A question about sched_analyze_insn in sched-deps.c
Ayal Zaks
ayal.zaks@gmail.com
Tue Aug 16 00:39:00 GMT 2011
>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.eres@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);
> }
> }
More information about the Gcc
mailing list