diff options
author | Richard Guenther <rguenther@suse.de> | 2011-03-15 09:49:33 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2011-03-15 09:49:33 +0000 |
commit | 17dea42fc45256b06cb19bc36b18e77fdc0f20a6 (patch) | |
tree | 9ed7abab94bb943b76eaad5f4ca9db1c4dbf7235 /gcc/fold-const.c | |
parent | 01c77a60551535ea2326f7e72723cd8962a64eb1 (diff) | |
download | gcc-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.c | 14 |
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); } |