[llvm-commits] [llvm] r48105 - in /llvm/trunk: lib/CodeGen/SelectionDAG/ScheduleDAG.cpp test/CodeGen/X86/inline-asm-fpstack.ll

Evan Cheng evan.cheng at apple.com
Mon Mar 10 10:53:04 PDT 2008


Only between physical registers? Or virtual registers as well (which  
might come in handy)?

Evan

On Mar 9, 2008, at 12:49 AM, Chris Lattner wrote:

> Author: lattner
> Date: Sun Mar  9 03:49:15 2008
> New Revision: 48105
>
> URL: http://llvm.org/viewvc/llvm-project?rev=48105&view=rev
> Log:
> Add ScheduleDAG support for copytoreg where the src/dst register are
> in different register classes, e.g. copy of ST(0) to RFP*.  This gets
> some really trivial inline asm working that plops things on the top of
> stack (PR879)
>
> Added:
>    llvm/trunk/test/CodeGen/X86/inline-asm-fpstack.ll
> Modified:
>    llvm/trunk/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp
>
> Modified: llvm/trunk/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp?rev=48105&r1=48104&r2=48105&view=diff
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp (original)
> +++ llvm/trunk/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp Sun Mar  9  
> 03:49:15 2008
> @@ -433,21 +433,25 @@
>       break;
>   }
>
> -  const TargetRegisterClass *TRC = 0;
> +  const TargetRegisterClass *SrcRC = 0, *DstRC = 0;
> +  SrcRC = TRI->getPhysicalRegisterRegClass(Node- 
> >getValueType(ResNo), SrcReg);
> +
>   // Figure out the register class to create for the destreg.
> -  if (VRBase)
> -    TRC = RegInfo.getRegClass(VRBase);
> -  else
> -    TRC = TRI->getPhysicalRegisterRegClass(Node- 
> >getValueType(ResNo), SrcReg);
> +  if (VRBase) {
> +    DstRC = RegInfo.getRegClass(VRBase);
> +  } else {
> +    DstRC = DAG.getTargetLoweringInfo()
> +             .getRegClassFor(Node->getValueType(ResNo));
> +  }
>
>   // If all uses are reading from the src physical register and  
> copying the
>   // register is either impossible or very expensive, then don't  
> create a copy.
> -  if (MatchReg && TRC->getCopyCost() < 0) {
> +  if (MatchReg && SrcRC->getCopyCost() < 0) {
>     VRBase = SrcReg;
>   } else {
>     // Create the reg, emit the copy.
> -    VRBase = RegInfo.createVirtualRegister(TRC);
> -    TII->copyRegToReg(*BB, BB->end(), VRBase, SrcReg, TRC, TRC);
> +    VRBase = RegInfo.createVirtualRegister(DstRC);
> +    TII->copyRegToReg(*BB, BB->end(), VRBase, SrcReg, DstRC, SrcRC);
>   }
>
>   if (InstanceNo > 0)
> @@ -594,14 +598,14 @@
>     unsigned VReg = getVR(Op, VRBaseMap);
>     MI->addOperand(MachineOperand::CreateReg(VReg, false));
>
> -    // Verify that it is right.
> +    // Verify that it is right.  Note that the reg class of the  
> physreg and the
> +    // vreg don't necessarily need to match, but the target copy  
> insertion has
> +    // to be able to handle it.  This handles things like copies  
> from ST(0) to
> +    // an FP vreg on x86.
>     assert(TargetRegisterInfo::isVirtualRegister(VReg) && "Not a  
> vreg?");
>     if (II) {
> -      const TargetRegisterClass *RC =
> -                            getInstrOperandRegClass(TRI, TII, *II,  
> IIOpNum);
> -      assert(RC && "Don't have operand info for this instruction!");
> -      assert(RegInfo.getRegClass(VReg) == RC &&
> -             "Register class of operand and regclass of use don't  
> agree!");
> +      assert(getInstrOperandRegClass(TRI, TII, *II, IIOpNum) &&
> +             "Don't have operand info for this instruction!");
>     }
>   }
>
> @@ -674,8 +678,7 @@
>
>     if (VRBase) {
>       // Grab the destination register
> -      const TargetRegisterClass *DRC = 0;
> -      DRC = RegInfo.getRegClass(VRBase);
> +      const TargetRegisterClass *DRC = RegInfo.getRegClass(VRBase);
>       assert(SRC && DRC && SRC == DRC &&
>              "Source subregister and destination must have the same  
> class");
>     } else {
>
> Added: llvm/trunk/test/CodeGen/X86/inline-asm-fpstack.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/inline-asm-fpstack.ll?rev=48105&view=auto
>
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> = 
> ======================================================================
> --- llvm/trunk/test/CodeGen/X86/inline-asm-fpstack.ll (added)
> +++ llvm/trunk/test/CodeGen/X86/inline-asm-fpstack.ll Sun Mar  9  
> 03:49:15 2008
> @@ -0,0 +1,13 @@
> +; RUN: llvm-as < %s | llc -march=x86
> +
> +define x86_fp80 @test1() {
> +        %tmp85 = call x86_fp80 asm sideeffect "fld0", "={st(0)}"()
> +        ret x86_fp80 %tmp85
> +}
> +
> +define double @test2() {
> +        %tmp85 = call double asm sideeffect "fld0", "={st(0)}"()
> +        ret double %tmp85
> +}
> +
> +
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list