I'm porting GCC 4.1.1 to a VLIW architecture.
I have to insert NOP instructions when data dependencies occurred.
So I wrote an algorithm as the following:
foreach(insn in all real insns) {
foreach(dep_insn in LOG_LINKS(insn)) {
if(INSN_DELETED_P(dep_insn)) continue;
stalls = insn_latency(dep_insn, insn);
distance = cycle_distance(dep_insn, insn);
if(stalls > distance)
emit proper NOP instructions before insn;
}
}
(This algorithm is performed in the hook `TARGET_ASM_FUNCTION_PROLOGUE')
The algorithm is highly dependent on the information of LOG_LINKS(insn).
But I found that there are not any dependecy info for `reload instructions'
because the register allocation pass and reloading pass are peformed after
the first insn scheduling pass.
For example, here are two insns which have true data dependency:
@(insn 25 2343 895 (set (reg:SI 25 rd1)
@ (const_int 0 [0x0])) 15 {*movsi_const_dsp} (nil)
@ (nil))
movilc .m0 rd1, #0 @ 25 *movsi_const_dsp/1 [length = 4]
@(insn 895 25 33 (set (mem/c:SI (plus:SI (reg/f:SI 12 fp)
@ (const_int -1204 [0xfffffb4c])) [0 S4 A32])
@ (reg:SI 25 rd1)) 16 {*movsi_dsp} (nil)
@ (nil))
stw .r0 rd1, *-fp[#1204] @ 895 *movsi_dsp/13 [length
= 4]
The `insn 895' is inserted by global register allocation pass.
So its LOG_LINKS field is empty because the insn didn't process by first
scheduling pass.
Should I write a violent algorithm to scan these data dependencies?
Are there any better solutions for this problem?
Thanks a lot.