https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91470
--- Comment #3 from rguenther at suse dot de <rguenther at suse dot de> --- On Tue, 27 Aug 2019, marxin at gcc dot gnu.org wrote: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91470 > > Martin Liška <marxin at gcc dot gnu.org> changed: > > What |Removed |Added > ---------------------------------------------------------------------------- > Keywords|needs-reduction | > Status|UNCONFIRMED |NEW > Last reconfirmed| |2019-08-27 > CC| |marxin at gcc dot gnu.org > Ever confirmed|0 |1 > > --- Comment #2 from Martin Liška <marxin at gcc dot gnu.org> --- > There's a reduced test-case: > > $ cat pr91470.ii > int input_location, global_trees_0, gfc_conv_intrinsic_findloc_body, > gfc_conv_intrinsic_findloc_loopblock, gfc_conv_intrinsic_findloc_tmp, > gfc_conv_intrinsic_findloc_found, gfc_conv_intrinsic_findloc_loop; > enum tree_code { COND_EXPR }; > struct A {}; > struct B { > int pre; > int expr; > }; > void fn1(B *, B *); > void fn2(int *, int *); > int *fn3(int *); > void fn4(int, tree_code, int *, int *, int *, int); > void fn5(B *, int *); > void fn6() { > A array_arg, value_arg, dim_arg, mask_arg, kind_arg, back_arg; > int *forward_branch; > B arrayse, valuese, maskse, backse; > int i; > value_arg = array_arg; > mask_arg = dim_arg; > back_arg = kind_arg; > for (i = 0; i < 2; i++) { > fn5(&maskse, &gfc_conv_intrinsic_findloc_loop); > fn1(&arrayse, __null); > fn2(&gfc_conv_intrinsic_findloc_body, &valuese.pre); > fn4(input_location, COND_EXPR, &global_trees_0, > &gfc_conv_intrinsic_findloc_tmp, &gfc_conv_intrinsic_findloc_found, > 0); > if (i == 0) > forward_branch = fn3(&gfc_conv_intrinsic_findloc_loopblock); > } > fn4(input_location, COND_EXPR, &global_trees_0, &backse.expr, > forward_branch, > 0); > } So this is basically int x; for (int i = 0; i < 2; ++i) if (i == 0) x = bar(); baz(x); with making sure we do _not_ thread / header copy / unroll this. The uninit pass warns about the default def flowing into the loop PHI node here.