From d1446456c3fcaa7be628726c9de4a877729490ca Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Tue, 18 Apr 2017 09:00:43 -0600 Subject: [PATCH] regcprop.c (maybe_mode_change): Avoid creating copies of the stack pointer. * regcprop.c (maybe_mode_change): Avoid creating copies of the stack pointer. Revert: 2017-04-13 Jeff Law * 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. From-SVN: r246970 --- gcc/ChangeLog | 10 ++++++++++ gcc/config/mips/mips.md | 10 ++-------- gcc/regcprop.c | 7 +++++++ 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1ff66847754..8da35cc67e3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2017-04-18 Jeff Law + + * regcprop.c (maybe_mode_change): Avoid creating copies of the + stack pointer. + + Revert: + 2017-04-13 Jeff Law + * 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 PR target/79453 diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md index dd5e1e77436..7acf00d0451 100644 --- a/gcc/config/mips/mips.md +++ b/gcc/config/mips/mips.md @@ -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" diff --git a/gcc/regcprop.c b/gcc/regcprop.c index ddc6252f53a..367d85a7e24 100644 --- a/gcc/regcprop.c +++ b/gcc/regcprop.c @@ -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)) -- 2.30.2