rl78-real.md: Add peepholes to avoid a register copy when calling a function.

* 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
This commit is contained in:
Nick Clifton 2015-06-03 12:59:38 +00:00
parent 9ce3eaa4ff
commit fddde8d3d8
3 changed files with 50 additions and 3 deletions

View 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>

View File

@ -342,6 +342,25 @@
[(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")
@ -353,6 +372,25 @@
[(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"

View 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