aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYvan Roux <yvan.roux@linaro.org>2016-09-03 19:13:21 +0200
committerYvan Roux <yvan.roux@linaro.org>2016-09-07 22:08:32 +0200
commit2ace425fb0ae8502c240505448fc9befd618e279 (patch)
tree610e305992ba74bf5bd5c9320f820c3f84cb7f3f
parent69f120d504071531698a806e6d9c5f05b2eb571b (diff)
gcc/
Backport from trunk r237607. 2016-06-20 Wilco Dijkstra <wdijkstr@arm.com> * config/aarch64/aarch64.opt (mpc-relative-literal-loads): Rename internal option name. * config/aarch64/aarch64.c (aarch64_nopcrelative_literal_loads): Rename to aarch64_pcrelative_literal_loads. (aarch64_expand_mov_immediate): Likewise. (aarch64_secondary_reload): Likewise. (aarch64_can_use_per_function_literal_pools_p): Likewise. (aarch64_override_options_after_change_1): Rename and simplify logic. (aarch64_classify_symbol): Merge large model checks into switch, remove pc-relative load check. Change-Id: Ie45ef06d2a93809b42915c3109121228867862fc
-rw-r--r--gcc/config/aarch64/aarch64.c66
-rw-r--r--gcc/config/aarch64/aarch64.opt2
2 files changed, 32 insertions, 36 deletions
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index b55d8aed223..e76bfdfcf05 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -152,7 +152,7 @@ enum aarch64_processor aarch64_tune = cortexa53;
unsigned long aarch64_tune_flags = 0;
/* Global flag for PC relative loads. */
-bool aarch64_nopcrelative_literal_loads;
+bool aarch64_pcrelative_literal_loads;
/* Support for command line parsing of boolean flags in the tuning
structures. */
@@ -1844,7 +1844,7 @@ aarch64_expand_mov_immediate (rtx dest, rtx imm)
we need to expand the literal pool access carefully.
This is something that needs to be done in a number
of places, so could well live as a separate function. */
- if (aarch64_nopcrelative_literal_loads)
+ if (!aarch64_pcrelative_literal_loads)
{
gcc_assert (can_create_pseudo_p ());
base = gen_reg_rtx (ptr_mode);
@@ -4186,7 +4186,7 @@ aarch64_classify_address (struct aarch64_address_info *info,
return ((GET_CODE (sym) == LABEL_REF
|| (GET_CODE (sym) == SYMBOL_REF
&& CONSTANT_POOL_ADDRESS_P (sym)
- && !aarch64_nopcrelative_literal_loads)));
+ && aarch64_pcrelative_literal_loads)));
}
return false;
@@ -5217,7 +5217,7 @@ aarch64_secondary_reload (bool in_p ATTRIBUTE_UNUSED, rtx x,
if (MEM_P (x) && GET_CODE (x) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (x)
&& (SCALAR_FLOAT_MODE_P (GET_MODE (x))
|| targetm.vector_mode_supported_p (GET_MODE (x)))
- && aarch64_nopcrelative_literal_loads)
+ && !aarch64_pcrelative_literal_loads)
{
sri->icode = aarch64_constant_pool_reload_icode (mode);
return NO_REGS;
@@ -5551,7 +5551,7 @@ aarch64_uxt_size (int shift, HOST_WIDE_INT mask)
static inline bool
aarch64_can_use_per_function_literal_pools_p (void)
{
- return (!aarch64_nopcrelative_literal_loads
+ return (aarch64_pcrelative_literal_loads
|| aarch64_cmodel == AARCH64_CMODEL_LARGE);
}
@@ -8229,32 +8229,31 @@ aarch64_override_options_after_change_1 (struct gcc_options *opts)
opts->x_align_functions = aarch64_tune_params.function_align;
}
- /* If nopcrelative_literal_loads is set on the command line, this
+ /* We default to no pc-relative literal loads. */
+
+ aarch64_pcrelative_literal_loads = false;
+
+ /* If -mpc-relative-literal-loads is set on the command line, this
implies that the user asked for PC relative literal loads. */
- if (opts->x_nopcrelative_literal_loads == 1)
- aarch64_nopcrelative_literal_loads = false;
+ if (opts->x_pcrelative_literal_loads == 1)
+ aarch64_pcrelative_literal_loads = true;
- /* If it is not set on the command line, we default to no pc
- relative literal loads, unless the workaround for Cortex-A53
- erratum 843419 is in effect. */
/* This is PR70113. When building the Linux kernel with
CONFIG_ARM64_ERRATUM_843419, support for relocations
R_AARCH64_ADR_PREL_PG_HI21 and R_AARCH64_ADR_PREL_PG_HI21_NC is
removed from the kernel to avoid loading objects with possibly
- offending sequences. With nopcrelative_literal_loads, we would
+ offending sequences. Without -mpc-relative-literal-loads we would
generate such relocations, preventing the kernel build from
succeeding. */
- if (opts->x_nopcrelative_literal_loads == 2
- && !TARGET_FIX_ERR_A53_843419)
- aarch64_nopcrelative_literal_loads = true;
-
- /* In the tiny memory model it makes no sense
- to disallow non PC relative literal pool loads
- as many other things will break anyway. */
- if (opts->x_nopcrelative_literal_loads
- && (aarch64_cmodel == AARCH64_CMODEL_TINY
- || aarch64_cmodel == AARCH64_CMODEL_TINY_PIC))
- aarch64_nopcrelative_literal_loads = false;
+ if (opts->x_pcrelative_literal_loads == 2
+ && TARGET_FIX_ERR_A53_843419)
+ aarch64_pcrelative_literal_loads = true;
+
+ /* In the tiny memory model it makes no sense to disallow PC relative
+ literal pool loads. */
+ if (aarch64_cmodel == AARCH64_CMODEL_TINY
+ || aarch64_cmodel == AARCH64_CMODEL_TINY_PIC)
+ aarch64_pcrelative_literal_loads = true;
/* When enabling the lower precision Newton series for the square root, also
enable it for the reciprocal square root, since the latter is an
@@ -9462,18 +9461,6 @@ aarch64_classify_symbol (rtx x, rtx offset)
if (GET_CODE (x) == SYMBOL_REF)
{
- if (aarch64_cmodel == AARCH64_CMODEL_LARGE)
- {
- /* This is alright even in PIC code as the constant
- pool reference is always PC relative and within
- the same translation unit. */
- if (nopcrelative_literal_loads
- && CONSTANT_POOL_ADDRESS_P (x))
- return SYMBOL_SMALL_ABSOLUTE;
- else
- return SYMBOL_FORCE_TO_MEM;
- }
-
if (aarch64_tls_symbol_p (x))
return aarch64_classify_tls_symbol (x);
@@ -9518,6 +9505,15 @@ aarch64_classify_symbol (rtx x, rtx offset)
? SYMBOL_SMALL_GOT_28K : SYMBOL_SMALL_GOT_4G);
return SYMBOL_SMALL_ABSOLUTE;
+ case AARCH64_CMODEL_LARGE:
+ /* This is alright even in PIC code as the constant
+ pool reference is always PC relative and within
+ the same translation unit. */
+ if (CONSTANT_POOL_ADDRESS_P (x))
+ return SYMBOL_SMALL_ABSOLUTE;
+ else
+ return SYMBOL_FORCE_TO_MEM;
+
default:
gcc_unreachable ();
}
diff --git a/gcc/config/aarch64/aarch64.opt b/gcc/config/aarch64/aarch64.opt
index bf6b47510e0..82e9f5bd0be 100644
--- a/gcc/config/aarch64/aarch64.opt
+++ b/gcc/config/aarch64/aarch64.opt
@@ -146,7 +146,7 @@ EnumValue
Enum(aarch64_abi) String(lp64) Value(AARCH64_ABI_LP64)
mpc-relative-literal-loads
-Target Report Save Var(nopcrelative_literal_loads) Init(2) Save
+Target Report Save Var(pcrelative_literal_loads) Init(2) Save
PC relative literal loads.
mlow-precision-recip-sqrt