aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>2014-11-24 11:09:59 +0000
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>2014-11-24 11:09:59 +0000
commit892d9879a895ac23e8672a0817c4cfd0af253bca (patch)
tree796682fd2edd26a0fabad078aaaf49c3506d6499
parenta9a318b031037cf3c486d7d863eae8491f1898d2 (diff)
downloadgcc-892d9879a895ac23e8672a0817c4cfd0af253bca.zip
gcc-892d9879a895ac23e8672a0817c4cfd0af253bca.tar.gz
gcc-892d9879a895ac23e8672a0817c4cfd0af253bca.tar.bz2
[sched-deps] Remove needless check for modified_in_p when trying to fuse two non-conditional jump insns
* sched-deps.c (sched_macro_fuse_insns): Do not check modified_in_p in the not conditional jump case. * doc/tm.texi (TARGET_SCHED_MACRO_FUSION_PAIR_P): Update description. * target.def (TARGET_SCHED_MACRO_FUSION_PAIR_P): Update description. * gcc.target/aarch64/fuse_adrp_add_1.c: New test. From-SVN: r218012
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/doc/tm.texi12
-rw-r--r--gcc/sched-deps.c3
-rw-r--r--gcc/target.def12
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/aarch64/fuse_adrp_add_1.c45
6 files changed, 71 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0835501..0db7927 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
2014-11-24 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
+ * sched-deps.c (sched_macro_fuse_insns): Do not check modified_in_p
+ in the not conditional jump case.
+ * doc/tm.texi (TARGET_SCHED_MACRO_FUSION_PAIR_P): Update description.
+ * target.def (TARGET_SCHED_MACRO_FUSION_PAIR_P): Update description.
+
+2014-11-24 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
+
* config/aarch64/aarch64.c: Include tm-constrs.h
(AARCH64_FUSE_ADRP_ADD): Define.
(cortexa57_tunings): Add AARCH64_FUSE_ADRP_ADD to fuseable_ops.
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 5b9da47..c54fc71 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -6484,11 +6484,13 @@ cycle. These other insns can then be taken into account properly.
This hook is used to check whether target platform supports macro fusion.
@end deftypefn
-@deftypefn {Target Hook} bool TARGET_SCHED_MACRO_FUSION_PAIR_P (rtx_insn *@var{condgen}, rtx_insn *@var{condjmp})
-This hook is used to check whether two insns could be macro fused for
-target microarchitecture. If this hook returns true for the given insn pair
-(@var{condgen} and @var{condjmp}), scheduler will put them into a sched
-group, and they will not be scheduled apart.
+@deftypefn {Target Hook} bool TARGET_SCHED_MACRO_FUSION_PAIR_P (rtx_insn *@var{prev}, rtx_insn *@var{curr})
+This hook is used to check whether two insns should be macro fused for
+a target microarchitecture. If this hook returns true for the given insn pair
+(@var{prev} and @var{curr}), the scheduler will put them into a sched
+group, and they will not be scheduled apart. The two insns will be either
+two SET insns or a compare and a conditional jump and this hook should
+validate any dependencies needed to fuse the two insns together.
@end deftypefn
@deftypefn {Target Hook} void TARGET_SCHED_DEPENDENCIES_EVALUATION_HOOK (rtx_insn *@var{head}, rtx_insn *@var{tail})
diff --git a/gcc/sched-deps.c b/gcc/sched-deps.c
index a4ea836..ee534b0 100644
--- a/gcc/sched-deps.c
+++ b/gcc/sched-deps.c
@@ -2877,8 +2877,7 @@ sched_macro_fuse_insns (rtx_insn *insn)
prev = prev_nonnote_nondebug_insn (insn);
if (!prev
|| !insn_set
- || !single_set (prev)
- || !modified_in_p (SET_DEST (insn_set), prev))
+ || !single_set (prev))
return;
}
diff --git a/gcc/target.def b/gcc/target.def
index dc48ae6..7c0296d 100644
--- a/gcc/target.def
+++ b/gcc/target.def
@@ -1067,11 +1067,13 @@ DEFHOOK
DEFHOOK
(macro_fusion_pair_p,
- "This hook is used to check whether two insns could be macro fused for\n\
-target microarchitecture. If this hook returns true for the given insn pair\n\
-(@var{condgen} and @var{condjmp}), scheduler will put them into a sched\n\
-group, and they will not be scheduled apart.",
- bool, (rtx_insn *condgen, rtx_insn *condjmp), NULL)
+ "This hook is used to check whether two insns should be macro fused for\n\
+a target microarchitecture. If this hook returns true for the given insn pair\n\
+(@var{prev} and @var{curr}), the scheduler will put them into a sched\n\
+group, and they will not be scheduled apart. The two insns will be either\n\
+two SET insns or a compare and a conditional jump and this hook should\n\
+validate any dependencies needed to fuse the two insns together.",
+ bool, (rtx_insn *prev, rtx_insn *curr), NULL)
/* The following member value is a pointer to a function called
after evaluation forward dependencies of insns in chain given
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 89b181f..b3d827f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2014-11-24 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
+
+ * gcc.target/aarch64/fuse_adrp_add_1.c: New test.
+
2014-11-24 Richard Biener <rguenther@suse.de>
PR testsuite/64039
diff --git a/gcc/testsuite/gcc.target/aarch64/fuse_adrp_add_1.c b/gcc/testsuite/gcc.target/aarch64/fuse_adrp_add_1.c
new file mode 100644
index 0000000..074c629
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/fuse_adrp_add_1.c
@@ -0,0 +1,45 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -mcpu=cortex-a57" } */
+
+enum reg_class { NO_REGS, AP_REG, XRF_REGS, GENERAL_REGS, AGRF_REGS,
+ XGRF_REGS, ALL_REGS, LIM_REG_CLASSES };
+
+enum rtx_code { REG, LAST_AND_UNUSED_RTX_CODE };
+
+typedef union rtunion_def
+{
+ int rtint;
+} rtunion;
+
+typedef struct rtx_def
+{
+ unsigned int volatil : 1;
+ rtunion fld[1];
+} *rtx;
+
+extern char fixed_regs[64];
+extern char global_regs[64];
+
+int
+rtx_cost (rtx x, int outer_code)
+{
+ register enum rtx_code code;
+ switch (code)
+ {
+ case REG:
+ return ! ((((x)->volatil) && ((x)->fld[0].rtint) < 64)
+ || ((((x)->fld[0].rtint)) == 30 || (((x)->fld[0].rtint)) == 30
+ || (((x)->fld[0].rtint)) == 31 || (((x)->fld[0].rtint)) == 0
+ || ((((x)->fld[0].rtint)) >= (64)
+ && (((x)->fld[0].rtint)) <= (((64)) + 3))
+ || ((((x)->fld[0].rtint)) < 64 && ((((x)->fld[0].rtint)) == 30
+ || (((x)->fld[0].rtint)) == 30 || fixed_regs[((x)->fld[0].rtint)]
+ || global_regs[((x)->fld[0].rtint)])
+ && ((((x)->fld[0].rtint))
+ ? ((((x)->fld[0].rtint) < 32)
+ ? GENERAL_REGS : XRF_REGS)
+ : AP_REG) != NO_REGS)));
+ }
+}
+
+/* { dg-final { scan-assembler "adrp\tx.*, fixed_regs\n\tadd\tx.*, x.*fixed_regs" } } */