Commit 2fa8205d by Ulrich Weigand Committed by Ulrich Weigand

reload.c (find_reloads_subreg_address): Check the original req_equiv_mem address…

reload.c (find_reloads_subreg_address): Check the original req_equiv_mem address to detect the case where an address is...

	* reload.c (find_reloads_subreg_address): Check the original
	req_equiv_mem address to detect the case where an address is
	not valid in the outer mode.

From-SVN: r150649
parent ac8f7e42
2009-08-11 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
* reload.c (find_reloads_subreg_address): Check the original
req_equiv_mem address to detect the case where an address is
not valid in the outer mode.
2009-08-11 Richard Guenther <rguenther@suse.de> 2009-08-11 Richard Guenther <rguenther@suse.de>
PR bootstrap/40788 PR bootstrap/40788
......
...@@ -6133,18 +6133,26 @@ find_reloads_subreg_address (rtx x, int force_replace, int opnum, ...@@ -6133,18 +6133,26 @@ find_reloads_subreg_address (rtx x, int force_replace, int opnum,
/* For some processors an address may be valid in the /* For some processors an address may be valid in the
original mode but not in a smaller mode. For original mode but not in a smaller mode. For
example, ARM accepts a scaled index register in example, ARM accepts a scaled index register in
SImode but not in HImode. Similarly, the address may SImode but not in HImode. Note that this is only
have been valid before the subreg offset was added, a problem if the address in reg_equiv_mem is already
but not afterwards. find_reloads_address invalid in the new mode; other cases would be fixed
assumes that we pass it a valid address, and doesn't by find_reloads_address as usual.
force a reload. This will probably be fine if
find_reloads_address finds some reloads. But if it ??? We attempt to handle such cases here by doing an
doesn't find any, then we may have just converted a additional reload of the full address after the
valid address into an invalid one. Check for that usual processing by find_reloads_address. Note that
here. */ this may not work in the general case, but it seems
to cover the cases where this situation currently
occurs. A more general fix might be to reload the
*value* instead of the address, but this would not
be expected by the callers of this routine as-is.
If find_reloads_address already completed replaced
the address, there is nothing further to do. */
if (reloaded == 0 if (reloaded == 0
&& !strict_memory_address_p (GET_MODE (tem), && reg_equiv_mem[regno] != 0
XEXP (tem, 0))) && !strict_memory_address_p (GET_MODE (x),
XEXP (reg_equiv_mem[regno], 0)))
push_reload (XEXP (tem, 0), NULL_RTX, &XEXP (tem, 0), (rtx*) 0, push_reload (XEXP (tem, 0), NULL_RTX, &XEXP (tem, 0), (rtx*) 0,
base_reg_class (GET_MODE (tem), MEM, SCRATCH), base_reg_class (GET_MODE (tem), MEM, SCRATCH),
GET_MODE (XEXP (tem, 0)), VOIDmode, 0, 0, GET_MODE (XEXP (tem, 0)), VOIDmode, 0, 0,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment