>AFAIK SMS will not do speculative memory access. Right, SMS does no speculative memory access. Though that might not be a bad idea... Ayal.
2011/8/11 Revital Eres <revital.e...@linaro.org> > > Hello, > > >> I appriciate explanation regarding the following piece of code in > >> sched_analyze_insn function (sched-deps.c): When handling jump instruction > >> dependence edges are created between the jump instruction and memory > >> writes and volatile reads and I'm not quite sure the reason why. > > > > Jump instructions can be conditional. Note the check for whether the > > next instruction is a barrier. > > Thanks for the answer. I'm asking that in the context of SMS --- I'm > not sure if this dependence is needed when SMS is applied. AFAIK SMS > will not do speculative memory access. If that's indeed the case I'll > submit the following patch. > > Thanks, > Revital > > Index: sched-deps.c > =================================================================== > --- sched-deps.c (revision 177556) > +++ sched-deps.c (working copy) > @@ -2777,32 +2777,36 @@ sched_analyze_insn (struct deps_desc *de > } > > /* All memory writes and volatile reads must happen before the > - jump. Non-volatile reads must happen before the jump iff > - the result is needed by the above register used mask. */ > + jump unless the analysis is done for the SMS pass. > + Non-volatile reads must happen before the jump iff the > + result is needed by the above register used mask. */ > > - pending = deps->pending_write_insns; > - pending_mem = deps->pending_write_mems; > - while (pending) > + if (common_sched_info->sched_pass_id != SCHED_SMS_PASS) > { > - if (! sched_insns_conditions_mutex_p (insn, XEXP (pending, 0))) > - add_dependence (insn, XEXP (pending, 0), REG_DEP_OUTPUT); > - pending = XEXP (pending, 1); > - pending_mem = XEXP (pending_mem, 1); > - } > - > - pending = deps->pending_read_insns; > - pending_mem = deps->pending_read_mems; > - while (pending) > - { > - if (MEM_VOLATILE_P (XEXP (pending_mem, 0)) > - && ! sched_insns_conditions_mutex_p (insn, XEXP (pending, > 0))) > - add_dependence (insn, XEXP (pending, 0), REG_DEP_OUTPUT); > - pending = XEXP (pending, 1); > - pending_mem = XEXP (pending_mem, 1); > + pending = deps->pending_write_insns; > + pending_mem = deps->pending_write_mems; > + while (pending) > + { > + if (! sched_insns_conditions_mutex_p (insn, XEXP (pending, > 0))) > + add_dependence (insn, XEXP (pending, 0), REG_DEP_OUTPUT); > + pending = XEXP (pending, 1); > + pending_mem = XEXP (pending_mem, 1); > + } > + > + pending = deps->pending_read_insns; > + pending_mem = deps->pending_read_mems; > + while (pending) > + { > + if (MEM_VOLATILE_P (XEXP (pending_mem, 0)) > + && ! sched_insns_conditions_mutex_p (insn, XEXP > (pending, 0))) > + add_dependence (insn, XEXP (pending, 0), REG_DEP_OUTPUT); > + pending = XEXP (pending, 1); > + pending_mem = XEXP (pending_mem, 1); > + } > + > + add_dependence_list (insn, deps->last_pending_memory_flush, 1, > + REG_DEP_ANTI); > } > - > - add_dependence_list (insn, deps->last_pending_memory_flush, 1, > - REG_DEP_ANTI); > } > }