From 4549e889f2d5f7494aca4f3de6c095029fb5d26d Mon Sep 17 00:00:00 2001 From: msebor Date: Fri, 14 Jun 2019 02:07:02 +0000 Subject: [PATCH] PR tree-optimization/90662 - strlen of a string in a vla plus offset not folded gcc/ChangeLog: PR tree-optimization/90662 * tree-ssa-strlen.c (get_stridx): Convert fold_build2 operands to the same type. gcc/testsuite/ChangeLog: PR tree-optimization/90662 * gcc.dg/pr90866-2.c: New test. * gcc.dg/pr90866.c: Ditto. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@272281 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.dg/pr90866-2.c | 24 ++++++++++++++++++++++++ gcc/testsuite/gcc.dg/pr90866.c | 18 ++++++++++++++++++ gcc/tree-ssa-strlen.c | 14 ++++++++++---- 5 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr90866-2.c create mode 100644 gcc/testsuite/gcc.dg/pr90866.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 09e05e697432..cbf0f02da0c6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-06-13 Martin Sebor + + PR tree-optimization/90662 + * tree-ssa-strlen.c (get_stridx): Convert fold_build2 operands + to the same type. + 2019-06-13 Jan Hubicka PR bootstrap/90873 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7032352934c8..bff5bbcddf79 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2019-06-13 Martin Sebor + + PR tree-optimization/90662 + * gcc.dg/pr90866-2.c: New test. + * gcc.dg/pr90866.c: Ditto. + 2019-06-13 Jiufu Guo Lijia He diff --git a/gcc/testsuite/gcc.dg/pr90866-2.c b/gcc/testsuite/gcc.dg/pr90866-2.c new file mode 100644 index 000000000000..8c110498154a --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr90866-2.c @@ -0,0 +1,24 @@ +/* PR tree-optimization/90866 - ICE in fold_binary_loc, at fold-const.c:9827 + { dg-do compile } + { dg-options "-O2 -fsanitize=thread" } */ + +typedef enum { a } b; +typedef struct { + int c[0]; +} d; +typedef struct { + int *data; +} e; +typedef struct { + e buffer; +} f; +int g, h; +int i(); +int i(f *j, d *k, b l, int m) { + if (l) + if (m) { + h = j->buffer.data[0]; + k->c[g] = k->c[g] * 8; + } + return 0; +} diff --git a/gcc/testsuite/gcc.dg/pr90866.c b/gcc/testsuite/gcc.dg/pr90866.c new file mode 100644 index 000000000000..66c92ee7826a --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr90866.c @@ -0,0 +1,18 @@ +/* PR tree-optimization/90866 - ICE in fold_binary_loc, at fold-const.c:9827 + { dg-do compile } + { dg-options "-O3 -Wall -fno-tree-loop-optimize" } */ + +int a[1024], b[1024]; + +void f (void) +{ + int i = 0; + for ( ; ; i++) + { + b[16] = a[i * 16 + 10]; + b[i * 16 + 11] = a[i * 16 + 11] * 3; + b[i * 16 + 12] = a[i * 16 + 12] * 4; + b[i * 16 + 13] = a[i * 16 + 13] * 4; + b[i * 16 + 14] = a[i * 16 + 14] * 3; + } +} diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c index 944650cecd53..7369a73ecc53 100644 --- a/gcc/tree-ssa-strlen.c +++ b/gcc/tree-ssa-strlen.c @@ -322,11 +322,17 @@ get_stridx (tree exp) if (TREE_CODE (ptr) == ARRAY_REF) { off = TREE_OPERAND (ptr, 1); - /* Scale the array index by the size of the element - type (normally 1 for char). */ - off = fold_build2 (MULT_EXPR, TREE_TYPE (off), off, - eltsize); ptr = TREE_OPERAND (ptr, 0); + if (!integer_onep (eltsize)) + { + /* Scale the array index by the size of the element + type in the rare case that it's greater than + the typical 1 for char, making sure both operands + have the same type. */ + eltsize = fold_convert (ssizetype, eltsize); + off = fold_convert (ssizetype, off); + off = fold_build2 (MULT_EXPR, ssizetype, off, eltsize); + } } else off = integer_zero_node; -- 2.39.2