Hi! The following testcase ICEs during regimplificatgion since the addition of (convert (eqne zero_one_valued_p@0 INTEGER_CST@1)) simplification. That simplification is novel in the sense that in gimplify_expr it can turn an expression (comparison in particular) into a SSA_NAME. Normally when gimplify_expr sees originally a SSA_NAME, it does case SSA_NAME: /* Allow callbacks into the gimplifier during optimization. */ ret = GS_ALL_DONE; break; and doesn't try to recalculate side effects because of that, but in this case gimplify_expr normally enters the: default: switch (TREE_CODE_CLASS (TREE_CODE (*expr_p))) { case tcc_comparison: then does *expr_p = gimple_boolify (*expr_p); and then *expr_p = fold_convert_loc (input_location, org_type, *expr_p); with this new match.pd simplification turns that tcc_comparison class into SSA_NAME. Unlike the outer SSA_NAME handling though, this falls through into recalculate_side_effects (*expr_p);
dont_recalculate: break; but unfortunately recalculate_side_effects doesn't handle SSA_NAME and ICEs on it. SSA_NAMEs don't ever have TREE_SIDE_EFFECTS set on those, so the following patch fixes it by handling it similarly to the tcc_constant case. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2024-01-06 Jakub Jelinek <ja...@redhat.com> PR tree-optimization/113228 * gimplify.cc (recalculate_side_effects): Do nothing for SSA_NAMEs. * gcc.c-torture/compile/pr113228.c: New test. --- gcc/gimplify.cc.jj 2024-01-03 11:51:40.744603324 +0100 +++ gcc/gimplify.cc 2024-01-05 13:32:34.351336320 +0100 @@ -3344,6 +3344,9 @@ recalculate_side_effects (tree t) return; default: + if (code == SSA_NAME) + /* No side-effects. */ + return; gcc_unreachable (); } } --- gcc/testsuite/gcc.c-torture/compile/pr113228.c.jj 2024-01-05 13:27:42.876330301 +0100 +++ gcc/testsuite/gcc.c-torture/compile/pr113228.c 2024-01-05 13:27:22.503609458 +0100 @@ -0,0 +1,17 @@ +/* PR tree-optimization/113228 */ + +int a, b, c, d, i; + +void +foo (void) +{ + int k[3] = {}; + int *l = &a; + for (d = 0; c; c--) + for (i = 0; i <= 9; i++) + { + for (b = 1; b <= 4; b++) + k[0] = k[0] == 0; + *l |= k[d]; + } +} Jakub