aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2020-11-19 17:41:30 -0500
committerAndrew MacLeod <amacleod@redhat.com>2020-11-19 17:41:30 -0500
commitd0d8b5d83614d8f0d0e40c0520d4f40ffa01f8d9 (patch)
treeb3e41b7114dececa7aad5faf4b314771673d2b2a /gcc/testsuite/gcc.dg
parent5bba2215c23d71ea08fb81656d93041229f7ea9c (diff)
downloadgcc-d0d8b5d83614d8f0d0e40c0520d4f40ffa01f8d9.zip
gcc-d0d8b5d83614d8f0d0e40c0520d4f40ffa01f8d9.tar.gz
gcc-d0d8b5d83614d8f0d0e40c0520d4f40ffa01f8d9.tar.bz2
Process only valid shift ranges.
When shifting outside the valid range of [0, precision-1], we can choose to process just the valid ones since the rest is undefined. this allows us to produce results for x << [0,2][+INF, +INF] by discarding the invalid ranges and processing just [0,2]. gcc/ PR tree-optimization/93781 * range-op.cc (get_shift_range): Rename from undefined_shift_range_check and now return valid shift ranges. (operator_lshift::fold_range): Use result from get_shift_range. (operator_rshift::fold_range): Ditto. gcc/testsuite/ * gcc.dg/tree-ssa/pr93781-1.c: New. * gcc.dg/tree-ssa/pr93781-2.c: New. * gcc.dg/tree-ssa/pr93781-3.c: New.
Diffstat (limited to 'gcc/testsuite/gcc.dg')
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr93781-1.c18
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr93781-2.c17
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr93781-3.c21
3 files changed, 56 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr93781-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr93781-1.c
new file mode 100644
index 0000000..5ebd805
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr93781-1.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-evrp" } */
+
+void kill (void);
+
+void foo (unsigned int arg)
+{
+ int a = arg - 3;
+ unsigned int b = 4;
+ int x = 0x1 << arg;
+
+ if (a < 0)
+ b = x;
+
+ /* In the fullness of time, we will delete this call. */
+ if (b >= 5)
+ kill ();;
+}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr93781-2.c b/gcc/testsuite/gcc.dg/tree-ssa/pr93781-2.c
new file mode 100644
index 0000000..c9b2878
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr93781-2.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-evrp" } */
+
+void kill (void);
+
+void foo (unsigned int arg)
+{
+ unsigned int C000003FE = 4;
+
+ if (arg + 1 < 4) // work for if (arg < 3)
+ C000003FE = 0x1 << arg;
+
+ if (C000003FE >= 5)
+ kill ();
+}
+
+/* { dg-final { scan-tree-dump-not "kill" "evrp" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr93781-3.c b/gcc/testsuite/gcc.dg/tree-ssa/pr93781-3.c
new file mode 100644
index 0000000..e1d2be0
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr93781-3.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-evrp" } */
+
+void kill (void);
+
+void foo (unsigned int arg)
+{
+ int a = arg - 3;
+ unsigned int b = 4;
+
+ if (a < 0)
+ {
+ int x = 0x1 << arg;
+ b = x;
+ }
+
+ if (b >= 5)
+ kill ();
+}
+
+/* { dg-final { scan-tree-dump-not "kill" "evrp" } } */