aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPan Li <pan2.li@intel.com>2024-09-21 22:30:18 +0800
committerPan Li <pan2.li@intel.com>2024-09-23 15:48:20 +0800
commit999363c53cf6cd87f75f96388a531e090299b97d (patch)
tree97347845bc6b0e19416a85db1dc59ec22edc6d2e
parent831137be51a54715b73a6178dbfb28215d1963df (diff)
downloadgcc-999363c53cf6cd87f75f96388a531e090299b97d.zip
gcc-999363c53cf6cd87f75f96388a531e090299b97d.tar.gz
gcc-999363c53cf6cd87f75f96388a531e090299b97d.tar.bz2
Genmatch: Fix ICE for binary phi cfg mismatching [PR116795]
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>
-rw-r--r--gcc/gimple-match-head.cc2
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr116795-1.c14
2 files changed, 15 insertions, 1 deletions
diff --git a/gcc/gimple-match-head.cc b/gcc/gimple-match-head.cc
index b63b66e..b5d4a71 100644
--- a/gcc/gimple-match-head.cc
+++ b/gcc/gimple-match-head.cc
@@ -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
index 0000000..629bdf4
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr116795-1.c
@@ -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;
+}