diff --git a/gcc/testsuite/gcc.dg/tm/pr95569.c b/gcc/testsuite/gcc.dg/tm/pr95569.c new file mode 100644 index 00000000000..f0b0d6f4c24 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tm/pr95569.c @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-options "-fgnu-tm -O0" } */ +/* { dg-do compile { target aarch64*-*-* } } */ + +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; + } +} diff --git a/gcc/trans-mem.c b/gcc/trans-mem.c index c23ecd2b31f..b6b9157006b 100644 --- a/gcc/trans-mem.c +++ b/gcc/trans-mem.c @@ -2424,6 +2424,7 @@ expand_assign_tm (struct tm_region *region, gimple_stmt_iterator *gsi) if (is_gimple_reg (rhs)) { tree rtmp = create_tmp_var (TREE_TYPE (rhs)); + TREE_ADDRESSABLE (rtmp) = 1; rhs_addr = build_fold_addr_expr (rtmp); gcall = gimple_build_assign (rtmp, rhs); gsi_insert_before (gsi, gcall, GSI_SAME_STMT);