From 9d0baae10e10d02ba0f09215f7b70461bd21ebb0 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Sat, 15 May 2010 15:06:47 +0000 Subject: [PATCH] re PR other/44038 (ICE: verify_stmts failed) 2010-05-15 Richard Guenther 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. From-SVN: r159434 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/compile/pr44038.c | 13 +++++++++++++ gcc/tree-ssa-forwprop.c | 16 ++++++++++++---- 4 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr44038.c 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 + + 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 * 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 + + PR tree-optimization/44038 + * gcc.c-torture/compile/pr44038.c: New testcase. + 2010-05-15 H.J. Lu * 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. */ -- 2.30.2