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

Reply via email to