aboutsummaryrefslogtreecommitdiff
path: root/gcc/fold-const.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2011-03-15 09:49:33 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2011-03-15 09:49:33 +0000
commit17dea42fc45256b06cb19bc36b18e77fdc0f20a6 (patch)
tree9ed7abab94bb943b76eaad5f4ca9db1c4dbf7235 /gcc/fold-const.c
parent01c77a60551535ea2326f7e72723cd8962a64eb1 (diff)
downloadgcc-17dea42fc45256b06cb19bc36b18e77fdc0f20a6.zip
gcc-17dea42fc45256b06cb19bc36b18e77fdc0f20a6.tar.gz
gcc-17dea42fc45256b06cb19bc36b18e77fdc0f20a6.tar.bz2
re PR tree-optimization/48031 (gcc.c-torture/compile/pr42956.c ICEs gcc on m68k-linux, ivopts related?)
2011-03-15 Richard Guenther <rguenther@suse.de> PR middle-end/48031 * fold-const.c (fold_indirect_ref_1): Do not create new variable-sized or variable-indexed array accesses when in gimple form. From-SVN: r170983
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r--gcc/fold-const.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 354aa4f..5d92e0d 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -15562,12 +15562,17 @@ fold_indirect_ref_1 (location_t loc, tree type, tree op0)
}
/* *(foo *)&fooarray => fooarray[0] */
else if (TREE_CODE (optype) == ARRAY_TYPE
- && type == TREE_TYPE (optype))
+ && type == TREE_TYPE (optype)
+ && (!in_gimple_form
+ || TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST))
{
tree type_domain = TYPE_DOMAIN (optype);
tree min_val = size_zero_node;
if (type_domain && TYPE_MIN_VALUE (type_domain))
min_val = TYPE_MIN_VALUE (type_domain);
+ if (in_gimple_form
+ && TREE_CODE (min_val) != INTEGER_CST)
+ return NULL_TREE;
return build4_loc (loc, ARRAY_REF, type, op, min_val,
NULL_TREE, NULL_TREE);
}
@@ -15641,7 +15646,9 @@ fold_indirect_ref_1 (location_t loc, tree type, tree op0)
/* *(foo *)fooarrptr => (*fooarrptr)[0] */
if (TREE_CODE (TREE_TYPE (subtype)) == ARRAY_TYPE
- && type == TREE_TYPE (TREE_TYPE (subtype)))
+ && type == TREE_TYPE (TREE_TYPE (subtype))
+ && (!in_gimple_form
+ || TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST))
{
tree type_domain;
tree min_val = size_zero_node;
@@ -15649,6 +15656,9 @@ fold_indirect_ref_1 (location_t loc, tree type, tree op0)
type_domain = TYPE_DOMAIN (TREE_TYPE (sub));
if (type_domain && TYPE_MIN_VALUE (type_domain))
min_val = TYPE_MIN_VALUE (type_domain);
+ if (in_gimple_form
+ && TREE_CODE (min_val) != INTEGER_CST)
+ return NULL_TREE;
return build4_loc (loc, ARRAY_REF, type, sub, min_val, NULL_TREE,
NULL_TREE);
}