EVRP - Push op1 value range before pushing op0 value range.
authorKugan Vivekanandarajah <kugan@gcc.gnu.org>
Thu, 13 Oct 2016 01:26:28 +0000 (01:26 +0000)
committerKugan Vivekanandarajah <kugan@gcc.gnu.org>
Thu, 13 Oct 2016 01:26:28 +0000 (01:26 +0000)
gcc/ChangeLog:

2016-10-12  Richard Biener  <rguenther@suse.de>

* tree-vrp.c (evrp_dom_walker::try_find_new_range): Renamed from
try_add_new_range and made to eturn new range.
(evrp_dom_walker::before_dom_children): Push op1 value range before
pushing op0 value range.

gcc/testsuite/ChangeLog:

2016-10-12  Kugan Vivekanandarajah  <kuganv@linaro.org>

* gcc.dg/tree-ssa/evrp6.c: New test.

From-SVN: r241083

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/evrp6.c [new file with mode: 0644]
gcc/tree-vrp.c

index 600700a39450dd4e174b88f8cfcd001916012b1c..922a0b60045ff572f8bad2fbb43782308422d624 100644 (file)
@@ -1,3 +1,10 @@
+2016-10-12  Richard Biener  <rguenther@suse.de>
+
+       * tree-vrp.c (evrp_dom_walker::try_find_new_range): Renamed from
+       try_add_new_range and made to eturn new range.
+       (evrp_dom_walker::before_dom_children): Push op1 value range before
+       pushing op0 value range.
+
 2016-10-12  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        PR tree-optimization/77937
index 5eb693a652f4b851bec06c3089b6b2d54ac1f972..e0d4f0bfb97db62edf9c3448d2df1e26674d35e3 100644 (file)
@@ -1,3 +1,7 @@
+2016-10-12  Kugan Vivekanandarajah  <kuganv@linaro.org>
+
+       * gcc.dg/tree-ssa/evrp6.c: New test.
+
 2016-10-12  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * gcc.target/powerpc/shrink-wrap-separate-0.c: New testcase.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/evrp6.c b/gcc/testsuite/gcc.dg/tree-ssa/evrp6.c
new file mode 100644 (file)
index 0000000..35d4d74
--- /dev/null
@@ -0,0 +1,22 @@
+
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-evrp" } */
+
+extern void abort (void);
+
+int
+foo (int k, int j)
+{
+  if (j >= 10)
+    {
+      if (j < k)
+       {
+         k++;
+         if (k < 10)
+           abort ();
+       }
+    }
+
+  return j;
+}
+/* { dg-final { scan-tree-dump "\\\[12, \\+INF" "evrp" } } */
index 8d5fa66e08459b2b7937b2fdf6b00f1a8f374ec0..941c0fd34d816178be5f8ab3525d78e19c2fd61c 100644 (file)
@@ -10646,7 +10646,7 @@ public:
   virtual void after_dom_children (basic_block);
   void push_value_range (const_tree var, value_range *vr);
   value_range *pop_value_range (const_tree var);
-  void try_add_new_range (tree op, tree_code code, tree limit);
+  value_range *try_find_new_range (tree op, tree_code code, tree limit);
 
   /* Cond_stack holds the old VR.  */
   auto_vec<std::pair <const_tree, value_range*> > stack;
@@ -10655,10 +10655,10 @@ public:
 };
 
 
-/*  Add new range to OP such that (OP CODE LIMIT) is true.  */
+/*  Find new range for OP such that (OP CODE LIMIT) is true.  */
 
-void
-evrp_dom_walker::try_add_new_range (tree op, tree_code code, tree limit)
+value_range *
+evrp_dom_walker::try_find_new_range (tree op, tree_code code, tree limit)
 {
   value_range vr = VR_INITIALIZER;
   value_range *old_vr = get_value_range (op);
@@ -10674,8 +10674,9 @@ evrp_dom_walker::try_add_new_range (tree op, tree_code code, tree limit)
     {
       value_range *new_vr = vrp_value_range_pool.allocate ();
       *new_vr = vr;
-      push_value_range (op, new_vr);
+      return new_vr;
     }
+  return NULL;
 }
 
 /* See if there is any new scope is entered with new VR and set that VR to
@@ -10711,7 +10712,7 @@ evrp_dom_walker::before_dom_children (basic_block bb)
            code = invert_tree_comparison (gimple_cond_code (stmt),
                                           HONOR_NANS (op0));
          /* Add VR when (OP0 CODE OP1) condition is true.  */
-         try_add_new_range (op0, code, op1);
+         value_range *op0_range = try_find_new_range (op0, code, op1);
 
          /* Register ranges for y in x < y where
             y might have ranges that are useful.  */
@@ -10724,8 +10725,13 @@ evrp_dom_walker::before_dom_children (basic_block bb)
                                                          &new_code, &limit))
            {
              /* Add VR when (OP1 NEW_CODE LIMIT) condition is true.  */
-             try_add_new_range (op1, new_code, limit);
+             value_range *op1_range = try_find_new_range (op1, new_code, limit);
+             if (op1_range)
+               push_value_range (op1, op1_range);
            }
+
+         if (op0_range)
+           push_value_range (op0, op0_range);
        }
     }