diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2018-08-02 17:32:43 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2018-08-02 17:32:43 +0000 | 
| commit | b7eb8e35e481a74962664b63dfb09483b200209a (patch) | |
| tree | 1937fb4a348458ce2d02ade03ac3bb0aa18d2fcd /lib/Transforms/Utils | |
| parent | eb11fae6d08f479c0799db45860a98af528fa6e7 (diff) | |
Notes
Diffstat (limited to 'lib/Transforms/Utils')
| -rw-r--r-- | lib/Transforms/Utils/BuildLibCalls.cpp | 2 | ||||
| -rw-r--r-- | lib/Transforms/Utils/CallPromotionUtils.cpp | 2 | ||||
| -rw-r--r-- | lib/Transforms/Utils/CloneFunction.cpp | 38 | ||||
| -rw-r--r-- | lib/Transforms/Utils/CloneModule.cpp | 4 | ||||
| -rw-r--r-- | lib/Transforms/Utils/CodeExtractor.cpp | 6 | ||||
| -rw-r--r-- | lib/Transforms/Utils/InlineFunction.cpp | 14 | ||||
| -rw-r--r-- | lib/Transforms/Utils/IntegerDivision.cpp | 10 | ||||
| -rw-r--r-- | lib/Transforms/Utils/LCSSA.cpp | 9 | ||||
| -rw-r--r-- | lib/Transforms/Utils/LoopUnrollPeel.cpp | 4 | ||||
| -rw-r--r-- | lib/Transforms/Utils/MetaRenamer.cpp | 2 | ||||
| -rw-r--r-- | lib/Transforms/Utils/SSAUpdater.cpp | 38 | ||||
| -rw-r--r-- | lib/Transforms/Utils/SimplifyIndVar.cpp | 2 | ||||
| -rw-r--r-- | lib/Transforms/Utils/SimplifyLibCalls.cpp | 237 | ||||
| -rw-r--r-- | lib/Transforms/Utils/SymbolRewriter.cpp | 2 | ||||
| -rw-r--r-- | lib/Transforms/Utils/UnifyFunctionExitNodes.cpp | 2 | 
15 files changed, 186 insertions, 186 deletions
| diff --git a/lib/Transforms/Utils/BuildLibCalls.cpp b/lib/Transforms/Utils/BuildLibCalls.cpp index 5f5c4150d3bb..d0396e6ce47d 100644 --- a/lib/Transforms/Utils/BuildLibCalls.cpp +++ b/lib/Transforms/Utils/BuildLibCalls.cpp @@ -911,7 +911,7 @@ static void appendTypeSuffix(Value *Op, StringRef &Name,        NameBuffer += 'l';      Name = NameBuffer; -  }   +  }  }  Value *llvm::emitUnaryFloatFnCall(Value *Op, StringRef Name, IRBuilder<> &B, diff --git a/lib/Transforms/Utils/CallPromotionUtils.cpp b/lib/Transforms/Utils/CallPromotionUtils.cpp index 4d9c22e57a68..6d18d0614611 100644 --- a/lib/Transforms/Utils/CallPromotionUtils.cpp +++ b/lib/Transforms/Utils/CallPromotionUtils.cpp @@ -392,7 +392,7 @@ Instruction *llvm::promoteCall(CallSite CS, Function *Callee,    auto CalleeType = Callee->getFunctionType();    auto CalleeParamNum = CalleeType->getNumParams();    for (unsigned ArgNo = 0; ArgNo < CalleeParamNum; ++ArgNo) { -    auto *Arg = CS.getArgument(ArgNo);  +    auto *Arg = CS.getArgument(ArgNo);      Type *FormalTy = CalleeType->getParamType(ArgNo);      Type *ActualTy = Arg->getType();      if (FormalTy != ActualTy) { diff --git a/lib/Transforms/Utils/CloneFunction.cpp b/lib/Transforms/Utils/CloneFunction.cpp index 61448e9acb57..807360340055 100644 --- a/lib/Transforms/Utils/CloneFunction.cpp +++ b/lib/Transforms/Utils/CloneFunction.cpp @@ -290,7 +290,7 @@ void PruningFunctionCloner::CloneBlock(const BasicBlock *BB,    // Have we already cloned this block?    if (BBEntry) return; -   +    // Nope, clone it now.    BasicBlock *NewBB;    BBEntry = NewBB = BasicBlock::Create(BB->getContext()); @@ -363,7 +363,7 @@ void PruningFunctionCloner::CloneBlock(const BasicBlock *BB,          hasDynamicAllocas = true;      }    } -   +    // Finally, clone over the terminator.    const TerminatorInst *OldTI = BB->getTerminator();    bool TerminatorDone = false; @@ -400,7 +400,7 @@ void PruningFunctionCloner::CloneBlock(const BasicBlock *BB,        TerminatorDone = true;      }    } -   +    if (!TerminatorDone) {      Instruction *NewInst = OldTI->clone();      if (OldTI->hasName()) @@ -418,11 +418,11 @@ void PruningFunctionCloner::CloneBlock(const BasicBlock *BB,      for (const BasicBlock *Succ : TI->successors())        ToClone.push_back(Succ);    } -   +    if (CodeInfo) {      CodeInfo->ContainsCalls          |= hasCalls;      CodeInfo->ContainsDynamicAllocas |= hasDynamicAllocas; -    CodeInfo->ContainsDynamicAllocas |= hasStaticAllocas &&  +    CodeInfo->ContainsDynamicAllocas |= hasStaticAllocas &&        BB != &BB->getParent()->front();    }  } @@ -468,7 +468,7 @@ void llvm::CloneAndPruneIntoFromInst(Function *NewFunc, const Function *OldFunc,      CloneWorklist.pop_back();      PFC.CloneBlock(BB, BB->begin(), CloneWorklist);    } -   +    // Loop over all of the basic blocks in the old function.  If the block was    // reachable, we have cloned it and the old block is now in the value map:    // insert it into the new function in the right order.  If not, ignore it. @@ -500,7 +500,7 @@ void llvm::CloneAndPruneIntoFromInst(Function *NewFunc, const Function *OldFunc,                       ModuleLevelChanges ? RF_None : RF_NoModuleLevelChanges,                       TypeMapper, Materializer);    } -   +    // Defer PHI resolution until rest of function is resolved, PHI resolution    // requires the CFG to be up-to-date.    for (unsigned phino = 0, e = PHIToResolve.size(); phino != e; ) { @@ -519,7 +519,7 @@ void llvm::CloneAndPruneIntoFromInst(Function *NewFunc, const Function *OldFunc,          Value *V = VMap.lookup(PN->getIncomingBlock(pred));          if (BasicBlock *MappedBlock = cast_or_null<BasicBlock>(V)) {            Value *InVal = MapValue(PN->getIncomingValue(pred), -                                  VMap,  +                                  VMap,                          ModuleLevelChanges ? RF_None : RF_NoModuleLevelChanges);            assert(InVal && "Unknown input value?");            PN->setIncomingValue(pred, InVal); @@ -529,9 +529,9 @@ void llvm::CloneAndPruneIntoFromInst(Function *NewFunc, const Function *OldFunc,            --pred;  // Revisit the next entry.            --e;          } -      }  +      }      } -     +      // The loop above has removed PHI entries for those blocks that are dead      // and has updated others.  However, if a block is live (i.e. copied over)      // but its terminator has been changed to not go to this block, then our @@ -546,11 +546,11 @@ void llvm::CloneAndPruneIntoFromInst(Function *NewFunc, const Function *OldFunc,        for (pred_iterator PI = pred_begin(NewBB), E = pred_end(NewBB);             PI != E; ++PI)          --PredCount[*PI]; -       +        // Figure out how many entries to remove from each PHI.        for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)          ++PredCount[PN->getIncomingBlock(i)]; -       +        // At this point, the excess predecessor entries are positive in the        // map.  Loop over all of the PHIs and remove excess predecessor        // entries. @@ -563,7 +563,7 @@ void llvm::CloneAndPruneIntoFromInst(Function *NewFunc, const Function *OldFunc,          }        }      } -     +      // If the loops above have made these phi nodes have 0 or 1 operand,      // replace them with undef or the input value.  We must do this for      // correctness, because 0-operand phis are not valid. @@ -655,7 +655,7 @@ void llvm::CloneAndPruneIntoFromInst(Function *NewFunc, const Function *OldFunc,      BranchInst *BI = dyn_cast<BranchInst>(I->getTerminator());      if (!BI || BI->isConditional()) { ++I; continue; } -     +      BasicBlock *Dest = BI->getSuccessor(0);      if (!Dest->getSinglePredecessor()) {        ++I; continue; @@ -668,16 +668,16 @@ void llvm::CloneAndPruneIntoFromInst(Function *NewFunc, const Function *OldFunc,      // We know all single-entry PHI nodes in the inlined function have been      // removed, so we just need to splice the blocks.      BI->eraseFromParent(); -     +      // Make all PHI nodes that referred to Dest now refer to I as their source.      Dest->replaceAllUsesWith(&*I);      // Move all the instructions in the succ to the pred.      I->getInstList().splice(I->end(), Dest->getInstList()); -     +      // Remove the dest block.      Dest->eraseFromParent(); -     +      // Do not increment I, iteratively merge all things this block branches to.    } @@ -703,7 +703,7 @@ void llvm::CloneAndPruneFunctionInto(Function *NewFunc, const Function *OldFunc,                                       ValueToValueMapTy &VMap,                                       bool ModuleLevelChanges,                                       SmallVectorImpl<ReturnInst*> &Returns, -                                     const char *NameSuffix,  +                                     const char *NameSuffix,                                       ClonedCodeInfo *CodeInfo,                                       Instruction *TheCall) {    CloneAndPruneIntoFromInst(NewFunc, OldFunc, &OldFunc->front().front(), VMap, @@ -730,7 +730,7 @@ Loop *llvm::cloneLoopWithPreheader(BasicBlock *Before, BasicBlock *LoopDomBB,                                     const Twine &NameSuffix, LoopInfo *LI,                                     DominatorTree *DT,                                     SmallVectorImpl<BasicBlock *> &Blocks) { -  assert(OrigLoop->getSubLoops().empty() &&  +  assert(OrigLoop->getSubLoops().empty() &&           "Loop to be cloned cannot have inner loop");    Function *F = OrigLoop->getHeader()->getParent();    Loop *ParentLoop = OrigLoop->getParentLoop(); diff --git a/lib/Transforms/Utils/CloneModule.cpp b/lib/Transforms/Utils/CloneModule.cpp index 35c7511a24b9..c7d68bab8170 100644 --- a/lib/Transforms/Utils/CloneModule.cpp +++ b/lib/Transforms/Utils/CloneModule.cpp @@ -61,7 +61,7 @@ std::unique_ptr<Module> llvm::CloneModule(    //    for (Module::const_global_iterator I = M.global_begin(), E = M.global_end();         I != E; ++I) { -    GlobalVariable *GV = new GlobalVariable(*New,  +    GlobalVariable *GV = new GlobalVariable(*New,                                              I->getValueType(),                                              I->isConstant(), I->getLinkage(),                                              (Constant*) nullptr, I->getName(), @@ -110,7 +110,7 @@ std::unique_ptr<Module> llvm::CloneModule(      GA->copyAttributesFrom(&*I);      VMap[&*I] = GA;    } -   +    // Now that all of the things that global variable initializer can refer to    // have been created, loop through and copy the global variable referrers    // over...  We also set the attributes on the global now. diff --git a/lib/Transforms/Utils/CodeExtractor.cpp b/lib/Transforms/Utils/CodeExtractor.cpp index f31dab9f96af..cb349e34606c 100644 --- a/lib/Transforms/Utils/CodeExtractor.cpp +++ b/lib/Transforms/Utils/CodeExtractor.cpp @@ -1020,7 +1020,7 @@ emitCallAndSwitchStatement(Function *newFunction, BasicBlock *codeReplacer,      } else {        // Otherwise we must have code extracted an unwind or something, just        // return whatever we want. -      ReturnInst::Create(Context,  +      ReturnInst::Create(Context,                           Constant::getNullValue(OldFnRetTy), TheSwitch);      } @@ -1158,13 +1158,13 @@ Function *CodeExtractor::extractCodeRegion() {    splitReturnBlocks();    // This takes place of the original loop -  BasicBlock *codeReplacer = BasicBlock::Create(header->getContext(),  +  BasicBlock *codeReplacer = BasicBlock::Create(header->getContext(),                                                  "codeRepl", oldFunction,                                                  header);    // The new function needs a root node because other nodes can branch to the    // head of the region, but the entry node of a function cannot have preds. -  BasicBlock *newFuncRoot = BasicBlock::Create(header->getContext(),  +  BasicBlock *newFuncRoot = BasicBlock::Create(header->getContext(),                                                 "newFuncRoot");    auto *BranchI = BranchInst::Create(header);    // If the original function has debug info, we have to add a debug location diff --git a/lib/Transforms/Utils/InlineFunction.cpp b/lib/Transforms/Utils/InlineFunction.cpp index 0315aac1cf84..ddc6e07e2f59 100644 --- a/lib/Transforms/Utils/InlineFunction.cpp +++ b/lib/Transforms/Utils/InlineFunction.cpp @@ -1199,7 +1199,7 @@ static void UpdateCallGraphAfterInlining(CallSite CS,      // Only copy the edge if the call was inlined!      if (VMI == VMap.end() || VMI->second == nullptr)        continue; -     +      // If the call was inlined, but then constant folded, there is no edge to      // add.  Check for this case.      Instruction *NewCall = dyn_cast<Instruction>(VMI->second); @@ -1211,7 +1211,7 @@ static void UpdateCallGraphAfterInlining(CallSite CS,      CallSite CS = CallSite(NewCall);      if (CS && CS.getCalledFunction() && CS.getCalledFunction()->isIntrinsic())        continue; -     +      // Remember that this call site got inlined for the client of      // InlineFunction.      IFI.InlinedCalls.push_back(NewCall); @@ -1231,7 +1231,7 @@ static void UpdateCallGraphAfterInlining(CallSite CS,      CallerNode->addCalledFunction(CallSite(NewCall), I->second);    } -   +    // Update the call graph by deleting the edge from Callee to Caller.  We must    // do this after the loop above in case Caller and Callee are the same.    CallerNode->removeCallEdgeFor(CS); @@ -1380,7 +1380,7 @@ static void fixupLineNumbers(Function *Fn, Function::iterator FI,        if (CalleeHasDebugInfo)          continue; -       +        // If the inlined instruction has no line number, make it look as if it        // originates from the call location. This is important for        // ((__always_inline__, __nodebug__)) functions which must use caller @@ -1777,7 +1777,7 @@ bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI,           E = FirstNewBlock->end(); I != E; ) {        AllocaInst *AI = dyn_cast<AllocaInst>(I++);        if (!AI) continue; -       +        // If the alloca is now dead, remove it.  This often occurs due to code        // specialization.        if (AI->use_empty()) { @@ -1787,10 +1787,10 @@ bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI,        if (!allocaWouldBeStaticInEntry(AI))          continue; -       +        // Keep track of the static allocas that we inline into the caller.        IFI.StaticAllocas.push_back(AI); -       +        // Scan for the block of allocas that we can move over, and move them        // all at once.        while (isa<AllocaInst>(I) && diff --git a/lib/Transforms/Utils/IntegerDivision.cpp b/lib/Transforms/Utils/IntegerDivision.cpp index 3fbb3487884b..4a359b99bebd 100644 --- a/lib/Transforms/Utils/IntegerDivision.cpp +++ b/lib/Transforms/Utils/IntegerDivision.cpp @@ -476,10 +476,10 @@ bool llvm::expandDivision(BinaryOperator *Div) {    return true;  } -/// Generate code to compute the remainder of two integers of bitwidth up to  +/// Generate code to compute the remainder of two integers of bitwidth up to  /// 32 bits. Uses the above routines and extends the inputs/truncates the  /// outputs to operate in 32 bits; that is, these routines are good for targets -/// that have no or very little suppport for smaller than 32 bit integer  +/// that have no or very little suppport for smaller than 32 bit integer  /// arithmetic.  ///  /// Replace Rem with emulation code. @@ -527,7 +527,7 @@ bool llvm::expandRemainderUpTo32Bits(BinaryOperator *Rem) {    return expandRemainder(cast<BinaryOperator>(ExtRem));  } -/// Generate code to compute the remainder of two integers of bitwidth up to  +/// Generate code to compute the remainder of two integers of bitwidth up to  /// 64 bits. Uses the above routines and extends the inputs/truncates the  /// outputs to operate in 64 bits.  /// @@ -613,7 +613,7 @@ bool llvm::expandDivisionUpTo32Bits(BinaryOperator *Div) {    } else {      ExtDividend = Builder.CreateZExt(Div->getOperand(0), Int32Ty);      ExtDivisor = Builder.CreateZExt(Div->getOperand(1), Int32Ty); -    ExtDiv = Builder.CreateUDiv(ExtDividend, ExtDivisor);   +    ExtDiv = Builder.CreateUDiv(ExtDividend, ExtDivisor);    }    Trunc = Builder.CreateTrunc(ExtDiv, DivTy); @@ -662,7 +662,7 @@ bool llvm::expandDivisionUpTo64Bits(BinaryOperator *Div) {    } else {      ExtDividend = Builder.CreateZExt(Div->getOperand(0), Int64Ty);      ExtDivisor = Builder.CreateZExt(Div->getOperand(1), Int64Ty); -    ExtDiv = Builder.CreateUDiv(ExtDividend, ExtDivisor);   +    ExtDiv = Builder.CreateUDiv(ExtDividend, ExtDivisor);    }    Trunc = Builder.CreateTrunc(ExtDiv, DivTy); diff --git a/lib/Transforms/Utils/LCSSA.cpp b/lib/Transforms/Utils/LCSSA.cpp index 956d0387c7a8..a1f8e7484bcf 100644 --- a/lib/Transforms/Utils/LCSSA.cpp +++ b/lib/Transforms/Utils/LCSSA.cpp @@ -10,7 +10,7 @@  // This pass transforms loops by placing phi nodes at the end of the loops for  // all values that are live across the loop boundary.  For example, it turns  // the left into the right code: -//  +//  // for (...)                for (...)  //   if (c)                   if (c)  //     X1 = ...                 X1 = ... @@ -21,8 +21,8 @@  //                          ... = X4 + 4  //  // This is still valid LLVM; the extra phi nodes are purely redundant, and will -// be trivially eliminated by InstCombine.  The major benefit of this  -// transformation is that it makes many other loop optimizations, such as  +// be trivially eliminated by InstCombine.  The major benefit of this +// transformation is that it makes many other loop optimizations, such as  // LoopUnswitching, simpler.  //  //===----------------------------------------------------------------------===// @@ -144,7 +144,8 @@ bool llvm::formLCSSAForInstructions(SmallVectorImpl<Instruction *> &Worklist,        PHINode *PN = PHINode::Create(I->getType(), PredCache.size(ExitBB),                                      I->getName() + ".lcssa", &ExitBB->front()); - +      // Get the debug location from the original instruction. +      PN->setDebugLoc(I->getDebugLoc());        // Add inputs from inside the loop for this PHI.        for (BasicBlock *Pred : PredCache.get(ExitBB)) {          PN->addIncoming(I, Pred); diff --git a/lib/Transforms/Utils/LoopUnrollPeel.cpp b/lib/Transforms/Utils/LoopUnrollPeel.cpp index 13794c53f24b..78afe748e596 100644 --- a/lib/Transforms/Utils/LoopUnrollPeel.cpp +++ b/lib/Transforms/Utils/LoopUnrollPeel.cpp @@ -344,7 +344,7 @@ void llvm::computePeelCount(Loop *L, unsigned LoopSize,  /// Update the branch weights of the latch of a peeled-off loop  /// iteration.  /// This sets the branch weights for the latch of the recently peeled off loop -/// iteration correctly.  +/// iteration correctly.  /// Our goal is to make sure that:  /// a) The total weight of all the copies of the loop body is preserved.  /// b) The total weight of the loop exit is preserved. @@ -544,7 +544,7 @@ bool llvm::peelLoop(Loop *L, unsigned PeelCount, LoopInfo *LI,    //    // Each following iteration will split the current bottom anchor in two,    // and put the new copy of the loop body between these two blocks. That is, -  // after peeling another iteration from the example above, we'll split  +  // after peeling another iteration from the example above, we'll split    // InsertBot, and get:    //    // InsertTop: diff --git a/lib/Transforms/Utils/MetaRenamer.cpp b/lib/Transforms/Utils/MetaRenamer.cpp index 323f2552ca80..88d595ee02ab 100644 --- a/lib/Transforms/Utils/MetaRenamer.cpp +++ b/lib/Transforms/Utils/MetaRenamer.cpp @@ -68,7 +68,7 @@ namespace {      PRNG prng;    }; -   +    struct MetaRenamer : public ModulePass {      // Pass identification, replacement for typeid      static char ID; diff --git a/lib/Transforms/Utils/SSAUpdater.cpp b/lib/Transforms/Utils/SSAUpdater.cpp index ca184ed7c4e3..4a1fd8d571aa 100644 --- a/lib/Transforms/Utils/SSAUpdater.cpp +++ b/lib/Transforms/Utils/SSAUpdater.cpp @@ -201,13 +201,13 @@ void SSAUpdater::RewriteUse(Use &U) {  void SSAUpdater::RewriteUseAfterInsertions(Use &U) {    Instruction *User = cast<Instruction>(U.getUser()); -   +    Value *V;    if (PHINode *UserPN = dyn_cast<PHINode>(User))      V = GetValueAtEndOfBlock(UserPN->getIncomingBlock(U));    else      V = GetValueAtEndOfBlock(User->getParent()); -   +    U.set(V);  } @@ -235,7 +235,7 @@ public:      PHI_iterator(PHINode *P, bool) // end iterator        : PHI(P), idx(PHI->getNumIncomingValues()) {} -    PHI_iterator &operator++() { ++idx; return *this; }  +    PHI_iterator &operator++() { ++idx; return *this; }      bool operator==(const PHI_iterator& x) const { return idx == x.idx; }      bool operator!=(const PHI_iterator& x) const { return !operator==(x); } @@ -333,7 +333,7 @@ LoadAndStorePromoter::  LoadAndStorePromoter(ArrayRef<const Instruction *> Insts,                       SSAUpdater &S, StringRef BaseName) : SSA(S) {    if (Insts.empty()) return; -   +    const Value *SomeVal;    if (const LoadInst *LI = dyn_cast<LoadInst>(Insts[0]))      SomeVal = LI; @@ -354,7 +354,7 @@ run(const SmallVectorImpl<Instruction *> &Insts) const {    for (Instruction *User : Insts)      UsesByBlock[User->getParent()].push_back(User); -   +    // Okay, now we can iterate over all the blocks in the function with uses,    // processing them.  Keep track of which loads are loading a live-in value.    // Walk the uses in the use-list order to be determinstic. @@ -364,10 +364,10 @@ run(const SmallVectorImpl<Instruction *> &Insts) const {    for (Instruction *User : Insts) {      BasicBlock *BB = User->getParent();      TinyPtrVector<Instruction *> &BlockUses = UsesByBlock[BB]; -     +      // If this block has already been processed, ignore this repeat use.      if (BlockUses.empty()) continue; -     +      // Okay, this is the first use in the block.  If this block just has a      // single user in it, we can rewrite it trivially.      if (BlockUses.size() == 1) { @@ -375,13 +375,13 @@ run(const SmallVectorImpl<Instruction *> &Insts) const {        if (StoreInst *SI = dyn_cast<StoreInst>(User)) {          updateDebugInfo(SI);          SSA.AddAvailableValue(BB, SI->getOperand(0)); -      } else  +      } else          // Otherwise it is a load, queue it to rewrite as a live-in load.          LiveInLoads.push_back(cast<LoadInst>(User));        BlockUses.clear();        continue;      } -     +      // Otherwise, check to see if this block is all loads.      bool HasStore = false;      for (Instruction *I : BlockUses) { @@ -390,7 +390,7 @@ run(const SmallVectorImpl<Instruction *> &Insts) const {          break;        }      } -     +      // If so, we can queue them all as live in loads.  We don't have an      // efficient way to tell which on is first in the block and don't want to      // scan large blocks, so just add all loads as live ins. @@ -400,7 +400,7 @@ run(const SmallVectorImpl<Instruction *> &Insts) const {        BlockUses.clear();        continue;      } -     +      // Otherwise, we have mixed loads and stores (or just a bunch of stores).      // Since SSAUpdater is purely for cross-block values, we need to determine      // the order of these instructions in the block.  If the first use in the @@ -411,7 +411,7 @@ run(const SmallVectorImpl<Instruction *> &Insts) const {        if (LoadInst *L = dyn_cast<LoadInst>(&I)) {          // If this is a load from an unrelated pointer, ignore it.          if (!isInstInList(L, Insts)) continue; -         +          // If we haven't seen a store yet, this is a live in use, otherwise          // use the stored value.          if (StoredValue) { @@ -433,13 +433,13 @@ run(const SmallVectorImpl<Instruction *> &Insts) const {          StoredValue = SI->getOperand(0);        }      } -     +      // The last stored value that happened is the live-out for the block.      assert(StoredValue && "Already checked that there is a store in block");      SSA.AddAvailableValue(BB, StoredValue);      BlockUses.clear();    } -   +    // Okay, now we rewrite all loads that use live-in values in the loop,    // inserting PHI nodes as necessary.    for (LoadInst *ALoad : LiveInLoads) { @@ -451,10 +451,10 @@ run(const SmallVectorImpl<Instruction *> &Insts) const {      ALoad->replaceAllUsesWith(NewVal);      ReplacedLoads[ALoad] = NewVal;    } -   +    // Allow the client to do stuff before we start nuking things.    doExtraRewritesBeforeFinalDeletion(); -   +    // Now that everything is rewritten, delete the old instructions from the    // function.  They should all be dead now.    for (Instruction *User : Insts) { @@ -465,7 +465,7 @@ run(const SmallVectorImpl<Instruction *> &Insts) const {      if (!User->use_empty()) {        Value *NewVal = ReplacedLoads[User];        assert(NewVal && "not a replaced load?"); -       +        // Propagate down to the ultimate replacee.  The intermediately loads        // could theoretically already have been deleted, so we don't want to        // dereference the Value*'s. @@ -474,11 +474,11 @@ run(const SmallVectorImpl<Instruction *> &Insts) const {          NewVal = RLI->second;          RLI = ReplacedLoads.find(NewVal);        } -       +        replaceLoadWithValue(cast<LoadInst>(User), NewVal);        User->replaceAllUsesWith(NewVal);      } -     +      instructionDeleted(User);      User->eraseFromParent();    } diff --git a/lib/Transforms/Utils/SimplifyIndVar.cpp b/lib/Transforms/Utils/SimplifyIndVar.cpp index e381fbc34ab4..65b23f4d94a1 100644 --- a/lib/Transforms/Utils/SimplifyIndVar.cpp +++ b/lib/Transforms/Utils/SimplifyIndVar.cpp @@ -196,7 +196,7 @@ bool SimplifyIndvar::makeIVComparisonInvariant(ICmpInst *ICmp,    SmallDenseMap<const SCEV*, Value*> CheapExpansions;    CheapExpansions[S] = ICmp->getOperand(IVOperIdx);    CheapExpansions[X] = ICmp->getOperand(1 - IVOperIdx); -   +    // TODO: Support multiple entry loops?  (We currently bail out of these in    // the IndVarSimplify pass)    if (auto *BB = L->getLoopPredecessor()) { diff --git a/lib/Transforms/Utils/SimplifyLibCalls.cpp b/lib/Transforms/Utils/SimplifyLibCalls.cpp index 8c48597fc2e4..15e035874002 100644 --- a/lib/Transforms/Utils/SimplifyLibCalls.cpp +++ b/lib/Transforms/Utils/SimplifyLibCalls.cpp @@ -890,7 +890,7 @@ static Value *foldMallocMemset(CallInst *Memset, IRBuilder<> &B,      return nullptr;    // Replace the malloc with a calloc. We need the data layout to know what the -  // actual size of a 'size_t' parameter is.  +  // actual size of a 'size_t' parameter is.    B.SetInsertPoint(Malloc->getParent(), ++Malloc->getIterator());    const DataLayout &DL = Malloc->getModule()->getDataLayout();    IntegerType *SizeType = DL.getIntPtrType(B.GetInsertBlock()->getContext()); @@ -970,7 +970,7 @@ static Value *optimizeUnaryDoubleFP(CallInst *CI, IRBuilder<> &B,    Value *V = valueHasFloatPrecision(CI->getArgOperand(0));    if (V == nullptr)      return nullptr; -   +    // If call isn't an intrinsic, check that it isn't within a function with the    // same name as the float version of this call.    // @@ -1126,165 +1126,164 @@ Value *LibCallSimplifier::replacePowWithSqrt(CallInst *Pow, IRBuilder<> &B) {    if (!Pow->isFast())      return nullptr; -  const APFloat *Arg1C; -  if (!match(Pow->getArgOperand(1), m_APFloat(Arg1C))) -    return nullptr; -  if (!Arg1C->isExactlyValue(0.5) && !Arg1C->isExactlyValue(-0.5)) +  Value *Sqrt, *Base = Pow->getArgOperand(0), *Expo = Pow->getArgOperand(1); +  Type *Ty = Pow->getType(); + +  const APFloat *ExpoF; +  if (!match(Expo, m_APFloat(ExpoF)) || +      (!ExpoF->isExactlyValue(0.5) && !ExpoF->isExactlyValue(-0.5)))      return nullptr; -  // Fast-math flags from the pow() are propagated to all replacement ops. -  IRBuilder<>::FastMathFlagGuard Guard(B); -  B.setFastMathFlags(Pow->getFastMathFlags()); -  Type *Ty = Pow->getType(); -  Value *Sqrt; +  // If errno is never set, then use the intrinsic for sqrt().    if (Pow->hasFnAttr(Attribute::ReadNone)) { -    // We know that errno is never set, so replace with an intrinsic: -    // pow(x, 0.5) --> llvm.sqrt(x) -    // llvm.pow(x, 0.5) --> llvm.sqrt(x) -    auto *F = Intrinsic::getDeclaration(Pow->getModule(), Intrinsic::sqrt, Ty); -    Sqrt = B.CreateCall(F, Pow->getArgOperand(0)); -  } else if (hasUnaryFloatFn(TLI, Ty, LibFunc_sqrt, LibFunc_sqrtf, -                             LibFunc_sqrtl)) { -    // Errno could be set, so we must use a sqrt libcall. -    // TODO: We also should check that the target can in fact lower the sqrt -    // libcall. We currently have no way to ask this question, so we ask -    // whether the target has a sqrt libcall which is not exactly the same. -    Sqrt = emitUnaryFloatFnCall(Pow->getArgOperand(0), -                                TLI->getName(LibFunc_sqrt), B, +    Function *SqrtFn = Intrinsic::getDeclaration(Pow->getModule(), +                                                 Intrinsic::sqrt, Ty); +    Sqrt = B.CreateCall(SqrtFn, Base); +  } +  // Otherwise, use the libcall for sqrt(). +  else if (hasUnaryFloatFn(TLI, Ty, LibFunc_sqrt, LibFunc_sqrtf, LibFunc_sqrtl)) +    // TODO: We also should check that the target can in fact lower the sqrt() +    // libcall. We currently have no way to ask this question, so we ask if +    // the target has a sqrt() libcall, which is not exactly the same. +    Sqrt = emitUnaryFloatFnCall(Base, TLI->getName(LibFunc_sqrt), B,                                  Pow->getCalledFunction()->getAttributes()); -  } else { -    // We can't replace with an intrinsic or a libcall. +  else      return nullptr; -  } -  // If this is pow(x, -0.5), get the reciprocal. -  if (Arg1C->isExactlyValue(-0.5)) -    Sqrt = B.CreateFDiv(ConstantFP::get(Ty, 1.0), Sqrt); +  // If the exponent is negative, then get the reciprocal. +  if (ExpoF->isNegative()) +    Sqrt = B.CreateFDiv(ConstantFP::get(Ty, 1.0), Sqrt, "reciprocal");    return Sqrt;  } -Value *LibCallSimplifier::optimizePow(CallInst *CI, IRBuilder<> &B) { -  Function *Callee = CI->getCalledFunction(); -  Value *Ret = nullptr; +Value *LibCallSimplifier::optimizePow(CallInst *Pow, IRBuilder<> &B) { +  Value *Base = Pow->getArgOperand(0), *Expo = Pow->getArgOperand(1); +  Function *Callee = Pow->getCalledFunction(); +  AttributeList Attrs = Callee->getAttributes();    StringRef Name = Callee->getName(); -  if (UnsafeFPShrink && Name == "pow" && hasFloatVersion(Name)) -    Ret = optimizeUnaryDoubleFP(CI, B, true); +  Module *Module = Pow->getModule(); +  Type *Ty = Pow->getType(); +  Value *Shrunk = nullptr; +  bool Ignored; + +  if (UnsafeFPShrink && +      Name == TLI->getName(LibFunc_pow) && hasFloatVersion(Name)) +    Shrunk = optimizeUnaryDoubleFP(Pow, B, true); + +  // Propagate the math semantics from the call to any created instructions. +  IRBuilder<>::FastMathFlagGuard Guard(B); +  B.setFastMathFlags(Pow->getFastMathFlags()); -  Value *Op1 = CI->getArgOperand(0), *Op2 = CI->getArgOperand(1); +  // Evaluate special cases related to the base.    // pow(1.0, x) -> 1.0 -  if (match(Op1, m_SpecificFP(1.0))) -    return Op1; -  // pow(2.0, x) -> llvm.exp2(x) -  if (match(Op1, m_SpecificFP(2.0))) { -    Value *Exp2 = Intrinsic::getDeclaration(CI->getModule(), Intrinsic::exp2, -                                            CI->getType()); -    return B.CreateCall(Exp2, Op2, "exp2"); -  } - -  // There's no llvm.exp10 intrinsic yet, but, maybe, some day there will -  // be one. -  if (ConstantFP *Op1C = dyn_cast<ConstantFP>(Op1)) { -    // pow(10.0, x) -> exp10(x) -    if (Op1C->isExactlyValue(10.0) && -        hasUnaryFloatFn(TLI, Op1->getType(), LibFunc_exp10, LibFunc_exp10f, -                        LibFunc_exp10l)) -      return emitUnaryFloatFnCall(Op2, TLI->getName(LibFunc_exp10), B, -                                  Callee->getAttributes()); +  if (match(Base, m_SpecificFP(1.0))) +    return Base; + +  // pow(2.0, x) -> exp2(x) +  if (match(Base, m_SpecificFP(2.0))) { +    Value *Exp2 = Intrinsic::getDeclaration(Module, Intrinsic::exp2, Ty); +    return B.CreateCall(Exp2, Expo, "exp2");    } +  // pow(10.0, x) -> exp10(x) +  if (ConstantFP *BaseC = dyn_cast<ConstantFP>(Base)) +    // There's no exp10 intrinsic yet, but, maybe, some day there shall be one. +    if (BaseC->isExactlyValue(10.0) && +        hasUnaryFloatFn(TLI, Ty, LibFunc_exp10, LibFunc_exp10f, LibFunc_exp10l)) +      return emitUnaryFloatFnCall(Expo, TLI->getName(LibFunc_exp10), B, Attrs); +    // pow(exp(x), y) -> exp(x * y)    // pow(exp2(x), y) -> exp2(x * y)    // We enable these only with fast-math. Besides rounding differences, the    // transformation changes overflow and underflow behavior quite dramatically.    // Example: x = 1000, y = 0.001.    // pow(exp(x), y) = pow(inf, 0.001) = inf, whereas exp(x*y) = exp(1). -  auto *OpC = dyn_cast<CallInst>(Op1); -  if (OpC && OpC->isFast() && CI->isFast()) { -    LibFunc Func; -    Function *OpCCallee = OpC->getCalledFunction(); -    if (OpCCallee && TLI->getLibFunc(OpCCallee->getName(), Func) && -        TLI->has(Func) && (Func == LibFunc_exp || Func == LibFunc_exp2)) { +  auto *BaseFn = dyn_cast<CallInst>(Base); +  if (BaseFn && BaseFn->isFast() && Pow->isFast()) { +    LibFunc LibFn; +    Function *CalleeFn = BaseFn->getCalledFunction(); +    if (CalleeFn && TLI->getLibFunc(CalleeFn->getName(), LibFn) && +        (LibFn == LibFunc_exp || LibFn == LibFunc_exp2) && TLI->has(LibFn)) {        IRBuilder<>::FastMathFlagGuard Guard(B); -      B.setFastMathFlags(CI->getFastMathFlags()); -      Value *FMul = B.CreateFMul(OpC->getArgOperand(0), Op2, "mul"); -      return emitUnaryFloatFnCall(FMul, OpCCallee->getName(), B, -                                  OpCCallee->getAttributes()); +      B.setFastMathFlags(Pow->getFastMathFlags()); + +      Value *FMul = B.CreateFMul(BaseFn->getArgOperand(0), Expo, "mul"); +      return emitUnaryFloatFnCall(FMul, CalleeFn->getName(), B, +                                  CalleeFn->getAttributes());      }    } -  if (Value *Sqrt = replacePowWithSqrt(CI, B)) +  // Evaluate special cases related to the exponent. + +  if (Value *Sqrt = replacePowWithSqrt(Pow, B))      return Sqrt; -  ConstantFP *Op2C = dyn_cast<ConstantFP>(Op2); -  if (!Op2C) -    return Ret; +  ConstantFP *ExpoC = dyn_cast<ConstantFP>(Expo); +  if (!ExpoC) +    return Shrunk; -  if (Op2C->getValueAPF().isZero()) // pow(x, 0.0) -> 1.0 -    return ConstantFP::get(CI->getType(), 1.0); +  // pow(x, -1.0) -> 1.0 / x +  if (ExpoC->isExactlyValue(-1.0)) +    return B.CreateFDiv(ConstantFP::get(Ty, 1.0), Base, "reciprocal"); -  // FIXME: Correct the transforms and pull this into replacePowWithSqrt(). -  if (Op2C->isExactlyValue(0.5) && -      hasUnaryFloatFn(TLI, Op2->getType(), LibFunc_sqrt, LibFunc_sqrtf, -                      LibFunc_sqrtl)) { -    // Expand pow(x, 0.5) to (x == -infinity ? +infinity : fabs(sqrt(x))). -    // This is faster than calling pow, and still handles negative zero -    // and negative infinity correctly. -    // TODO: In finite-only mode, this could be just fabs(sqrt(x)). -    Value *Inf = ConstantFP::getInfinity(CI->getType()); -    Value *NegInf = ConstantFP::getInfinity(CI->getType(), true); +  // pow(x, 0.0) -> 1.0 +  if (ExpoC->getValueAPF().isZero()) +    return ConstantFP::get(Ty, 1.0); -    // TODO: As above, we should lower to the sqrt intrinsic if the pow is an -    // intrinsic, to match errno semantics. -    Value *Sqrt = emitUnaryFloatFnCall(Op1, "sqrt", B, Callee->getAttributes()); +  // pow(x, 1.0) -> x +  if (ExpoC->isExactlyValue(1.0)) +    return Base; -    Module *M = Callee->getParent(); -    Function *FabsF = Intrinsic::getDeclaration(M, Intrinsic::fabs, -                                                CI->getType()); -    Value *FAbs = B.CreateCall(FabsF, Sqrt); +  // pow(x, 2.0) -> x * x +  if (ExpoC->isExactlyValue(2.0)) +    return B.CreateFMul(Base, Base, "square"); -    Value *FCmp = B.CreateFCmpOEQ(Op1, NegInf); -    Value *Sel = B.CreateSelect(FCmp, Inf, FAbs); -    return Sel; +  // FIXME: Correct the transforms and pull this into replacePowWithSqrt(). +  if (ExpoC->isExactlyValue(0.5) && +      hasUnaryFloatFn(TLI, Ty, LibFunc_sqrt, LibFunc_sqrtf, LibFunc_sqrtl)) { +    // Expand pow(x, 0.5) to (x == -infinity ? +infinity : fabs(sqrt(x))). +    // This is faster than calling pow(), and still handles -0.0 and +    // negative infinity correctly. +    // TODO: In finite-only mode, this could be just fabs(sqrt(x)). +    Value *PosInf = ConstantFP::getInfinity(Ty); +    Value *NegInf = ConstantFP::getInfinity(Ty, true); + +    // TODO: As above, we should lower to the sqrt() intrinsic if the pow() is +    // an intrinsic, to match errno semantics. +    Value *Sqrt = emitUnaryFloatFnCall(Base, TLI->getName(LibFunc_sqrt), +                                       B, Attrs); +    Function *FAbsFn = Intrinsic::getDeclaration(Module, Intrinsic::fabs, Ty); +    Value *FAbs = B.CreateCall(FAbsFn, Sqrt, "abs"); +    Value *FCmp = B.CreateFCmpOEQ(Base, NegInf, "isinf"); +    Sqrt = B.CreateSelect(FCmp, PosInf, FAbs); +    return Sqrt;    } -  // Propagate fast-math-flags from the call to any created instructions. -  IRBuilder<>::FastMathFlagGuard Guard(B); -  B.setFastMathFlags(CI->getFastMathFlags()); -  // pow(x, 1.0) --> x -  if (Op2C->isExactlyValue(1.0)) -    return Op1; -  // pow(x, 2.0) --> x * x -  if (Op2C->isExactlyValue(2.0)) -    return B.CreateFMul(Op1, Op1, "pow2"); -  // pow(x, -1.0) --> 1.0 / x -  if (Op2C->isExactlyValue(-1.0)) -    return B.CreateFDiv(ConstantFP::get(CI->getType(), 1.0), Op1, "powrecip"); - -  // In -ffast-math, generate repeated fmul instead of generating pow(x, n). -  if (CI->isFast()) { -    APFloat V = abs(Op2C->getValueAPF()); -    // We limit to a max of 7 fmul(s). Thus max exponent is 32. +  // pow(x, n) -> x * x * x * .... +  if (Pow->isFast()) { +    APFloat ExpoA = abs(ExpoC->getValueAPF()); +    // We limit to a max of 7 fmul(s). Thus the maximum exponent is 32.      // This transformation applies to integer exponents only. -    if (V.compare(APFloat(V.getSemantics(), 32.0)) == APFloat::cmpGreaterThan || -        !V.isInteger()) +    if (!ExpoA.isInteger() || +        ExpoA.compare +            (APFloat(ExpoA.getSemantics(), 32.0)) == APFloat::cmpGreaterThan)        return nullptr;      // We will memoize intermediate products of the Addition Chain.      Value *InnerChain[33] = {nullptr}; -    InnerChain[1] = Op1; -    InnerChain[2] = B.CreateFMul(Op1, Op1); +    InnerChain[1] = Base; +    InnerChain[2] = B.CreateFMul(Base, Base, "square");      // We cannot readily convert a non-double type (like float) to a double. -    // So we first convert V to something which could be converted to double. -    bool Ignored; -    V.convert(APFloat::IEEEdouble(), APFloat::rmTowardZero, &Ignored); -     -    Value *FMul = getPow(InnerChain, V.convertToDouble(), B); -    // For negative exponents simply compute the reciprocal. -    if (Op2C->isNegative()) -      FMul = B.CreateFDiv(ConstantFP::get(CI->getType(), 1.0), FMul); +    // So we first convert it to something which could be converted to double. +    ExpoA.convert(APFloat::IEEEdouble(), APFloat::rmTowardZero, &Ignored); +    Value *FMul = getPow(InnerChain, ExpoA.convertToDouble(), B); + +    // If the exponent is negative, then get the reciprocal. +    if (ExpoC->isNegative()) +      FMul = B.CreateFDiv(ConstantFP::get(Ty, 1.0), FMul, "reciprocal");      return FMul;    } diff --git a/lib/Transforms/Utils/SymbolRewriter.cpp b/lib/Transforms/Utils/SymbolRewriter.cpp index 3640541e63cc..fd0da79487f1 100644 --- a/lib/Transforms/Utils/SymbolRewriter.cpp +++ b/lib/Transforms/Utils/SymbolRewriter.cpp @@ -536,7 +536,7 @@ private:  char RewriteSymbolsLegacyPass::ID = 0;  RewriteSymbolsLegacyPass::RewriteSymbolsLegacyPass() : ModulePass(ID) { -  initializeRewriteSymbolsLegacyPassPass(*PassRegistry::getPassRegistry());   +  initializeRewriteSymbolsLegacyPassPass(*PassRegistry::getPassRegistry());  }  RewriteSymbolsLegacyPass::RewriteSymbolsLegacyPass( diff --git a/lib/Transforms/Utils/UnifyFunctionExitNodes.cpp b/lib/Transforms/Utils/UnifyFunctionExitNodes.cpp index e633ac0c874d..d49b26472548 100644 --- a/lib/Transforms/Utils/UnifyFunctionExitNodes.cpp +++ b/lib/Transforms/Utils/UnifyFunctionExitNodes.cpp @@ -61,7 +61,7 @@ bool UnifyFunctionExitNodes::runOnFunction(Function &F) {    } else if (UnreachableBlocks.size() == 1) {      UnreachableBlock = UnreachableBlocks.front();    } else { -    UnreachableBlock = BasicBlock::Create(F.getContext(),  +    UnreachableBlock = BasicBlock::Create(F.getContext(),                                            "UnifiedUnreachableBlock", &F);      new UnreachableInst(F.getContext(), UnreachableBlock); | 
