gcc/
* haifa-sched.c (rank_for_schedule): Add bypass_p
cost check in flag_sched_last_insn_heuristic.
---
gcc/haifa-sched.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/gcc/haifa-sched.c b/gcc/haifa-sched.c
index 62d1816a55d..adf63659d15 100644
--- a/gcc/haifa-sched.c
+++ b/gcc/haifa-sched.c
@@ -2780,10 +2780,14 @@ rank_for_schedule (const void *x, const void *y)
1) Data dependent on last schedule insn.
2) Anti/Output dependent on last scheduled insn.
3) Independent of last scheduled insn, or has latency of one.
+ 4) bypass of last scheduled insn, and has latency of zero.
Choose the insn from the highest numbered class if different. */
dep1 = sd_find_dep_between (last, tmp, true);
- if (dep1 == NULL || dep_cost (dep1) == 1)
+ if (dep1 == NULL || dep_cost (dep1) == 1
+ || (INSN_CODE (DEP_PRO (dep1)) >= 0 && bypass_p (DEP_PRO (dep1))
+ && recog_memoized (DEP_CON (dep1)) >= 0
+ && !dep_cost (dep1)))
tmp_class = 3;
else if (/* Data dependence. */
DEP_TYPE (dep1) == REG_DEP_TRUE)
@@ -2793,7 +2797,10 @@ rank_for_schedule (const void *x, const void *y)
dep2 = sd_find_dep_between (last, tmp2, true);
- if (dep2 == NULL || dep_cost (dep2) == 1)
+ if (dep2 == NULL || dep_cost (dep2) == 1
+ || (INSN_CODE (DEP_PRO (dep2)) >= 0 && bypass_p (DEP_PRO (dep2))
+ && recog_memoized (DEP_CON (dep2)) >= 0
+ && !dep_cost (dep2)))
tmp2_class = 3;
else if (/* Data dependence. */
DEP_TYPE (dep2) == REG_DEP_TRUE)
--
2.24.3 (Apple Git-128)