delay branch bug?

Jeff Law law@redhat.com
Mon May 24 14:33:00 GMT 2010


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? ]

Jeff
>
> Thanks
> Hari
>



More information about the Gcc mailing list