Hi Jeff, Thanks for the review and your approval for final patch. Sorry, It was a long weekend and hence could not revert to your comments earlier.
>> You need a ChangeLog entry, but I think that's it. Can you >> please repost with a ChangeLog entry for final approval? Please find the final patch and ChangeLog entry updated as required. Please review the same and let me know if its okay to commit? Thanks, Naveen 2017-06-27 Naveen H.S <naveen.hurugalaw...@cavium.com> * config/aarch64/aarch64.c (aarch_macro_fusion_pair_p): Push the check for CC usage into AARCH64_FUSE_CMP_BRANCH. * config/i386/i386.c (ix86_macro_fusion_pair_p): Push the check for CC usage from generic code to here. * sched-deps.c (sched_macro_fuse_insns): Move the condition for CC usage into the target macros.
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 2e385c4..b38b8b7 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -13973,13 +13973,23 @@ aarch_macro_fusion_pair_p (rtx_insn *prev, rtx_insn *curr) { enum attr_type prev_type = get_attr_type (prev); - /* FIXME: this misses some which is considered simple arthematic - instructions for ThunderX. Simple shifts are missed here. */ - if (prev_type == TYPE_ALUS_SREG - || prev_type == TYPE_ALUS_IMM - || prev_type == TYPE_LOGICS_REG - || prev_type == TYPE_LOGICS_IMM) - return true; + unsigned int condreg1, condreg2; + rtx cc_reg_1; + aarch64_fixed_condition_code_regs (&condreg1, &condreg2); + cc_reg_1 = gen_rtx_REG (CCmode, condreg1); + + if (reg_referenced_p (cc_reg_1, PATTERN (curr)) + && prev + && modified_in_p (cc_reg_1, prev)) + { + /* FIXME: this misses some which is considered simple arthematic + instructions for ThunderX. Simple shifts are missed here. */ + if (prev_type == TYPE_ALUS_SREG + || prev_type == TYPE_ALUS_IMM + || prev_type == TYPE_LOGICS_REG + || prev_type == TYPE_LOGICS_IMM) + return true; + } } return false; diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 0b2fa1b..af14c90 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -29483,6 +29483,15 @@ ix86_macro_fusion_pair_p (rtx_insn *condgen, rtx_insn *condjmp) if (!any_condjump_p (condjmp)) return false; + unsigned int condreg1, condreg2; + rtx cc_reg_1; + ix86_fixed_condition_code_regs (&condreg1, &condreg2); + cc_reg_1 = gen_rtx_REG (CCmode, condreg1); + if (!reg_referenced_p (cc_reg_1, PATTERN (condjmp)) + || !condgen + || !modified_in_p (cc_reg_1, condgen)) + 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 b2393bf..4c459e6 100644 --- a/gcc/sched-deps.c +++ b/gcc/sched-deps.c @@ -2834,34 +2834,30 @@ static void sched_macro_fuse_insns (rtx_insn *insn) { rtx_insn *prev; - + prev = prev_nonnote_nondebug_insn (insn); + if (!prev) + 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; + if (reg_referenced_p (cc_reg_1, PATTERN (insn)) + && modified_in_p (cc_reg_1, prev)) + { + if (targetm.sched.macro_fusion_pair_p (prev, insn)) + SCHED_GROUP_P (insn) = 1; + return; + } } - else - { - rtx insn_set = single_set (insn); - - prev = prev_nonnote_nondebug_insn (insn); - if (!prev - || !insn_set - || !single_set (prev)) - return; + if (single_set (insn) && single_set (prev)) + { + if (targetm.sched.macro_fusion_pair_p (prev, insn)) + SCHED_GROUP_P (insn) = 1; } - - if (targetm.sched.macro_fusion_pair_p (prev, insn)) - SCHED_GROUP_P (insn) = 1; - } /* Get the implicit reg pending clobbers for INSN and save them in TEMP. */