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); } free (bb_order); Marek