aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-strlen.c
diff options
context:
space:
mode:
authorMartin Sebor <msebor@redhat.com>2019-06-14 02:07:02 +0000
committerMartin Sebor <msebor@gcc.gnu.org>2019-06-13 20:07:02 -0600
commitbc09939dad30f42d89f0ee90cad1033fb32edb85 (patch)
tree4cf3d886c39f8679d0cec4db8581e82d3030d845 /gcc/tree-ssa-strlen.c
parentd4b5b8eaa4227c84b9519336dce3b8c7c5561295 (diff)
downloadgcc-bc09939dad30f42d89f0ee90cad1033fb32edb85.zip
gcc-bc09939dad30f42d89f0ee90cad1033fb32edb85.tar.gz
gcc-bc09939dad30f42d89f0ee90cad1033fb32edb85.tar.bz2
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. From-SVN: r272281
Diffstat (limited to 'gcc/tree-ssa-strlen.c')
-rw-r--r--gcc/tree-ssa-strlen.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c
index 944650c..7369a73 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;