+2017-04-18 Jeff Law <law@redhat.com>
+
+ * regcprop.c (maybe_mode_change): Avoid creating copies of the
+ stack pointer.
+
+ Revert:
+ 2017-04-13 Jeff Law <law@redhat.com>
+ * config/mips.mips.md (zero_extendsidi2): Do not allow SP to appear
+ in operands[1] if it is a MEM and TARGET_MIPS16 is active.
+
2017-04-18 Georg-Johann Lay <avr@gjlay.de>
PR target/79453
(define_insn_and_split "*zero_extendsidi2"
[(set (match_operand:DI 0 "register_operand" "=d,d")
(zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "d,W")))]
- "TARGET_64BIT && !ISA_HAS_EXT_INS
- && !(TARGET_MIPS16
- && MEM_P (operands[1])
- && reg_mentioned_p (stack_pointer_rtx, operands[1]))"
+ "TARGET_64BIT && !ISA_HAS_EXT_INS"
"@
#
lwu\t%0,%1"
(define_insn "*zero_extendsidi2_dext"
[(set (match_operand:DI 0 "register_operand" "=d,d")
(zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "d,W")))]
- "TARGET_64BIT && ISA_HAS_EXT_INS
- && !(TARGET_MIPS16
- && MEM_P (operands[1])
- && reg_mentioned_p (stack_pointer_rtx, operands[1]))"
+ "TARGET_64BIT && ISA_HAS_EXT_INS"
"@
dext\t%0,%1,0,32
lwu\t%0,%1"
&& GET_MODE_SIZE (copy_mode) < GET_MODE_SIZE (new_mode))
return NULL_RTX;
+ /* Avoid creating multiple copies of the stack pointer. Some ports
+ assume there is one and only one stack pointer.
+
+ It's unclear if we need to do the same for other special registers. */
+ if (regno == STACK_POINTER_REGNUM)
+ return NULL_RTX;
+
if (orig_mode == new_mode)
return gen_raw_REG (new_mode, regno);
else if (mode_change_ok (orig_mode, new_mode, regno))