The stack clash protection code had a logic error in how it decided whether to put the final update size in a register, or to emit it directly in an insn. This fixes it. It also tidies some surrounding code.
Segher 2018-04-10 Segher Boessenkool <seg...@kernel.crashing.org> * gcc/config/rs6000/rs6000.md (allocate_stack): Put the residual size for stack clash protection in a register whenever we need it to be in a register. --- gcc/config/rs6000/rs6000.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index 62b4aa7..25ac0b8 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -9795,14 +9795,12 @@ (define_expand "allocate_stack" /* Now handle residuals. We just have to set operands[1] correctly and let the rest of the expander run. */ operands[1] = residual; - if (!CONST_INT_P (residual)) - operands[1] = force_reg (Pmode, operands[1]); } - if (GET_CODE (operands[1]) != CONST_INT - || INTVAL (operands[1]) < -32767 - || INTVAL (operands[1]) > 32768) + if (!(CONST_INT_P (operands[1]) + && IN_RANGE (INTVAL (operands[1]), -32767, 32768))) { + operands[1] = force_reg (Pmode, operands[1]); neg_op0 = gen_reg_rtx (Pmode); if (TARGET_32BIT) emit_insn (gen_negsi2 (neg_op0, operands[1])); @@ -9810,7 +9808,7 @@ (define_expand "allocate_stack" emit_insn (gen_negdi2 (neg_op0, operands[1])); } else - neg_op0 = GEN_INT (- INTVAL (operands[1])); + neg_op0 = GEN_INT (-INTVAL (operands[1])); insn = emit_insn ((* ((TARGET_32BIT) ? gen_movsi_update_stack : gen_movdi_di_update_stack)) -- 1.8.3.1