diff mbox series

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

Message ID nycvar.YFH.7.76.2008071221110.9963@zhemvz.fhfr.qr
State New
Headers show
Series tree-optimization/96514 - avoid if-converting control-altering calls | expand

Commit Message

Richard Biener Aug. 7, 2020, 10:21 a.m. UTC
This avoids if-converting when encountering control-altering calls.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

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.
---
 gcc/testsuite/gcc.dg/pr96514.c | 27 +++++++++++++++++++++++++++
 gcc/tree-if-conv.c             |  5 +++++
 2 files changed, 32 insertions(+)
 create mode 100644 gcc/testsuite/gcc.dg/pr96514.c
diff mbox series

Patch

diff --git a/gcc/testsuite/gcc.dg/pr96514.c b/gcc/testsuite/gcc.dg/pr96514.c
new file mode 100644
index 00000000000..891b4da2b1e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr96514.c
@@ -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);
+}
diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c
index fc894eb94da..257759d01bf 100644
--- a/gcc/tree-if-conv.c
+++ b/gcc/tree-if-conv.c
@@ -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)