delay branch bug?
Hariharan Sandanagobalane
hariharans@picochip.com
Mon May 24 16:56:00 GMT 2010
Jeff Law wrote:
> On 05/24/10 05:46, Hariharan wrote:
>> Hello all,
>> I found something a little odd with delay slot scheduling. If i had
>> the following bit of code (Note that "get" builtin functions in
>> picochip stand for port communication)
>>
>> int mytest ()
>> {
>> int a[5];
>> int i;
>> for (i = 0; i < 5; i++)
>> {
>> a[i] = (int) getctrlIn();
>> }
>> switch (a[3])
>> {
>> case 0:
>> return 4;
>> default:
>> return 13;
>> }
>> }
>>
>> The relevant bit of assembly for this compiled at -Os is
>>
>> _L2:
>> GET 0,R[5:4] // R[5:4] := PORT(0)
>> _picoMark_LBE5=
>> _picoMark_LBE4=
>> .loc 1 13 0
>> STW R4,(R3)0 // Mem((R3)0{byte}) := R4
>> ADD.0 R3,2,R3 // R3 := R3 + 2 (HI)
>> .loc 1 11 0
>> SUB.0 R3,R2,r15 // CC := (R3!=R2)
>> BNE _L2
>> =-> LDW (FP)3,R5 // R5 = Mem((FP)6{byte})
>> .loc 1 22 0
>>
>> =-> is the delay slot marker. Note that the LDW instruction has been
>> moved into the delay slot. This corresponds to the load in "switch
>> (a[3]" statement above. The first 3 times around this loop, LDW would
>> be loading uninitialised memory. The loaded value is ignored until we
>> come out of the loop and hence the code is functionally correct, but
>> i am not sure introduction of uninitialised memory access by the
>> compiler when there was none in the source is good.
>>
>> I browsed around the delay branch code in reorg.c, but couldn't find
>> anything that checks for this. Is this the intended behaviour? Can
>> anyone familiar with delay branch code help?
> It's not ideal, but there's no way for reorg to know that a particular
> memory location is uninitialized as a result trying to "fix" this
> problem would ultimately result in reorg not being allowed to fill
> delay slots with memory references except under very very restrictive
> circumstances.
>
> From a correctness standpoint, the uninitialized value will never be
> used, so it should cause no ill effects on your code. The biggest
> effect would be tools like valgrind & purify (if supported on your
> architecture) would report the uninitialized memory read. [Which begs
> the question how does purify handle this on sparc-solaris? ]
The code compiled for picochip runs under a simulator. The simulator
tracks uninitialised memory accesses and emits warnings and hence my
question. I would agree with you that turning off delay slot filling of
memory references for this sake doesn't make sense.
Thanks for your help.
Cheers
Hari
>
> Jeff
>>
>> Thanks
>> Hari
>>
More information about the Gcc
mailing list