]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Genmatch: Fix ICE for binary phi cfg mismatching [PR116795]
authorPan Li <pan2.li@intel.com>
Sat, 21 Sep 2024 14:30:18 +0000 (22:30 +0800)
committerPan Li <pan2.li@intel.com>
Mon, 23 Sep 2024 07:48:20 +0000 (15:48 +0800)
This patch would like to fix one ICE when try to match the binary
phi for below cfg.  We check the first edge of the Phi block comes
from b0, instead of check the only one edge of b1 comes from the
b0 too.  Thus, it will result in some code to be recog as .SAT_SUB
but it is not, and finally result the verify_ssa failure.

+------+
| b0:  |
| def  |       +-----+
| ...  |       | b1: |
| cond |------>| def |
+------+       | ... |
   |           +-----+
   |              |
   |              |
   v              |
+-----+           |
| b2: |           |
| Phi |<----------+
+-----+

The below test suites are passed for this patch.
* The rv64gcv fully regression test.
* The x86 bootstrap test.
* The x86 fully regression test.

PR target/116795

gcc/ChangeLog:

* gimple-match-head.cc (match_cond_with_binary_phi): Fix the
incorrect cfg check as b0->b1 in above example.

gcc/testsuite/ChangeLog:

* gcc.dg/torture/pr116795-1.c: New test.

Signed-off-by: Pan Li <pan2.li@intel.com>
gcc/gimple-match-head.cc
gcc/testsuite/gcc.dg/torture/pr116795-1.c [new file with mode: 0644]

index b63b66e9485a2e1b796bbac9ebbed0a823b75206..b5d4a71ddc55f054e6ee15c1553577a3b6634a85 100644 (file)
@@ -402,7 +402,7 @@ match_cond_with_binary_phi (gphi *phi, tree *true_arg, tree *false_arg)
   if (EDGE_COUNT (pred_b0->succs) == 2
       && EDGE_COUNT (pred_b1->succs) == 1
       && EDGE_COUNT (pred_b1->preds) == 1
-      && pred_b0 == EDGE_PRED (gimple_bb (phi), 0)->src)
+      && pred_b0 == EDGE_PRED (pred_b1, 0)->src)
     /*
      * +------+
      * | b0:  |
diff --git a/gcc/testsuite/gcc.dg/torture/pr116795-1.c b/gcc/testsuite/gcc.dg/torture/pr116795-1.c
new file mode 100644 (file)
index 0000000..629bdf4
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+volatile int a, b;
+int c;
+int main() {
+  unsigned e = 0;
+  for (; e < 2; e++) {
+    a && b;
+    if (c)
+      e = -(c ^ e);
+  }
+  return 0;
+}