@@ -3493,10 +3493,7 @@
(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"
@@ -3512,10 +3509,7 @@
(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"
@@ -396,6 +396,13 @@ maybe_mode_change (machine_mode orig_mode, machine_mode copy_mode,
&& 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))