gimple-ssa-evrp.c (class evrp_folder): Add simplify_stmt_using_ranges method.
authorRichard Biener <rguenther@suse.de>
Fri, 18 May 2018 11:54:37 +0000 (11:54 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 18 May 2018 11:54:37 +0000 (11:54 +0000)
2018-05-18  Richard Biener  <rguenther@suse.de>

* gimple-ssa-evrp.c (class evrp_folder): Add simplify_stmt_using_ranges
method.
(evrp_dom_walker::before_dom_children): Call it.

* gcc.dg/tree-ssa/pr21559.c: Adjust.
* gcc.dg/tree-ssa/pr45397.c: Likewise.
* gcc.dg/tree-ssa/pr61839_1.c: Likewise.
* gcc.dg/tree-ssa/pr61839_2.c: Likewise.
* gcc.dg/tree-ssa/pr61839_4.c: Likewise.
* gcc.dg/tree-ssa/vrp17.c: Likewise.
* gcc.dg/tree-ssa/vrp18.c: Likewise.
* gcc.dg/tree-ssa/vrp23.c: Likewise.
* gcc.dg/tree-ssa/vrp24.c: Likewise.
* gcc.dg/tree-ssa/vrp58.c: Likewise.
* gcc.dg/vrp-min-max-1.c: Likewise.
* gcc.dg/vrp-min-max-3.c: New testcase.

From-SVN: r260357

15 files changed:
gcc/ChangeLog
gcc/gimple-ssa-evrp.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr21559.c
gcc/testsuite/gcc.dg/tree-ssa/pr45397.c
gcc/testsuite/gcc.dg/tree-ssa/pr61839_1.c
gcc/testsuite/gcc.dg/tree-ssa/pr61839_2.c
gcc/testsuite/gcc.dg/tree-ssa/pr61839_4.c
gcc/testsuite/gcc.dg/tree-ssa/vrp17.c
gcc/testsuite/gcc.dg/tree-ssa/vrp18.c
gcc/testsuite/gcc.dg/tree-ssa/vrp23.c
gcc/testsuite/gcc.dg/tree-ssa/vrp24.c
gcc/testsuite/gcc.dg/tree-ssa/vrp58.c
gcc/testsuite/gcc.dg/vrp-min-max-1.c
gcc/testsuite/gcc.dg/vrp-min-max-3.c [new file with mode: 0644]

index 8a1bc05c3b9165e3db7e585baf853c0c9e3f4030..4795777850b93d9723d032d49c411fc1b2ceea54 100644 (file)
@@ -1,3 +1,9 @@
+2018-05-18  Richard Biener  <rguenther@suse.de>
+
+       * gimple-ssa-evrp.c (class evrp_folder): Add simplify_stmt_using_ranges
+       method.
+       (evrp_dom_walker::before_dom_children): Call it.
+
 2018-05-18  Richard Biener  <rguenther@suse.de>
 
        * tree-dfa.c (get_ref_base_and_extent): Use range-info to refine
index c9bbf09a4064e5fc6c35e6eb71c015363d7d905f..b9a054fd2ee5c63cc66db44ba5a9b778ed38d36d 100644 (file)
@@ -47,6 +47,8 @@ class evrp_folder : public substitute_and_fold_engine
  public:
   tree get_value (tree) FINAL OVERRIDE;
   evrp_folder (class vr_values *vr_values_) : vr_values (vr_values_) { }
+  bool simplify_stmt_using_ranges (gimple_stmt_iterator *gsi)
+    { return vr_values->simplify_stmt_using_ranges (gsi); }
   class vr_values *vr_values;
 
  private:
@@ -180,6 +182,12 @@ evrp_dom_walker::before_dom_children (basic_block bb)
          update_stmt (stmt);
          did_replace = true;
        }
