diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | 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 <rguenther@suse.de> + + PR tree-optimization/47641 + * tree-ssa.c (execute_update_addresses_taken): For asm outputs + require type compatibility. + 2011-02-08 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> * 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)); } } |