From: Andrew MacLeod Date: Wed, 12 Jan 2022 18:31:08 +0000 (-0500) Subject: Allow more precision when querying from fold_const. X-Git-Tag: basepoints/gcc-13~1754 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=49d5fb4feee831868d80fff4d024c271911c92ca;p=thirdparty%2Fgcc.git Allow more precision when querying from fold_const. fold_const::expr_not_equal_to queries for a current range, but still uses the old value_range class. This is causing it to miss opportunities when ranger can provide something better. PR tree-optimization/83072 PR tree-optimization/83073 PR tree-optimization/97909 gcc/ * fold-const.c (expr_not_equal_to): Use a multi-range class. gcc/testsuite/ * gcc.dg/pr83072-2.c: New. * gcc.dg/pr83073.c: New. --- diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 397fa9a03a10..cd540e1f2b3c 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -10734,7 +10734,7 @@ tree_expr_nonzero_p (tree t) bool expr_not_equal_to (tree t, const wide_int &w) { - value_range vr; + int_range_max vr; switch (TREE_CODE (t)) { case INTEGER_CST: diff --git a/gcc/testsuite/gcc.dg/pr83072-2.c b/gcc/testsuite/gcc.dg/pr83072-2.c new file mode 100644 index 000000000000..f495f2582c43 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr83072-2.c @@ -0,0 +1,18 @@ +/* { dg-do compile} */ +/* { dg-options "-O2 -fdump-tree-evrp-details" } */ + +int f1(int a, int b, int c){ + if(c==0)__builtin_unreachable(); + a *= c; + b *= c; + return a == b; +} + +int f2(int a, int b, int c){ + c |= 1; + a *= c; + b *= c; + return a == b; +} + +/* { dg-final { scan-tree-dump-times "gimple_simplified to" 2 "evrp" } } */ diff --git a/gcc/testsuite/gcc.dg/pr83073.c b/gcc/testsuite/gcc.dg/pr83073.c new file mode 100644 index 000000000000..1168ae822a41 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr83073.c @@ -0,0 +1,10 @@ +/* { dg-do compile} */ +/* { dg-options "-O2 -fdump-tree-evrp-details -fno-tree-fre -fno-tree-ccp -fno-tree-forwprop" } */ + +int f(int x) +{ + x = x|1; + return x & 1; +} + +/* { dg-final { scan-tree-dump "gimple_simplified to.* = 1" "evrp" } } */