rl78-real.md: Add peepholes to avoid a register copy when calling a function.
authorNick Clifton <nickc@gcc.gnu.org>
Wed, 3 Jun 2015 12:59:38 +0000 (12:59 +0000)
committerNick Clifton <nickc@gcc.gnu.org>
Wed, 3 Jun 2015 12:59:38 +0000 (12:59 +0000)
* config/rl78/rl78-real.md: Add peepholes to avoid a register
copy when calling a function.
* config/rl78/rl78.c (need_to_save): Do not push the frame
pointer in an interrupt handler prologue if it is never used.

From-SVN: r224076

gcc/ChangeLog
gcc/config/rl78/rl78-real.md
gcc/config/rl78/rl78.c

index b1b3dc6f2234c6cb4c34508decb69292ee1e5e54..cab2f38ad3c368de27025c2f50b61f372a993254 100644 (file)
@@ -1,3 +1,10 @@
+2015-06-03  Nick Clifton  <nickc@redhat.com>
+
+       * config/rl78/rl78-real.md: Add peepholes to avoid a register
+       copy when calling a function.
+       * config/rl78/rl78.c (need_to_save): Do not push the frame
+       pointer in an interrupt handler prologue if it is never used.
+
 2015-06-03  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * ifcvt (end_ifcvt_sequence): Fix typo in comment above.
@@ -44,7 +51,7 @@
 
 2015-06-03  Andrew Bennett  <andrew.bennett@imgtec.com>
 
-       * explow.c (plus_constant): Update check after force_const_mem call 
+       * explow.c (plus_constant): Update check after force_const_mem call
        to see if the value returned is not a NULL_RTX.
 
 2015-06-03  Ilya Enkovich  <ilya.enkovich@intel.com>
index f6ab7ff42138b5a02a6ead9e7420c9a3d14c1bba..d6324e5bed7effb0a215c23e78448f5e5376f9cc 100644 (file)
   [(set (attr "update_Z") (const_string "clobber"))]
   )
 
+;; Peephole to match:
+;;
+;;     (set (reg1) (reg2))
+;;     (call (mem (reg1)))
+;;
+;;  and replace it with:
+;;
+;;     (call (mem (reg2)))
+
+(define_peephole2
+  [(set (match_operand:HI 0 "register_operand") (match_operand:HI 1 "register_operand"))
+   (call (mem:HI (match_dup 0))(const_int 0))
+  ]
+  "peep2_regno_dead_p (2, REGNO (operands[0]))
+   && REGNO (operands[1]) < 8"
+  [(call (mem:HI (match_dup 1))(const_int 0))
+  ]
+)
+
 (define_insn "*call_value_real"
   [(set (match_operand 0 "register_operand" "=v,v")
        (call (match_operand:HI 1 "memory_operand" "Wab,Wca")
   [(set (attr "update_Z") (const_string "clobber"))]
   )
 
+;; Peephole to match:
+;;
+;;     (set (reg1) (reg2))
+;;     (set (reg3) (call (mem (reg1))))
+;;
+;;  and replace it with:
+;;
+;;     (set (reg3) (call (mem (reg2))))
+
+(define_peephole2
+  [(set (match_operand:HI 0 "register_operand") (match_operand:HI 1 "register_operand"))
+   (set (match_operand:HI 2 "register_operand") (call (mem:HI (match_dup 0))(const_int 0)))
+  ]
+  "peep2_regno_dead_p (2, REGNO (operands[0]))
+   && REGNO (operands[1]) < 8"
+  [(set (match_dup 2) (call (mem:HI (match_dup 1))(const_int 0)))
+  ]
+)
+
 (define_insn "*cbranchqi4_real_signed"
   [(set (pc) (if_then_else
              (match_operator 0 "rl78_cmp_operator_signed"
index 6a15f915c915ffac752a46d1d1e98d558672bd43..c6a0d57e354c568715d7d866a4ef70bbca103220 100644 (file)
@@ -678,8 +678,10 @@ need_to_save (unsigned int regno)
 
       /* If the handler is a non-leaf function then it may call
         non-interrupt aware routines which will happily clobber
-        any call_used registers, so we have to preserve them.  */
-      if (!crtl->is_leaf && call_used_regs[regno])
+        any call_used registers, so we have to preserve them.
+         We do not have to worry about the frame pointer register
+        though, as that is handled below.  */
+      if (!crtl->is_leaf && call_used_regs[regno] && regno < 22)
        return true;
 
       /* Otherwise we only have to save a register, call_used