Message ID | 4EF1E490.2090609@redhat.com |
---|---|
State | New |
Headers | show |
On Wed, Dec 21, 2011 at 07:52:16AM -0600, Aldy Hernandez wrote: > Oh neat... create_tmp_reg will do all this for me. I don't think that update_stmt is needed there. The stmt is freshly allocated a few lines above it: stmt = gimple_build_assign (lp->save_var, unshare_expr (lp->addr)); so the modified flag is still set and thus when you gsi_insert_before it afterwards, it will update_stmt_if_modified, which is the same as update_stmt when the modified flag is set. The first hunk looks okay. > --- trans-mem.c (revision 182542) > +++ trans-mem.c (working copy) > @@ -1003,7 +1003,7 @@ tm_log_add (basic_block entry_block, tre > special constructors and the like. */ > && !TREE_ADDRESSABLE (type)) > { > - lp->save_var = create_tmp_var (TREE_TYPE (lp->addr), "tm_save"); > + lp->save_var = create_tmp_reg (TREE_TYPE (lp->addr), "tm_save"); > add_referenced_var (lp->save_var); > lp->stmts = NULL; > lp->entry_block = entry_block; > @@ -1188,6 +1188,7 @@ tm_log_emit_saves (basic_block entry_blo > { > lp->save_var = make_ssa_name (lp->save_var, stmt); > gimple_assign_set_lhs (stmt, lp->save_var); > + update_stmt (stmt); > } > > gsi_insert_before (&gsi, stmt, GSI_SAME_STMT); Jakub
Index: testsuite/gcc.dg/tm/pr51472.c =================================================================== --- testsuite/gcc.dg/tm/pr51472.c (revision 0) +++ testsuite/gcc.dg/tm/pr51472.c (revision 0) @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-fgnu-tm -O --param tm-max-aggregate-size=32" } */ + +typedef int __attribute__ ((vector_size (16))) vectype; +vectype v; + +void +foo (int c) +{ + vectype *p = __builtin_malloc (sizeof (vectype)); + __transaction_atomic + { + *p = v; + if (c) + __transaction_cancel; + } +} Index: trans-mem.c =================================================================== --- trans-mem.c (revision 182542) +++ trans-mem.c (working copy) @@ -1003,7 +1003,7 @@ tm_log_add (basic_block entry_block, tre special constructors and the like. */ && !TREE_ADDRESSABLE (type)) { - lp->save_var = create_tmp_var (TREE_TYPE (lp->addr), "tm_save"); + lp->save_var = create_tmp_reg (TREE_TYPE (lp->addr), "tm_save"); add_referenced_var (lp->save_var); lp->stmts = NULL; lp->entry_block = entry_block; @@ -1188,6 +1188,7 @@ tm_log_emit_saves (basic_block entry_blo { lp->save_var = make_ssa_name (lp->save_var, stmt); gimple_assign_set_lhs (stmt, lp->save_var); + update_stmt (stmt); } gsi_insert_before (&gsi, stmt, GSI_SAME_STMT);