> Am 17.06.2025 um 08:57 schrieb Jakub Jelinek <ja...@redhat.com>:
>
> 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?
Ok
Richard
> 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
>