aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2022-07-12 09:37:13 +0200
committerAldy Hernandez <aldyh@redhat.com>2022-07-13 16:25:28 +0200
commit1184f677d6e17033572ecc5e97ea5ee627627908 (patch)
tree2bcbdcd5264a740f41cef764d07b0d6229c17ab8 /gcc
parent554b21edb9ec91a898125d4915d790c6d4b9a688 (diff)
downloadgcc-1184f677d6e17033572ecc5e97ea5ee627627908.zip
gcc-1184f677d6e17033572ecc5e97ea5ee627627908.tar.gz
gcc-1184f677d6e17033572ecc5e97ea5ee627627908.tar.bz2
Use nonzero bits in range-ops to determine if < 0 is false.
For a signed integer, x < 0 is false if the sign bit in the nonzero bits of X is clear. Both CCP and ipa-cp can set the global nonzero bits in a range, which means we can now use some of that information in evrp and subsequent passes. I've adjusted two tests which now fold things earlier because of this optimization. Tested on x86-64 Linux. gcc/ChangeLog: * range-op.cc (operator_lt::fold_range): Use nonzero bits. gcc/testsuite/ChangeLog: * g++.dg/ipa/pure-const-3.C: Adjust. * gcc.dg/pr102983.c: Adjust.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/range-op.cc3
-rw-r--r--gcc/testsuite/g++.dg/ipa/pure-const-3.C2
-rw-r--r--gcc/testsuite/gcc.dg/pr102983.c2
3 files changed, 5 insertions, 2 deletions
diff --git a/gcc/range-op.cc b/gcc/range-op.cc
index 0e16408..e184129 100644
--- a/gcc/range-op.cc
+++ b/gcc/range-op.cc
@@ -803,6 +803,9 @@ operator_lt::fold_range (irange &r, tree type,
r = range_true (type);
else if (!wi::lt_p (op1.lower_bound (), op2.upper_bound (), sign))
r = range_false (type);
+ // Use nonzero bits to determine if < 0 is false.
+ else if (op2.zero_p () && !wi::neg_p (op1.get_nonzero_bits (), sign))
+ r = range_false (type);
else
r = range_true_and_false (type);
return true;
diff --git a/gcc/testsuite/g++.dg/ipa/pure-const-3.C b/gcc/testsuite/g++.dg/ipa/pure-const-3.C
index 172a36b..b4a4673 100644
--- a/gcc/testsuite/g++.dg/ipa/pure-const-3.C
+++ b/gcc/testsuite/g++.dg/ipa/pure-const-3.C
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -fno-ipa-vrp -fdump-tree-optimized -fno-tree-ccp" } */
+/* { dg-options "-O2 -fno-ipa-vrp -fdump-tree-optimized -fno-tree-ccp -fdisable-tree-evrp" } */
int *ptr;
static int barvar;
static int b(int a);
diff --git a/gcc/testsuite/gcc.dg/pr102983.c b/gcc/testsuite/gcc.dg/pr102983.c
index ef58af6..e1bd24b 100644
--- a/gcc/testsuite/gcc.dg/pr102983.c
+++ b/gcc/testsuite/gcc.dg/pr102983.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-evrp" } */
+/* { dg-options "-O2 -fdump-tree-evrp -fno-tree-ccp" } */
void foo(void);
static int a = 1;