backport: re PR rtl-optimization/52804 (IRA/RELOAD allocate wrong register on ARM for cortex-m0)

Backport r187139 from mainline.
	2012-05-04  Bin Cheng  <bin.cheng@arm.com>

	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: r187496
This commit is contained in:
Bin Cheng 2012-05-15 02:14:05 +00:00 committed by Bin Cheng
parent eb6c1e0cb7
commit 4d4f41fab3
2 changed files with 26 additions and 0 deletions

View File

@ -1,3 +1,15 @@
2012-05-15 Bin Cheng <bin.cheng@arm.com>
Backport r187139 from mainline.
2012-05-04 Bin Cheng <bin.cheng@arm.com>
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 <ubizjak@gmail.com>
PR target/46098

View File

@ -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: