re PR target/36090 (ppc64 cacoshl miscompilation)
authorPaolo Bonzini <bonzini@gnu.org>
Thu, 8 May 2008 16:35:56 +0000 (16:35 +0000)
committerDavid Edelsohn <dje@gcc.gnu.org>
Thu, 8 May 2008 16:35:56 +0000 (12:35 -0400)
2008-05-08  Paolo Bonzini  <bonzini@gnu.org>

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

From-SVN: r135086

gcc/ChangeLog
gcc/simplify-rtx.c

index f87e063d216b57ce9a79d3cae5e79139db9c4889..7ac7cd27fe3ece451ba5affccae7bec14f09a3a2 100644 (file)
@@ -1,3 +1,9 @@
+2008-05-08  Paolo Bonzini  <bonzini@gnu.org>
+
+       PR target/36090
+       * simplify-rtx.c (simplify_plus_minus): Create CONST of
+       similar RTX_CONST_OBJ before CONST_INT.
+
 2008-05-08  Steve Ellcey  <sje@cup.hp.com>
 
        * stmt.c (expand_stack_restore): Change sa mode if needed.
index 44f3ef574731cf4e9fc703f6c8d4400148cabb54..15e4c2a3424fe1ce295556d741dbbcade19fa64f 100644 (file)
@@ -3674,6 +3674,24 @@ simplify_plus_minus (enum rtx_code code, enum machine_mode mode, rtx op0,
      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.  */
 
+  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
       && CONSTANT_P (ops[n_ops - 2].op))