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