This patch cleans up the -mpc-relative-loads option processing.

This patch cleans up the -mpc-relative-loads option processing.  Rename to avoid
the confusing nopcrelative_literal_loads names.  Fix the option processing code
to correctly support -mno-pc-relative-loads rather than ignore it. 

    gcc/
	* 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.

From-SVN: r237607
This commit is contained in:
Wilco Dijkstra 2016-06-20 16:20:31 +00:00 committed by Wilco Dijkstra
parent d9e8bdfd90
commit 9ee6540a77
3 changed files with 46 additions and 36 deletions

View file

@ -1,3 +1,17 @@
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.
2016-06-20 James Greenhalgh <james.greenhalgh@arm.com>
* config/arm/aarch-cost-tables.h (cortexa53_extra_costs): Make FP

View file

@ -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. */
@ -1725,7 +1725,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);
@ -4066,7 +4066,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;
@ -5097,7 +5097,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;
@ -5431,7 +5431,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);
}
@ -8108,32 +8108,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
implies that the user asked for PC relative literal loads. */
if (opts->x_nopcrelative_literal_loads == 1)
aarch64_nopcrelative_literal_loads = false;
/* 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_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;
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 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;
/* 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
@ -9341,18 +9340,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);
@ -9393,6 +9380,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 ();
}

View file

@ -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