From: Bin Cheng Date: Fri, 4 May 2012 02:52:27 +0000 (+0000) Subject: re PR rtl-optimization/52804 (IRA/RELOAD allocate wrong register on ARM for cortex-m0) X-Git-Tag: misc/gccgo-go1_1_2~3105 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=73292fcf29ebad0ff753d0d57d7bef3677187b0e;p=thirdparty%2Fgcc.git re PR rtl-optimization/52804 (IRA/RELOAD allocate wrong register on ARM for cortex-m0) 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. From-SVN: r187139 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 635e914b3896..746087a0aae5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +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-04 Manuel López-Ibáñez PR c++/24985 diff --git a/gcc/reload1.c b/gcc/reload1.c index 71cea8171d4e..359a89313f09 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -5429,6 +5429,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)) @@ -5503,6 +5510,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: