Message ID | f068e5348cd863a03ed7340c70c036ee7ef70430.1572102518.git.segher@kernel.crashing.org |
---|---|
State | New |
Headers | show |
Series | rs6000: Fix allocate_stack in a corner case (PR91289) | expand |
On Sat, Oct 26, 2019 at 04:35:04PM +0000, Segher Boessenkool wrote: > 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. > > Committing to trunk. I have backported this to 9 and 8. Segher > 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.
diff --git a/gcc/config/rs6000/rs6000-logue.c b/gcc/config/rs6000/rs6000-logue.c index e98893a..04aae80 100644 --- a/gcc/config/rs6000/rs6000-logue.c +++ b/gcc/config/rs6000/rs6000-logue.c @@ -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");