[committed] Fix aarch64 profiledbootstrap (PR middle-end/89655, PR bootstrap/89656)

Jakub Jelinek jakub@redhat.com
Mon Mar 11 22:21:00 GMT 2019


Hi!

As mentioned in the PR, since r269453 dom can process stmts newly added
by fold_stmt.  The problem is that at the start of the pass we construct
vr_values with the current number of SSA names and size the tables based on
that.  When we process a stmt which sets on lhs a new SSA_NAME above that
number, get_value_range returns for that address of a shared constant VR_VARYING
variable, but if we manage to find some smaller range, update_value_range
happily updates that shared range to this.

Based on IRC discussion, this is a minimal fix, approved by Richard on IRC.

Bootstrapped/regtested on {x86_64,i686,powerpc64le}-linux and bootstrapped
on {aarch64,s390x}-linux (profiledbootstrap for all; where aarch64-linux
profiledbootstrap would previously fail), committed to trunk.

2019-03-11  Jakub Jelinek  <jakub@redhat.com>

	PR middle-end/89655
	PR bootstrap/89656
	* vr-values.c (vr_values::update_value_range): If
	old_vr->varying_p (), don't update it, make new_vr also VARYING
	and return false.

	* gcc.c-torture/compile/pr89655.c: New test.

--- gcc/vr-values.c.jj	2019-01-24 19:54:20.792500923 +0100
+++ gcc/vr-values.c	2019-03-11 12:46:34.526494064 +0100
@@ -189,8 +189,13 @@ vr_values::update_value_range (const_tre
 	 because VR_RANGE and VR_ANTI_RANGE need to be considered
 	 the same.  We may not have is_new when transitioning to
 	 UNDEFINED.  If old_vr->type is VARYING, we shouldn't be
-	 called.  */
-      if (new_vr->undefined_p ())
+	 called, if we are anyway, keep it VARYING.  */
+      if (old_vr->varying_p ())
+	{
+	  new_vr->set_varying ();
+	  is_new = false;
+	}
+      else if (new_vr->undefined_p ())
 	{
 	  old_vr->set_varying ();
 	  new_vr->set_varying ();
--- gcc/testsuite/gcc.c-torture/compile/pr89655.c.jj	2019-03-11 13:45:27.279823237 +0100
+++ gcc/testsuite/gcc.c-torture/compile/pr89655.c	2019-03-11 13:45:10.482097642 +0100
@@ -0,0 +1,15 @@
+/* PR middle-end/89655 */
+
+int a, b, d;
+char *c;
+
+void
+foo (void)
+{
+  int f = a;
+  for (;;)
+    {
+      for (f = 0; f < (a > 3 ? : a); f++)
+	b = c[f] ? c[(f + 2 > a - 1 ? a - 1 : 2) * d] : 0;
+    }
+}

	Jakub



More information about the Gcc-patches mailing list