aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRamana Radhakrishnan <ramana.radhakrishnan@arm.com>2014-08-04 09:57:49 +0000
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>2014-08-04 09:57:49 +0000
commitdc549f34cb94f69b00296c45517a97e6de57ecba (patch)
tree33061b27da0df6c3eb72fbac9e0c4b2559787f16 /gcc
parentbb304287342b02608f8df217b65f2a93f65ae90c (diff)
downloadgcc-dc549f34cb94f69b00296c45517a97e6de57ecba.zip
gcc-dc549f34cb94f69b00296c45517a97e6de57ecba.tar.gz
gcc-dc549f34cb94f69b00296c45517a97e6de57ecba.tar.bz2
[sched-deps] Generalise usage of macro fusion to work on any two insns.
* sched-deps.c (try_group_insn): Generalise macro fusion hook usage to any two insns. Update comment. Rename to sched_macro_fuse_insns. (sched_analyze_insn): Update use of try_group_insn to sched_macro_fuse_insns. * config/i386/i386.c (ix86_macro_fusion_pair_p): Reject 2nd arguments that are not conditional jumps. Co-Authored-By: Kyrylo Tkachov <kyrylo.tkachov@arm.com> From-SVN: r213551
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/i386/i386.c3
-rw-r--r--gcc/sched-deps.c51
3 files changed, 42 insertions, 22 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2be35a9..e2a17a6 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2014-07-14 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
+ Kyrylo Tkachov <kyrylo.tkachov@arm.com>
+
+ * sched-deps.c (try_group_insn): Generalise macro fusion hook usage
+ to any two insns. Update comment. Rename to sched_macro_fuse_insns.
+ (sched_analyze_insn): Update use of try_group_insn to
+ sched_macro_fuse_insns.
+ * config/i386/i386.c (ix86_macro_fusion_pair_p): Reject 2nd
+ arguments that are not conditional jumps.
+
2014-08-04 Ganesh Gopalasubramanian <Ganesh.Gopalasubramanian@amd.com>
* config/i386/driver-i386.c (host_detect_local_cpu): Handle AMD's extended
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 1cb6297..d13e235 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -25808,6 +25808,9 @@ ix86_macro_fusion_pair_p (rtx condgen, rtx condjmp)
rtx compare_set = NULL_RTX, test_if, cond;
rtx alu_set = NULL_RTX, addr = NULL_RTX;
+ if (!any_condjump_p (condjmp))
+ return false;
+
if (get_attr_type (condgen) != TYPE_TEST
&& get_attr_type (condgen) != TYPE_ICMP
&& get_attr_type (condgen) != TYPE_INCDEC
diff --git a/gcc/sched-deps.c b/gcc/sched-deps.c
index d271521..51c1a01 100644
--- a/gcc/sched-deps.c
+++ b/gcc/sched-deps.c
@@ -2821,35 +2821,42 @@ sched_analyze_2 (struct deps_desc *deps, rtx x, rtx insn)
sched_deps_info->finish_rhs ();
}
-/* Try to group comparison and the following conditional jump INSN if
- they're already adjacent. This is to prevent scheduler from scheduling
- them apart. */
+/* Try to group two fuseable insns together to prevent scheduler
+ from scheduling them apart. */
static void
-try_group_insn (rtx insn)
+sched_macro_fuse_insns (rtx insn)
{
- unsigned int condreg1, condreg2;
- rtx cc_reg_1;
rtx prev;
- if (!any_condjump_p (insn))
- return;
+ if (any_condjump_p (insn))
+ {
+ unsigned int condreg1, condreg2;
+ rtx cc_reg_1;
+ targetm.fixed_condition_code_regs (&condreg1, &condreg2);
+ cc_reg_1 = gen_rtx_REG (CCmode, condreg1);
+ prev = prev_nonnote_nondebug_insn (insn);
+ if (!reg_referenced_p (cc_reg_1, PATTERN (insn))
+ || !prev
+ || !modified_in_p (cc_reg_1, prev))
+ return;
+ }
+ else
+ {
+ rtx insn_set = single_set (insn);
- targetm.fixed_condition_code_regs (&condreg1, &condreg2);
- cc_reg_1 = gen_rtx_REG (CCmode, condreg1);
- prev = prev_nonnote_nondebug_insn (insn);
- if (!reg_referenced_p (cc_reg_1, PATTERN (insn))
- || !prev
- || !modified_in_p (cc_reg_1, prev))
- return;
+ prev = prev_nonnote_nondebug_insn (insn);
+ if (!prev
+ || !insn_set
+ || !single_set (prev)
+ || !modified_in_p (SET_DEST (insn_set), prev))
+ return;
- /* Different microarchitectures support macro fusions for different
- combinations of insn pairs. */
- if (!targetm.sched.macro_fusion_pair_p
- || !targetm.sched.macro_fusion_pair_p (prev, insn))
- return;
+ }
+
+ if (targetm.sched.macro_fusion_pair_p (prev, insn))
+ SCHED_GROUP_P (insn) = 1;
- SCHED_GROUP_P (insn) = 1;
}
/* Analyze an INSN with pattern X to find all dependencies. */
@@ -2878,7 +2885,7 @@ sched_analyze_insn (struct deps_desc *deps, rtx x, rtx insn)
/* Group compare and branch insns for macro-fusion. */
if (targetm.sched.macro_fusion_p
&& targetm.sched.macro_fusion_p ())
- try_group_insn (insn);
+ sched_macro_fuse_insns (insn);
if (may_trap_p (x))
/* Avoid moving trapping instructions across function calls that might