summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2010-05-15 15:06:47 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2010-05-15 15:06:47 +0000
commit8f71200d0c993c25ef4b6926033c739ef6572e37 (patch)
treef1d10729aeb0fb72e554df99355cac2e070b9b16
parent3e5482040c58423a2a6e5fdb321d630adcea200c (diff)
downloadgcc-8f71200d0c993c25ef4b6926033c739ef6572e37.tar.gz
2010-05-15 Richard Guenther <rguenther@suse.de>
PR tree-optimization/44038 * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Avoid taking the address of a V_C_E of a constant. * gcc.c-torture/compile/pr44038.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@159434 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr44038.c13
-rw-r--r--gcc/tree-ssa-forwprop.c16
4 files changed, 36 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 22210155635..5829fad1794 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2010-05-15 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/44038
+ * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Avoid
+ taking the address of a V_C_E of a constant.
+
2010-05-14 Jan Hubicka <jh@suse.cz>
* tree.h (memory_identifier_string): Remove.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 32b066e0d9a..3223474115a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-05-15 Richard Guenther <rguenther@suse.de>
+
+ PR tree-optimization/44038
+ * gcc.c-torture/compile/pr44038.c: New testcase.
+
2010-05-15 H.J. Lu <hongjiu.lu@intel.com>
* gcc.target/i386/avx-cmpsd-1.c: Add -std=c99.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr44038.c b/gcc/testsuite/gcc.c-torture/compile/pr44038.c
new file mode 100644
index 00000000000..574ff398b42
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr44038.c
@@ -0,0 +1,13 @@
+struct Ustr {
+ char data[1];
+};
+int ustr_xi__embed_val_get(char *);
+inline static int ustr_len(struct Ustr *s1)
+{
+ return ustr_xi__embed_val_get(s1->data);
+}
+static struct Ustr *s1 = ((struct Ustr *) "");
+int tst(char *cstr)
+{
+ return ustr_len(s1);
+}
diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c
index fc40bf46eac..836ca7c1aa8 100644
--- a/gcc/tree-ssa-forwprop.c
+++ b/gcc/tree-ssa-forwprop.c
@@ -730,6 +730,7 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
gimple use_stmt = gsi_stmt (*use_stmt_gsi);
enum tree_code rhs_code;
bool res = true;
+ bool addr_p = false;
gcc_assert (TREE_CODE (def_rhs) == ADDR_EXPR);
@@ -802,8 +803,12 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
/* Strip away any outer COMPONENT_REF, ARRAY_REF or ADDR_EXPR
nodes from the RHS. */
rhsp = gimple_assign_rhs1_ptr (use_stmt);
- while (handled_component_p (*rhsp)
- || TREE_CODE (*rhsp) == ADDR_EXPR)
+ if (TREE_CODE (*rhsp) == ADDR_EXPR)
+ {
+ rhsp = &TREE_OPERAND (*rhsp, 0);
+ addr_p = true;
+ }
+ while (handled_component_p (*rhsp))
rhsp = &TREE_OPERAND (*rhsp, 0);
rhs = *rhsp;
@@ -852,11 +857,14 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
return res;
}
/* If the defining rhs comes from an indirect reference, then do not
- convert into a VIEW_CONVERT_EXPR. */
+ convert into a VIEW_CONVERT_EXPR. Likewise if we'll end up taking
+ the address of a V_C_E of a constant. */
def_rhs_base = TREE_OPERAND (def_rhs, 0);
while (handled_component_p (def_rhs_base))
def_rhs_base = TREE_OPERAND (def_rhs_base, 0);
- if (!INDIRECT_REF_P (def_rhs_base))
+ if (!INDIRECT_REF_P (def_rhs_base)
+ && (!addr_p
+ || !is_gimple_min_invariant (def_rhs)))
{
/* We may have arbitrary VIEW_CONVERT_EXPRs in a nested component
reference. Place it there and fold the thing. */