diff options
author | Chung-Ju Wu <jasonwucj@gmail.com> | 2015-01-13 06:06:34 +0000 |
---|---|---|
committer | Chung-Ju Wu <jasonwucj@gcc.gnu.org> | 2015-01-13 06:06:34 +0000 |
commit | 4855be843467f337cd50f0d081e0a524e6ab4d77 (patch) | |
tree | 4633b6d235806a32aa620ec6ad35c5c286ffe1e8 /gcc/config | |
parent | 511a41d799f2a3b9946d5176ff0f5404077d2bec (diff) | |
download | gcc-4855be843467f337cd50f0d081e0a524e6ab4d77.zip gcc-4855be843467f337cd50f0d081e0a524e6ab4d77.tar.gz gcc-4855be843467f337cd50f0d081e0a524e6ab4d77.tar.bz2 |
[NDS32] Consider -mcmodel=X in nds32_legitimate_address_p implementation.
gcc/
* config/nds32/nds32.c (nds32_legitimate_address_p): Consider
TARGET_CMODEL_LARGE and TARGET_CMODEL_MEDIUM cases.
From-SVN: r219515
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/nds32/nds32.c | 48 |
1 files changed, 36 insertions, 12 deletions
diff --git a/gcc/config/nds32/nds32.c b/gcc/config/nds32/nds32.c index 5128bfa..192816f 100644 --- a/gcc/config/nds32/nds32.c +++ b/gcc/config/nds32/nds32.c @@ -1961,24 +1961,27 @@ nds32_legitimate_address_p (machine_mode mode, rtx x, bool strict) return nds32_address_register_rtx_p (x, strict); case SYMBOL_REF: - - if (!TARGET_GP_DIRECT + /* (mem (symbol_ref A)) => [symbol_ref] */ + /* If -mcmodel=large, the 'symbol_ref' is not a valid address + during or after LRA/reload phase. */ + if (TARGET_CMODEL_LARGE && (reload_completed || reload_in_progress || lra_in_progress)) return false; - - /* (mem (symbol_ref A)) => [symbol_ref] */ - return !currently_expanding_to_rtl; - - case CONST: - - if (!TARGET_GP_DIRECT + /* If -mcmodel=medium and the symbol references to rodata section, + the 'symbol_ref' is not a valid address during or after + LRA/reload phase. */ + if (TARGET_CMODEL_MEDIUM + && NDS32_SYMBOL_REF_RODATA_P (x) && (reload_completed || reload_in_progress || lra_in_progress)) return false; + return true; + + case CONST: /* (mem (const (...))) => [ + const_addr ], where const_addr = symbol_ref + const_int */ if (GET_CODE (XEXP (x, 0)) == PLUS) @@ -1989,9 +1992,30 @@ nds32_legitimate_address_p (machine_mode mode, rtx x, bool strict) rtx op1 = XEXP (plus_op, 1); if (GET_CODE (op0) == SYMBOL_REF && CONST_INT_P (op1)) - return true; - else - return false; + { + /* Now we see the [ + const_addr ] pattern, but we need + some further checking. */ + /* If -mcmodel=large, the 'const_addr' is not a valid address + during or after LRA/reload phase. */ + if (TARGET_CMODEL_LARGE + && (reload_completed + || reload_in_progress + || lra_in_progress)) + return false; + /* If -mcmodel=medium and the symbol references to rodata section, + the 'const_addr' is not a valid address during or after + LRA/reload phase. */ + if (TARGET_CMODEL_MEDIUM + && NDS32_SYMBOL_REF_RODATA_P (op0) + && (reload_completed + || reload_in_progress + || lra_in_progress)) + return false; + + /* At this point we can make sure 'const_addr' is a + valid address. */ + return true; + } } return false; |