aboutsummaryrefslogtreecommitdiff
path: root/gcc/trans-mem.c
diff options
context:
space:
mode:
authorAndrew Pinski <apinski@cavium.com>2012-09-11 04:21:00 +0000
committerAndrew Pinski <pinskia@gcc.gnu.org>2012-09-10 21:21:00 -0700
commit01a723fa357712b17083bf7a64916ce4443ef413 (patch)
treecb92aa327d23c60b5cf4b64daaaf566c760b07d6 /gcc/trans-mem.c
parent5f3b7d7c57f66d74667ba91ddc36fce50096f1e1 (diff)
downloadgcc-01a723fa357712b17083bf7a64916ce4443ef413.zip
gcc-01a723fa357712b17083bf7a64916ce4443ef413.tar.gz
gcc-01a723fa357712b17083bf7a64916ce4443ef413.tar.bz2
re PR middle-end/54362 (COND_EXPR not understood by either alias or ITM)
2012-09-10 Andrew Pinski <apinski@cavium.com> PR tree-opt/54362 * trans-mem.c (thread_private_new_memory): Handle COND_EXPR also. 2012-09-10 Andrew Pinski <apinski@cavium.com> PR tree-opt/c54362 * gcc.dg/tm/memopt-16.c: New testcase. From-SVN: r191172
Diffstat (limited to 'gcc/trans-mem.c')
-rw-r--r--gcc/trans-mem.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/gcc/trans-mem.c b/gcc/trans-mem.c
index edb678e..e71efff 100644
--- a/gcc/trans-mem.c
+++ b/gcc/trans-mem.c
@@ -1379,6 +1379,19 @@ thread_private_new_memory (basic_block entry_block, tree x)
/* x = (cast*) foo ==> foo */
else if (code == VIEW_CONVERT_EXPR || code == NOP_EXPR)
x = gimple_assign_rhs1 (stmt);
+ /* x = c ? op1 : op2 == > op1 or op2 just like a PHI */
+ else if (code == COND_EXPR)
+ {
+ tree op1 = gimple_assign_rhs2 (stmt);
+ tree op2 = gimple_assign_rhs3 (stmt);
+ enum thread_memory_type mem;
+ retval = thread_private_new_memory (entry_block, op1);
+ if (retval == mem_non_local)
+ goto new_memory_ret;
+ mem = thread_private_new_memory (entry_block, op2);
+ retval = MIN (retval, mem);
+ goto new_memory_ret;
+ }
else
{
retval = mem_non_local;