public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [EVRP] Fold stmts with vrp_fold_stmt
@ 2016-10-03 19:14 kugan
  2016-10-04  8:56 ` Richard Biener
  0 siblings, 1 reply; 4+ messages in thread
From: kugan @ 2016-10-03 19:14 UTC (permalink / raw)
  To: gcc-patches; +Cc: Richard Biener

[-- Attachment #1: Type: text/plain, Size: 1652 bytes --]

Hi,

This patch improves Early VRP by folding stmts using vrp_fold_stmt as it 
is done in ssa_propagate for VRP.

I have also changed EVRP to handle POINTER_TYPE_P. I will send follow up 
patches to use this in IPA-VRP.

Bootstrapped and regression testd on x86_64-linux-gnu with no new 
regressions. Is this OK for trunk?

Thanks,
Kugan

gcc/testsuite/ChangeLog:

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

	* gcc.dg/pr68217.c: Adjust testcase as more cases are now handled in
	  evrp.
	* gcc.dg/predict-1.c: Likewise.
	* gcc.dg/predict-9.c: Likewise.
	* gcc.dg/tree-ssa/pr20318.c: Likewise.
	* gcc.dg/tree-ssa/pr21001.c: Likewise.
	* gcc.dg/tree-ssa/pr21090.c: Likewise.
	* gcc.dg/tree-ssa/pr21294.c: Likewise.
	* gcc.dg/tree-ssa/pr21559.c: Likewise.
	* gcc.dg/tree-ssa/pr21563.c: Likewise.
	* gcc.dg/tree-ssa/pr23744.c: Likewise.
	* gcc.dg/tree-ssa/pr25382.c: Likewise.
	* gcc.dg/tree-ssa/pr61839_1.c: Likewise.
	* gcc.dg/tree-ssa/pr68431.c: Likewise.
	* gcc.dg/tree-ssa/vrp03.c: Likewise.
	* gcc.dg/tree-ssa/vrp07.c: Likewise.
	* gcc.dg/tree-ssa/vrp09.c: Likewise.
	* gcc.dg/tree-ssa/vrp17.c: Likewise.
	* gcc.dg/tree-ssa/vrp18.c: Likewise.
	* gcc.dg/tree-ssa/vrp19.c: Likewise.
	* gcc.dg/tree-ssa/vrp20.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/tree-ssa/vrp92.c: Likewise.
	* gcc.dg/tree-ssa/vrp98.c: Likewise.
	* gcc.dg/vrp-min-max-1.c: Likewise.

gcc/ChangeLog:

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

	* tree-vrp.c (evrp_dom_walker::before_dom_children): Handle
	  POINTER_TYPE_P. Also fold stmts with vrp_fold_stmt.

[-- Attachment #2: 0001-Fold-stmts-using-vrp_fold-in-evrp.patch --]
[-- Type: text/x-patch, Size: 18507 bytes --]

From 4bb16e7d01674461a47e6b6488b04fb1907234ea Mon Sep 17 00:00:00 2001
From: Kugan Vivekanandarajah <kugan.vivekanandarajah@linaro.org>
Date: Mon, 3 Oct 2016 06:12:05 +1100
Subject: [PATCH 1/5] Fold stmts using vrp_fold in evrp

---
 gcc/testsuite/gcc.dg/pr68217.c            |  4 ++--
 gcc/testsuite/gcc.dg/predict-1.c          |  2 +-
 gcc/testsuite/gcc.dg/predict-9.c          |  2 +-
 gcc/testsuite/gcc.dg/tree-ssa/pr20318.c   |  4 ++--
 gcc/testsuite/gcc.dg/tree-ssa/pr21001.c   |  2 +-
 gcc/testsuite/gcc.dg/tree-ssa/pr21090.c   |  4 ++--
 gcc/testsuite/gcc.dg/tree-ssa/pr21294.c   |  4 ++--
 gcc/testsuite/gcc.dg/tree-ssa/pr21559.c   |  2 +-
 gcc/testsuite/gcc.dg/tree-ssa/pr21563.c   |  2 +-
 gcc/testsuite/gcc.dg/tree-ssa/pr23744.c   |  4 ++--
 gcc/testsuite/gcc.dg/tree-ssa/pr25382.c   |  4 ++--
 gcc/testsuite/gcc.dg/tree-ssa/pr61839_1.c |  6 +++---
 gcc/testsuite/gcc.dg/tree-ssa/pr68431.c   |  2 +-
 gcc/testsuite/gcc.dg/tree-ssa/vrp03.c     |  4 ++--
 gcc/testsuite/gcc.dg/tree-ssa/vrp07.c     |  2 +-
 gcc/testsuite/gcc.dg/tree-ssa/vrp09.c     |  4 ++--
 gcc/testsuite/gcc.dg/tree-ssa/vrp17.c     |  4 ++--
 gcc/testsuite/gcc.dg/tree-ssa/vrp18.c     |  4 ++--
 gcc/testsuite/gcc.dg/tree-ssa/vrp19.c     |  6 +++---
 gcc/testsuite/gcc.dg/tree-ssa/vrp20.c     |  6 +++---
 gcc/testsuite/gcc.dg/tree-ssa/vrp23.c     |  2 +-
 gcc/testsuite/gcc.dg/tree-ssa/vrp24.c     |  2 +-
 gcc/testsuite/gcc.dg/tree-ssa/vrp58.c     |  2 +-
 gcc/testsuite/gcc.dg/tree-ssa/vrp92.c     |  2 +-
 gcc/testsuite/gcc.dg/tree-ssa/vrp98.c     |  2 +-
 gcc/testsuite/gcc.dg/vrp-min-max-1.c      |  2 +-
 gcc/tree-vrp.c                            | 27 ++++++++++++++++++++-------
 27 files changed, 62 insertions(+), 49 deletions(-)

diff --git a/gcc/testsuite/gcc.dg/pr68217.c b/gcc/testsuite/gcc.dg/pr68217.c
index 426a99a..fbe4627 100644
--- a/gcc/testsuite/gcc.dg/pr68217.c
+++ b/gcc/testsuite/gcc.dg/pr68217.c
@@ -1,6 +1,6 @@
 
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1" } */
+/* { dg-options "-O2 -fdump-tree-evrp" } */
 
 int foo (void)
 {
@@ -11,4 +11,4 @@ int foo (void)
     return 0;
 }
 
-/* { dg-final { scan-tree-dump "\\\[-INF, 0\\\]" "vrp1" } } */
+/* { dg-final { scan-tree-dump "\\\[-INF, 0\\\]" "evrp" } } */
diff --git a/gcc/testsuite/gcc.dg/predict-1.c b/gcc/testsuite/gcc.dg/predict-1.c
index 10d62ba..0d14802 100644
--- a/gcc/testsuite/gcc.dg/predict-1.c
+++ b/gcc/testsuite/gcc.dg/predict-1.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-profile_estimate" } */
+/* { dg-options "-O2 -fno-tree-vrp -fdump-tree-profile_estimate" } */
 
 extern int global;
 
diff --git a/gcc/testsuite/gcc.dg/predict-9.c b/gcc/testsuite/gcc.dg/predict-9.c
index 196e31c..8833cb3 100644
--- a/gcc/testsuite/gcc.dg/predict-9.c
+++ b/gcc/testsuite/gcc.dg/predict-9.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-profile_estimate" } */
+/* { dg-options "-O2 -fno-tree-vrp -fdump-tree-profile_estimate" } */
 
 extern int global;
 extern int global2;
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr20318.c b/gcc/testsuite/gcc.dg/tree-ssa/pr20318.c
index 41f569e..11d4f0d 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr20318.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr20318.c
@@ -1,5 +1,5 @@
 /* { dg-do compile { target { ! keeps_null_pointer_checks } } } */
-/* { dg-options "-O2 -fdump-tree-original -fdump-tree-vrp1 -fdelete-null-pointer-checks" } */
+/* { dg-options "-O2 -fdump-tree-original -fdump-tree-evrp -fdelete-null-pointer-checks" } */
 
 extern int* f(int) __attribute__((returns_nonnull));
 extern void eliminate ();
@@ -14,4 +14,4 @@ void h () {
 }
 
 /* { dg-final { scan-tree-dump-times "== 0" 1 "original" } } */
-/* { dg-final { scan-tree-dump-times "Folding predicate\[^\\n\]*to 0" 1 "vrp1" } } */
+/* { dg-final { scan-tree-dump-times "Folding predicate\[^\\n\]*to 0" 1 "evrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21001.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21001.c
index 482d530..719360a 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr21001.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21001.c
@@ -5,7 +5,7 @@
    range information out of the conditional.  */
 
 /* { dg-do compile } */
-/* { dg-options "-O2 -fno-tree-dominator-opts -fno-tree-fre -fdump-tree-vrp1-details" } */
+/* { dg-options "-O2 -fno-tree-dominator-opts -fno-tree-fre -fdisable-tree-evrp -fdump-tree-vrp1-details" } */
 
 int
 foo (int a)
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21090.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21090.c
index 26d0d55..12e0104 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr21090.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21090.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1 -fdelete-null-pointer-checks" } */
+/* { dg-options "-O2 -fdump-tree-evrp -fdelete-null-pointer-checks" } */
 
 int g, h;
 
@@ -19,4 +19,4 @@ foo (int a)
     return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "Folding predicate.*to 1" 1 "vrp1" { target { ! keeps_null_pointer_checks } } } } */
+/* { dg-final { scan-tree-dump-times "Folding predicate.*to 1" 1 "evrp" { target { ! keeps_null_pointer_checks } } } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21294.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21294.c
index f694fb2..91b36e6 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr21294.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21294.c
@@ -4,7 +4,7 @@
    allows us to eliminate the second "if" statement.  */
 
 /* { dg-do compile } */
-/* { dg-options "-O2 -fno-tree-dominator-opts -fdump-tree-vrp1-details" } */
+/* { dg-options "-O2 -fno-tree-dominator-opts -fdump-tree-evrp" } */
 
 struct f {
   int i;
@@ -19,4 +19,4 @@ foo (struct f *p)
   return 0;
 }
 
-/* { dg-final { scan-tree-dump-times "Folding predicate" 1 "vrp1"} } */
+/* { dg-final { scan-tree-dump-times "if" 1 "evrp"} } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21559.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21559.c
index 0906351..d73b587 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr21559.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21559.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1-details" } */
+/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1-details" } */
 
 static int blocksize = 4096;
 
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr21563.c b/gcc/testsuite/gcc.dg/tree-ssa/pr21563.c
index 2cc2599..9c67a3a 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr21563.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr21563.c
@@ -2,7 +2,7 @@
    Make sure VRP folds the second "if" statement.  */
 
 /* { dg-do compile } */
-/* { dg-options "-O2 -fno-tree-dominator-opts -fdump-tree-vrp1-details" } */
+/* { dg-options "-O2 -fno-tree-dominator-opts -fdisable-tree-evrp -fdump-tree-vrp1-details" } */
 
 int
 foo (int a)
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr23744.c b/gcc/testsuite/gcc.dg/tree-ssa/pr23744.c
index 9d662f2..5f7d0b8 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr23744.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr23744.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fno-tree-ccp -fdump-tree-vrp1" } */
+/* { dg-options "-O2 -fno-tree-ccp -fdump-tree-evrp" } */
 
 void h (void);
 
@@ -17,4 +17,4 @@ int g (int i, int j)
     return 1;
 }
 
-/* { dg-final { scan-tree-dump-times "Folding predicate.*to 1" 1 "vrp1" } } */
+/* { dg-final { scan-tree-dump-times "Folding predicate.*to 1" 1 "evrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr25382.c b/gcc/testsuite/gcc.dg/tree-ssa/pr25382.c
index dcf9148..0d19d0d 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr25382.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr25382.c
@@ -3,7 +3,7 @@
    Check that VRP now gets ranges from BIT_AND_EXPRs.  */
 
 /* { dg-do compile } */
-/* { dg-options "-O2 -fno-tree-ccp -fdump-tree-vrp1" } */
+/* { dg-options "-O2 -fno-tree-ccp -fdump-tree-evrp" } */
 
 int
 foo (int a)
@@ -15,4 +15,4 @@ foo (int a)
     return 1;
 }
 
-/* { dg-final { scan-tree-dump-times "Folding predicate b_.* > 300 to 0" 1 "vrp1" } } */
+/* { dg-final { scan-tree-dump-times "Folding predicate b_.* > 300 to 0" 1 "evrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr61839_1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr61839_1.c
index 9f8168a..9fcc35b 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr61839_1.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr61839_1.c
@@ -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-evrp -fdump-tree-optimized" } */
 /* { dg-require-effective-target int32plus } */
 
 __attribute__ ((noinline))
@@ -38,7 +38,7 @@ int main ()
 }
 
 /* Scan for c = 972195717) >> [0, 1] in function foo.  */
-/* { dg-final { scan-tree-dump-times "486097858 : 972195717" 1  "vrp1" } } */
+/* { dg-final { scan-tree-dump-times "486097858 : 972195717" 1  "evrp" } } */
 /* Scan for c = 972195717) >> [2, 3] in function bar.  */
-/* { dg-final { scan-tree-dump-times "243048929 : 121524464" 2  "vrp1" } } */
+/* { dg-final { scan-tree-dump-times "243048929 : 121524464" 1  "evrp" } } */
 /* { dg-final { scan-tree-dump-times "486097858" 0  "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr68431.c b/gcc/testsuite/gcc.dg/tree-ssa/pr68431.c
index 3bd3843..9c42563b 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr68431.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr68431.c
@@ -1,5 +1,5 @@
 /* PR tree-optimization/68431 */
-/* { dg-options "-O2 -fdump-tree-vrp1-details" } */
+/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1-details" } */
 
 unsigned int x = 1;
 int
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp03.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp03.c
index 59146bf..5e87195 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/vrp03.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp03.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1" } */
+/* { dg-options "-O2 -fdump-tree-evrp -fdump-tree-vrp1" } */
 
 struct A
 {
@@ -32,4 +32,4 @@ foo (struct A *p, struct A *q)
 }
 
 /* { dg-final { scan-tree-dump-times "Folding predicate q_.*to 1" 1 "vrp1" } } */
-/* { dg-final { scan-tree-dump-times "Folding predicate r_.*to 1" 1 "vrp1" } } */
+/* { dg-final { scan-tree-dump-times "Folding predicate r_.*to 1" 1 "evrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp07.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp07.c
index a5bd670..725bcc1 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/vrp07.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp07.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fno-tree-fre -fdump-tree-vrp1-details -fdelete-null-pointer-checks" } */
+/* { dg-options "-O2 -fdisable-tree-evrp -fno-tree-fre -fdump-tree-vrp1-details -fdelete-null-pointer-checks" } */
 
 int
 foo (int i, int *p)
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp09.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp09.c
index d42a566..c2b2d65 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/vrp09.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp09.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fno-tree-fre -fdump-tree-vrp1 -std=gnu89" } */
+/* { dg-options "-O2 -fno-tree-fre -fdump-tree-evrp -std=gnu89" } */
 
 foo (int *p)
 {
@@ -27,4 +27,4 @@ L78:
     }
 }
 
-/* { dg-final { scan-tree-dump-times "Folding predicate p_.. != 0B to 1" 2 "vrp1" } } */
+/* { dg-final { scan-tree-dump-times "Folding predicate p_..... != 0B to 1" 2 "evrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp17.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp17.c
index 4f12103..b8470e7 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/vrp17.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp17.c
@@ -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" } } */
 
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp18.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp18.c
index 008eebb..d7ab3f6 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/vrp18.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp18.c
@@ -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" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp19.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp19.c
index cecacb6..3d47bfd 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/vrp19.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp19.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-fwrapv -O1 -ftree-vrp -fdump-tree-vrp1" } */
+/* { dg-options "-fwrapv -O1 -ftree-vrp -fdump-tree-evrp" } */
 
 #include <limits.h>
 extern void abort ();
@@ -22,5 +22,5 @@ int g (int b) {
 	}
 	return 1;
 }
-/* { dg-final { scan-tree-dump "Folding predicate a_. < 0 to 0" "vrp1" } } */
-/* { dg-final { scan-tree-dump "Folding predicate b_. >= 0 to 1" "vrp1" } } */
+/* { dg-final { scan-tree-dump "Folding predicate a_. < 0 to 0" "evrp" } } */
+/* { dg-final { scan-tree-dump "Folding predicate b_. >= 0 to 1" "evrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp20.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp20.c
index 60d1731..a844b94 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/vrp20.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp20.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-fwrapv -O1 -fno-tree-fre -ftree-vrp -fdump-tree-vrp1" } */
+/* { dg-options "-fwrapv -O1 -fno-tree-fre -ftree-vrp -fdump-tree-evrp" } */
 
 extern void abort ();
 extern void exit (int);
@@ -23,5 +23,5 @@ int g (int b) {
 	return 1;
 }
 
-/* { dg-final { scan-tree-dump "Folding predicate a_. == 0 to 0" "vrp1" } } */
-/* { dg-final { scan-tree-dump "Folding predicate b_. != 0 to 1" "vrp1" } } */
+/* { dg-final { scan-tree-dump "Folding predicate a_.... == 0 to 0" "evrp" } } */
+/* { dg-final { scan-tree-dump "Folding predicate b_.... != 0 to 1" "evrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp23.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp23.c
index ae68c090..855e8f1 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/vrp23.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp23.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fno-tree-forwprop -fdump-tree-vrp1-details" } */
+/* { dg-options "-O2 -fdisable-tree-evrp -fno-tree-forwprop -fdump-tree-vrp1-details" } */
 
 void aa (void);
 void aos (void);
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp24.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp24.c
index 853ee21..1cdd763 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/vrp24.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp24.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fno-tree-forwprop -fdump-tree-vrp1-details" } */
+/* { dg-options "-O2 -fdisable-tree-evrp -fno-tree-forwprop -fdump-tree-vrp1-details" } */
 
 
 struct rtx_def;
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp58.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp58.c
index 5b44ae2..ff9835c 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/vrp58.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp58.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1-details" } */
+/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1-details" } */
 
 long long
 foo (long long a, signed char b, signed char c)
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp92.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp92.c
index 5d53750..213aa47 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/vrp92.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp92.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1-details -fdisable-tree-ethread" } */
+/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1-details -fdisable-tree-ethread" } */
 
 void bar (void);
 int foo (int i, int j)
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp98.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp98.c
index 982f091..704295a 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/vrp98.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp98.c
@@ -1,6 +1,6 @@
 /* { dg-do compile } */
 /* { dg-require-effective-target int128 } */
-/* { dg-options "-Os -fdump-tree-vrp1-details" } */
+/* { dg-options "-Os -fdump-tree-vrp1-details -fdisable-tree-evrp" } */
 
 #include <stdint.h>
 #include <limits.h>
diff --git a/gcc/testsuite/gcc.dg/vrp-min-max-1.c b/gcc/testsuite/gcc.dg/vrp-min-max-1.c
index 270f2bb..375d8d3 100644
--- a/gcc/testsuite/gcc.dg/vrp-min-max-1.c
+++ b/gcc/testsuite/gcc.dg/vrp-min-max-1.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-vrp1 -fdump-tree-mergephi2" } */
+/* { dg-options "-O2 -fdisable-tree-evrp -fdump-tree-vrp1 -fdump-tree-mergephi2" } */
 
 int bar (void);
 
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 7a08be7..f5d8154 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -10666,7 +10666,8 @@ evrp_dom_walker::before_dom_children (basic_block bb)
 	  && gimple_code (stmt) == GIMPLE_COND
 	  && (op0 = gimple_cond_lhs (stmt))
 	  && TREE_CODE (op0) == SSA_NAME
-	  && INTEGRAL_TYPE_P (TREE_TYPE (gimple_cond_lhs (stmt))))
+	  && (INTEGRAL_TYPE_P (TREE_TYPE (gimple_cond_lhs (stmt)))
+	      || POINTER_TYPE_P (TREE_TYPE (gimple_cond_lhs (stmt)))))
 	{
 	  /* Entering a new scope.  Try to see if we can find a VR
 	     here.  */
@@ -10749,12 +10750,23 @@ evrp_dom_walker::before_dom_children (basic_block bb)
 	    set_defs_to_varying (stmt);
 
 	  /* Try folding stmts with the VR discovered.  */
-	  bool did_replace
-	    = replace_uses_in (stmt,
-			       op_with_constant_singleton_value_range);
-	  if (fold_stmt (&gsi, follow_single_use_edges)
-	      || did_replace)
-	    update_stmt (gsi_stmt (gsi));
+	  bool did_replace = false;
+	  if (vrp_fold_stmt (&gsi))
+	    {
+	      did_replace = true;
+	      stmt = gsi_stmt (gsi);
+	      update_stmt (stmt);
+	    }
+
+	  did_replace
+	    |= replace_uses_in (stmt,
+				op_with_constant_singleton_value_range);
+
+	  if (did_replace)
+	    {
+	      fold_stmt (&gsi, follow_single_use_edges);
+	      stmt = gsi_stmt (gsi);
+	    }
 
 	  if (did_replace)
 	    {
@@ -10776,6 +10788,7 @@ evrp_dom_walker::before_dom_children (basic_block bb)
 		  if (TREE_CODE (rhs) == ADDR_EXPR)
 		    recompute_tree_invariant_for_addr_expr (rhs);
 		}
+	      update_stmt (gsi_stmt (gsi));
 	    }
 
 	  def_operand_p def_p = SINGLE_SSA_DEF_OPERAND (stmt, SSA_OP_DEF);
-- 
2.7.4


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [EVRP] Fold stmts with vrp_fold_stmt
  2016-10-03 19:14 [EVRP] Fold stmts with vrp_fold_stmt kugan
@ 2016-10-04  8:56 ` Richard Biener
  2016-10-05  5:58   ` kugan
  0 siblings, 1 reply; 4+ messages in thread
From: Richard Biener @ 2016-10-04  8:56 UTC (permalink / raw)
  To: kugan; +Cc: gcc-patches

On Tue, 4 Oct 2016, kugan wrote:

> Hi,
> 
> This patch improves Early VRP by folding stmts using vrp_fold_stmt as it is
> done in ssa_propagate for VRP.

Why?  I'd like us to move away from the fold_stmt callback of
substitute-and-fold (I have actually started some work towards that).
 
> I have also changed EVRP to handle POINTER_TYPE_P. I will send follow up
> patches to use this in IPA-VRP.

For pointers all VRP does is track non-NULLness.  Can you split out this 
part?

I'm really worried about all the testsuite changes -- it means we are
losing test coverage for VRP :/

Richard.

> Bootstrapped and regression testd on x86_64-linux-gnu with no new regressions.
> Is this OK for trunk?
> 
> Thanks,
> Kugan
> 
> gcc/testsuite/ChangeLog:
> 
> 2016-10-03  Kugan Vivekanandarajah  <kuganv@linaro.org>
> 
> 	* gcc.dg/pr68217.c: Adjust testcase as more cases are now handled in
> 	  evrp.
> 	* gcc.dg/predict-1.c: Likewise.
> 	* gcc.dg/predict-9.c: Likewise.
> 	* gcc.dg/tree-ssa/pr20318.c: Likewise.
> 	* gcc.dg/tree-ssa/pr21001.c: Likewise.
> 	* gcc.dg/tree-ssa/pr21090.c: Likewise.
> 	* gcc.dg/tree-ssa/pr21294.c: Likewise.
> 	* gcc.dg/tree-ssa/pr21559.c: Likewise.
> 	* gcc.dg/tree-ssa/pr21563.c: Likewise.
> 	* gcc.dg/tree-ssa/pr23744.c: Likewise.
> 	* gcc.dg/tree-ssa/pr25382.c: Likewise.
> 	* gcc.dg/tree-ssa/pr61839_1.c: Likewise.
> 	* gcc.dg/tree-ssa/pr68431.c: Likewise.
> 	* gcc.dg/tree-ssa/vrp03.c: Likewise.
> 	* gcc.dg/tree-ssa/vrp07.c: Likewise.
> 	* gcc.dg/tree-ssa/vrp09.c: Likewise.
> 	* gcc.dg/tree-ssa/vrp17.c: Likewise.
> 	* gcc.dg/tree-ssa/vrp18.c: Likewise.
> 	* gcc.dg/tree-ssa/vrp19.c: Likewise.
> 	* gcc.dg/tree-ssa/vrp20.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/tree-ssa/vrp92.c: Likewise.
> 	* gcc.dg/tree-ssa/vrp98.c: Likewise.
> 	* gcc.dg/vrp-min-max-1.c: Likewise.
> 
> gcc/ChangeLog:
> 
> 2016-10-03  Kugan Vivekanandarajah  <kuganv@linaro.org>
> 
> 	* tree-vrp.c (evrp_dom_walker::before_dom_children): Handle
> 	  POINTER_TYPE_P. Also fold stmts with vrp_fold_stmt.
> 

-- 
Richard Biener <rguenther@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [EVRP] Fold stmts with vrp_fold_stmt
  2016-10-04  8:56 ` Richard Biener
