diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c773d7d6c23..96b86cc3e07 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2013-12-03 Vladimir Makarov + + * config/aarch64/aarch64.c (aarch64_frame_pointer_required): Check + LR_REGNUM. + (aarch64_can_eliminate): Don't check elimination source when + frame_pointer_required is false. + 2013-12-03 Senthil Kumar Selvaraj * config/avr/avr.c (avr_option_override): Warn if asked to generate diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index b1b4eef81be..1c881c8f7af 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -1703,7 +1703,7 @@ aarch64_frame_pointer_required (void) if (flag_omit_frame_pointer && !faked_omit_frame_pointer) return false; else if (flag_omit_leaf_frame_pointer) - return !crtl->is_leaf; + return !crtl->is_leaf || df_regs_ever_live_p (LR_REGNUM); return true; } @@ -4126,7 +4126,7 @@ aarch64_can_eliminate (const int from, const int to) of faked_omit_frame_pointer here (which is true when we always wish to keep non-leaf frame pointers but only wish to keep leaf frame pointers when LR is clobbered). */ - if (from == FRAME_POINTER_REGNUM && to == STACK_POINTER_REGNUM + if (to == STACK_POINTER_REGNUM && df_regs_ever_live_p (LR_REGNUM) && faked_omit_frame_pointer) return false;