summaryrefslogtreecommitdiff
path: root/0051-Backport-phiopt-Fix-up-conditional_replacement-PR993.patch
diff options
context:
space:
mode:
Diffstat (limited to '0051-Backport-phiopt-Fix-up-conditional_replacement-PR993.patch')
-rw-r--r--0051-Backport-phiopt-Fix-up-conditional_replacement-PR993.patch92
1 files changed, 92 insertions, 0 deletions
diff --git a/0051-Backport-phiopt-Fix-up-conditional_replacement-PR993.patch b/0051-Backport-phiopt-Fix-up-conditional_replacement-PR993.patch
new file mode 100644
index 0000000..3d47670
--- /dev/null
+++ b/0051-Backport-phiopt-Fix-up-conditional_replacement-PR993.patch
@@ -0,0 +1,92 @@
+From 79a974bc7bb67cf425a7839f3c1f5689e41c7ee8 Mon Sep 17 00:00:00 2001
+From: Jakub Jelinek <jakub@redhat.com>
+Date: Tue, 9 Mar 2021 19:13:11 +0100
+Subject: [PATCH 03/35] [Backport] phiopt: Fix up conditional_replacement
+ [PR99305]
+
+Reference: https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;h=b610c30453d8e4cc88693d85a5a100d089640be5
+
+Before my PR97690 changes, conditional_replacement would not set neg
+when the nonzero arg was boolean true.
+I've simplified the testing, so that it first finds the zero argument
+and then checks the other argument for all the handled cases
+(1, -1 and 1 << X, where the last case is what the patch added support for).
+But, unfortunately I've placed the integer_all_onesp test first.
+For unsigned precision 1 types such as bool integer_all_onesp, integer_onep
+and integer_pow2p can all be true and the code set neg to true in that case,
+which is undesirable.
+
+The following patch tests integer_pow2p first (which is trivially true
+for integer_onep too and tree_log2 in that case gives shift == 0)
+and only if that isn't the case, integer_all_onesp.
+
+2021-03-09 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/99305
+ * tree-ssa-phiopt.c (conditional_replacement): Test integer_pow2p
+ before integer_all_onesp instead of vice versa.
+
+ * g++.dg/opt/pr99305.C: New test.
+---
+ gcc/testsuite/g++.dg/opt/pr99305.C | 26 ++++++++++++++++++++++++++
+ gcc/tree-ssa-phiopt.c | 6 +++---
+ 2 files changed, 29 insertions(+), 3 deletions(-)
+ create mode 100644 gcc/testsuite/g++.dg/opt/pr99305.C
+
+diff --git a/gcc/testsuite/g++.dg/opt/pr99305.C b/gcc/testsuite/g++.dg/opt/pr99305.C
+new file mode 100644
+index 000000000..8a91277e7
+--- /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 85587e8d1..b9be28474 100644
+--- a/gcc/tree-ssa-phiopt.c
++++ b/gcc/tree-ssa-phiopt.c
+@@ -774,14 +774,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;
+
+--
+2.27.0.windows.1
+