@ 2016-10-05  5:58   ` kugan
  2016-10-05  8:50     ` Richard Biener
  0 siblings, 1 reply; 4+ messages in thread
From: kugan @ 2016-10-05  5:58 UTC (permalink / raw)
  To: Richard Biener; +Cc: gcc-patches

[-- Attachment #1: Type: text/plain, Size: 2999 bytes --]

Hi Richard,
Thanks for the review.

On 04/10/16 19:56, Richard Biener wrote:
> On Tue, 4 Oct 2016, kugan wrote:
>
>> Hi,
>>
>> This patch improves Early VRP by folding stmts using vrp_fold_stmt as it is
>> done in ssa_propagate for VRP.
>
> Why?

I thought it would be good for early vrp to simplify stmts using ranges. 
If we simplify obvious cases early, wouldn't it be better for IPA/LTO?

   I'd like us to move away from the fold_stmt callback of
> substitute-and-fold (I have actually started some work towards that).

I must have missed it. But what is the general issue with 
substitute-and-fold.

>
>> I have also changed EVRP to handle POINTER_TYPE_P. I will send follow up
>> patches to use this in IPA-VRP.
>
> For pointers all VRP does is track non-NULLness.  Can you split out this
> part?
Attached patch does that.

> I'm really worried about all the testsuite changes -- it means we are
> losing test coverage for VRP :/

As you said earlier, unit testing with gimple FE should help. I am also 
wondering if we should organize these testcases such that it is run once 
without evrp and once with evrp to test both?

Thanks,
Kugan

gcc/ChangeLog:

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

	* tree-vrp.c (evrp_dom_walker::before_dom_children): Handle
	  POINTER_TYPE_P.


gcc/testsuite/ChangeLog:

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

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

>
> Richard.
>
>> Bootstrapped and regression testd on x86_64-linux-gnu with no new regressions.
>> Is this OK for trunk?
>>
>> Thanks,
>> Kugan
>>
>> gcc/testsuite/ChangeLog:
>>
>> 2016-10-03  Kugan Vivekanandarajah  <kuganv@linaro.org>
>>
>> 	* gcc.dg/pr68217.c: Adjust testcase as more cases are now handled in
>> 	  evrp.
>> 	* gcc.dg/predict-1.c: Likewise.
>> 	* gcc.dg/predict-9.c: Likewise.
>> 	* gcc.dg/tree-ssa/pr20318.c: Likewise.
>> 	* gcc.dg/tree-ssa/pr21001.c: Likewise.
>> 	* gcc.dg/tree-ssa/pr21090.c: Likewise.
>> 	* gcc.dg/tree-ssa/pr21294.c: Likewise.
>> 	* gcc.dg/tree-ssa/pr21559.c: Likewise.
>> 	* gcc.dg/tree-ssa/pr21563.c: Likewise.
>> 	* gcc.dg/tree-ssa/pr23744.c: Likewise.
>> 	* gcc.dg/tree-ssa/pr25382.c: Likewise.
>> 	* gcc.dg/tree-ssa/pr61839_1.c: Likewise.
>> 	* gcc.dg/tree-ssa/pr68431.c: Likewise.
>> 	* gcc.dg/tree-ssa/vrp03.c: Likewise.
>> 	* gcc.dg/tree-ssa/vrp07.c: Likewise.
>> 	* gcc.dg/tree-ssa/vrp09.c: Likewise.
>> 	* gcc.dg/tree-ssa/vrp17.c: Likewise.
>> 	* gcc.dg/tree-ssa/vrp18.c: Likewise.
>> 	* gcc.dg/tree-ssa/vrp19.c: Likewise.
>> 	* gcc.dg/tree-ssa/vrp20.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/tree-ssa/vrp92.c: Likewise.
>> 	* gcc.dg/tree-ssa/vrp98.c: Likewise.
>> 	* gcc.dg/vrp-min-max-1.c: Likewise.
>>
>> gcc/ChangeLog:
>>
>> 2016-10-03  Kugan Vivekanandarajah  <kuganv@linaro.org>
>>
>> 	* tree-vrp.c (evrp_dom_walker::before_dom_children): Handle
>> 	  POINTER_TYPE_P. Also fold stmts with vrp_fold_stmt.
>>
>

[-- Attachment #2: 0001-Handle-pointer-type-in-evrp.patch --]
[-- Type: text/x-patch, Size: 1522 bytes --]

From c9badd0cee1433af67ba5e1a45a90b4b659a244f Mon Sep 17 00:00:00 2001
From: Kugan Vivekanandarajah <kugan.vivekanandarajah@linaro.org>
Date: Mon, 3 Oct 2016 06:12:05 +1100
Subject: [PATCH 1/5] Handle pointer type in evrp

---
 gcc/testsuite/gcc.dg/tree-ssa/evrp4.c | 20 ++++++++++++++++++++
 gcc/tree-vrp.c                        |  3 ++-
 2 files changed, 22 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/evrp4.c

diff --git a/gcc/testsuite/gcc.dg/tree-ssa/evrp4.c b/gcc/testsuite/gcc.dg/tree-ssa/evrp4.c
new file mode 100644
index 0000000..ebb87ed
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/evrp4.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-evrp" } */
+
+int foo (int *p);
+
+struct st
+{
+  int a;
+  int b;
+};
+
+int bar (struct st *s)
+{
+
+  if (!s)
+    return 0;
+  foo (&s->a);
+}
+
+/* { dg-final { scan-tree-dump "\~\\\[0B, 0B\\\]" "evrp" } } */
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 7a08be7..46bbd82 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -10666,7 +10666,8 @@ evrp_dom_walker::before_dom_children (basic_block bb)
 	  && gimple_code (stmt) == GIMPLE_COND
 	  && (op0 = gimple_cond_lhs (stmt))
 	  && TREE_CODE (op0) == SSA_NAME
-	  && INTEGRAL_TYPE_P (TREE_TYPE (gimple_cond_lhs (stmt))))
+	  && (INTEGRAL_TYPE_P (TREE_TYPE (gimple_cond_lhs (stmt)))
+	      || POINTER_TYPE_P (TREE_TYPE (gimple_cond_lhs (stmt)))))
 	{
 	  /* Entering a new scope.  Try to see if we can find a VR
 	     here.  */
-- 
2.7.4


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [EVRP] Fold stmts with vrp_fold_stmt
  2016-10-05  5:58   ` kugan
@ 2016-10-05  8:50     ` Richard Biener
  0 siblings, 0 replies; 4+ messages in thread
From: Richard Biener @ 2016-10-05  8:50 UTC (permalink / raw)
  To: kugan; +Cc: gcc-patches

On Wed, 5 Oct 2016, kugan wrote:

> Hi Richard,
> Thanks for the review.
> 
> On 04/10/16 19:56, Richard Biener wrote:
> > On Tue, 4 Oct 2016, kugan wrote:
> > 
> > > Hi,
> > > 
> > > This patch improves Early VRP by folding stmts using vrp_fold_stmt as it
> > > is
> > > done in ssa_propagate for VRP.
> > 
> > Why?
> 
> I thought it would be good for early vrp to simplify stmts using ranges. If we
> simplify obvious cases early, wouldn't it be better for IPA/LTO?
> 
>   I'd like us to move away from the fold_stmt callback of
> > substitute-and-fold (I have actually started some work towards that).
> 
> I must have missed it. But what is the general issue with 
> substitute-and-fold.

The pass specific stmt folding hook is a distraction and causes extra
work.  Most of the things the CCP variant does are no longer necessary
for example.  First and foremost I'm trying to enable "dce" in
substitute-and-fold for VRP and handle ASSERT_EXPR "removal" by
means of propagation -- this should fix quite a few missed pattern
matchings with fold_stmt which when running into ASSERT_EXPRs just
give up.

> > 
> > > I have also changed EVRP to handle POINTER_TYPE_P. I will send follow up
> > > patches to use this in IPA-VRP.
> > 
> > For pointers all VRP does is track non-NULLness.  Can you split out this
> > part?
> Attached patch does that.

That patch is ok.

> > I'm really worried about all the testsuite changes -- it means we are
> > losing test coverage for VRP :/
> 
> As you said earlier, unit testing with gimple FE should help. I am also
> wondering if we should organize these testcases such that it is run once
> without evrp and once with evrp to test both?

Yeah, that would be nice.  I always wondered about adding the ability
to add a "local torture" to individual testcases, say

{ dg-do compile }
{ dg-torture-options { "-O2 -fdisable-tree-evrp" "-O2" } }

(and make it be "additional" torture options when in dg-torture.exp)

Requires TCL hacking which isn't exactly my favourite...

Alternatively (seen elsewhere) put the testcase in a header and
have two testcases include it, with different dg-options ...

Richard.

> Thanks,
> Kugan
> 
> gcc/ChangeLog:
> 
> 2016-10-05  Kugan Vivekanandarajah  <kuganv@linaro.org>
> 
> 	* tree-vrp.c (evrp_dom_walker::before_dom_children): Handle
> 	  POINTER_TYPE_P.
> 
> 
> gcc/testsuite/ChangeLog:
> 
> 2016-10-05  Kugan Vivekanandarajah  <kuganv@linaro.org>
> 
> 	* gcc.dg/tree-ssa/evrp4.c: New test.
> 
> > 
> > Richard.
> > 
> > > Bootstrapped and regression testd on x86_64-linux-gnu with no new
> > > regressions.
> > > Is this OK for trunk?
> > > 
> > > Thanks,
> > > Kugan
> > > 
> > > gcc/testsuite/ChangeLog:
> > > 
> > > 2016-10-03  Kugan Vivekanandarajah  <kuganv@linaro.org>
> > > 
> > > 	* gcc.dg/pr68217.c: Adjust testcase as more cases are now handled in
> > > 	  evrp.
> > > 	* gcc.dg/predict-1.c: Likewise.
> > > 	* gcc.dg/predict-9.c: Likewise.
> > > 	* gcc.dg/tree-ssa/pr20318.c: Likewise.
> > > 	* gcc.dg/tree-ssa/pr21001.c: Likewise.
> > > 	* gcc.dg/tree-ssa/pr21090.c: Likewise.
> > > 	* gcc.dg/tree-ssa/pr21294.c: Likewise.
> > > 	* gcc.dg/tree-ssa/pr21559.c: Likewise.
> > > 	* gcc.dg/tree-ssa/pr21563.c: Likewise.
> > > 	* gcc.dg/tree-ssa/pr23744.c: Likewise.
> > > 	* gcc.dg/tree-ssa/pr25382.c: Likewise.
> > > 	* gcc.dg/tree-ssa/pr61839_1.c: Likewise.
> > > 	* gcc.dg/tree-ssa/pr68431.c: Likewise.
> > > 	* gcc.dg/tree-ssa/vrp03.c: Likewise.
> > > 	* gcc.dg/tree-ssa/vrp07.c: Likewise.
> > > 	* gcc.dg/tree-ssa/vrp09.c: Likewise.
> > > 	* gcc.dg/tree-ssa/vrp17.c: Likewise.
> > > 	* gcc.dg/tree-ssa/vrp18.c: Likewise.
> > > 	* gcc.dg/tree-ssa/vrp19.c: Likewise.
> > > 	* gcc.dg/tree-ssa/vrp20.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/tree-ssa/vrp92.c: Likewise.
> > > 	* gcc.dg/tree-ssa/vrp98.c: Likewise.
> > > 	* gcc.dg/vrp-min-max-1.c: Likewise.
> > > 
> > > gcc/ChangeLog:
> > > 
> > > 2016-10-03  Kugan Vivekanandarajah  <kuganv@linaro.org>
> > > 
> > > 	* tree-vrp.c (evrp_dom_walker::before_dom_children): Handle
> > > 	  POINTER_TYPE_P. Also fold stmts with vrp_fold_stmt.
> > > 
> > 
> 

-- 
Richard Biener <rguenther@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2016-10-05  8:50 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-10-03 19:14 [EVRP] Fold stmts with vrp_fold_stmt kugan
2016-10-04  8:56 ` Richard Biener
2016-10-05  5:58   ` kugan
2016-10-05  8:50     ` Richard Biener

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).