This patch adds 3 new evrp testcases which test some enhanced ranger
functionality in EVRP.
I pulled them from the old rvrp testsuite that was created when the
ranger project was first started, and they are things EVRP didn't use to
get.
Andrew
commit 0d1189b4e618517b62f938a94c722123cc0ef5f5
Author: Andrew MacLeod <amacl...@redhat.com>
Date: Fri Nov 13 11:40:41 2020 -0500
Add 3 new EVRP testcases.
test new evrp functionality.
gcc/testsuite/
* gcc.dg/tree-ssa/evrp20.c
* gcc.dg/tree-ssa/evrp21.c
* gcc.dg/tree-ssa/evrp22.c
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/evrp20.c b/gcc/testsuite/gcc.dg/tree-ssa/evrp20.c
new file mode 100644
index 00000000000..7d4d55f7638
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/evrp20.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-evrp" } */
+
+void call (void);
+
+void foo (int base)
+{
+ unsigned i;
+
+ // Ranger should be able to remove the (i > 123) comparison.
+ for (i = base; i < 10; i++)
+ if (i > 123)
+ {
+ call ();
+ return;
+ }
+}
+
+/* { dg-final { scan-tree-dump-not "call" "evrp"} } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/evrp21.c b/gcc/testsuite/gcc.dg/tree-ssa/evrp21.c
new file mode 100644
index 00000000000..dae788cc2b6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/evrp21.c
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-evrp" } */
+
+extern void vrp_keep (void);
+extern void vrp_kill (void);
+
+void
+f2 (int s, int b)
+{
+ if (s > 4)
+ s = 4;
+ if (s < -16)
+ s = -16;
+ /* s in [-16, 4]. */
+ b = (b & 1) + 1;
+ /* b in range [1, 2]. */
+ b = s << b;
+ /* b in range [-64, 16]. */
+ if (b == -2)
+ vrp_keep ();
+ if (b <= -65)
+ vrp_kill ();
+ if (b >= 17)
+ vrp_kill ();
+}
+
+/* { dg-final { scan-tree-dump-times "vrp_keep \\(" 1 "evrp"} } */
+/* { dg-final { scan-tree-dump-times "vrp_kill \\(" 0 "evrp"} } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/evrp22.c b/gcc/testsuite/gcc.dg/tree-ssa/evrp22.c
new file mode 100644
index 00000000000..3dd47e55d04
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/evrp22.c
@@ -0,0 +1,43 @@
+/* See backwards thru casts if the range fits the LHS type. */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-evrp" } */
+
+extern void kill(int i);
+extern void keep(int i);
+
+void
+foo (int i)
+{
+ if (i >= 10)
+ {
+ if (i <= 100)
+ {
+ /* i has a range of [10, 100] */
+ char c = (char) i;
+ if (c < 30)
+ {
+ /* If we wind back thru the cast with the range of c being [10,29]
+ * from the branch, and recognize that the range of i fits within
+ * a cast to c, then there is no missing information in a cast
+ * back to int. We can use the range calculated for 'c' with 'i'
+ * as well and Ranger should be able to kill the call. */
+ if (i > 29)
+ kill (i);
+ }
+ }
+ /* i has a range of [10, MAX] */
+ char d = (char) i;
+ if (d < 30)
+ {
+ /* Here, a cast to a char and back is NOT equivalent, so we cannot use
+ * the value of d to remove the call. */
+ if (i > 29)
+ keep (i);
+ }
+
+ }
+}
+
+/* { dg-final { scan-tree-dump-times "kill \\(" 0 "evrp"} } */
+/* { dg-final { scan-tree-dump-times "keep \\(" 1 "evrp"} } */
+