Jakob Stoklund Olesen
2012-Jul-06 01:48 UTC
[LLVMdev] MachineOperand: Subreg defines and the Undef flag
On Jul 5, 2012, at 6:01 PM, "Pranav Bhandarkar" <pranavb at codeaurora.org> wrote:> Hi Jakob, > >> New_MI_1:: Vreg1 = 0 ; Vreg1 and Vreg2 >> are 32 bit virt. regs. >> New_MI_2:: Vreg2 = COPY C:lo_sub_reg. >> New_MI_3:: B= REG_SEQUENCE<Vreg1, hi_sub_reg, Vreg2, lo_sub_reg> ; B >> is a >> 64 bit virt reg. > > I used this approach and it worked find until I hit, what I believe is, a > bug in the register coalescer. > When the register coalescer cannot trivially coalesce a copy, say C,, it > calls AdjustCopiesBackFrom. In this function, we try to see if have this > situation. > > A3 = B0 > ..... > ..... > B1 = A3 <--The copy C > > And if so, we check if we can merge the two ranges of B into a single range. > However, this is not safe if A3 is a subreg define while A3 is not a subreg > use. > For instance, consider this code (part of a single block loop). > > MI1:: %vreg7:subreg_loreg<def,undef>, %vreg30<def> = POST_LDriuh %vreg30, > 2, // Post Inc. Load. Vreg7 is a 64bit reg. > MI2:: %vreg7:subreg_hireg<def> = COPY %vreg32:subreg_hireg<kill> > // This is the A3 = B0 above. > MI3:: %vreg31<def> = ADD_rr %vreg31<kill>, %vreg32:subreg_loreg<kill> > // Use the lo subreg that was setup in MI1: > .... > .... > MI4:: %vreg32<def> = COPY %vreg7; //Not trivial > because 7 is not killed. This is the Copy C i.e. B1=A3. > .... > MI5:: Conditional jump back to start of the block. > > The coalesce coalesces the copy withouth realizing that the instruction that > defined the source of the copy was a copy instruction that only copied a > subreg not the whole register. > In the event, we lose the lower subreg. > > Let me know If I am missing something.That sounds like a bug, probably adjustCopiesBackFrom needs to check ACopyMI->isFullCopy(). Do you have a test case for this? /jakob
Pranav D Bhandarkar
2012-Jul-06 14:30 UTC
[LLVMdev] MachineOperand: Subreg defines and the Undef flag
> > > That sounds like a bug, probably adjustCopiesBackFrom needs to check > ACopyMI->isFullCopy(). > > Do you have a test case for this? > >Yes and No. Yes because the example is from a unit testcase that I have. No because it manifests itself only with my half baked pass that I was talking about earlier in this thread. Pranav -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120706/7e2d2118/attachment.html>
Jakob Stoklund Olesen
2012-Jul-06 16:48 UTC
[LLVMdev] MachineOperand: Subreg defines and the Undef flag
On Jul 6, 2012, at 7:30 AM, Pranav D Bhandarkar <pranav.bhandarkar at utexas.edu> wrote:> That sounds like a bug, probably adjustCopiesBackFrom needs to check ACopyMI->isFullCopy(). > > Do you have a test case for this? > > > Yes and No. Yes because the example is from a unit testcase that I have. No because it manifests itself only with my half baked pass that I was talking about earlier in this thread.Alright. Even then, patches welcome! /jakob -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120706/0dea51f1/attachment.html>
Reasonably Related Threads
- [LLVMdev] MachineOperand: Subreg defines and the Undef flag
- [LLVMdev] MachineOperand: Subreg defines and the Undef flag
- [LLVMdev] MachineOperand: Subreg defines and the Undef flag
- [LLVMdev] MachineOperand: Subreg defines and the Undef flag
- [LLVMdev] MachineOperand: Subreg defines and the Undef flag