From 496649d983d5da94a8125a23ce8ba596d5ff72ce Mon Sep 17 00:00:00 2001 From: jasonwucj Date: Wed, 14 Jan 2015 06:08:35 +0000 Subject: [PATCH] [NDS32] Remove some features and options that are not available yet in nds32 port of GNU binutils package. gcc/ * config/nds32/nds32.opt (mforce-fp-as-gp): Remove. (mforbid-fp-as-gp): Remove. (mex9): Remove. * config/nds32/nds32-fp-as-gp.c (nds32_have_prologue_p): Remove. (nds32_symbol_load_store_p): Remove. (nds32_fp_as_gp_check_available): Clean up implementation. * config/nds32/nds32.h (LINK_SPEC): Remove -mforce-as-gp and -mex9 cases. * config/nds32/nds32.c (nds32_asm_file_start): No need to consider fp-as-gp and ex9 cases. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@219576 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 13 ++ gcc/config/nds32/nds32-fp-as-gp.c | 325 +++++++++++--------------------------- gcc/config/nds32/nds32.c | 26 --- gcc/config/nds32/nds32.h | 7 +- gcc/config/nds32/nds32.opt | 12 -- 5 files changed, 103 insertions(+), 280 deletions(-) rewrite gcc/config/nds32/nds32-fp-as-gp.c (64%) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 83304ac24aa..eef9de94f2e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2015-01-14 Chung-Ju Wu + + * config/nds32/nds32.opt (mforce-fp-as-gp): Remove. + (mforbid-fp-as-gp): Remove. + (mex9): Remove. + * config/nds32/nds32-fp-as-gp.c (nds32_have_prologue_p): Remove. + (nds32_symbol_load_store_p): Remove. + (nds32_fp_as_gp_check_available): Clean up implementation. + * config/nds32/nds32.h (LINK_SPEC): Remove -mforce-as-gp and -mex9 + cases. + * config/nds32/nds32.c (nds32_asm_file_start): No need to consider + fp-as-gp and ex9 cases. + 2015-01-13 Jan Hubicka * tree-profile.c (init_ic_make_global_vars): Drop workaround diff --git a/gcc/config/nds32/nds32-fp-as-gp.c b/gcc/config/nds32/nds32-fp-as-gp.c dissimilarity index 64% index 88a8e5b38d5..4732714b9a9 100644 --- a/gcc/config/nds32/nds32-fp-as-gp.c +++ b/gcc/config/nds32/nds32-fp-as-gp.c @@ -1,237 +1,88 @@ -/* The fp-as-gp pass of Andes NDS32 cpu for GNU compiler - Copyright (C) 2012-2015 Free Software Foundation, Inc. - Contributed by Andes Technology Corporation. - - This file is part of GCC. - - GCC is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published - by the Free Software Foundation; either version 3, or (at your - option) any later version. - - GCC is distributed in the hope that it will be useful, but WITHOUT - ANY WARRANTY; without even the implied warranty of MERCHANTABILITY - or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public - License for more details. - - You should have received a copy of the GNU General Public License - along with GCC; see the file COPYING3. If not see - . */ - -/* ------------------------------------------------------------------------ */ - -#include "config.h" -#include "system.h" -#include "coretypes.h" -#include "tm.h" -#include "hash-set.h" -#include "machmode.h" -#include "vec.h" -#include "double-int.h" -#include "input.h" -#include "alias.h" -#include "symtab.h" -#include "wide-int.h" -#include "inchash.h" -#include "tree.h" -#include "stor-layout.h" -#include "varasm.h" -#include "calls.h" -#include "rtl.h" -#include "regs.h" -#include "hard-reg-set.h" -#include "insn-config.h" /* Required by recog.h. */ -#include "conditions.h" -#include "output.h" -#include "insn-attr.h" /* For DFA state_t. */ -#include "insn-codes.h" /* For CODE_FOR_xxx. */ -#include "reload.h" /* For push_reload(). */ -#include "flags.h" -#include "input.h" -#include "function.h" -#include "expr.h" -#include "recog.h" -#include "diagnostic-core.h" -#include "dominance.h" -#include "cfg.h" -#include "cfgrtl.h" -#include "cfganal.h" -#include "lcm.h" -#include "cfgbuild.h" -#include "cfgcleanup.h" -#include "predict.h" -#include "basic-block.h" -#include "df.h" -#include "tm_p.h" -#include "tm-constrs.h" -#include "optabs.h" /* For GEN_FCN. */ -#include "target.h" -#include "target-def.h" -#include "langhooks.h" /* For add_builtin_function(). */ -#include "ggc.h" -#include "builtins.h" - -/* ------------------------------------------------------------------------ */ - -/* A helper function to check if this function should contain prologue. */ -static int -nds32_have_prologue_p (void) -{ - int i; - - for (i = 0; i < 28; i++) - if (NDS32_REQUIRED_CALLEE_SAVED_P (i)) - return 1; - - return (flag_pic - || NDS32_REQUIRED_CALLEE_SAVED_P (FP_REGNUM) - || NDS32_REQUIRED_CALLEE_SAVED_P (LP_REGNUM)); -} - -/* Return true if is load/store with SYMBOL_REF addressing mode - and memory mode is SImode. */ -static bool -nds32_symbol_load_store_p (rtx_insn *insn) -{ - rtx mem_src = NULL_RTX; - - switch (get_attr_type (insn)) - { - case TYPE_LOAD: - mem_src = SET_SRC (PATTERN (insn)); - break; - case TYPE_STORE: - mem_src = SET_DEST (PATTERN (insn)); - break; - default: - break; - } - - /* Find load/store insn with addressing mode is SYMBOL_REF. */ - if (mem_src != NULL_RTX) - { - if ((GET_CODE (mem_src) == ZERO_EXTEND) - || (GET_CODE (mem_src) == SIGN_EXTEND)) - mem_src = XEXP (mem_src, 0); - - if ((GET_CODE (XEXP (mem_src, 0)) == SYMBOL_REF) - || (GET_CODE (XEXP (mem_src, 0)) == LO_SUM)) - return true; - } - - return false; -} - -/* Function to determine whether it is worth to do fp_as_gp optimization. - Return 0: It is NOT worth to do fp_as_gp optimization. - Return 1: It is APPROXIMATELY worth to do fp_as_gp optimization. - Note that if it is worth to do fp_as_gp optimization, - we MUST set FP_REGNUM ever live in this function. */ -int -nds32_fp_as_gp_check_available (void) -{ - /* If there exists ANY of following conditions, - we DO NOT perform fp_as_gp optimization: - 1. TARGET_FORBID_FP_AS_GP is set - regardless of the TARGET_FORCE_FP_AS_GP. - 2. User explicitly uses 'naked' attribute. - 3. Not optimize for size. - 4. Need frame pointer. - 5. If $fp is already required to be saved, - it means $fp is already choosen by register allocator. - Thus we better not to use it for fp_as_gp optimization. - 6. This function is a vararg function. - DO NOT apply fp_as_gp optimization on this function - because it may change and break stack frame. - 7. The epilogue is empty. - This happens when the function uses exit() - or its attribute is no_return. - In that case, compiler will not expand epilogue - so that we have no chance to output .omit_fp_end directive. */ - if (TARGET_FORBID_FP_AS_GP - || lookup_attribute ("naked", DECL_ATTRIBUTES (current_function_decl)) - || !optimize_size - || frame_pointer_needed - || NDS32_REQUIRED_CALLEE_SAVED_P (FP_REGNUM) - || (cfun->stdarg == 1) - || (find_fallthru_edge (EXIT_BLOCK_PTR_FOR_FN (cfun)->preds) == NULL)) - return 0; - - /* Now we can check the possibility of using fp_as_gp optimization. */ - if (TARGET_FORCE_FP_AS_GP) - { - /* User explicitly issues -mforce-fp-as-gp option. */ - df_set_regs_ever_live (FP_REGNUM, 1); - return 1; - } - else - { - /* In the following we are going to evaluate whether - it is worth to do fp_as_gp optimization. */ - int good_gain = 0; - int symbol_count = 0; - - int threshold; - rtx_insn *insn; - - /* We check if there already requires prologue. - Note that $gp will be saved in prologue for PIC code generation. - After that, we can set threshold by the existence of prologue. - Each fp-implied instruction will gain 2-byte code size - from gp-aware instruction, so we have following heuristics. */ - if (flag_pic - || nds32_have_prologue_p ()) - { - /* Have-prologue: - Compiler already intends to generate prologue content, - so the fp_as_gp optimization will only insert - 'la $fp,_FP_BASE_' instruction, which will be - converted into 4-byte instruction at link time. - The threshold is "3" symbol accesses, 2 + 2 + 2 > 4. */ - threshold = 3; - } - else - { - /* None-prologue: - Compiler originally does not generate prologue content, - so the fp_as_gp optimization will NOT ONLY insert - 'la $fp,_FP_BASE' instruction, but also causes - push/pop instructions. - If we are using v3push (push25/pop25), - the threshold is "5" symbol accesses, 5*2 > 4 + 2 + 2; - If we are using normal push (smw/lmw), - the threshold is "5+2" symbol accesses 7*2 > 4 + 4 + 4. */ - threshold = 5 + (TARGET_V3PUSH ? 0 : 2); - } - - /* We would like to traverse every instruction in this function. - So we need to have push_topmost_sequence()/pop_topmost_sequence() - surrounding our for-loop evaluation. */ - push_topmost_sequence (); - /* Counting the insn number which the addressing mode is symbol. */ - for (insn = get_insns (); insn; insn = NEXT_INSN (insn)) - { - if (single_set (insn) && nds32_symbol_load_store_p (insn)) - symbol_count++; - - if (symbol_count == threshold) - { - good_gain = 1; - break; - } - } - pop_topmost_sequence (); - - /* Enable fp_as_gp optimization when potential gain is good enough. */ - if (good_gain) - { - df_set_regs_ever_live (FP_REGNUM, 1); - return 1; - } - } - - /* By default we return 0. */ - return 0; -} - -/* ------------------------------------------------------------------------ */ +/* The fp-as-gp pass of Andes NDS32 cpu for GNU compiler + Copyright (C) 2012-2015 Free Software Foundation, Inc. + Contributed by Andes Technology Corporation. + + This file is part of GCC. + + GCC is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 3, or (at your + option) any later version. + + GCC is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU General Public License + along with GCC; see the file COPYING3. If not see + . */ + +/* ------------------------------------------------------------------------ */ + +#include "config.h" +#include "system.h" +#include "coretypes.h" +#include "tm.h" +#include "hash-set.h" +#include "machmode.h" +#include "vec.h" +#include "double-int.h" +#include "input.h" +#include "alias.h" +#include "symtab.h" +#include "wide-int.h" +#include "inchash.h" +#include "tree.h" +#include "stor-layout.h" +#include "varasm.h" +#include "calls.h" +#include "rtl.h" +#include "regs.h" +#include "hard-reg-set.h" +#include "insn-config.h" /* Required by recog.h. */ +#include "conditions.h" +#include "output.h" +#include "insn-attr.h" /* For DFA state_t. */ +#include "insn-codes.h" /* For CODE_FOR_xxx. */ +#include "reload.h" /* For push_reload(). */ +#include "flags.h" +#include "input.h" +#include "function.h" +#include "expr.h" +#include "recog.h" +#include "diagnostic-core.h" +#include "dominance.h" +#include "cfg.h" +#include "cfgrtl.h" +#include "cfganal.h" +#include "lcm.h" +#include "cfgbuild.h" +#include "cfgcleanup.h" +#include "predict.h" +#include "basic-block.h" +#include "df.h" +#include "tm_p.h" +#include "tm-constrs.h" +#include "optabs.h" /* For GEN_FCN. */ +#include "target.h" +#include "target-def.h" +#include "langhooks.h" /* For add_builtin_function(). */ +#include "ggc.h" +#include "builtins.h" + +/* ------------------------------------------------------------------------ */ + +/* Function to determine whether it is worth to do fp_as_gp optimization. + Return 0: It is NOT worth to do fp_as_gp optimization. + Return 1: It is APPROXIMATELY worth to do fp_as_gp optimization. + Note that if it is worth to do fp_as_gp optimization, + we MUST set FP_REGNUM ever live in this function. */ +int +nds32_fp_as_gp_check_available (void) +{ + /* By default we return 0. */ + return 0; +} + +/* ------------------------------------------------------------------------ */ diff --git a/gcc/config/nds32/nds32.c b/gcc/config/nds32/nds32.c index 192816f9f29..227052e3ac6 100644 --- a/gcc/config/nds32/nds32.c +++ b/gcc/config/nds32/nds32.c @@ -2191,26 +2191,6 @@ nds32_asm_file_start (void) "for checking inconsistency on interrupt handler\n"); fprintf (asm_out_file, "\t.vec_size\t%d\n", nds32_isr_vector_size); - /* If user enables '-mforce-fp-as-gp' or compiles programs with -Os, - the compiler may produce 'la $fp,_FP_BASE_' instruction - at prologue for fp-as-gp optimization. - We should emit weak reference of _FP_BASE_ to avoid undefined reference - in case user does not pass '--relax' option to linker. */ - if (TARGET_FORCE_FP_AS_GP || optimize_size) - { - fprintf (asm_out_file, "\t! This weak reference is required to do " - "fp-as-gp link time optimization\n"); - fprintf (asm_out_file, "\t.weak\t_FP_BASE_\n"); - } - /* If user enables '-mex9', we should emit relaxation directive - to tell linker that this file is allowed to do ex9 optimization. */ - if (TARGET_EX9) - { - fprintf (asm_out_file, "\t! This relaxation directive is required " - "to do ex9 link time optimization\n"); - fprintf (asm_out_file, "\t.relax\tex9\n"); - } - fprintf (asm_out_file, "\t! ------------------------------------\n"); if (TARGET_ISA_V2) @@ -2744,12 +2724,6 @@ nds32_option_override (void) fixed_regs[r] = call_used_regs[r] = 1; } - /* See if user explicitly would like to use fp-as-gp optimization. - If so, we must prevent $fp from being allocated - during register allocation. */ - if (TARGET_FORCE_FP_AS_GP) - fixed_regs[FP_REGNUM] = call_used_regs[FP_REGNUM] = 1; - if (!TARGET_16_BIT) { /* Under no 16 bit ISA, we need to strictly disable TARGET_V3PUSH. */ diff --git a/gcc/config/nds32/nds32.h b/gcc/config/nds32/nds32.h index e3362b67251..8e4ebecf3be 100644 --- a/gcc/config/nds32/nds32.h +++ b/gcc/config/nds32/nds32.h @@ -381,13 +381,10 @@ enum nds32_builtins #define ASM_SPEC \ " %{mbig-endian:-EB} %{mlittle-endian:-EL}" -/* If user issues -mrelax, -mforce-fp-as-gp, or -mex9, - we need to pass '--relax' to linker. - Besides, for -mex9, we need to further pass '--mex9'. */ +/* If user issues -mrelax, we need to pass '--relax' to linker. */ #define LINK_SPEC \ " %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ - " %{mrelax|mforce-fp-as-gp|mex9:--relax}" \ - " %{mex9:--mex9}" + " %{mrelax:--relax}" #define LIB_SPEC \ " -lc -lgloss" diff --git a/gcc/config/nds32/nds32.opt b/gcc/config/nds32/nds32.opt index fa8a6cea6fa..0d573daa548 100644 --- a/gcc/config/nds32/nds32.opt +++ b/gcc/config/nds32/nds32.opt @@ -95,18 +95,6 @@ Enum(nds32_cmodel_type) String(medium) Value(CMODEL_MEDIUM) EnumValue Enum(nds32_cmodel_type) String(large) Value(CMODEL_LARGE) -mforce-fp-as-gp -Target Report Mask(FORCE_FP_AS_GP) -Prevent $fp being allocated during register allocation so that compiler is able to force performing fp-as-gp optimization. - -mforbid-fp-as-gp -Target Report Mask(FORBID_FP_AS_GP) -Forbid using $fp to access static and global variables. This option strictly forbids fp-as-gp optimization regardless of '-mforce-fp-as-gp'. - -mex9 -Target Report Mask(EX9) -Use special directives to guide linker doing ex9 optimization. - mctor-dtor Target Report Enable constructor/destructor feature. -- 2.11.4.GIT