On Wed, 30 Sep 2015, Marek Polacek wrote: > Another instance of out of date SSA range info. Before phiopt1 we had > > <bb 2>: > if (N_2(D) >= 0) > goto <bb 3>; > else > goto <bb 4>; > > <bb 3>: > iftmp.0_3 = MIN_EXPR <N_2(D), 16>; > > <bb 4>: > # iftmp.0_5 = PHI <0(2), iftmp.0_3(3)> > value_4 = (short int) iftmp.0_5; > return value_4; > > and after phiop1: > > <bb 2>: > iftmp.0_3 = MIN_EXPR <N_2(D), 16>; > iftmp.0_6 = MAX_EXPR <iftmp.0_3, 0>; > value_4 = (short int) iftmp.0_6; > return value_4; > > But the flow-sensitive info in this BB hasn't been cleared up. > > This problem doesn't show up in GCC5 but might be latent there. > > Bootstrapped/regtested on x86_64-linux, ok for trunk and 5 as well? > > 2015-09-30 Marek Polacek <pola...@redhat.com> > > PR tree-optimization/67769 > * tree-ssa-phiopt.c (tree_ssa_phiopt_worker): Call > reset_flow_sensitive_info_in_bb when changing the CFG. > > * gcc.dg/torture/pr67769.c: New test. > > diff --git gcc/testsuite/gcc.dg/torture/pr67769.c > gcc/testsuite/gcc.dg/torture/pr67769.c > index e69de29..c1d17c3 100644 > --- gcc/testsuite/gcc.dg/torture/pr67769.c > +++ gcc/testsuite/gcc.dg/torture/pr67769.c > @@ -0,0 +1,23 @@ > +/* { dg-do run } */ > + > +static int > +clamp (int x, int lo, int hi) > +{ > + return (x < lo) ? lo : ((x > hi) ? hi : x); > +} > + > +__attribute__ ((noinline)) > +short > +foo (int N) > +{ > + short value = clamp (N, 0, 16); > + return value; > +} > + > +int > +main () > +{ > + if (foo (-5) != 0) > + __builtin_abort (); > + return 0; > +} > diff --git gcc/tree-ssa-phiopt.c gcc/tree-ssa-phiopt.c > index 37fdf28..101988a 100644 > --- gcc/tree-ssa-phiopt.c > +++ gcc/tree-ssa-phiopt.c > @@ -338,6 +338,8 @@ tree_ssa_phiopt_worker (bool do_store_elim, bool > do_hoist_loads) > else if (minmax_replacement (bb, bb1, e1, e2, phi, arg0, arg1)) > cfgchanged = true; > } > + if (cfgchanged) > + reset_flow_sensitive_info_in_bb (bb);
That's a bit conservative. I believe most PHI opt transforms should be fine as the conditionally executed blocks did not contain any stmts that prevail. The merge PHI also should have valid range info. So I don't think the patch is good as-is. Please consider reverting if you already applied it. Thanks, Richard.