diff --git a/gcc/testsuite/g++.dg/opt/pr99305.C b/gcc/testsuite/g++.dg/opt/pr99305.C new file mode 100644 index 000000000000..8a91277e7928 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr99305.C @@ -0,0 +1,26 @@ +// PR tree-optimization/99305 +// { dg-do compile } +// { dg-options "-O3 -fno-ipa-icf -fdump-tree-optimized" } +// { dg-final { scan-tree-dump-times " = \\\(unsigned char\\\) c_\[0-9]*\\\(D\\\);" 3 "optimized" } } +// { dg-final { scan-tree-dump-times " = \[^\n\r]* \\+ \[0-9]*;" 3 "optimized" } } +// { dg-final { scan-tree-dump-times " = \[^\n\r]* <= 9;" 3 "optimized" } } +// { dg-final { scan-tree-dump-not "if \\\(c_\[0-9]*\\\(D\\\) \[!=]= 0\\\)" "optimized" } } +// { dg-final { scan-tree-dump-not " = PHI <" "optimized" } } + +bool +foo (char c) +{ + return c >= 48 && c <= 57; +} + +bool +bar (char c) +{ + return c != 0 && foo (c); +} + +bool +baz (char c) +{ + return c != 0 && c >= 48 && c <= 57; +} diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c index ddd9d531b13c..aa48f447d23c 100644 --- a/gcc/tree-ssa-phiopt.c +++ b/gcc/tree-ssa-phiopt.c @@ -808,14 +808,14 @@ conditional_replacement (basic_block cond_bb, basic_block middle_bb, nonzero_arg = arg0; else return false; - if (integer_all_onesp (nonzero_arg)) - neg = true; - else if (integer_pow2p (nonzero_arg)) + if (integer_pow2p (nonzero_arg)) { shift = tree_log2 (nonzero_arg); if (shift && POINTER_TYPE_P (TREE_TYPE (nonzero_arg))) return false; } + else if (integer_all_onesp (nonzero_arg)) + neg = true; else return false;