From 73292fcf29ebad0ff753d0d57d7bef3677187b0e Mon Sep 17 00:00:00 2001 From: Bin Cheng Date: Fri, 4 May 2012 02:52:27 +0000 Subject: 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 --- gcc/reload1.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'gcc/reload1.c') diff --git a/gcc/reload1.c b/gcc/reload1.c index 71cea81..359a893 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: -- cgit v1.1