[PATCH] Simplify difference of SYMBOL_REFs (PR target/36090)

David Edelsohn dje@watson.ibm.com
Sun May 4 01:35:00 GMT 2008


	PPC64 Linux and AIX represent TOC entries in RTL as a difference
of SYMBOL_REFs.  References to 128 bit long double values can produce
offsets into the doubleword TOC entry.

	forwprop now has become smart enough to recognize more of these
addresses.  It tries to simplify the addresses it creates with
simplify_plus_minus(), which currently produces non-canonical RTL that
PRINT_OPERAND_ADDRESS does not expect, silently producing wrong code.

	simplify_plus_minus() explicitly creates a pairing of an
RTX_CONST_OBJ and a CONST_INT, if they were found in the expression, and
wraps them in CONST, prior to generating the full simplified expression.
The current algorithm does not take into account the expression possibly
containing two RTX_CONST_OBJ operands, such as SYMBOL_REFs or LABEL_REFs,
that should be grouped together more tightly than CONST_INT.

	Paolo Bonzini suggested the appended patch to group RTX_CONST_OBJ
before CONST_INT.

Bootstrapped and regression tested on powerpc-ibm-aix5.3.0.0.  Testing on
x86 also in progress.

Okay for mainline and 4.3 branch?

Thanks, David


2008-05-04  Paolo Bonzini  <bonzini@gnu.org>

	PR target/36090
	* simplify-rtx.c (simplify_plus_minus): Create CONST of
	similar RTX_CONST_OBJ before CONST_INT.

Index: simplify-rtx.c
===================================================================
--- simplify-rtx.c	(revision 134899)
+++ simplify-rtx.c	(working copy)
@@ -3672,7 +3672,26 @@
      combination loop to avoid recursion.  Create one manually now.
      The combination loop should have ensured that there is exactly
      one CONST_INT, and the sort will have ensured that it is last
-     in the array and that any other constant will be next-to-last.  */
+     in the array and that any other constant will be next-to-last.
+     Group similar RTX_CONST_OBJ first, then CONST_INT.  */
+
+  if (GET_CODE (ops[n_ops - 1].op) == CONST_INT)
+    i = n_ops - 2;
+  else
+    i = n_ops - 1;
+
+  if (i >= 1
+      && ops[i].neg
+      && !ops[i - 1].neg
+      && CONSTANT_P (ops[i].op)
+      && GET_CODE (ops[i].op) == GET_CODE (ops[i - 1].op))
+    {
+      ops[i - 1].op = gen_rtx_MINUS (mode, ops[i - 1].op, ops[i].op);
+      ops[i - 1].op = gen_rtx_CONST (mode, ops[i - 1].op);
+      if (i < n_ops - 1)
+	ops[i] = ops[i + 1];
+      n_ops--;
+    }
 
   if (n_ops > 1
       && GET_CODE (ops[n_ops - 1].op) == CONST_INT



More information about the Gcc-patches mailing list