rs6000: Don't use HARD_FRAME_POINTER_REGNUM if it's not live in pro_and_epilogue...
authorXionghu Luo <luoxhu@linux.ibm.com>
Mon, 27 Apr 2020 01:37:27 +0000 (20:37 -0500)
committerXionghu Luo <luoxhu@linux.ibm.com>
Mon, 27 Apr 2020 01:41:38 +0000 (20:41 -0500)
commitf6955089db6c3aa63c276704159ffad1ef15d256
tree0433341f8d43b3c95276846b1130cb88eb5e535b
parentbfdea9ae81f924ecdcc6be9bd64b6c9084881088
rs6000: Don't use HARD_FRAME_POINTER_REGNUM if it's not live in pro_and_epilogue (PR91518)

This bug is exposed by FRE refactor of r263875.  Comparing the fre
dump file shows no obvious change of the segment fault function proves
it to be a target issue.
frame_pointer_needed is set to true in reload pass setup_can_eliminate,
but regs_ever_live[31] is false, pro_and_epilogue uses it without live
check causing CPU2006 465.tonto segment fault of loading from invalid
addresses due to r31 not saved/restored.  Thus, add HARD_FRAME_POINTER_REGNUM
live check with frame_pointer_needed_indeed when generating pro_and_epilogue
instructions.

gcc/ChangeLog

2020-04-27  Xiong Hu Luo  <luoxhu@linux.ibm.com>

PR target/91518
* config/rs6000/rs6000-logue.c (frame_pointer_needed_indeed):
New variable.
(rs6000_emit_prologue_components):
Check with frame_pointer_needed_indeed.
(rs6000_emit_epilogue_components): Likewise.
(rs6000_emit_prologue): Likewise.
(rs6000_emit_epilogue): Set frame_pointer_needed_indeed.
gcc/ChangeLog
gcc/config/rs6000/rs6000-logue.c