diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2003-01-25 23:57:30 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@gcc.gnu.org> | 2003-01-25 23:57:30 +0000 |
commit | acf9fa5f14c922de0daaf89f1847d733ddf61bd1 (patch) | |
tree | 34763eb4183577d75b1cefd91523c1a402fc1ad4 /gcc/reload.c | |
parent | 5a09edba1f72e8f2781127c38f45c9b36dea7509 (diff) | |
download | gcc-acf9fa5f14c922de0daaf89f1847d733ddf61bd1.zip gcc-acf9fa5f14c922de0daaf89f1847d733ddf61bd1.tar.gz gcc-acf9fa5f14c922de0daaf89f1847d733ddf61bd1.tar.bz2 |
reload.c (maybe_memory_address_p): New function.
gcc/
* reload.c (maybe_memory_address_p): New function.
(find_reloads_address): Use it instead of memory_address_p.
gcc/testsuite/
* gcc.dg/20030123-1.c: New test.
From-SVN: r61805
Diffstat (limited to 'gcc/reload.c')
-rw-r--r-- | gcc/reload.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/gcc/reload.c b/gcc/reload.c index 866cd25..a16012c 100644 --- a/gcc/reload.c +++ b/gcc/reload.c @@ -260,6 +260,7 @@ static int alternative_allows_memconst PARAMS ((const char *, int)); static rtx find_reloads_toplev PARAMS ((rtx, int, enum reload_type, int, int, rtx, int *)); static rtx make_memloc PARAMS ((rtx, int)); +static int maybe_memory_address_p PARAMS ((enum machine_mode, rtx, rtx *)); static int find_reloads_address PARAMS ((enum machine_mode, rtx *, rtx, rtx *, int, enum reload_type, int, rtx)); static rtx subst_reg_equivs PARAMS ((rtx, rtx)); @@ -4587,6 +4588,27 @@ make_memloc (ad, regno) return tem; } +/* Returns true if AD could be turned into a valid memory reference + to mode MODE by reloading the part pointed to by PART into a + register. */ + +static int +maybe_memory_address_p (mode, ad, part) + enum machine_mode mode; + rtx ad; + rtx *part; +{ + int retv; + rtx tem = *part; + rtx reg = gen_rtx_REG (GET_MODE (tem), max_reg_num ()); + + *part = reg; + retv = memory_address_p (mode, ad); + *part = tem; + + return retv; +} + /* Record all reloads needed for handling memory address AD which appears in *LOC in a memory reference to mode MODE which itself is found in location *MEMREFLOC. @@ -4886,7 +4908,7 @@ find_reloads_address (mode, memrefloc, ad, loc, opnum, type, ind_levels, insn) || XEXP (XEXP (ad, 0), 0) == arg_pointer_rtx #endif || XEXP (XEXP (ad, 0), 0) == stack_pointer_rtx) - && ! memory_address_p (mode, ad)) + && ! maybe_memory_address_p (mode, ad, &XEXP (XEXP (ad, 0), 1))) { *loc = ad = gen_rtx_PLUS (GET_MODE (ad), plus_constant (XEXP (XEXP (ad, 0), 0), @@ -4911,7 +4933,7 @@ find_reloads_address (mode, memrefloc, ad, loc, opnum, type, ind_levels, insn) || XEXP (XEXP (ad, 0), 1) == arg_pointer_rtx #endif || XEXP (XEXP (ad, 0), 1) == stack_pointer_rtx) - && ! memory_address_p (mode, ad)) + && ! maybe_memory_address_p (mode, ad, &XEXP (XEXP (ad, 0), 0))) { *loc = ad = gen_rtx_PLUS (GET_MODE (ad), XEXP (XEXP (ad, 0), 0), |