Commit cc6a467f by Segher Boessenkool Committed by Segher Boessenkool

rs6000: Use SAVE_MULTIPLE only if we restore what it saves (PR80938)

We can have SAVE_MULTIPLE while we do not have REST_MULTIPLE.  If the
inline restore does not restore all registers, the CFI for the save
and restore can conflict if things are shrink-wrapped.

We could restore all registers that are saved (not ideal), or emit
the CFI notes to say we did (which will work fine, but is also not
so great); instead, let's not save the registers that are unused.


	PR target/80938
	* config/rs6000/rs6000.c (rs6000_savres_strategy): Don't use
	SAVE_MULTIPLE if not all the registers that saves, should be saved.

From-SVN: r251005
parent a8a581af
2017-08-09 Segher Boessenkool <segher@kernel.crashing.org>
PR target/80938
* config/rs6000/rs6000.c (rs6000_savres_strategy): Don't use
SAVE_MULTIPLE if not all the registers that saves, should be saved.
2017-08-09 Jim Wilson <jim.wilson@linaro.org>
* config/aarch64/aarch64-cores.def (falkor): Use falkor pipeline.
......
......@@ -24431,6 +24431,21 @@ rs6000_savres_strategy (rs6000_stack_t *info,
else if (!lr_save_p && info->first_gp_reg_save > 29)
strategy |= SAVE_INLINE_GPRS | REST_INLINE_GPRS;
/* We can only use save multiple if we need to save all the registers from
first_gp_reg_save. Otherwise, the CFI gets messed up (we save some
register we do not restore). */
if (strategy & SAVE_MULTIPLE)
{
int i;
for (i = info->first_gp_reg_save; i < 32; i++)
if (fixed_reg_p (i) || !save_reg_p (i))
{
strategy &= ~SAVE_MULTIPLE;
break;
}
}
/* We can only use load multiple or the out-of-line routines to
restore gprs if we've saved all the registers from
first_gp_reg_save. Otherwise, we risk loading garbage.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment