[llvm-commits] [llvm] r106066 - in /llvm/trunk: lib/CodeGen/MachineSink.cpp lib/Target/X86/X86ISelLowering.cpp test/CodeGen/X86/MachineSink-CritEdge.ll

Jakob Stoklund Olesen stoklund at 2pi.dk
Tue Jun 15 17:13:06 PDT 2010


On Jun 15, 2010, at 4:46 PM, Bill Wendling wrote:

> Author: void
> Date: Tue Jun 15 18:46:31 2010
> New Revision: 106066
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=106066&view=rev
> Log:
> Create a more targeted fix for not sinking instructions into a range where it
> will conflict with another live range. The place which creates this scenerio is
> the code in X86 that lowers a select instruction by splitting the MBBs. This
> eliminates the need to check from the bottom up in an MBB for live pregs.

Looks good to me.

> @@ -329,10 +285,14 @@
>   // If the instruction to move defines a dead physical register which is live
>   // when leaving the basic block, don't move it because it could turn into a
>   // "zombie" define of that preg. E.g., EFLAGS. (<rdar://problem/8030636>)
> -  for (SmallVectorImpl<unsigned>::const_iterator
> -         I = PhysRegs.begin(), E = PhysRegs.end(); I != E; ++I)
> -    if (LiveOutOfBasicBlock(MI, *I))
> +  for (unsigned I = 0, E = MI->getNumOperands(); I != E; ++I) {
> +    const MachineOperand &MO = MI->getOperand(I);
> +    if (!MO.isReg()) continue;
> +    unsigned Reg = MO.getReg();
> +    if (Reg == 0 || !TargetRegisterInfo::isPhysicalRegister(Reg)) continue;
> +    if (SuccToSinkTo->isLiveIn(Reg))
>       return false;
> +  }

This loop catches both physreg defs and uses. That is on purpose, right? The comment doesn't mention uses.

/jakob





More information about the llvm-commits mailing list