[gcc r14-6941] scev: Avoid ICE on results used in abnormal PHI args [PR113201]

Jakub Jelinek jakub@gcc.gnu.org
Fri Jan 5 10:18:54 GMT 2024


https://gcc.gnu.org/g:b8faf1fca42a9b987fec0992ca5d63995b2640b3

commit r14-6941-gb8faf1fca42a9b987fec0992ca5d63995b2640b3
Author: Jakub Jelinek <jakub@redhat.com>
Date:   Fri Jan 5 11:18:17 2024 +0100

    scev: Avoid ICE on results used in abnormal PHI args [PR113201]
    
    The following testcase ICEs when rslt is SSA_NAME_OCCURS_IN_ABNORMAL_PHI
    and we call replace_uses_by with a INTEGER_CST def, where it ICEs on:
                  if (e->flags & EDGE_ABNORMAL
                      && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (val))
    because val is not an SSA_NAME.  One way would be to add
                      && TREE_CODE (val) == SSA_NAME
    check in between the above 2 lines in replace_uses_by.
    
    And/or the following patch just punts propagating constants to
    SSA_NAME_OCCURS_IN_ABNORMAL_PHI rslt uses.
    
    Or we could punt somewhere earlier in final value replacement (but dunno
    where).
    
    2024-01-05  Jakub Jelinek  <jakub@redhat.com>
    
            PR tree-optimization/113201
            * tree-scalar-evolution.cc (final_value_replacement_loop): Don't call
            replace_uses_by on SSA_NAME_OCCURS_IN_ABNORMAL_PHI rslt.
    
            * gcc.c-torture/compile/pr113201.c: New test.

Diff:
---
 gcc/testsuite/gcc.c-torture/compile/pr113201.c | 15 +++++++++++++++
 gcc/tree-scalar-evolution.cc                   |  2 +-
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/gcc/testsuite/gcc.c-torture/compile/pr113201.c b/gcc/testsuite/gcc.c-torture/compile/pr113201.c
new file mode 100644
index 00000000000..72ec76169bd
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr113201.c
@@ -0,0 +1,15 @@
+/* PR tree-optimization/113201 */
+
+void foo (void) __attribute__((returns_twice));
+void bar (void);
+
+int
+baz (void)
+{
+  int x = 42;
+  foo ();
+  while (--x)
+    ;
+  bar ();
+  return x;
+}
diff --git a/gcc/tree-scalar-evolution.cc b/gcc/tree-scalar-evolution.cc
index 481ce7cf943..25e3130e2f1 100644
--- a/gcc/tree-scalar-evolution.cc
+++ b/gcc/tree-scalar-evolution.cc
@@ -3881,7 +3881,7 @@ final_value_replacement_loop (class loop *loop)
 
       /* Propagate constants immediately, but leave an unused initialization
 	 around to avoid invalidating the SCEV cache.  */
-      if (CONSTANT_CLASS_P (def))
+      if (CONSTANT_CLASS_P (def) && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rslt))
 	replace_uses_by (rslt, def);
 
       /* Create the replacement statements.  */


More information about the Gcc-cvs mailing list