diff options
author | aldyh <aldyh@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-01-05 13:36:32 +0000 |
---|---|---|
committer | aldyh <aldyh@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-01-05 13:36:32 +0000 |
commit | ea580cf7d8d93cc795106f985d6a6e6b686b192d (patch) | |
tree | 7593c75bb507415d098642b7f803184801986170 /gcc/trans-mem.c | |
parent | a7fdb416f673a56f5d79b1dd83f92a802eb5e4ec (diff) | |
download | gcc-ea580cf7d8d93cc795106f985d6a6e6b686b192d.tar.gz |
PR middle-end/51472
* trans-mem.c (expand_assign_tm): Handle TM_MEMMOVE loads correctly.
testsuite/
PR middle-end/51472
* gcc.dg/tm/memopt-6.c: Adjust regexp.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@182908 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/trans-mem.c')
-rw-r--r-- | gcc/trans-mem.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/gcc/trans-mem.c b/gcc/trans-mem.c index 750f3a18624..538d798a70d 100644 --- a/gcc/trans-mem.c +++ b/gcc/trans-mem.c @@ -2174,7 +2174,7 @@ expand_assign_tm (struct tm_region *region, gimple_stmt_iterator *gsi) } if (!gcall) { - tree lhs_addr, rhs_addr; + tree lhs_addr, rhs_addr, tmp; if (load_p) transaction_subcode_ior (region, GTMA_HAVE_LOAD); @@ -2183,13 +2183,29 @@ expand_assign_tm (struct tm_region *region, gimple_stmt_iterator *gsi) /* ??? Figure out if there's any possible overlap between the LHS and the RHS and if not, use MEMCPY. */ - lhs_addr = gimplify_addr (gsi, lhs); + + if (load_p && is_gimple_non_addressable (lhs)) + { + tmp = create_tmp_var (TREE_TYPE (lhs), NULL); + lhs_addr = build_fold_addr_expr (tmp); + } + else + { + tmp = NULL_TREE; + lhs_addr = gimplify_addr (gsi, lhs); + } rhs_addr = gimplify_addr (gsi, rhs); gcall = gimple_build_call (builtin_decl_explicit (BUILT_IN_TM_MEMMOVE), 3, lhs_addr, rhs_addr, TYPE_SIZE_UNIT (TREE_TYPE (lhs))); gimple_set_location (gcall, loc); gsi_insert_before (gsi, gcall, GSI_SAME_STMT); + + if (tmp) + { + gcall = gimple_build_assign (lhs, tmp); + gsi_insert_before (gsi, gcall, GSI_SAME_STMT); + } } /* Now that we have the load/store in its instrumented form, add |