aboutsummaryrefslogtreecommitdiff
path: root/gcc/expr.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2011-02-04 16:50:51 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2011-02-04 16:50:51 +0100
commitdcde5957ce2d3465028da302a878d93bea9fc41f (patch)
tree414dfa9293092030de0a06170c839b69d92e5b67 /gcc/expr.c
parenta64a8e5a1375676bad507dd424e0a1c4850a525b (diff)
downloadgcc-dcde5957ce2d3465028da302a878d93bea9fc41f.zip
gcc-dcde5957ce2d3465028da302a878d93bea9fc41f.tar.gz
gcc-dcde5957ce2d3465028da302a878d93bea9fc41f.tar.bz2
re PR inline-asm/23200 (rejects "i"(&var + 1))
PR inline-asm/23200 * tree-ssa-ter.c (is_replaceable_p): Add TER argument. Don't do bb, locus and block comparison and disallow loads if it is not set. (stmt_is_replaceable_p): New function. (process_replaceable, find_replaceable_in_bb): Adjust is_replaceable_p callers. * expr.c (expand_expr_real_1) <case SSA_NAME>: If get_gimple_for_ssa_name try for EXPAND_INITIALIZER harder to use SSA_NAME_DEF_STMT. * tree-flow.h (stmt_is_replaceable_p): New prototype. * gcc.dg/pr23200.c: New test. From-SVN: r169831
Diffstat (limited to 'gcc/expr.c')
-rw-r--r--gcc/expr.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/gcc/expr.c b/gcc/expr.c
index df15c92..b09b1ac 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -8387,6 +8387,13 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
NULL);
g = get_gimple_for_ssa_name (exp);
+ /* For EXPAND_INITIALIZER try harder to get something simpler. */
+ if (g == NULL
+ && modifier == EXPAND_INITIALIZER
+ && !SSA_NAME_IS_DEFAULT_DEF (exp)
+ && (optimize || DECL_IGNORED_P (SSA_NAME_VAR (exp)))
+ && stmt_is_replaceable_p (SSA_NAME_DEF_STMT (exp)))
+ g = SSA_NAME_DEF_STMT (exp);
if (g)
return expand_expr_real (gimple_assign_rhs_to_tree (g), target, tmode,
modifier, NULL);