From b51061d49c7da3c2c09de0e6ba27f3be69b062c0 Mon Sep 17 00:00:00 2001 From: uweigand Date: Sat, 25 Jan 2003 23:57:30 +0000 Subject: 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@61805 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/reload.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) (limited to 'gcc/reload.c') diff --git a/gcc/reload.c b/gcc/reload.c index 866cd250388..a16012c651f 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), -- cgit v1.2.1