diff options
Diffstat (limited to 'lib/CodeGen/CodeGenPrepare.cpp')
| -rw-r--r-- | lib/CodeGen/CodeGenPrepare.cpp | 146 | 
1 files changed, 80 insertions, 66 deletions
diff --git a/lib/CodeGen/CodeGenPrepare.cpp b/lib/CodeGen/CodeGenPrepare.cpp index 70de4e7ebd11..6ab6acc03722 100644 --- a/lib/CodeGen/CodeGenPrepare.cpp +++ b/lib/CodeGen/CodeGenPrepare.cpp @@ -147,10 +147,13 @@ class TypePromotionTransaction;      /// OptSize - True if optimizing for size.      bool OptSize; +    /// DataLayout for the Function being processed. +    const DataLayout *DL; +    public:      static char ID; // Pass identification, replacement for typeid      explicit CodeGenPrepare(const TargetMachine *TM = nullptr) -        : FunctionPass(ID), TM(TM), TLI(nullptr), TTI(nullptr) { +        : FunctionPass(ID), TM(TM), TLI(nullptr), TTI(nullptr), DL(nullptr) {          initializeCodeGenPreparePass(*PassRegistry::getPassRegistry());        }      bool runOnFunction(Function &F) override; @@ -203,6 +206,8 @@ bool CodeGenPrepare::runOnFunction(Function &F) {    if (skipOptnoneFunction(F))      return false; +  DL = &F.getParent()->getDataLayout(); +    bool EverMadeChange = false;    // Clear per function information.    InsertedInsts.clear(); @@ -753,10 +758,11 @@ static bool SinkCast(CastInst *CI) {  ///  /// Return true if any changes are made.  /// -static bool OptimizeNoopCopyExpression(CastInst *CI, const TargetLowering &TLI){ +static bool OptimizeNoopCopyExpression(CastInst *CI, const TargetLowering &TLI, +                                       const DataLayout &DL) {    // If this is a noop copy, -  EVT SrcVT = TLI.getValueType(CI->getOperand(0)->getType()); -  EVT DstVT = TLI.getValueType(CI->getType()); +  EVT SrcVT = TLI.getValueType(DL, CI->getOperand(0)->getType()); +  EVT DstVT = TLI.getValueType(DL, CI->getType());    // This is an fp<->int conversion?    if (SrcVT.isInteger() != DstVT.isInteger()) @@ -921,7 +927,7 @@ static bool isExtractBitsCandidateUse(Instruction *User) {  static bool  SinkShiftAndTruncate(BinaryOperator *ShiftI, Instruction *User, ConstantInt *CI,                       DenseMap<BasicBlock *, BinaryOperator *> &InsertedShifts, -                     const TargetLowering &TLI) { +                     const TargetLowering &TLI, const DataLayout &DL) {    BasicBlock *UserBB = User->getParent();    DenseMap<BasicBlock *, CastInst *> InsertedTruncs;    TruncInst *TruncI = dyn_cast<TruncInst>(User); @@ -947,7 +953,7 @@ SinkShiftAndTruncate(BinaryOperator *ShiftI, Instruction *User, ConstantInt *CI,      // approximation; some nodes' legality is determined by the      // operand or other means. There's no good way to find out though.      if (TLI.isOperationLegalOrCustom( -            ISDOpcode, TLI.getValueType(TruncUser->getType(), true))) +            ISDOpcode, TLI.getValueType(DL, TruncUser->getType(), true)))        continue;      // Don't bother for PHI nodes. @@ -1005,13 +1011,14 @@ SinkShiftAndTruncate(BinaryOperator *ShiftI, Instruction *User, ConstantInt *CI,  /// instruction.  /// Return true if any changes are made.  static bool OptimizeExtractBits(BinaryOperator *ShiftI, ConstantInt *CI, -                                const TargetLowering &TLI) { +                                const TargetLowering &TLI, +                                const DataLayout &DL) {    BasicBlock *DefBB = ShiftI->getParent();    /// Only insert instructions in each block once.    DenseMap<BasicBlock *, BinaryOperator *> InsertedShifts; -  bool shiftIsLegal = TLI.isTypeLegal(TLI.getValueType(ShiftI->getType())); +  bool shiftIsLegal = TLI.isTypeLegal(TLI.getValueType(DL, ShiftI->getType()));    bool MadeChange = false;    for (Value::user_iterator UI = ShiftI->user_begin(), E = ShiftI->user_end(); @@ -1048,9 +1055,10 @@ static bool OptimizeExtractBits(BinaryOperator *ShiftI, ConstantInt *CI,        if (isa<TruncInst>(User) && shiftIsLegal            // If the type of the truncate is legal, no trucate will be            // introduced in other basic blocks. -          && (!TLI.isTypeLegal(TLI.getValueType(User->getType())))) +          && +          (!TLI.isTypeLegal(TLI.getValueType(DL, User->getType()))))          MadeChange = -            SinkShiftAndTruncate(ShiftI, User, CI, InsertedShifts, TLI); +            SinkShiftAndTruncate(ShiftI, User, CI, InsertedShifts, TLI, DL);        continue;      } @@ -1307,12 +1315,10 @@ bool CodeGenPrepare::OptimizeCallInst(CallInst *CI, bool& ModifiedDT) {        return true;    } -  const DataLayout *TD = TLI ? TLI->getDataLayout() : nullptr; -    // Align the pointer arguments to this call if the target thinks it's a good    // idea    unsigned MinSize, PrefAlign; -  if (TLI && TD && TLI->shouldAlignPointerArgs(CI, MinSize, PrefAlign)) { +  if (TLI && TLI->shouldAlignPointerArgs(CI, MinSize, PrefAlign)) {      for (auto &Arg : CI->arg_operands()) {        // We want to align both objects whose address is used directly and        // objects whose address is used in casts and GEPs, though it only makes @@ -1320,36 +1326,34 @@ bool CodeGenPrepare::OptimizeCallInst(CallInst *CI, bool& ModifiedDT) {        // if size - offset meets the size threshold.        if (!Arg->getType()->isPointerTy())          continue; -      APInt Offset(TD->getPointerSizeInBits( -                     cast<PointerType>(Arg->getType())->getAddressSpace()), 0); -      Value *Val = Arg->stripAndAccumulateInBoundsConstantOffsets(*TD, Offset); +      APInt Offset(DL->getPointerSizeInBits( +                       cast<PointerType>(Arg->getType())->getAddressSpace()), +                   0); +      Value *Val = Arg->stripAndAccumulateInBoundsConstantOffsets(*DL, Offset);        uint64_t Offset2 = Offset.getLimitedValue();        if ((Offset2 & (PrefAlign-1)) != 0)          continue;        AllocaInst *AI; -      if ((AI = dyn_cast<AllocaInst>(Val)) && -          AI->getAlignment() < PrefAlign && -          TD->getTypeAllocSize(AI->getAllocatedType()) >= MinSize + Offset2) +      if ((AI = dyn_cast<AllocaInst>(Val)) && AI->getAlignment() < PrefAlign && +          DL->getTypeAllocSize(AI->getAllocatedType()) >= MinSize + Offset2)          AI->setAlignment(PrefAlign);        // Global variables can only be aligned if they are defined in this        // object (i.e. they are uniquely initialized in this object), and        // over-aligning global variables that have an explicit section is        // forbidden.        GlobalVariable *GV; -      if ((GV = dyn_cast<GlobalVariable>(Val)) && -          GV->hasUniqueInitializer() && -          !GV->hasSection() && -          GV->getAlignment() < PrefAlign && -          TD->getTypeAllocSize( -            GV->getType()->getElementType()) >= MinSize + Offset2) +      if ((GV = dyn_cast<GlobalVariable>(Val)) && GV->hasUniqueInitializer() && +          !GV->hasSection() && GV->getAlignment() < PrefAlign && +          DL->getTypeAllocSize(GV->getType()->getElementType()) >= +              MinSize + Offset2)          GV->setAlignment(PrefAlign);      }      // If this is a memcpy (or similar) then we may be able to improve the      // alignment      if (MemIntrinsic *MI = dyn_cast<MemIntrinsic>(CI)) { -      unsigned Align = getKnownAlignment(MI->getDest(), *TD); +      unsigned Align = getKnownAlignment(MI->getDest(), *DL);        if (MemTransferInst *MTI = dyn_cast<MemTransferInst>(MI)) -        Align = std::min(Align, getKnownAlignment(MTI->getSource(), *TD)); +        Align = std::min(Align, getKnownAlignment(MTI->getSource(), *DL));        if (Align > MI->getAlignment())          MI->setAlignment(ConstantInt::get(MI->getAlignmentType(), Align));      } @@ -2099,6 +2103,7 @@ class AddressingModeMatcher {    SmallVectorImpl<Instruction*> &AddrModeInsts;    const TargetMachine &TM;    const TargetLowering &TLI; +  const DataLayout &DL;    /// AccessTy/MemoryInst - This is the type for the access (e.g. double) and    /// the memory instruction that we're computing this address for. @@ -2131,8 +2136,9 @@ class AddressingModeMatcher {        : AddrModeInsts(AMI), TM(TM),          TLI(*TM.getSubtargetImpl(*MI->getParent()->getParent())                   ->getTargetLowering()), -        AccessTy(AT), AddrSpace(AS), MemoryInst(MI), AddrMode(AM), -        InsertedInsts(InsertedInsts), PromotedInsts(PromotedInsts), TPT(TPT) { +        DL(MI->getModule()->getDataLayout()), AccessTy(AT), AddrSpace(AS), +        MemoryInst(MI), AddrMode(AM), InsertedInsts(InsertedInsts), +        PromotedInsts(PromotedInsts), TPT(TPT) {      IgnoreProfitability = false;    }  public: @@ -2199,7 +2205,7 @@ bool AddressingModeMatcher::MatchScaledValue(Value *ScaleReg, int64_t Scale,    TestAddrMode.ScaledReg = ScaleReg;    // If the new address isn't legal, bail out. -  if (!TLI.isLegalAddressingMode(TestAddrMode, AccessTy, AddrSpace)) +  if (!TLI.isLegalAddressingMode(DL, TestAddrMode, AccessTy, AddrSpace))      return false;    // It was legal, so commit it. @@ -2216,7 +2222,7 @@ bool AddressingModeMatcher::MatchScaledValue(Value *ScaleReg, int64_t Scale,      // If this addressing mode is legal, commit it and remember that we folded      // this instruction. -    if (TLI.isLegalAddressingMode(TestAddrMode, AccessTy, AddrSpace)) { +    if (TLI.isLegalAddressingMode(DL, TestAddrMode, AccessTy, AddrSpace)) {        AddrModeInsts.push_back(cast<Instruction>(ScaleReg));        AddrMode = TestAddrMode;        return true; @@ -2262,7 +2268,8 @@ static bool MightBeFoldableInst(Instruction *I) {  /// \note \p Val is assumed to be the product of some type promotion.  /// Therefore if \p Val has an undefined state in \p TLI, this is assumed  /// to be legal, as the non-promoted value would have had the same state. -static bool isPromotedInstructionLegal(const TargetLowering &TLI, Value *Val) { +static bool isPromotedInstructionLegal(const TargetLowering &TLI, +                                       const DataLayout &DL, Value *Val) {    Instruction *PromotedInst = dyn_cast<Instruction>(Val);    if (!PromotedInst)      return false; @@ -2272,7 +2279,7 @@ static bool isPromotedInstructionLegal(const TargetLowering &TLI, Value *Val) {      return true;    // Otherwise, check if the promoted instruction is legal or not.    return TLI.isOperationLegalOrCustom( -      ISDOpcode, TLI.getValueType(PromotedInst->getType())); +      ISDOpcode, TLI.getValueType(DL, PromotedInst->getType()));  }  /// \brief Hepler class to perform type promotion. @@ -2646,7 +2653,7 @@ bool AddressingModeMatcher::IsPromotionProfitable(    // The promotion is neutral but it may help folding the sign extension in    // loads for instance.    // Check that we did not create an illegal instruction. -  return isPromotedInstructionLegal(TLI, PromotedOperand); +  return isPromotedInstructionLegal(TLI, DL, PromotedOperand);  }  /// MatchOperationAddr - Given an instruction or constant expr, see if we can @@ -2674,12 +2681,14 @@ bool AddressingModeMatcher::MatchOperationAddr(User *AddrInst, unsigned Opcode,    case Instruction::PtrToInt:      // PtrToInt is always a noop, as we know that the int type is pointer sized.      return MatchAddr(AddrInst->getOperand(0), Depth); -  case Instruction::IntToPtr: +  case Instruction::IntToPtr: { +    auto AS = AddrInst->getType()->getPointerAddressSpace(); +    auto PtrTy = MVT::getIntegerVT(DL.getPointerSizeInBits(AS));      // This inttoptr is a no-op if the integer type is pointer sized. -    if (TLI.getValueType(AddrInst->getOperand(0)->getType()) == -        TLI.getPointerTy(AddrInst->getType()->getPointerAddressSpace())) +    if (TLI.getValueType(DL, AddrInst->getOperand(0)->getType()) == PtrTy)        return MatchAddr(AddrInst->getOperand(0), Depth);      return false; +  }    case Instruction::BitCast:      // BitCast is always a noop, and we can handle it as long as it is      // int->int or pointer->pointer (we don't want int<->fp or something). @@ -2752,16 +2761,15 @@ bool AddressingModeMatcher::MatchOperationAddr(User *AddrInst, unsigned Opcode,      unsigned VariableScale = 0;      int64_t ConstantOffset = 0; -    const DataLayout *TD = TLI.getDataLayout();      gep_type_iterator GTI = gep_type_begin(AddrInst);      for (unsigned i = 1, e = AddrInst->getNumOperands(); i != e; ++i, ++GTI) {        if (StructType *STy = dyn_cast<StructType>(*GTI)) { -        const StructLayout *SL = TD->getStructLayout(STy); +        const StructLayout *SL = DL.getStructLayout(STy);          unsigned Idx =            cast<ConstantInt>(AddrInst->getOperand(i))->getZExtValue();          ConstantOffset += SL->getElementOffset(Idx);        } else { -        uint64_t TypeSize = TD->getTypeAllocSize(GTI.getIndexedType()); +        uint64_t TypeSize = DL.getTypeAllocSize(GTI.getIndexedType());          if (ConstantInt *CI = dyn_cast<ConstantInt>(AddrInst->getOperand(i))) {            ConstantOffset += CI->getSExtValue()*TypeSize;          } else if (TypeSize) {  // Scales of zero don't do anything. @@ -2781,7 +2789,7 @@ bool AddressingModeMatcher::MatchOperationAddr(User *AddrInst, unsigned Opcode,      if (VariableOperand == -1) {        AddrMode.BaseOffs += ConstantOffset;        if (ConstantOffset == 0 || -          TLI.isLegalAddressingMode(AddrMode, AccessTy, AddrSpace)) { +          TLI.isLegalAddressingMode(DL, AddrMode, AccessTy, AddrSpace)) {          // Check to see if we can fold the base pointer in too.          if (MatchAddr(AddrInst->getOperand(0), Depth+1))            return true; @@ -2904,14 +2912,14 @@ bool AddressingModeMatcher::MatchAddr(Value *Addr, unsigned Depth) {    if (ConstantInt *CI = dyn_cast<ConstantInt>(Addr)) {      // Fold in immediates if legal for the target.      AddrMode.BaseOffs += CI->getSExtValue(); -    if (TLI.isLegalAddressingMode(AddrMode, AccessTy, AddrSpace)) +    if (TLI.isLegalAddressingMode(DL, AddrMode, AccessTy, AddrSpace))        return true;      AddrMode.BaseOffs -= CI->getSExtValue();    } else if (GlobalValue *GV = dyn_cast<GlobalValue>(Addr)) {      // If this is a global variable, try to fold it into the addressing mode.      if (!AddrMode.BaseGV) {        AddrMode.BaseGV = GV; -      if (TLI.isLegalAddressingMode(AddrMode, AccessTy, AddrSpace)) +      if (TLI.isLegalAddressingMode(DL, AddrMode, AccessTy, AddrSpace))          return true;        AddrMode.BaseGV = nullptr;      } @@ -2955,7 +2963,7 @@ bool AddressingModeMatcher::MatchAddr(Value *Addr, unsigned Depth) {      AddrMode.HasBaseReg = true;      AddrMode.BaseReg = Addr;      // Still check for legality in case the target supports [imm] but not [i+r]. -    if (TLI.isLegalAddressingMode(AddrMode, AccessTy, AddrSpace)) +    if (TLI.isLegalAddressingMode(DL, AddrMode, AccessTy, AddrSpace))        return true;      AddrMode.HasBaseReg = false;      AddrMode.BaseReg = nullptr; @@ -2965,7 +2973,7 @@ bool AddressingModeMatcher::MatchAddr(Value *Addr, unsigned Depth) {    if (AddrMode.Scale == 0) {      AddrMode.Scale = 1;      AddrMode.ScaledReg = Addr; -    if (TLI.isLegalAddressingMode(AddrMode, AccessTy, AddrSpace)) +    if (TLI.isLegalAddressingMode(DL, AddrMode, AccessTy, AddrSpace))        return true;      AddrMode.Scale = 0;      AddrMode.ScaledReg = nullptr; @@ -2984,7 +2992,8 @@ static bool IsOperandAMemoryOperand(CallInst *CI, InlineAsm *IA, Value *OpVal,    const TargetLowering *TLI = TM.getSubtargetImpl(*F)->getTargetLowering();    const TargetRegisterInfo *TRI = TM.getSubtargetImpl(*F)->getRegisterInfo();    TargetLowering::AsmOperandInfoVector TargetConstraints = -      TLI->ParseConstraints(TRI, ImmutableCallSite(CI)); +      TLI->ParseConstraints(F->getParent()->getDataLayout(), TRI, +                            ImmutableCallSite(CI));    for (unsigned i = 0, e = TargetConstraints.size(); i != e; ++i) {      TargetLowering::AsmOperandInfo &OpInfo = TargetConstraints[i]; @@ -3324,7 +3333,7 @@ bool CodeGenPrepare::OptimizeMemoryInst(Instruction *MemoryInst, Value *Addr,      // prevents new inttoptr/ptrtoint pairs from degrading AA capabilities.      DEBUG(dbgs() << "CGP: SINKING nonlocal addrmode: " << AddrMode << " for "                   << *MemoryInst << "\n"); -    Type *IntPtrTy = TLI->getDataLayout()->getIntPtrType(Addr->getType()); +    Type *IntPtrTy = DL->getIntPtrType(Addr->getType());      Value *ResultPtr = nullptr, *ResultIndex = nullptr;      // First, find the pointer. @@ -3443,7 +3452,7 @@ bool CodeGenPrepare::OptimizeMemoryInst(Instruction *MemoryInst, Value *Addr,    } else {      DEBUG(dbgs() << "CGP: SINKING nonlocal addrmode: " << AddrMode << " for "                   << *MemoryInst << "\n"); -    Type *IntPtrTy = TLI->getDataLayout()->getIntPtrType(Addr->getType()); +    Type *IntPtrTy = DL->getIntPtrType(Addr->getType());      Value *Result = nullptr;      // Start with the base register. Do this first so that subsequent address @@ -3545,8 +3554,8 @@ bool CodeGenPrepare::OptimizeInlineAsmInst(CallInst *CS) {    const TargetRegisterInfo *TRI =        TM->getSubtargetImpl(*CS->getParent()->getParent())->getRegisterInfo(); -  TargetLowering::AsmOperandInfoVector -    TargetConstraints = TLI->ParseConstraints(TRI, CS); +  TargetLowering::AsmOperandInfoVector TargetConstraints = +      TLI->ParseConstraints(*DL, TRI, CS);    unsigned ArgNo = 0;    for (unsigned i = 0, e = TargetConstraints.size(); i != e; ++i) {      TargetLowering::AsmOperandInfo &OpInfo = TargetConstraints[i]; @@ -3680,7 +3689,7 @@ bool CodeGenPrepare::ExtLdPromotion(TypePromotionTransaction &TPT,      TotalCreatedInstsCost -= ExtCost;      if (!StressExtLdPromotion &&          (TotalCreatedInstsCost > 1 || -         !isPromotedInstructionLegal(*TLI, PromotedVal))) { +         !isPromotedInstructionLegal(*TLI, *DL, PromotedVal))) {        // The promotion is not profitable, rollback to the previous state.        TPT.rollback(LastKnownGood);        continue; @@ -3735,8 +3744,8 @@ bool CodeGenPrepare::MoveExtToFormExtLoad(Instruction *&I) {    if (!HasPromoted && LI->getParent() == I->getParent())      return false; -  EVT VT = TLI->getValueType(I->getType()); -  EVT LoadVT = TLI->getValueType(LI->getType()); +  EVT VT = TLI->getValueType(*DL, I->getType()); +  EVT LoadVT = TLI->getValueType(*DL, LI->getType());    // If the load has other users and the truncate is not free, this probably    // isn't worthwhile. @@ -4013,6 +4022,9 @@ namespace {  /// Assuming both extractelement and store can be combine, we get rid of the  /// transition.  class VectorPromoteHelper { +  /// DataLayout associated with the current module. +  const DataLayout &DL; +    /// Used to perform some checks on the legality of vector operations.    const TargetLowering &TLI; @@ -4086,7 +4098,8 @@ class VectorPromoteHelper {      unsigned Align = ST->getAlignment();      // Check if this store is supported.      if (!TLI.allowsMisalignedMemoryAccesses( -            TLI.getValueType(ST->getValueOperand()->getType()), AS, Align)) { +            TLI.getValueType(DL, ST->getValueOperand()->getType()), AS, +            Align)) {        // If this is not supported, there is no way we can combine        // the extract with the store.        return false; @@ -4181,9 +4194,10 @@ class VectorPromoteHelper {    }  public: -  VectorPromoteHelper(const TargetLowering &TLI, const TargetTransformInfo &TTI, -                      Instruction *Transition, unsigned CombineCost) -      : TLI(TLI), TTI(TTI), Transition(Transition), +  VectorPromoteHelper(const DataLayout &DL, const TargetLowering &TLI, +                      const TargetTransformInfo &TTI, Instruction *Transition, +                      unsigned CombineCost) +      : DL(DL), TLI(TLI), TTI(TTI), Transition(Transition),          StoreExtractCombineCost(CombineCost), CombineInst(nullptr) {      assert(Transition && "Do not know how to promote null");    } @@ -4219,7 +4233,7 @@ public:        return false;      return StressStoreExtract ||             TLI.isOperationLegalOrCustom( -               ISDOpcode, TLI.getValueType(getTransitionType(), true)); +               ISDOpcode, TLI.getValueType(DL, getTransitionType(), true));    }    /// \brief Check whether or not \p Use can be combined @@ -4323,7 +4337,7 @@ bool CodeGenPrepare::OptimizeExtractElementInst(Instruction *Inst) {    //      we do not do that for now.    BasicBlock *Parent = Inst->getParent();    DEBUG(dbgs() << "Found an interesting transition: " << *Inst << '\n'); -  VectorPromoteHelper VPH(*TLI, *TTI, Inst, CombineCost); +  VectorPromoteHelper VPH(*DL, *TLI, *TTI, Inst, CombineCost);    // If the transition has more than one use, assume this is not going to be    // beneficial.    while (Inst->hasOneUse()) { @@ -4368,8 +4382,7 @@ bool CodeGenPrepare::OptimizeInst(Instruction *I, bool& ModifiedDT) {      // It is possible for very late stage optimizations (such as SimplifyCFG)      // to introduce PHI nodes too late to be cleaned up.  If we detect such a      // trivial PHI, go ahead and zap it here. -    const DataLayout &DL = I->getModule()->getDataLayout(); -    if (Value *V = SimplifyInstruction(P, DL, TLInfo, nullptr)) { +    if (Value *V = SimplifyInstruction(P, *DL, TLInfo, nullptr)) {        P->replaceAllUsesWith(V);        P->eraseFromParent();        ++NumPHIsElim; @@ -4388,15 +4401,16 @@ bool CodeGenPrepare::OptimizeInst(Instruction *I, bool& ModifiedDT) {      if (isa<Constant>(CI->getOperand(0)))        return false; -    if (TLI && OptimizeNoopCopyExpression(CI, *TLI)) +    if (TLI && OptimizeNoopCopyExpression(CI, *TLI, *DL))        return true;      if (isa<ZExtInst>(I) || isa<SExtInst>(I)) {        /// Sink a zext or sext into its user blocks if the target type doesn't        /// fit in one register -      if (TLI && TLI->getTypeAction(CI->getContext(), -                                    TLI->getValueType(CI->getType())) == -                     TargetLowering::TypeExpandInteger) { +      if (TLI && +          TLI->getTypeAction(CI->getContext(), +                             TLI->getValueType(*DL, CI->getType())) == +              TargetLowering::TypeExpandInteger) {          return SinkCast(CI);        } else {          bool MadeChange = MoveExtToFormExtLoad(I); @@ -4433,7 +4447,7 @@ bool CodeGenPrepare::OptimizeInst(Instruction *I, bool& ModifiedDT) {                  BinOp->getOpcode() == Instruction::LShr)) {      ConstantInt *CI = dyn_cast<ConstantInt>(BinOp->getOperand(1));      if (TLI && CI && TLI->hasExtractBitsInsn()) -      return OptimizeExtractBits(BinOp, CI, *TLI); +      return OptimizeExtractBits(BinOp, CI, *TLI, *DL);      return false;    }  | 
