[llvm-commits] [llvm] r111883 - /llvm/trunk/lib/Target/ARM/ARMFastISel.cpp

Jim Grosbach grosbach at apple.com
Tue Aug 24 12:22:36 PDT 2010


On Aug 23, 2010, at 5:50 PM, Eric Christopher wrote:

> Author: echristo
> Date: Mon Aug 23 19:50:47 2010
> New Revision: 111883
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=111883&view=rev
> Log:
> Add register class hack that needs to go away, but makes it more obvious
> that it needs to go away.  Use loadRegFromStackSlot where possible.
> 
> Also, remember to update the value map.
> 
> Modified:
>    llvm/trunk/lib/Target/ARM/ARMFastISel.cpp
> 
> Modified: llvm/trunk/lib/Target/ARM/ARMFastISel.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMFastISel.cpp?rev=111883&r1=111882&r2=111883&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/ARMFastISel.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/ARMFastISel.cpp Mon Aug 23 19:50:47 2010
> @@ -58,6 +58,9 @@
>   const TargetInstrInfo &TII;
>   const TargetLowering &TLI;
>   const ARMFunctionInfo *AFI;
> +  
> +  // FIXME: Remove this and replace it with queries.
> +  const TargetRegisterClass *FixedRC;
> 
>   public:
>     explicit ARMFastISel(FunctionLoweringInfo &funcInfo) 
> @@ -67,6 +70,7 @@
>       TLI(*TM.getTargetLowering()) {
>       Subtarget = &TM.getSubtarget<ARMSubtarget>();
>       AFI = funcInfo.MF->getInfo<ARMFunctionInfo>();
> +      FixedRC = ARM::GPRRegisterClass;
>     }
> 
>     // Code from FastISel.cpp.
> @@ -109,6 +113,7 @@
> 
>     // Utility routines.
>   private:
> +    bool ARMLoadAlloca(const Instruction *I);
>     bool ARMComputeRegOffset(const Value *Obj, unsigned &Reg, int &Offset);
> 
>     bool DefinesOptionalPredicate(MachineInstr *MI, bool *CPSR);
> @@ -340,22 +345,14 @@
>     //errs() << "Failing Opcode is: " << *Op1 << "\n";
>     break;
>     case Instruction::Alloca: {
> -      // Do static allocas.
> -      const AllocaInst *A = cast<AllocaInst>(Obj);
> -      DenseMap<const AllocaInst*, int>::iterator SI =
> -        FuncInfo.StaticAllocaMap.find(A);
> -      if (SI != FuncInfo.StaticAllocaMap.end())
> -        Offset =
> -          TM.getRegisterInfo()->getFrameIndexReference(*FuncInfo.MF,
> -                                                       SI->second, Reg);
> -      else
> -        return false;
> -      return true;
> +      assert(false && "Alloca should have been handled earlier!");
> +      return false;
>     }
>   }
> 
>   if (const GlobalValue *GV = dyn_cast<GlobalValue>(Obj)) {
>     //errs() << "Failing GV is: " << GV << "\n";
> +    (void)GV;
>     return false;
>   }
> 
> @@ -364,12 +361,37 @@
>   return Reg != 0;  
> }
> 
> +bool ARMFastISel::ARMLoadAlloca(const Instruction *I) {
> +  Value *Op0 = I->getOperand(0);
> +
> +  // Verify it's an alloca.
> +  const Instruction *Inst = dyn_cast<Instruction>(Op0);
> +  if (!Inst || Inst->getOpcode() != Instruction::Alloca) return false;
> +
> +  const AllocaInst *AI = cast<AllocaInst>(Op0);

You can combine these checks and the following cast to AllocaInst with:

if (const AllocaInst *AI = dyn_cast<AllocaInst>(Op0) {
 ...

> +  DenseMap<const AllocaInst*, int>::iterator SI =
> +    FuncInfo.StaticAllocaMap.find(AI);
> +    
> +  if (SI != FuncInfo.StaticAllocaMap.end()) {
> +    unsigned ResultReg = createResultReg(FixedRC);
> +    TII.loadRegFromStackSlot(*FuncInfo.MBB, *FuncInfo.InsertPt,
> +                              ResultReg, SI->second, FixedRC,
> +                              TM.getRegisterInfo());
> +    UpdateValueMap(I, ResultReg);
> +    return true;
> +  }
> +  
> +  return false;
> +}
> +
> bool ARMFastISel::ARMSelectLoad(const Instruction *I) {
>   // Our register and offset with innocuous defaults.
>   unsigned Reg = 0;
>   int Offset = 0;
> 
>   // TODO: Think about using loadRegFromStackSlot() here when we can.
> +  if (ARMLoadAlloca(I))
> +    return true;
> 
>   // See if we can handle this as Reg + Offset
>   if (!ARMComputeRegOffset(I->getOperand(0), Reg, Offset))
> @@ -393,10 +415,11 @@
>   } 
> 
>   // FIXME: There is more than one register class in the world...
> -  unsigned ResultReg = createResultReg(ARM::GPRRegisterClass);
> +  unsigned ResultReg = createResultReg(FixedRC);
>   AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL,
>                           TII.get(ARM::LDR), ResultReg)
>                   .addImm(0).addReg(Reg).addImm(Offset));
> +  UpdateValueMap(I, ResultReg);
> 
>   return true;
> }
> 
> 
> _______________________________________________
> 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