aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2022-06-01 14:13:01 +0200
committerRichard Biener <rguenther@suse.de>2022-06-01 15:17:42 +0200
commit57a8fb92ac4161ebbf9381b009e8c5af843e3e5f (patch)
tree559ecb64f3bd41383441f26dc15e2f12ce3d0339
parent0d5cc976a36af07c9790c38a99a0b98110c89795 (diff)
downloadgcc-57a8fb92ac4161ebbf9381b009e8c5af843e3e5f.zip
gcc-57a8fb92ac4161ebbf9381b009e8c5af843e3e5f.tar.gz
gcc-57a8fb92ac4161ebbf9381b009e8c5af843e3e5f.tar.bz2
tree-optimization/105786 - avoid strlen replacement for pointers
This avoids matching strlen to a pointer result, avoiding ICEing because of an integer adjustment using PLUS_EXPR on pointers. 2022-06-01 Richard Biener <rguenther@suse.de> PR tree-optimization/105786 * tree-loop-distribution.cc (loop_distribution::transform_reduction_loop): Only do strlen replacement for integer type reductions. * gcc.dg/torture/pr105786.c: New testcase.
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr105786.c13
-rw-r--r--gcc/tree-loop-distribution.cc1
2 files changed, 14 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/torture/pr105786.c b/gcc/testsuite/gcc.dg/torture/pr105786.c
new file mode 100644
index 0000000..64aacf7
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr105786.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+
+void sink(const char*);
+static const char *a;
+int main()
+{
+ const char *b = a;
+ for (int i = 0; i < 2; ++i)
+ while (*b++)
+ ;
+ sink(b);
+ return 0;
+}
diff --git a/gcc/tree-loop-distribution.cc b/gcc/tree-loop-distribution.cc
index db6e909..086b59c 100644
--- a/gcc/tree-loop-distribution.cc
+++ b/gcc/tree-loop-distribution.cc
@@ -3658,6 +3658,7 @@ loop_distribution::transform_reduction_loop (loop_p loop)
/* Handle strlen like loops. */
if (store_dr == NULL
&& integer_zerop (pattern)
+ && INTEGRAL_TYPE_P (TREE_TYPE (reduction_var))
&& TREE_CODE (reduction_iv.base) == INTEGER_CST
&& TREE_CODE (reduction_iv.step) == INTEGER_CST
&& integer_onep (reduction_iv.step))