Maxim Kuvyrkov writes: > I'm not 100% sure about current state of things, considering recent > merge of sel-sched, but before that it was: > > set_priorities() -> priority() -> dep_cost() -> recog_memoized().
I don't think that was the case for all insns even before the patch. The only new thing is the assert which now catches this. If the consumer is an asm just like in gcc.dg/tree-ssa/stdarg-2.c:f10() then we would not call recog on the producer inside dep_cost*. The patch below fixes the issue for me. I am going to test this if it looks good to people. Adam Index: haifa-sched.c =================================================================== --- haifa-sched.c (revision 139918) +++ haifa-sched.c (working copy) @@ -646,7 +646,8 @@ insn_cost (rtx insn) /* Compute cost of dependence LINK. This is the number of cycles between instruction issue and - instruction results. */ + instruction results. We also use this function to call + recog_memoized on all insns. */ int dep_cost_1 (dep_t link, dw_t dw) { @@ -657,7 +658,10 @@ dep_cost_1 (dep_t link, dw_t dw) This allows the computation of a function's result and parameter values to overlap the return and call. */ if (recog_memoized (used) < 0) - cost = 0; + { + cost = 0; + recog_memoized (DEP_PRO (link)); + } else { rtx insn = DEP_PRO (link); @@ -2305,6 +2309,8 @@ choose_ready (struct ready_list *ready, { insn = ready_element (ready, i); + /* If this insn is recognizable we should have already + recognized it in dep_cost_1. */ gcc_assert (INSN_CODE (insn) >= 0 || recog_memoized (insn) < 0);