Commit 26bd2dab by Segher Boessenkool Committed by Segher Boessenkool

rs6000: Fix allocate_stack in a corner case (PR91289)

When we have -fstack-limit-symbol with sysv we can end up with a non-
existing instruction (you cannot add an immediate to register 0).  Fix
this by using register 11 instead.  It might be used for something else
already though, so save and restore its value around this.  In
optimizing compiles these extra moves are usually removed again: the
restore by cprop_hardreg, and then the save by rtl_dce.


	PR target/91289
	* config/rs6000/rs6000-logue.c (rs6000_emit_allocate_stack): Don't add
	an immediate to r0; use r11 instead.  Save and restore r11 to r0 around
	this.

From-SVN: r277472
parent 8bbf3dea
2019-10-26 Segher Boessenkool <segher@kernel.crashing.org>
PR target/91289
* config/rs6000/rs6000-logue.c (rs6000_emit_allocate_stack): Don't add
an immediate to r0; use r11 instead. Save and restore r11 to r0 around
this.
2019-10-26 Hongtao Liu <hongtao.liu@intel.com>
* config/i386/sse.md
......@@ -1700,10 +1700,14 @@ rs6000_emit_allocate_stack (HOST_WIDE_INT size, rtx copy_reg, int copy_off)
stack_limit_rtx,
GEN_INT (size)));
emit_insn (gen_elf_high (tmp_reg, toload));
emit_insn (gen_elf_low (tmp_reg, tmp_reg, toload));
emit_insn (gen_cond_trap (LTU, stack_reg, tmp_reg,
const0_rtx));
/* We cannot use r0 with elf_low. Lamely solve this problem by
moving registers around. */
rtx r11_reg = gen_rtx_REG (Pmode, 11);
emit_move_insn (tmp_reg, r11_reg);
emit_insn (gen_elf_high (r11_reg, toload));
emit_insn (gen_elf_low (r11_reg, r11_reg, toload));
emit_insn (gen_cond_trap (LTU, stack_reg, r11_reg, const0_rtx));
emit_move_insn (r11_reg, tmp_reg);
}
else
warning (0, "stack limit expression is not supported");
......
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