diff options
Diffstat (limited to 'lib/Transforms/IPO')
| -rw-r--r-- | lib/Transforms/IPO/ArgumentPromotion.cpp | 22 | ||||
| -rw-r--r-- | lib/Transforms/IPO/DeadArgumentElimination.cpp | 10 | ||||
| -rw-r--r-- | lib/Transforms/IPO/GlobalOpt.cpp | 15 | ||||
| -rw-r--r-- | lib/Transforms/IPO/LowerBitSets.cpp | 16 | ||||
| -rw-r--r-- | lib/Transforms/IPO/PassManagerBuilder.cpp | 7 | ||||
| -rw-r--r-- | lib/Transforms/IPO/StripSymbols.cpp | 26 | 
6 files changed, 53 insertions, 43 deletions
diff --git a/lib/Transforms/IPO/ArgumentPromotion.cpp b/lib/Transforms/IPO/ArgumentPromotion.cpp index 46480bd..56975ea 100644 --- a/lib/Transforms/IPO/ArgumentPromotion.cpp +++ b/lib/Transforms/IPO/ArgumentPromotion.cpp @@ -207,6 +207,13 @@ CallGraphNode *ArgPromotion::PromoteArguments(CallGraphNode *CGN) {    // Make sure that it is local to this module.    if (!F || !F->hasLocalLinkage()) return nullptr; +  // Don't promote arguments for variadic functions. Adding, removing, or +  // changing non-pack parameters can change the classification of pack +  // parameters. Frontends encode that classification at the call site in the +  // IR, while in the callee the classification is determined dynamically based +  // on the number of registers consumed so far. +  if (F->isVarArg()) return nullptr; +    // First check: see if there are any pointer arguments!  If not, quick exit.    SmallVector<Argument*, 16> PointerArgs;    for (Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E; ++I) @@ -227,12 +234,6 @@ CallGraphNode *ArgPromotion::PromoteArguments(CallGraphNode *CGN) {        isSelfRecursive = true;    } -  // Don't promote arguments for variadic functions. Adding, removing, or -  // changing non-pack parameters can change the classification of pack -  // parameters. Frontends encode that classification at the call site in the -  // IR, while in the callee the classification is determined dynamically based -  // on the number of registers consumed so far. -  if (F->isVarArg()) return nullptr;    const DataLayout &DL = F->getParent()->getDataLayout();    // Check to see which arguments are promotable.  If an argument is promotable, @@ -674,8 +675,9 @@ CallGraphNode *ArgPromotion::DoPromotion(Function *F,        for (ScalarizeTable::iterator SI = ArgIndices.begin(),               E = ArgIndices.end(); SI != E; ++SI) {          // not allowed to dereference ->begin() if size() is 0 -        Params.push_back( -            GetElementPtrInst::getIndexedType(I->getType(), SI->second)); +        Params.push_back(GetElementPtrInst::getIndexedType( +            cast<PointerType>(I->getType()->getScalarType())->getElementType(), +            SI->second));          assert(Params.back());        } @@ -704,7 +706,7 @@ CallGraphNode *ArgPromotion::DoPromotion(Function *F,    auto DI = FunctionDIs.find(F);    if (DI != FunctionDIs.end()) {      DISubprogram SP = DI->second; -    SP.replaceFunction(NF); +    SP->replaceFunction(NF);      // Ensure the map is updated so it can be reused on subsequent argument      // promotions of the same function.      FunctionDIs.erase(DI); @@ -860,7 +862,7 @@ CallGraphNode *ArgPromotion::DoPromotion(Function *F,      // Update the callgraph to know that the callsite has been transformed.      CallGraphNode *CalleeNode = CG[Call->getParent()->getParent()]; -    CalleeNode->replaceCallEdge(Call, New, NF_CGN); +    CalleeNode->replaceCallEdge(CS, CallSite(New), NF_CGN);      if (!Call->use_empty()) {        Call->replaceAllUsesWith(New); diff --git a/lib/Transforms/IPO/DeadArgumentElimination.cpp b/lib/Transforms/IPO/DeadArgumentElimination.cpp index 4431311..3be23d5 100644 --- a/lib/Transforms/IPO/DeadArgumentElimination.cpp +++ b/lib/Transforms/IPO/DeadArgumentElimination.cpp @@ -73,8 +73,8 @@ namespace {        }        std::string getDescription() const { -        return std::string((IsArg ? "Argument #" : "Return value #")) -               + utostr(Idx) + " of function " + F->getName().str(); +        return (Twine(IsArg ? "Argument #" : "Return value #") + utostr(Idx) + +                " of function " + F->getName()).str();        }      }; @@ -304,7 +304,7 @@ bool DAE::DeleteDeadVarargs(Function &Fn) {    auto DI = FunctionDIs.find(&Fn);    if (DI != FunctionDIs.end()) {      DISubprogram SP = DI->second; -    SP.replaceFunction(NF); +    SP->replaceFunction(NF);      // Ensure the map is updated so it can be reused on non-varargs argument      // eliminations of the same function.      FunctionDIs.erase(DI); @@ -482,7 +482,7 @@ DAE::Liveness DAE::SurveyUse(const Use *U,        return Result;      } -    if (ImmutableCallSite CS = V) { +    if (auto CS = ImmutableCallSite(V)) {        const Function *F = CS.getCalledFunction();        if (F) {          // Used in a direct call. @@ -1092,7 +1092,7 @@ bool DAE::RemoveDeadStuffFromFunction(Function *F) {    // Patch the pointer to LLVM function in debug info descriptor.    auto DI = FunctionDIs.find(F);    if (DI != FunctionDIs.end()) -    DI->second.replaceFunction(NF); +    DI->second->replaceFunction(NF);    // Now that the old function is dead, delete it.    F->eraseFromParent(); diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp index 20b41fb..b8c4f5d 100644 --- a/lib/Transforms/IPO/GlobalOpt.cpp +++ b/lib/Transforms/IPO/GlobalOpt.cpp @@ -564,6 +564,7 @@ static GlobalVariable *SRAGlobal(GlobalVariable *GV, const DataLayout &DL) {      if (Val >= NewGlobals.size()) Val = 0; // Out of bound array access.      Value *NewPtr = NewGlobals[Val]; +    Type *NewTy = NewGlobals[Val]->getType();      // Form a shorter GEP if needed.      if (GEP->getNumOperands() > 3) { @@ -572,7 +573,9 @@ static GlobalVariable *SRAGlobal(GlobalVariable *GV, const DataLayout &DL) {          Idxs.push_back(NullInt);          for (unsigned i = 3, e = CE->getNumOperands(); i != e; ++i)            Idxs.push_back(CE->getOperand(i)); -        NewPtr = ConstantExpr::getGetElementPtr(cast<Constant>(NewPtr), Idxs); +        NewPtr = +            ConstantExpr::getGetElementPtr(NewTy, cast<Constant>(NewPtr), Idxs); +        NewTy = GetElementPtrInst::getIndexedType(NewTy, Idxs);        } else {          GetElementPtrInst *GEPI = cast<GetElementPtrInst>(GEP);          SmallVector<Value*, 8> Idxs; @@ -721,8 +724,8 @@ static bool OptimizeAwayTrappingUsesOfValue(Value *V, Constant *NewV) {          else            break;        if (Idxs.size() == GEPI->getNumOperands()-1) -        Changed |= OptimizeAwayTrappingUsesOfValue(GEPI, -                          ConstantExpr::getGetElementPtr(NewV, Idxs)); +        Changed |= OptimizeAwayTrappingUsesOfValue( +            GEPI, ConstantExpr::getGetElementPtr(nullptr, NewV, Idxs));        if (GEPI->use_empty()) {          Changed = true;          GEPI->eraseFromParent(); @@ -2338,7 +2341,7 @@ bool Evaluator::EvaluateBlock(BasicBlock::iterator CurInst,                Constant *IdxZero = ConstantInt::get(IdxTy, 0, false);                Constant * const IdxList[] = {IdxZero, IdxZero}; -              Ptr = ConstantExpr::getGetElementPtr(Ptr, IdxList); +              Ptr = ConstantExpr::getGetElementPtr(nullptr, Ptr, IdxList);                if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Ptr))                  Ptr = ConstantFoldConstantExpression(CE, DL, TLI); @@ -2402,8 +2405,8 @@ bool Evaluator::EvaluateBlock(BasicBlock::iterator CurInst,             i != e; ++i)          GEPOps.push_back(getVal(*i));        InstResult = -        ConstantExpr::getGetElementPtr(P, GEPOps, -                                       cast<GEPOperator>(GEP)->isInBounds()); +          ConstantExpr::getGetElementPtr(GEP->getSourceElementType(), P, GEPOps, +                                         cast<GEPOperator>(GEP)->isInBounds());        DEBUG(dbgs() << "Found a GEP! Simplifying: " << *InstResult              << "\n");      } else if (LoadInst *LI = dyn_cast<LoadInst>(CurInst)) { diff --git a/lib/Transforms/IPO/LowerBitSets.cpp b/lib/Transforms/IPO/LowerBitSets.cpp index fe00d92..f3f8529 100644 --- a/lib/Transforms/IPO/LowerBitSets.cpp +++ b/lib/Transforms/IPO/LowerBitSets.cpp @@ -349,7 +349,8 @@ void LowerBitSets::allocateByteArrays() {      Constant *Idxs[] = {ConstantInt::get(IntPtrTy, 0),                          ConstantInt::get(IntPtrTy, ByteArrayOffsets[I])}; -    Constant *GEP = ConstantExpr::getInBoundsGetElementPtr(ByteArray, Idxs); +    Constant *GEP = ConstantExpr::getInBoundsGetElementPtr( +        ByteArrayConst->getType(), ByteArray, Idxs);      // Create an alias instead of RAUW'ing the gep directly. On x86 this ensures      // that the pc-relative displacement is folded into the lea instead of the @@ -395,16 +396,17 @@ Value *LowerBitSets::createBitSetTest(IRBuilder<> &B, BitSetInfo &BSI,      }      Constant *ByteArray = BAI->ByteArray; +    Type *Ty = BAI->ByteArray->getValueType();      if (!LinkerSubsectionsViaSymbols && AvoidReuse) {        // Each use of the byte array uses a different alias. This makes the        // backend less likely to reuse previously computed byte array addresses,        // improving the security of the CFI mechanism based on this pass. -      ByteArray = GlobalAlias::create( -          BAI->ByteArray->getType()->getElementType(), 0, -          GlobalValue::PrivateLinkage, "bits_use", ByteArray, M); +      ByteArray = GlobalAlias::create(BAI->ByteArray->getValueType(), 0, +                                      GlobalValue::PrivateLinkage, "bits_use", +                                      ByteArray, M);      } -    Value *ByteAddr = B.CreateGEP(ByteArray, BitOffset); +    Value *ByteAddr = B.CreateGEP(Ty, ByteArray, BitOffset);      Value *Byte = B.CreateLoad(ByteAddr);      Value *ByteAndMask = B.CreateAnd(Byte, BAI->Mask); @@ -546,8 +548,8 @@ void LowerBitSets::buildBitSetsFromGlobals(      // Multiply by 2 to account for padding elements.      Constant *CombinedGlobalIdxs[] = {ConstantInt::get(Int32Ty, 0),                                        ConstantInt::get(Int32Ty, I * 2)}; -    Constant *CombinedGlobalElemPtr = -        ConstantExpr::getGetElementPtr(CombinedGlobal, CombinedGlobalIdxs); +    Constant *CombinedGlobalElemPtr = ConstantExpr::getGetElementPtr( +        NewInit->getType(), CombinedGlobal, CombinedGlobalIdxs);      if (LinkerSubsectionsViaSymbols) {        Globals[I]->replaceAllUsesWith(CombinedGlobalElemPtr);      } else { diff --git a/lib/Transforms/IPO/PassManagerBuilder.cpp b/lib/Transforms/IPO/PassManagerBuilder.cpp index d28d563..502451b 100644 --- a/lib/Transforms/IPO/PassManagerBuilder.cpp +++ b/lib/Transforms/IPO/PassManagerBuilder.cpp @@ -59,6 +59,10 @@ static cl::opt<bool>  RunLoopRerolling("reroll-loops", cl::Hidden,                   cl::desc("Run the loop rerolling pass")); +static cl::opt<bool> +RunFloat2Int("float-to-int", cl::Hidden, cl::init(true), +             cl::desc("Run the float2int (float demotion) pass")); +  static cl::opt<bool> RunLoadCombine("combine-loads", cl::init(false),                                      cl::Hidden,                                      cl::desc("Run the load combining pass")); @@ -307,6 +311,9 @@ void PassManagerBuilder::populateModulePassManager(    // we must insert a no-op module pass to reset the pass manager.    MPM.add(createBarrierNoopPass()); +  if (RunFloat2Int) +    MPM.add(createFloat2IntPass()); +    // Re-rotate loops in all our loop nests. These may have fallout out of    // rotated form due to GVN or other transformations, and the vectorizer relies    // on the rotated form. diff --git a/lib/Transforms/IPO/StripSymbols.cpp b/lib/Transforms/IPO/StripSymbols.cpp index 816978e..ad7c5a0 100644 --- a/lib/Transforms/IPO/StripSymbols.cpp +++ b/lib/Transforms/IPO/StripSymbols.cpp @@ -305,33 +305,29 @@ bool StripDeadDebugInfo::runOnModule(Module &M) {    SmallVector<Metadata *, 64> LiveSubprograms;    DenseSet<const MDNode *> VisitedSet; -  for (DICompileUnit DIC : F.compile_units()) { -    assert(DIC.Verify() && "DIC must verify as a DICompileUnit."); - +  for (MDCompileUnit *DIC : F.compile_units()) {      // Create our live subprogram list. -    DIArray SPs = DIC.getSubprograms(); +    MDSubprogramArray SPs = DIC->getSubprograms();      bool SubprogramChange = false; -    for (unsigned i = 0, e = SPs.getNumElements(); i != e; ++i) { -      DISubprogram DISP(SPs.getElement(i)); -      assert(DISP.Verify() && "DISP must verify as a DISubprogram."); +    for (unsigned i = 0, e = SPs.size(); i != e; ++i) { +      DISubprogram DISP = SPs[i];        // Make sure we visit each subprogram only once.        if (!VisitedSet.insert(DISP).second)          continue;        // If the function referenced by DISP is not null, the function is live. -      if (DISP.getFunction()) +      if (DISP->getFunction())          LiveSubprograms.push_back(DISP);        else          SubprogramChange = true;      }      // Create our live global variable list. -    DIArray GVs = DIC.getGlobalVariables(); +    MDGlobalVariableArray GVs = DIC->getGlobalVariables();      bool GlobalVariableChange = false; -    for (unsigned i = 0, e = GVs.getNumElements(); i != e; ++i) { -      DIGlobalVariable DIG(GVs.getElement(i)); -      assert(DIG.Verify() && "DIG must verify as DIGlobalVariable."); +    for (unsigned i = 0, e = GVs.size(); i != e; ++i) { +      DIGlobalVariable DIG = GVs[i];        // Make sure we only visit each global variable only once.        if (!VisitedSet.insert(DIG).second) @@ -339,7 +335,7 @@ bool StripDeadDebugInfo::runOnModule(Module &M) {        // If the global variable referenced by DIG is not null, the global        // variable is live. -      if (DIG.getGlobal()) +      if (DIG->getVariable())          LiveGlobalVariables.push_back(DIG);        else          GlobalVariableChange = true; @@ -349,12 +345,12 @@ bool StripDeadDebugInfo::runOnModule(Module &M) {      // subprogram list/global variable list with our new live subprogram/global      // variable list.      if (SubprogramChange) { -      DIC.replaceSubprograms(DIArray(MDNode::get(C, LiveSubprograms))); +      DIC->replaceSubprograms(MDTuple::get(C, LiveSubprograms));        Changed = true;      }      if (GlobalVariableChange) { -      DIC.replaceGlobalVariables(DIArray(MDNode::get(C, LiveGlobalVariables))); +      DIC->replaceGlobalVariables(MDTuple::get(C, LiveGlobalVariables));        Changed = true;      }  | 