+      if (evrp_folder.simplify_stmt_using_ranges (&gsi))
+       {
+         stmt = gsi_stmt (gsi);
+         update_stmt (stmt);
+         did_replace = true;
+       }
 
       if (did_replace)
        {
index 7d53f322505d2ca945fa3824dd14547c8577309b..185ce2fb6c3b3be9e991d01edd737915d0840821 100644 (file)
@@ -1,3 +1,18 @@
+2018-05-18  Richard Biener  <rguenther@suse.de>
+
+       * gcc.dg/tree-ssa/pr21559.c: Adjust.
+       * gcc.dg/tree-ssa/pr45397.c: Likewise.
+       * gcc.dg/tree-ssa/pr61839_1.c: Likewise.
+       * gcc.dg/tree-ssa/pr61839_2.c: Likewise.
+       * gcc.dg/tree-ssa/pr61839_4.c: Likewise.
+       * gcc.dg/tree-ssa/vrp17.c: Likewise.
+       * gcc.dg/tree-ssa/vrp18.c: Likewise.
+       * gcc.dg/tree-ssa/vrp23.c: Likewise.
+       * gcc.dg/tree-ssa/vrp24.c: Likewise.
+       * gcc.dg/tree-ssa/vrp58.c: Likewise.
+       * gcc.dg/vrp-min-max-1.c: Likewise.
+       * gcc.dg/vrp-min-max-3.c: New testcase.
+
 2018-05-18  Richard Biener  <rguenther@suse.de>
 
        * gcc.dg/tree-ssa/ssa-dse-35.c: New testcase.
index 0906351350ecf484d0ab06f4a08c030b65717539..b4065668ff8f684a45fbd49283da50cc5a6dae9c 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1-details" } */
+/* { dg-options "-O2 -fdump-tree-evrp-details -fdump-tree-vrp1-details" } */
 
 static int blocksize = 4096;
 
@@ -33,7 +33,7 @@ void foo (void)
 
 
 /* First, we should simplify the bits < 0 test within the loop.  */
-/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp1" } } */
+/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "evrp" } } */
 
 /* Second, we should thread the edge out of the loop via the break
    statement.  We also realize that the final bytes == 0 test is useless,
index 18c7f0bceccc32fbbb08ba32ddec782e3216dc6b..af75a75b1e2bce385d234a4304dfa4da2d99e277 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-phiopt1" } */
+/* { dg-options "-O2 -fdump-tree-phiopt1 -fdump-tree-evrp" } */
 
 int foo_add (const unsigned char *tmp, int i, int val)
 {
@@ -18,6 +18,7 @@ int foo_mul (const unsigned char *tmp, int i, int val)
 
 /* All cases should end up using min/max for the saturated operations and
    have no control flow.  */
+/* { dg-final { scan-tree-dump-not " & 255;" "evrp" } } */
 /* { dg-final { scan-tree-dump-times "MAX_EXPR" 3 "phiopt1" } } */
 /* { dg-final { scan-tree-dump-times "MIN_EXPR" 3 "phiopt1" } } */
 /* { dg-final { scan-tree-dump-not "if " "phiopt1" } } */
index 9f8168a81f28448759ab53074a8982d8d7da7d62..d44c7dc188219b227a9e3ec7725ad288bf23e10e 100644 (file)
@@ -1,6 +1,6 @@
 /* PR tree-optimization/61839.  */
 /* { dg-do run } */
-/* { dg-options "-O2 -fdump-tree-vrp1 -fdump-tree-optimized" } */
+/* { dg-options "-O2 -fdump-tree-vrp1 -fdisable-tree-evrp -fdump-tree-optimized" } */
 /* { dg-require-effective-target int32plus } */
 
 __attribute__ ((noinline))
index 638189e66e569c6d2786ed8b3e1c859d9b185c72..cfec54de991c20528e30e57e15712ef7cd976d59 100644 (file)
@@ -51,4 +51,4 @@ int bar2 ()
 /* Dont optimize 972195717 % 0 in function bar.  */
 /* { dg-final { scan-tree-dump-times "972195717 % " 1 "evrp" } } */
 /* May optimize in function bar2, but EVRP doesn't perform this yet.  */
-/* { dg-final { scan-tree-dump-times "972195715 % " 0 "evrp" { xfail *-*-* } } } */
+/* { dg-final { scan-tree-dump-times "972195715 % " 0 "evrp" } } */
index 5c026c89c7d128db00d570c95ef6d222acd01dcc..a346912d12167de3d36ee4d29297095a8236332d 100644 (file)
@@ -1,6 +1,6 @@
 /* PR tree-optimization/61839.  */
 /* { dg-do run } */
-/* { dg-options "-O2 -fdump-tree-vrp1 -fdump-tree-optimized" } */
+/* { dg-options "-O2 -fdump-tree-vrp1 -fdisable-tree-evrp -fdump-tree-optimized" } */
 /* { dg-require-effective-target int32plus } */
 
 __attribute__ ((noinline))
index 4f1210301867bd2bc385d847fc7573429c576b95..b8470e7a3dbeb413859c68e93488b783baff1e0b 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1" } */
+/* { dg-options "-O2 -fdump-tree-evrp" } */
 
 extern void abort (void) __attribute__ ((__noreturn__));
 union tree_node;
@@ -27,5 +27,5 @@ gimplify_for_stmt (tree stmt)
     abort ();
 }
 
