ifcvt: Call fixup_partitions (PR83361)

Message ID dd95ebe7439036b287cf5531e744c5f9506de61f.1513007277.git.segher@kernel.crashing.org
State New
Headers show
Series
  • ifcvt: Call fixup_partitions (PR83361)
Related show

Commit Message

Segher Boessenkool Dec. 11, 2017, 3:49 p.m.
After converting a conditional branch to an unconditional trap to a
conditional trap, if the original trap is still reachable from another
path, it may be that it is in a hot basic block  and only reachable from
cold blocks.  Fix that up.

This fixes PR83361.  Bootstrapping on powerpc64-linux {-m32,-m64}; okay
for trunk if it succeeds?


Segher


2017-12-11  Segher Boessenkool  <segher@kernel.crashing.org>

	PR rtl-optimization/83361
	* ifcvt.c (if_convert): Call fixup_partitions.

gcc/testsuite/
	PR rtl-optimization/83361
	* gcc.dg/pr83361.c: New testcase.

---
 gcc/ifcvt.c                    |  4 ++++
 gcc/testsuite/gcc.dg/pr83361.c | 40 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 44 insertions(+)
 create mode 100644 gcc/testsuite/gcc.dg/pr83361.c

-- 
1.8.3.1

Comments

Jeff Law Dec. 11, 2017, 9:14 p.m. | #1
On 12/11/2017 08:49 AM, Segher Boessenkool wrote:
> After converting a conditional branch to an unconditional trap to a

> conditional trap, if the original trap is still reachable from another

> path, it may be that it is in a hot basic block  and only reachable from

> cold blocks.  Fix that up.

> 

> This fixes PR83361.  Bootstrapping on powerpc64-linux {-m32,-m64}; okay

> for trunk if it succeeds?

> 

> 

> Segher

> 

> 

> 2017-12-11  Segher Boessenkool  <segher@kernel.crashing.org>

> 

> 	PR rtl-optimization/83361

> 	* ifcvt.c (if_convert): Call fixup_partitions.

> 

> gcc/testsuite/

> 	PR rtl-optimization/83361

> 	* gcc.dg/pr83361.c: New testcase.

OK.
jeff

Patch

diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c
index 91360d8..eb3da68 100644
--- a/gcc/ifcvt.c
+++ b/gcc/ifcvt.c
@@ -5446,6 +5446,10 @@  if_convert (bool after_combine)
   if (optimize == 1)
     df_remove_problem (df_live);
 
+  /* Some non-cold blocks may now be only reachable from cold blocks.
+     Fix that up.  */
+  fixup_partitions ();
+
   checking_verify_flow_info ();
 }
 
diff --git a/gcc/testsuite/gcc.dg/pr83361.c b/gcc/testsuite/gcc.dg/pr83361.c
new file mode 100644
index 0000000..2a6f807
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr83361.c
@@ -0,0 +1,40 @@ 
+/* PR rtl-optimization/83361 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -freorder-blocks-and-partition" } */
+
+#include <limits.h>
+
+int yz;
+
+void
+tq (int z3)
+{
+  unsigned long long int n8 = (unsigned long long int)INT_MAX + 1;
+  int *ey = &yz;
+
+  if (yz == 0)
+    {
+      int bc;
+
+      yz = 1;
+      while (yz != 0)
+        {
+          *ey *= bc;
+          n8 = !!(1 / ((unsigned long long int)yz == n8));
+          ey = &z3;
+        }
+
+      while (z3 != 0)
+        {
+        }
+    }
+
+  z3 = (n8 != 0) && (*ey != 0);
+  z3 = yz / z3;
+  if (z3 < 0)
+    {
+      if (yz != 0)
+        yz = 0;
+      yz /= 0;
+    }
+}