[LLVMdev] RegisterCoalescing Pass seems to ignore part of CFG.
ivanllopard at gmail.com
Thu Oct 25 12:54:03 PDT 2012
On 25/10/2012 18:14, Vincent Lejeune wrote:
> When examining the debug output of regalloc, it seems that joining 32bits reg also joins 128 parent reg.
> If I look at the :
> %vreg34<def> = COPY %vreg6:sel_y; R600_Reg32:%vreg34 R600_Reg128:%vreg6
> instructions ; it gets joined to :
> 928B%vreg34<def> = COPY %vreg48:sel_y;
> when vreg6 and vreg48 are joined. It's right.
> But joining the following copy
> 912B%vreg32:sel_x<def,read-undef> = COPY %vreg48:sel_x; R600_Reg128:%vreg32,%vreg48
> updates it to
> 928B%vreg34<def> = COPY %vreg32:sel_y; R600_Reg32:%vreg34 R600_Reg128:%vreg32
> which is wrong. vreg32:sel_y is undef.
Well, that seems correct to me. Following the code and debug output, the
joining is going from vreg6->vreg48->vreg32. vreg6 is defined at BB0, so
it will be vreg32 and its sel_y subreg also.
Try to run the verifier with -verify-coalescing.
If you have implemented the hooks for the coalescer in your
TargetRegisterInfo you can also try to disable them to verify the
implementation. Hope this helps to spot the problem.
More information about the llvm-dev