-/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp1" } } */
+/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "evrp" } } */
 
index 008eebb25e4db963f0d3a52dd3d3aee55764f100..d7ab3f69f3798731a26b6e5cf2265576dd83f954 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1" } */
+/* { dg-options "-O2 -fdump-tree-evrp" } */
 
 static int blocksize = 4096;
 
@@ -30,4 +30,4 @@ void foo (void)
     eof_reached = 1;
 }
 
-/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp1" } } */
+/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "evrp" } } */
index ae68c090f77b4b006a07e6408c068918a4223768..6ac8d55600d21ac359d13524999b38551dccd280 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fno-tree-forwprop -fdump-tree-vrp1-details" } */
+/* { dg-options "-O2 -fno-tree-forwprop -fdump-tree-evrp-details" } */
 
 void aa (void);
 void aos (void);
@@ -45,5 +45,5 @@ L8:
 /* The n_sets > 0 test can be simplified into n_sets == 1 since the
    only way to reach the test is when n_sets <= 1, and the only value
    which satisfies both conditions is n_sets == 1.  */
-/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp1" } } */
+/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "evrp" } } */
 
index ed49e25f87a9ccf49a6e420821263509c80d3df5..dfe44b30649a3600bb106de3bc0c799d3d0492fa 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fno-tree-forwprop -fdump-tree-vrp1-details -fdump-tree-optimized" } */
+/* { dg-options "-O2 -fno-tree-forwprop -fdump-tree-evrp-details -fdump-tree-optimized" } */
 
 
 struct rtx_def;
@@ -88,6 +88,6 @@ L7:
    n_sets can only have the values [0, 1] as it's the result of a
    boolean operation.  */
 
-/* { dg-final { scan-tree-dump-times "Simplified relational" 1 "vrp1" } } */
+/* { dg-final { scan-tree-dump-times "Simplified relational" 2 "evrp" } } */
 /* { dg-final { scan-tree-dump-times "if " 4 "optimized" } } */
 
index 5b44ae2cfd1880526d1252c79859fd5d73c4fe9b..b64a2df8f33009e85b12bf593bec12b313a34636 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1-details" } */
+/* { dg-options "-O2 -fdump-tree-cddce1" } */
 
 long long
 foo (long long a, signed char b, signed char c)
@@ -8,5 +8,5 @@ foo (long long a, signed char b, signed char c)
   return a + (short)bc;
 }
 
-/* { dg-final { scan-tree-dump "Folded into" "vrp1" { target int32plus } } } */
-/* { dg-final { scan-tree-dump "Folding statement: _\[0-9\]\* = \\(long long int\\) bc_\[0-9\]\*;" "vrp1" { target int16 } } } */
+/* EVRP should remove the truncation to short, keeping (long long)bc.  */
+/* { dg-final { scan-tree-dump-not "short" "cddce1" { target int32plus } } } */
index 270f2bbb4364b548db3e074156e9ab9dcf8016f9..b9c8379c832b5a3628f599bc50903d5a9219e5e7 100644 (file)
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1 -fdump-tree-mergephi2" } */
+/* { dg-options "-O2 -fdump-tree-vrp1 -fdisable-tree-evrp -fdump-tree-mergephi2" } */
 
 int bar (void);
 
diff --git a/gcc/testsuite/gcc.dg/vrp-min-max-3.c b/gcc/testsuite/gcc.dg/vrp-min-max-3.c
new file mode 100644 (file)
index 0000000..1fffee7
--- /dev/null
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-evrp -fdump-tree-fre1" } */
+
+int bar (void);
+
+int foo1 (int x, int y)
+{
+  if (y < 10) return bar ();
+  if (x > 9) return bar ();
+
+  return x < y ? x : y;
+}
+
+int foo2 (int x, int y)
+{
+  if (y < 10) return bar ();
+  if (x > 9) return bar ();
+
+  return x > y ? x : y;
+}
+
+/* We expect to optimiz min/max in EVRP */
+
+/* { dg-final { scan-tree-dump-times "MIN_EXPR" 1 "fre1" } } */
+/* { dg-final { scan-tree-dump-times "MAX_EXPR" 1 "fre1" } } */
+/* { dg-final { scan-tree-dump-not "MIN_EXPR" "evrp" } } */
+/* { dg-final { scan-tree-dump-not "MAX_EXPR" "evrp" } } */