Hi!

The following testcase ICEs, because optimize_crc_loop inserts a call
statement before labels instead of after labels.

Fixed thusly (plus fixed other issues noticed around it),
bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk/15.2?

2025-06-17  Jakub Jelinek  <ja...@redhat.com>

        PR tree-optimization/120677
        * gimple-crc-optimization.cc (crc_optimization::optimize_crc_loop):
        Insert before gsi_after_labels instead of gsi_start_bb.  Use
        gimple_bb (output_crc) instead of output_crc->bb.  Formatting fix.

        * gcc.c-torture/execute/pr120677.c: New test.

--- gcc/gimple-crc-optimization.cc.jj   2025-04-08 14:08:51.619276743 +0200
+++ gcc/gimple-crc-optimization.cc      2025-06-16 21:52:55.864229216 +0200
@@ -1261,15 +1261,12 @@ crc_optimization::optimize_crc_loop (gph
   loc = EXPR_LOCATION (phi_result);
 
   /* Add IFN call and write the return value in the phi_result.  */
-  gcall *call
-      = gimple_build_call_internal (ifn, 3,
-                                   m_crc_arg,
-                                   m_data_arg,
-                                   polynomial_arg);
+  gcall *call = gimple_build_call_internal (ifn, 3, m_crc_arg, m_data_arg,
+                                           polynomial_arg);
 
   gimple_call_set_lhs (call, phi_result);
   gimple_set_location (call, loc);
-  gimple_stmt_iterator si = gsi_start_bb (output_crc->bb);
+  gimple_stmt_iterator si = gsi_after_labels (gimple_bb (output_crc));
   gsi_insert_before (&si, call, GSI_SAME_STMT);
 
   /* Remove phi statement, which was holding CRC result.  */
--- gcc/testsuite/gcc.c-torture/execute/pr120677.c.jj   2025-06-16 
21:58:57.149514696 +0200
+++ gcc/testsuite/gcc.c-torture/execute/pr120677.c      2025-06-16 
21:58:29.438876302 +0200
@@ -0,0 +1,31 @@
+/* PR tree-optimization/120677 */
+/* { dg-do run { target int32plus } } */
+
+unsigned a;
+int b, e;
+
+int
+foo (int d)
+{
+  switch (d)
+    {
+    case 0:
+    case 2:
+      return 0;
+    default:
+      return 1;
+    }
+}
+
+int
+main ()
+{
+  for (b = 8; b; b--)
+    if (a & 1)
+      a = a >> 1 ^ 20000000;
+    else
+      a >>= 1;
+  e = foo (0);
+  if (e || a)
+    __builtin_abort ();
+}

        Jakub

Reply via email to