diff mbox series

rs6000: Fix allocate_stack in a corner case (PR91289)

Message ID f068e5348cd863a03ed7340c70c036ee7ef70430.1572102518.git.segher@kernel.crashing.org
State New
Headers show
Series rs6000: Fix allocate_stack in a corner case (PR91289) | expand

Commit Message

Segher Boessenkool Oct. 26, 2019, 4:35 p.m. UTC
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.


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.

---
 gcc/config/rs6000/rs6000-logue.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

Comments

Segher Boessenkool Nov. 5, 2019, 5:26 p.m. UTC | #1
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 mbox series

Patch

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");