diff options
author | Ramana Radhakrishnan <ramana.radhakrishnan@arm.com> | 2014-08-04 09:57:49 +0000 |
---|---|---|
committer | Kyrylo Tkachov <ktkachov@gcc.gnu.org> | 2014-08-04 09:57:49 +0000 |
commit | dc549f34cb94f69b00296c45517a97e6de57ecba (patch) | |
tree | 33061b27da0df6c3eb72fbac9e0c4b2559787f16 /gcc | |
parent | bb304287342b02608f8df217b65f2a93f65ae90c (diff) | |
download | gcc-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/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 3 | ||||
-rw-r--r-- | gcc/sched-deps.c | 51 |
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 |