incorrect register live ranges
I'm an experiencing what feels like register mis-allocation by uca. I allocate several registers, branch to another segment, allocate several more, and the newly allocated virtual registers end up being allocated in the same physical registers as the virts allocated in before the branch. I'm using an unconditional branch (br) to jump to the second segment (.segment 1) - same to come back to segment 0. IE: .segment 0 .local reg1 immed[reg1, 1] br[label#] done#: ctx_arb[kill] .endlocal .segment 1 label#: .local reg2 immed[reg2, 2] //ends up overwriting reg1 br[done#] .endlocal Does the compiler not calculate virtual live ranges across segments? Or is this a silly .local\.endlocal problem, and the compiler doesn't follow the live range on a branch outside a .local section? thanks, Cy
The following does work correctly... .segment 0 .local reg1 immed[reg1, 1] br[label#] .segment 1 label#: .local reg2 immed[reg2, 2] //ends up overwriting reg1 br[done#] .endlocal .segment 0 done#: ctx_arb[kill] .endlocal On Tue, 2003-07-08 at 14:02, Cyrus Hall wrote:
I'm an experiencing what feels like register mis-allocation by uca. I allocate several registers, branch to another segment, allocate several more, and the newly allocated virtual registers end up being allocated in the same physical registers as the virts allocated in before the branch. I'm using an unconditional branch (br) to jump to the second segment (.segment 1) - same to come back to segment 0.
IE: .segment 0 .local reg1 immed[reg1, 1] br[label#] done#: ctx_arb[kill] .endlocal
.segment 1 label#: .local reg2 immed[reg2, 2] //ends up overwriting reg1 br[done#] .endlocal
Does the compiler not calculate virtual live ranges across segments? Or is this a silly .local\.endlocal problem, and the compiler doesn't follow the live range on a branch outside a .local section?
thanks, Cy
participants (1)
-
Cyrus Hall