rx.md: Add peephole to remove redundant extensions after loads.
authorNick Clifton <nickc@redhat.com>
Tue, 17 May 2011 08:36:44 +0000 (08:36 +0000)
committerNick Clifton <nickc@gcc.gnu.org>
Tue, 17 May 2011 08:36:44 +0000 (08:36 +0000)
* config/rx/rx.md: Add peephole to remove redundant extensions
after loads.

From-SVN: r173820

gcc/ChangeLog
gcc/config/rx/rx.md

index 8ceeac30236e30f79c5e16e0519463f891e3797f..637241fbf56533e7e6881671d5177b4addc06404 100644 (file)
@@ -1,3 +1,8 @@
+2011-05-17  Nick Clifton  <nickc@redhat.com>
+
+       * config/rx/rx.md: Add peephole to remove redundant extensions
+       after loads.
+
 2011-05-17  Kazuhio Inaoka  <kazuhiro.inaoka.ud@renesas.com>
            Nick Clifton  <nickc@redhat.com>
 
index fdbf2876a3e462dbff74979f7a29edf5a5a6608a..227fe310059a5ff550a5976a3a78d97c244c6df2 100644 (file)
                    (extend_types:SI (match_dup 1))))]
 )
 
+;; Convert:
+;;   (set (reg1) (sign_extend (mem))
+;;   (set (reg2) (zero_extend (reg1))
+;; into
+;;   (set (reg2) (zero_extend (mem)))
+(define_peephole2
+  [(set (match_operand:SI                              0 "register_operand")
+       (sign_extend:SI (match_operand:small_int_modes 1 "memory_operand")))
+   (set (match_operand:SI                              2 "register_operand")
+       (zero_extend:SI (match_operand:small_int_modes 3 "register_operand")))]
+  "REGNO (operands[0]) == REGNO (operands[3])
+   && (REGNO (operands[0]) == REGNO (operands[2])
+       || peep2_regno_dead_p (2, REGNO (operands[0])))"
+  [(set (match_dup 2)
+       (zero_extend:SI (match_dup 1)))]
+)
+
+;; Remove the redundant sign extension from:
+;;   (set (reg) (extend (mem)))
+;;   (set (reg) (extend (reg)))
+(define_peephole2
+  [(set (match_operand:SI                               0 "register_operand")
+       (extend_types:SI (match_operand:small_int_modes 1 "memory_operand")))
+   (set (match_dup 0)
+       (extend_types:SI (match_operand:small_int_modes 2 "register_operand")))]
+  "REGNO (operands[0]) == REGNO (operands[2])"
+  [(set (match_dup 0) (extend_types:SI (match_dup 1)))]
+)
+
 (define_insn "comparesi3_<extend_types:code><small_int_modes:mode>"
   [(set (reg:CC CC_REG)
        (compare:CC (match_operand:SI                               0 "register_operand" "=r")