From 9ee6540a77ee11d1aa70d86e08642406fb150fe0 Mon Sep 17 00:00:00 2001 From: Wilco Dijkstra Date: Mon, 20 Jun 2016 16:20:31 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 14 ++++++++ gcc/config/aarch64/aarch64.c | 66 ++++++++++++++++------------------ gcc/config/aarch64/aarch64.opt | 2 +- 3 files changed, 46 insertions(+), 36 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0e67896bef9..5d1c60d0bc4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2016-06-20 Wilco Dijkstra + + * 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 * config/arm/aarch-cost-tables.h (cortexa53_extra_costs): Make FP diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 46c917a17bc..2b3e9aefafa 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. */ @@ -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 + /* 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 @@ -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 (); } 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 -- 2.30.2