[LLVMbugs] [Bug 9410] New: Bad live intervals after SimpleRegisterCoalescing remat

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Sat Mar 5 10:35:11 PST 2011


http://llvm.org/bugs/show_bug.cgi?id=9410

           Summary: Bad live intervals after SimpleRegisterCoalescing
                    remat
           Product: libraries
           Version: trunk
          Platform: PC
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: Register Allocator
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: stoklund at 2pi.dk
                CC: llvmbugs at cs.uiuc.edu


SimpleRegisterCoalescing can rematerialize isAsCheapAsAMove instructions
instead of coalescing a copy which causes the source live interval to shrink.

In rare cases, the live interval doesn't shrink enough because previously
coalesced copies are still around and look like legitimate uses to
LiveIntervals::shrinkToUses.

llc bugpoint-reduced-simplified.bc -disable-fp-elim -relocation-model=pic
-debug
...
if.then1043:
1728L   %vreg43<def> = COPY %vreg34; GR32:%vreg43,%vreg34
        Considering merging %vreg34 with %vreg43 to GR32
                RHS = %vreg34 = [1392d,1760d:0)  0 at 1392d
                LHS = %vreg43 = [1728d,1744d:0)  0 at 1728d
                updated: 1392L  %vreg43<def> = MOV32r0 %EFLAGS<imp-def,dead>;
GR32:%vreg43
                updated: 1760L  %vreg63<def> = COPY %vreg43<kill>;
GR32:%vreg63,%vreg43
                updated: 1568L  %vreg38<def> = CMOVNE32rr %vreg38, %vreg43,
%EFLAGS<imp-use,kill>; GR32:%vreg38,%vreg43
        Joined. Result = %vreg43 = [1392d,1760d:0)  0 at 1392d
...

1760L   %vreg63<def> = COPY %vreg43<kill>; GR32:%vreg63,%vreg43
        Considering merging %vreg43 with %vreg63 to GR32                RHS =
%vreg43 = [1392d,1760d:0)  0 at 1392d
                LHS = %vreg63 =
[624d,672L:4)[704d,720L:5)[720L,944L:0)[1040d,1088L:2)[1120L,1200L:0)[1216L,1712L:0)[1760d,1792L:3)[1792L,2160L:0)[2160L,2320L:1)[2336L,2448d:1)
 0 at 720L-
phidef-phikill 1 at 2160L-phidef 2 at 1040d-phikill 3 at 1760d-phikill 4 at 624d-phikill
5 at 704d-phikill
Remat: %vreg63<def> = MOV32r0 %EFLAGS<imp-def,dead>; GR32:%vreg63
Shrink: %vreg43 = [1392d,1760d:0)  0 at 1392d
 live-in at 1712L
Shrink: %vreg43 = [1392d,1728d:0)  0 at 1392d

Notice how %vreg43 is shrunk to end at 1728d which is a COPY instruction that
was coalesced above.

This is not a big problem for linear scan - the range is longer, but it is
trivially rematerializable, so it shouldn't degrade code quality much. I don't
want to mess with this so close to the 2.9 release branch.


The greedy register allocator doesn't like this at all because %vreg43
seemingly ends in the middle of a basic block where it has no uses. That's
impossible, and confuses the live range splitting.

r127096 temporarily fixes the problem by recomputing incomsistent live
intervals. It should be reverted after the real problem is fixed.

*** Fixing inconsistent live interval! ***
Shrink: %vreg43,1.371047e-02 = [1392d,1728d:0)  0 at 1392d
Shrink: %vreg43,1.371047e-02 = [1392d,1568d:0)  0 at 1392d

-- 
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.



More information about the llvm-bugs mailing list