rs6000: Fix allocate_stack in a corner case (PR91289)
authorSegher Boessenkool <segher@kernel.crashing.org>
Sat, 26 Oct 2019 16:38:59 +0000 (18:38 +0200)
committerSegher Boessenkool <segher@gcc.gnu.org>
Sat, 26 Oct 2019 16:38:59 +0000 (18:38 +0200)
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

gcc/ChangeLog
gcc/config/rs6000/rs6000-logue.c

index 3dc1b7c08a3103cf8a13bab3785102654e281e43..de55e1a8323f1416b238c6113f09d7b4a21f4761 100644 (file)
@@ -1,3 +1,10 @@
+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
index e98893a440c6c58faba501d7c09ca6b83d637ce3..04aae8052dbf46d0cbf1dd61e457c973aafae17a 100644 (file)
@@ -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");