From: Alan Modra Date: Sat, 9 Feb 2019 12:44:02 +0000 (+1030) Subject: [RS6000] Correct save_reg_p X-Git-Tag: releases/gcc-7.5.0~599 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e08292047c4a856470bce333929e93fee4ec19d4;p=thirdparty%2Fgcc.git [RS6000] Correct save_reg_p PR target/88343 * config/rs6000/rs6000.c (rs6000_reg_live_or_pic_offset_p): Match logic in rs6000_emit_prologue emitting pic_offset_table setup. From-SVN: r268722 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 91dbf9962adf..9e73034f085b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-02-09 Alan Modra + + PR target/88343 + * config/rs6000/rs6000.c (rs6000_reg_live_or_pic_offset_p): Match + logic in rs6000_emit_prologue emitting pic_offset_table setup. + 2019-02-08 Eric Botcazou Backport from mainline diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 68dd95429fe6..f31a8b83a759 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -26726,27 +26726,35 @@ save_reg_p (int r) static bool rs6000_reg_live_or_pic_offset_p (int reg) { - /* We need to mark the PIC offset register live for the same conditions - as it is set up, or otherwise it won't be saved before we clobber it. */ - if (reg == RS6000_PIC_OFFSET_TABLE_REGNUM && !TARGET_SINGLE_PIC_BASE) { + /* When calling eh_return, we must return true for all the cases + where conditional_register_usage marks the PIC offset reg + call used or fixed. */ + if (crtl->calls_eh_return + && ((DEFAULT_ABI == ABI_V4 && flag_pic) + || (DEFAULT_ABI == ABI_DARWIN && flag_pic) + || (TARGET_TOC && TARGET_MINIMAL_TOC))) + return true; + + /* We need to mark the PIC offset register live for the same + conditions as it is set up in rs6000_emit_prologue, or + otherwise it won't be saved before we clobber it. */ if (TARGET_TOC && TARGET_MINIMAL_TOC - && (crtl->calls_eh_return - || df_regs_ever_live_p (reg) - || !constant_pool_empty_p ())) + && !constant_pool_empty_p ()) return true; - if ((DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN) - && flag_pic) + if (DEFAULT_ABI == ABI_V4 + && (flag_pic == 1 || (flag_pic && TARGET_SECURE_PLT)) + && df_regs_ever_live_p (RS6000_PIC_OFFSET_TABLE_REGNUM)) return true; - } - /* If the function calls eh_return, claim used all the registers that would - be checked for liveness otherwise. */ + if (DEFAULT_ABI == ABI_DARWIN + && flag_pic && crtl->uses_pic_offset_table) + return true; + } - return ((crtl->calls_eh_return || df_regs_ever_live_p (reg)) - && !call_used_regs[reg]); + return !call_used_regs[reg] && df_regs_ever_live_p (reg); } /* Return the first fixed-point register that is required to be