tree-optimization/96514 - avoid if-converting control-altering calls

This avoids if-converting when encountering control-altering calls.

2020-08-07  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/96514
	* tree-if-conv.c (if_convertible_bb_p): If the last stmt
	is a call that is control-altering, fail.

	* gcc.dg/pr96514.c: New testcase.
This commit is contained in:
Richard Biener 2020-08-07 10:16:05 +02:00
parent e87c540fe4
commit c3f94f5786
2 changed files with 32 additions and 0 deletions

View file

@ -0,0 +1,27 @@
/* { dg-do compile } */
int __attribute__ ((pure, returns_twice))
r0 (void);
void
vy (int t7)
{
while (t7 == 0)
r0 ();
}
void
qw (int t7)
{
vy (t7);
if (0)
r0 ();
}
void __attribute__ ((simd))
un (int t7)
{
qw (t7);
qw (t7);
}

View file

@ -1139,6 +1139,11 @@ if_convertible_bb_p (class loop *loop, basic_block bb, basic_block exit_bb)
if (EDGE_COUNT (bb->succs) > 2)
return false;
gimple *last = last_stmt (bb);
if (gcall *call = safe_dyn_cast <gcall *> (last))
if (gimple_call_ctrl_altering_p (call))
return false;
if (exit_bb)
{
if (bb != loop->latch)