Use simplify_gen_binary in canon_rtx
authorRichard Sandiford <richard.sandiford@arm.com>
Tue, 15 Nov 2016 18:16:59 +0000 (18:16 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 15 Nov 2016 18:16:59 +0000 (18:16 +0000)
After simplifying the operands of a PLUS, canon_rtx checked only
for cases in which one of the simplified operands was a constant,
falling back to gen_rtx_PLUS otherwise.  This left the PLUS in a
non-canonical order if one of the simplified operands was
(plus (reg R1) (const_int X)); we'd end up with:

       (plus (plus (reg R1) (const_int Y)) (reg R2))

rather than:

       (plus (plus (reg R1) (reg R2)) (const_int Y))

Fixing this exposed new DSE opportunities on spu-elf in
gcc.c-torture/execute/builtins/strcat-chk.c but otherwise
it doesn't seem to have much practical effect.

gcc/
2016-11-15  Richard Sandiford  <richard.sandiford@arm.com>
    Alan Hayward  <alan.hayward@arm.com>
    David Sherwood  <david.sherwood@arm.com>

* alias.c (canon_rtx): Use simplify_gen_binary.

Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>
From-SVN: r242445

gcc/ChangeLog
gcc/alias.c

index 0a2dd3cd71e39fb6b32af15167e1e6040f65ae6e..5e3e8a1c1cd60b4585e21178e35e5b9311fa1be4 100644 (file)
@@ -1,3 +1,9 @@
+2016-11-15  Richard Sandiford  <richard.sandiford@arm.com>
+           Alan Hayward  <alan.hayward@arm.com>
+           David Sherwood  <david.sherwood@arm.com>
+
+       * alias.c (canon_rtx): Use simplify_gen_binary.
+
 2016-11-15  Richard Sandiford  <richard.sandiford@arm.com>
            Alan Hayward  <alan.hayward@arm.com>
            David Sherwood  <david.sherwood@arm.com>
index 1ea2417bed1d29d41eeb796744e298a4ba824beb..546ae7ff891af0cd51c99da29179201f32698d43 100644 (file)
@@ -1708,13 +1708,7 @@ canon_rtx (rtx x)
       rtx x1 = canon_rtx (XEXP (x, 1));
 
       if (x0 != XEXP (x, 0) || x1 != XEXP (x, 1))
-       {
-         if (CONST_INT_P (x0))
-           return plus_constant (GET_MODE (x), x1, INTVAL (x0));
-         else if (CONST_INT_P (x1))
-           return plus_constant (GET_MODE (x), x0, INTVAL (x1));
-         return gen_rtx_PLUS (GET_MODE (x), x0, x1);
-       }
+       return simplify_gen_binary (PLUS, GET_MODE (x), x0, x1);
     }
 
   /* This gives us much better alias analysis when called from