Hello,
I am slightly unsure if the confusion is in the dependencies or it's my
confusion.
I have tracked this strange behaviour which only occurs when we need to flush
pending instructions due to the pending list becoming too large (gcc 4.8,
haven't tried with trunk).
I have two stores:
85: st zr, [r12] # zr is the zero register
90: st zr, [r18]
While analysing dependencies for `st zr, [r12]`, we notice that pending list is
too large in sched_analyze_1 and call flush_pending_lists (deps, insn, false,
true).
This in turn causes the last_pending_memory_flush to be set to:
(insn_list:REG_DEP_TRUE 85 (nil))
When insn 90 is analyzed next, it skips the flushing bit since the pending
lists had just been flushed and enters the else bit where it does:
add_dependence_list (insn, deps->last_pending_memory_flush, 1,
REG_DEP_ANTI, true);
This adds the dependency: 90 has an anti-dependency to 85.
I think this should be a true dependency (write after write). It even says so
in the list of last_pending_memory_flush, however add_dependence_list function
ignored this and uses the dep_type passed: REG_DEP_ANTI.
Is anti the correct dependence? Why?
--
Paulo Matos