aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaz Kojima <kkojima@gcc.gnu.org>2014-12-19 04:47:18 +0000
committerKaz Kojima <kkojima@gcc.gnu.org>2014-12-19 04:47:18 +0000
commit106a52b7bff18807dedbfc54e48db07d375e7eac (patch)
treee32b6978997b2ab87c56e6b930228d8776fc7237
parent14133a4d8ab6d9ccd7e7e2e827f4451180a7e17a (diff)
downloadgcc-106a52b7bff18807dedbfc54e48db07d375e7eac.zip
gcc-106a52b7bff18807dedbfc54e48db07d375e7eac.tar.gz
gcc-106a52b7bff18807dedbfc54e48db07d375e7eac.tar.bz2
* [SH] Add -mlra option.
From-SVN: r218888
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/sh/sh.c14
-rw-r--r--gcc/config/sh/sh.opt3
3 files changed, 24 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b22e5aa..fd92d52 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
2014-12-19 Kaz Kojima <kkojima@gcc.gnu.org>
+ * config/sh/sh.c (sh_lra_p): New function.
+ (TARGET_LRA_P): Define.
+ (sh_legitimize_reload_address): Return false if sh_lra_p is true.
+ * config/sh/sh.opt (mlra): New option.
+
+2014-12-19 Kaz Kojima <kkojima@gcc.gnu.org>
+
* lra-constraints.c (process_address_1): Try if target can split
displacement with targetm.legitimize_address_displacement.
* target.def (legitimize_address_displacement): New hook.
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c
index 815f4d9..e586f48 100644
--- a/gcc/config/sh/sh.c
+++ b/gcc/config/sh/sh.c
@@ -222,6 +222,7 @@ static int sh_mode_after (int, int, rtx_insn *);
static int sh_mode_entry (int);
static int sh_mode_exit (int);
static int sh_mode_priority (int entity, int n);
+static bool sh_lra_p (void);
static rtx mark_constant_pool_use (rtx);
static tree sh_handle_interrupt_handler_attribute (tree *, tree, tree,
@@ -620,6 +621,9 @@ static const struct attribute_spec sh_attribute_table[] =
#undef TARGET_ENCODE_SECTION_INFO
#define TARGET_ENCODE_SECTION_INFO sh_encode_section_info
+#undef TARGET_LRA_P
+#define TARGET_LRA_P sh_lra_p
+
#undef TARGET_SECONDARY_RELOAD
#define TARGET_SECONDARY_RELOAD sh_secondary_reload
@@ -10484,6 +10488,9 @@ sh_legitimize_reload_address (rtx *p, machine_mode mode, int opnum,
enum reload_type type = (enum reload_type) itype;
const int mode_sz = GET_MODE_SIZE (mode);
+ if (sh_lra_p ())
+ return false;
+
if (! ALLOW_INDEXED_ADDRESS
&& GET_CODE (*p) == PLUS
&& REG_P (XEXP (*p, 0)) && REG_P (XEXP (*p, 1)))
@@ -13774,6 +13781,13 @@ sh_mode_priority (int entity ATTRIBUTE_UNUSED, int n)
return ((TARGET_FPU_SINGLE != 0) ^ (n) ? FP_MODE_SINGLE : FP_MODE_DOUBLE);
}
+/* Return true if we use LRA instead of reload pass. */
+static bool
+sh_lra_p (void)
+{
+ return sh_lra_flag;
+}
+
/* Implement TARGET_USE_BY_PIECES_INFRASTRUCTURE_P. */
static bool
diff --git a/gcc/config/sh/sh.opt b/gcc/config/sh/sh.opt
index bb6d395..375bb88 100644
--- a/gcc/config/sh/sh.opt
+++ b/gcc/config/sh/sh.opt
@@ -360,3 +360,6 @@ mfsrra
Target Var(TARGET_FSRRA)
Enable the use of the fsrra instruction
+mlra
+Target Report Var(sh_lra_flag) Init(0) Save
+Use LRA instead of reload (transitional)