@@ -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;
@@ -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);
@@ -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;