[LLVMbugs] [Bug 1306] NEW: LiveVariables improperly handles killing aliased registers

bugzilla-daemon at cs.uiuc.edu bugzilla-daemon at cs.uiuc.edu
Wed Apr 4 12:42:46 PDT 2007


           Summary: LiveVariables improperly handles killing aliased
           Product: new-bugs
           Version: unspecified
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: major
          Priority: P2
         Component: new bugs
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: christopher.lamb at gmail.com
                CC: christopher.lamb at gmail.com

Here is the beginning of the BB dump.

entry (0x8503c80, LLVM BB @0x8501af0, ID#0):
Live Ins: %R0 %R1
	%reg1024 = ORI %R0<kill>, 0
	%reg1025 = ORI %R1<kill>, 0

V4R0 is getting killed because handleLiveInRegister() is called on  
all results of getAliasSet() for each of the liveins (this is in  
LiveIntervals::computeIntervals() ).

handleRegisterDef() does a similar thing where calls  
handlePhysicalRegisterDef() on all members of getAliasSet() returned  
for the def, which also triggers this problem.


This is a pretty serious bug. LiveVariables::KillsRegister should not kill aliases that are "larger". The 
correct way to fix this is to explicitly list registers that are defined, used, and killed. So your example 
should look like:

entry (0x8503c80, LLVM BB @0x8501af0, ID#0):
Live Ins: %R0 %R1
	%reg1024 = ORI %R0<kill>, 0, %V4R0<imp-use>
	%reg1025 = ORI %R1<kill>, 0, %V4R0<imp-use,kill>

KillsRegister should check for exact match rather than regsOverlap. There are probably other similar 
bugs in LiveVariables.

------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.

More information about the llvm-bugs mailing list