diff options
author | Andrew MacLeod <amacleod@redhat.com> | 2020-11-19 17:41:30 -0500 |
---|---|---|
committer | Andrew MacLeod <amacleod@redhat.com> | 2020-11-19 17:41:30 -0500 |
commit | d0d8b5d83614d8f0d0e40c0520d4f40ffa01f8d9 (patch) | |
tree | b3e41b7114dececa7aad5faf4b314771673d2b2a /gcc/testsuite | |
parent | 5bba2215c23d71ea08fb81656d93041229f7ea9c (diff) | |
download | gcc-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')
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr93781-1.c | 18 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr93781-2.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr93781-3.c | 21 |
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" } } */ |