From ef618bb8149fd0408442cba9d0123fa110fc2737 Mon Sep 17 00:00:00 2001 From: rguenth Date: Tue, 8 Feb 2011 12:53:50 +0000 Subject: [PATCH] 2011-02-08 Richard Guenther PR tree-optimization/47641 * tree-ssa.c (execute_update_addresses_taken): For asm outputs require type compatibility. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@169925 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/tree-ssa.c | 13 +++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 36e7a73..f22f667 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-02-08 Richard Guenther + + PR tree-optimization/47641 + * tree-ssa.c (execute_update_addresses_taken): For asm outputs + require type compatibility. + 2011-02-08 Andreas Krebbel * gimple-low.c (lower_function_body): Don't remove the location of diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c index 90fb5dd..cc8c83d 100644 --- a/gcc/tree-ssa.c +++ b/gcc/tree-ssa.c @@ -1898,7 +1898,7 @@ non_rewritable_lvalue_p (tree lhs) /* A decl that is wrapped inside a MEM-REF that covers it full is also rewritable. ??? The following could be relaxed allowing component - references that do not change the access size. */ ; + references that do not change the access size. */ if (TREE_CODE (lhs) == MEM_REF && TREE_CODE (TREE_OPERAND (lhs, 0)) == ADDR_EXPR && integer_zerop (TREE_OPERAND (lhs, 1))) @@ -2039,11 +2039,16 @@ execute_update_addresses_taken (void) { tree link = gimple_asm_output_op (stmt, i); tree lhs = TREE_VALUE (link); - if (TREE_CODE (lhs) != SSA_NAME - && non_rewritable_lvalue_p (lhs)) + if (TREE_CODE (lhs) != SSA_NAME) { decl = get_base_address (lhs); - if (DECL_P (decl)) + if (DECL_P (decl) + && (non_rewritable_lvalue_p (lhs) + /* We cannot move required conversions from + the lhs to the rhs in asm statements, so + require we do not need any. */ + || !useless_type_conversion_p + (TREE_TYPE (lhs), TREE_TYPE (decl)))) bitmap_set_bit (not_reg_needs, DECL_UID (decl)); } } -- 2.7.4