From 8dc72e956283a8e31b3c93b2d924bbd6d5d3466b Mon Sep 17 00:00:00 2001 From: amker Date: Tue, 15 May 2012 02:14:05 +0000 Subject: [PATCH] Backport r187139 from mainline. 2012-05-04 Bin Cheng PR rtl-optimization/52804 * reload1.c (reload_reg_reaches_end_p): Check whether successor reload with type RELOAD_FOR_INPUT_ADDRESS kills reload register of current one with type RELOAD_FOR_INPADDR_ADDRESS. Same stands for reloads with type RELOAD_FOR_OUTPUT_ADDRESS and RELOAD_FOR_OUTADDR_ADDRESS. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@187496 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 12 ++++++++++++ gcc/reload1.c | 14 ++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5c2ff61ee40..688366e8d59 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2012-05-15 Bin Cheng + + Backport r187139 from mainline. + 2012-05-04 Bin Cheng + + PR rtl-optimization/52804 + * reload1.c (reload_reg_reaches_end_p): Check whether successor + reload with type RELOAD_FOR_INPUT_ADDRESS kills reload register + of current one with type RELOAD_FOR_INPADDR_ADDRESS. + Same stands for reloads with type RELOAD_FOR_OUTPUT_ADDRESS and + RELOAD_FOR_OUTADDR_ADDRESS. + 2012-05-14 Uros Bizjak PR target/46098 diff --git a/gcc/reload1.c b/gcc/reload1.c index bbb75c85a1d..9154f0ba932 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -5423,6 +5423,13 @@ reload_reg_reaches_end_p (unsigned int regno, int reloadnum) if (TEST_HARD_REG_BIT (reload_reg_used_in_input[i], regno)) return 0; + /* Reload register of reload with type RELOAD_FOR_INPADDR_ADDRESS + could be killed if the register is also used by reload with type + RELOAD_FOR_INPUT_ADDRESS, so check it. */ + if (type == RELOAD_FOR_INPADDR_ADDRESS + && TEST_HARD_REG_BIT (reload_reg_used_in_input_addr[opnum], regno)) + return 0; + for (i = opnum + 1; i < reload_n_operands; i++) if (TEST_HARD_REG_BIT (reload_reg_used_in_input_addr[i], regno) || TEST_HARD_REG_BIT (reload_reg_used_in_inpaddr_addr[i], regno)) @@ -5497,6 +5504,13 @@ reload_reg_reaches_end_p (unsigned int regno, int reloadnum) || TEST_HARD_REG_BIT (reload_reg_used_in_outaddr_addr[i], regno)) return 0; + /* Reload register of reload with type RELOAD_FOR_OUTADDR_ADDRESS + could be killed if the register is also used by reload with type + RELOAD_FOR_OUTPUT_ADDRESS, so check it. */ + if (type == RELOAD_FOR_OUTADDR_ADDRESS + && TEST_HARD_REG_BIT (reload_reg_used_in_outaddr_addr[opnum], regno)) + return 0; + return 1; default: -- 2.11.0