[LLVMdev] Possible VirtRegMap Bug

Evan Cheng evan.cheng at apple.com
Fri May 30 13:13:45 PDT 2008


On May 27, 2008, at 5:36 PM, David Greene wrote:

> I've been playing around with spillers and found that the  
> SimpleSpiller fails
> badly on a particular code.
>
> The problem arises because SimpleSpiller does the test
> VRM.isAssignedReg(virtReg) which is implemented as:
>
> 00183     bool isAssignedReg(unsigned virtReg) const {
> 00184       if (getStackSlot(virtReg) == NO_STACK_SLOT &&
> 00185           getReMatId(virtReg) == NO_STACK_SLOT)
> 00186         return true;
> 00187       // Split register can be assigned a physical register as  
> well as a
> 00188       // stack slot or remat id.
> 00189       return (Virt2SplitMap[virtReg] && Virt2PhysMap[virtReg] !=
> NO_PHYS_REG);
> 00190     }

This is poorly named. All vr's will be assigned a physical register  
even if they are spilled or remat'd. This really should be  
isNotSpilledOrReMated. But then the exception is split register. Yeah,  
I know this is a mess. We are planning a complete rewrite.

>
>
> VRM::assignVirt2Phys is implemented as:
>
> 00147     void assignVirt2Phys(unsigned virtReg, unsigned physReg) {
> 00148       assert(TargetRegisterInfo::isVirtualRegister(virtReg) &&
> 00149              TargetRegisterInfo::isPhysicalRegister(physReg));
> 00150       assert(Virt2PhysMap[virtReg] == NO_PHYS_REG &&
> 00151              "attempt to assign physical register to already  
> mapped "
> 00152              "virtual register");
> 00153       Virt2PhysMap[virtReg] = physReg;
> 00154     }
>
> Note that this doesn't clear the stack slot or remat mappings.
>
> In the particular code I'm looking at, linear scan spills an  
> interval and
> one of the intervals created (%reg1631) gets mark as  
> rematerializable by
> LiveIntervals:
>
> 00984     if (CreatedNewVReg) {
> 00985       if (DefIsReMat) {
> 00986         vrm.setVirtIsReMaterialized(NewVReg, ReMatDefMI/*,  
> CanDelete*/);
> 00987         if (ReMatIds[VNI->id] == VirtRegMap::MAX_STACK_SLOT) {
> 00988           // Each valnum may have its own remat id.
> 00989           ReMatIds[VNI->id] = vrm.assignVirtReMatId(NewVReg);
>
> Linear scan dutifully assigns %reg1631 to AL.  Then SimpleSpiller  
> runs and
> does this:
>
> 00261             unsigned VirtReg = MO.getReg();
> 00262             unsigned PhysReg = VRM.getPhys(VirtReg);
> 00263             if (!VRM.isAssignedReg(VirtReg)) {
> 00264               int StackSlot = VRM.getStackSlot(VirtReg);
>
> Well, according to VRM, %reg1631 is NOT assigned to a register  
> (because it has
> a remat id) even though linear scan assigned it one.  VRM then  
> returns garbage
> as the stack slot and things go downhill from there.
>
> So should VirtRegMap reset the stack slot and remat id maps when it  
> is told to
> assign a phys to a virt?

No, every vr is assigned a physical register. It needs to know how  
what physical register to reload it, for example. Looks like  
SimpleSpiller has bit-rotted. There really isn't a good reason to fix  
it. Unless you want to use it, I'll just remove it.

Evan


>
>
>                                                 -Dave
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev




More information about the llvm-dev mailing list