1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 11:42:57 +01:00

function names should start with a lower case letter; NFC

llvm-svn: 248224
This commit is contained in:
Sanjay Patel 2015-09-21 23:03:16 +00:00
parent 2b3a524d83
commit 9671de578a

View File

@ -160,25 +160,25 @@ class TypePromotionTransaction;
} }
private: private:
bool EliminateFallThrough(Function &F); bool eliminateFallThrough(Function &F);
bool EliminateMostlyEmptyBlocks(Function &F); bool eliminateMostlyEmptyBlocks(Function &F);
bool CanMergeBlocks(const BasicBlock *BB, const BasicBlock *DestBB) const; bool canMergeBlocks(const BasicBlock *BB, const BasicBlock *DestBB) const;
void EliminateMostlyEmptyBlock(BasicBlock *BB); void eliminateMostlyEmptyBlock(BasicBlock *BB);
bool OptimizeBlock(BasicBlock &BB, bool& ModifiedDT); bool optimizeBlock(BasicBlock &BB, bool& ModifiedDT);
bool OptimizeInst(Instruction *I, bool& ModifiedDT); bool optimizeInst(Instruction *I, bool& ModifiedDT);
bool OptimizeMemoryInst(Instruction *I, Value *Addr, bool optimizeMemoryInst(Instruction *I, Value *Addr,
Type *AccessTy, unsigned AS); Type *AccessTy, unsigned AS);
bool OptimizeInlineAsmInst(CallInst *CS); bool optimizeInlineAsmInst(CallInst *CS);
bool OptimizeCallInst(CallInst *CI, bool& ModifiedDT); bool optimizeCallInst(CallInst *CI, bool& ModifiedDT);
bool MoveExtToFormExtLoad(Instruction *&I); bool moveExtToFormExtLoad(Instruction *&I);
bool OptimizeExtUses(Instruction *I); bool optimizeExtUses(Instruction *I);
bool OptimizeSelectInst(SelectInst *SI); bool optimizeSelectInst(SelectInst *SI);
bool OptimizeShuffleVectorInst(ShuffleVectorInst *SI); bool optimizeShuffleVectorInst(ShuffleVectorInst *SI);
bool OptimizeExtractElementInst(Instruction *Inst); bool optimizeExtractElementInst(Instruction *Inst);
bool DupRetToEnableTailCallOpts(BasicBlock *BB); bool dupRetToEnableTailCallOpts(BasicBlock *BB);
bool PlaceDbgValues(Function &F); bool placeDbgValues(Function &F);
bool sinkAndCmp(Function &F); bool sinkAndCmp(Function &F);
bool ExtLdPromotion(TypePromotionTransaction &TPT, LoadInst *&LI, bool extLdPromotion(TypePromotionTransaction &TPT, LoadInst *&LI,
Instruction *&Inst, Instruction *&Inst,
const SmallVectorImpl<Instruction *> &Exts, const SmallVectorImpl<Instruction *> &Exts,
unsigned CreatedInstCost); unsigned CreatedInstCost);
@ -225,12 +225,12 @@ bool CodeGenPrepare::runOnFunction(Function &F) {
// Eliminate blocks that contain only PHI nodes and an // Eliminate blocks that contain only PHI nodes and an
// unconditional branch. // unconditional branch.
EverMadeChange |= EliminateMostlyEmptyBlocks(F); EverMadeChange |= eliminateMostlyEmptyBlocks(F);
// llvm.dbg.value is far away from the value then iSel may not be able // llvm.dbg.value is far away from the value then iSel may not be able
// handle it properly. iSel will drop llvm.dbg.value if it can not // handle it properly. iSel will drop llvm.dbg.value if it can not
// find a node corresponding to the value. // find a node corresponding to the value.
EverMadeChange |= PlaceDbgValues(F); EverMadeChange |= placeDbgValues(F);
// If there is a mask, compare against zero, and branch that can be combined // If there is a mask, compare against zero, and branch that can be combined
// into a single target instruction, push the mask and compare into branch // into a single target instruction, push the mask and compare into branch
@ -247,7 +247,7 @@ bool CodeGenPrepare::runOnFunction(Function &F) {
for (Function::iterator I = F.begin(); I != F.end(); ) { for (Function::iterator I = F.begin(); I != F.end(); ) {
BasicBlock *BB = I++; BasicBlock *BB = I++;
bool ModifiedDTOnIteration = false; bool ModifiedDTOnIteration = false;
MadeChange |= OptimizeBlock(*BB, ModifiedDTOnIteration); MadeChange |= optimizeBlock(*BB, ModifiedDTOnIteration);
// Restart BB iteration if the dominator tree of the Function was changed // Restart BB iteration if the dominator tree of the Function was changed
if (ModifiedDTOnIteration) if (ModifiedDTOnIteration)
@ -290,7 +290,7 @@ bool CodeGenPrepare::runOnFunction(Function &F) {
// Merge pairs of basic blocks with unconditional branches, connected by // Merge pairs of basic blocks with unconditional branches, connected by
// a single edge. // a single edge.
if (EverMadeChange || MadeChange) if (EverMadeChange || MadeChange)
MadeChange |= EliminateFallThrough(F); MadeChange |= eliminateFallThrough(F);
EverMadeChange |= MadeChange; EverMadeChange |= MadeChange;
} }
@ -311,7 +311,7 @@ bool CodeGenPrepare::runOnFunction(Function &F) {
/// Merge basic blocks which are connected by a single edge, where one of the /// Merge basic blocks which are connected by a single edge, where one of the
/// basic blocks has a single successor pointing to the other basic block, /// basic blocks has a single successor pointing to the other basic block,
/// which has a single predecessor. /// which has a single predecessor.
bool CodeGenPrepare::EliminateFallThrough(Function &F) { bool CodeGenPrepare::eliminateFallThrough(Function &F) {
bool Changed = false; bool Changed = false;
// Scan all of the blocks in the function, except for the entry block. // Scan all of the blocks in the function, except for the entry block.
for (Function::iterator I = std::next(F.begin()), E = F.end(); I != E;) { for (Function::iterator I = std::next(F.begin()), E = F.end(); I != E;) {
@ -346,7 +346,7 @@ bool CodeGenPrepare::EliminateFallThrough(Function &F) {
/// unconditional branch. Passes before isel (e.g. LSR/loopsimplify) often split /// unconditional branch. Passes before isel (e.g. LSR/loopsimplify) often split
/// edges in ways that are non-optimal for isel. Start by eliminating these /// edges in ways that are non-optimal for isel. Start by eliminating these
/// blocks so we can split them the way we want them. /// blocks so we can split them the way we want them.
bool CodeGenPrepare::EliminateMostlyEmptyBlocks(Function &F) { bool CodeGenPrepare::eliminateMostlyEmptyBlocks(Function &F) {
bool MadeChange = false; bool MadeChange = false;
// Note that this intentionally skips the entry block. // Note that this intentionally skips the entry block.
for (Function::iterator I = std::next(F.begin()), E = F.end(); I != E;) { for (Function::iterator I = std::next(F.begin()), E = F.end(); I != E;) {
@ -376,10 +376,10 @@ bool CodeGenPrepare::EliminateMostlyEmptyBlocks(Function &F) {
if (DestBB == BB) if (DestBB == BB)
continue; continue;
if (!CanMergeBlocks(BB, DestBB)) if (!canMergeBlocks(BB, DestBB))
continue; continue;
EliminateMostlyEmptyBlock(BB); eliminateMostlyEmptyBlock(BB);
MadeChange = true; MadeChange = true;
} }
return MadeChange; return MadeChange;
@ -388,7 +388,7 @@ bool CodeGenPrepare::EliminateMostlyEmptyBlocks(Function &F) {
/// Return true if we can merge BB into DestBB if there is a single /// Return true if we can merge BB into DestBB if there is a single
/// unconditional branch between them, and BB contains no other non-phi /// unconditional branch between them, and BB contains no other non-phi
/// instructions. /// instructions.
bool CodeGenPrepare::CanMergeBlocks(const BasicBlock *BB, bool CodeGenPrepare::canMergeBlocks(const BasicBlock *BB,
const BasicBlock *DestBB) const { const BasicBlock *DestBB) const {
// We only want to eliminate blocks whose phi nodes are used by phi nodes in // We only want to eliminate blocks whose phi nodes are used by phi nodes in
// the successor. If there are more complex condition (e.g. preheaders), // the successor. If there are more complex condition (e.g. preheaders),
@ -456,7 +456,7 @@ bool CodeGenPrepare::CanMergeBlocks(const BasicBlock *BB,
/// Eliminate a basic block that has only phi's and an unconditional branch in /// Eliminate a basic block that has only phi's and an unconditional branch in
/// it. /// it.
void CodeGenPrepare::EliminateMostlyEmptyBlock(BasicBlock *BB) { void CodeGenPrepare::eliminateMostlyEmptyBlock(BasicBlock *BB) {
BranchInst *BI = cast<BranchInst>(BB->getTerminator()); BranchInst *BI = cast<BranchInst>(BB->getTerminator());
BasicBlock *DestBB = BI->getSuccessor(0); BasicBlock *DestBB = BI->getSuccessor(0);
@ -1286,7 +1286,7 @@ static void ScalarizeMaskedStore(CallInst *CI) {
CI->eraseFromParent(); CI->eraseFromParent();
} }
bool CodeGenPrepare::OptimizeCallInst(CallInst *CI, bool& ModifiedDT) { bool CodeGenPrepare::optimizeCallInst(CallInst *CI, bool& ModifiedDT) {
BasicBlock *BB = CI->getParent(); BasicBlock *BB = CI->getParent();
// Lower inline assembly if we can. // Lower inline assembly if we can.
@ -1302,7 +1302,7 @@ bool CodeGenPrepare::OptimizeCallInst(CallInst *CI, bool& ModifiedDT) {
return true; return true;
} }
// Sink address computing for memory operands into the block. // Sink address computing for memory operands into the block.
if (OptimizeInlineAsmInst(CI)) if (optimizeInlineAsmInst(CI))
return true; return true;
} }
@ -1421,7 +1421,7 @@ bool CodeGenPrepare::OptimizeCallInst(CallInst *CI, bool& ModifiedDT) {
Type *AccessTy; Type *AccessTy;
if (TLI->GetAddrModeArguments(II, PtrOps, AccessTy, AddrSpace)) if (TLI->GetAddrModeArguments(II, PtrOps, AccessTy, AddrSpace))
while (!PtrOps.empty()) while (!PtrOps.empty())
if (OptimizeMemoryInst(II, PtrOps.pop_back_val(), AccessTy, AddrSpace)) if (optimizeMemoryInst(II, PtrOps.pop_back_val(), AccessTy, AddrSpace))
return true; return true;
} }
} }
@ -1472,7 +1472,7 @@ bool CodeGenPrepare::OptimizeCallInst(CallInst *CI, bool& ModifiedDT) {
/// %tmp2 = tail call i32 @f2() /// %tmp2 = tail call i32 @f2()
/// ret i32 %tmp2 /// ret i32 %tmp2
/// @endcode /// @endcode
bool CodeGenPrepare::DupRetToEnableTailCallOpts(BasicBlock *BB) { bool CodeGenPrepare::dupRetToEnableTailCallOpts(BasicBlock *BB) {
if (!TLI) if (!TLI)
return false; return false;
@ -2154,32 +2154,32 @@ public:
bool Success = AddressingModeMatcher(AddrModeInsts, TM, AccessTy, AS, bool Success = AddressingModeMatcher(AddrModeInsts, TM, AccessTy, AS,
MemoryInst, Result, InsertedInsts, MemoryInst, Result, InsertedInsts,
PromotedInsts, TPT).MatchAddr(V, 0); PromotedInsts, TPT).matchAddr(V, 0);
(void)Success; assert(Success && "Couldn't select *anything*?"); (void)Success; assert(Success && "Couldn't select *anything*?");
return Result; return Result;
} }
private: private:
bool MatchScaledValue(Value *ScaleReg, int64_t Scale, unsigned Depth); bool matchScaledValue(Value *ScaleReg, int64_t Scale, unsigned Depth);
bool MatchAddr(Value *V, unsigned Depth); bool matchAddr(Value *V, unsigned Depth);
bool MatchOperationAddr(User *Operation, unsigned Opcode, unsigned Depth, bool matchOperationAddr(User *Operation, unsigned Opcode, unsigned Depth,
bool *MovedAway = nullptr); bool *MovedAway = nullptr);
bool IsProfitableToFoldIntoAddressingMode(Instruction *I, bool isProfitableToFoldIntoAddressingMode(Instruction *I,
ExtAddrMode &AMBefore, ExtAddrMode &AMBefore,
ExtAddrMode &AMAfter); ExtAddrMode &AMAfter);
bool ValueAlreadyLiveAtInst(Value *Val, Value *KnownLive1, Value *KnownLive2); bool valueAlreadyLiveAtInst(Value *Val, Value *KnownLive1, Value *KnownLive2);
bool IsPromotionProfitable(unsigned NewCost, unsigned OldCost, bool isPromotionProfitable(unsigned NewCost, unsigned OldCost,
Value *PromotedOperand) const; Value *PromotedOperand) const;
}; };
/// Try adding ScaleReg*Scale to the current addressing mode. /// Try adding ScaleReg*Scale to the current addressing mode.
/// Return true and update AddrMode if this addr mode is legal for the target, /// Return true and update AddrMode if this addr mode is legal for the target,
/// false if not. /// false if not.
bool AddressingModeMatcher::MatchScaledValue(Value *ScaleReg, int64_t Scale, bool AddressingModeMatcher::matchScaledValue(Value *ScaleReg, int64_t Scale,
unsigned Depth) { unsigned Depth) {
// If Scale is 1, then this is the same as adding ScaleReg to the addressing // If Scale is 1, then this is the same as adding ScaleReg to the addressing
// mode. Just process that directly. // mode. Just process that directly.
if (Scale == 1) if (Scale == 1)
return MatchAddr(ScaleReg, Depth); return matchAddr(ScaleReg, Depth);
// If the scale is 0, it takes nothing to add this. // If the scale is 0, it takes nothing to add this.
if (Scale == 0) if (Scale == 0)
@ -2632,7 +2632,7 @@ Value *TypePromotionHelper::promoteOperandForOther(
/// matched in the addressing mode the promotion. /// matched in the addressing mode the promotion.
/// \p PromotedOperand is the value that has been promoted. /// \p PromotedOperand is the value that has been promoted.
/// \return True if the promotion is profitable, false otherwise. /// \return True if the promotion is profitable, false otherwise.
bool AddressingModeMatcher::IsPromotionProfitable( bool AddressingModeMatcher::isPromotionProfitable(
unsigned NewCost, unsigned OldCost, Value *PromotedOperand) const { unsigned NewCost, unsigned OldCost, Value *PromotedOperand) const {
DEBUG(dbgs() << "OldCost: " << OldCost << "\tNewCost: " << NewCost << '\n'); DEBUG(dbgs() << "OldCost: " << OldCost << "\tNewCost: " << NewCost << '\n');
// The cost of the new extensions is greater than the cost of the // The cost of the new extensions is greater than the cost of the
@ -2659,7 +2659,7 @@ bool AddressingModeMatcher::IsPromotionProfitable(
/// This state can happen when AddrInst is a sext, since it may be moved away. /// This state can happen when AddrInst is a sext, since it may be moved away.
/// Therefore, AddrInst may not be valid when MovedAway is true and it must /// Therefore, AddrInst may not be valid when MovedAway is true and it must
/// not be referenced anymore. /// not be referenced anymore.
bool AddressingModeMatcher::MatchOperationAddr(User *AddrInst, unsigned Opcode, bool AddressingModeMatcher::matchOperationAddr(User *AddrInst, unsigned Opcode,
unsigned Depth, unsigned Depth,
bool *MovedAway) { bool *MovedAway) {
// Avoid exponential behavior on extremely deep expression trees. // Avoid exponential behavior on extremely deep expression trees.
@ -2672,13 +2672,13 @@ bool AddressingModeMatcher::MatchOperationAddr(User *AddrInst, unsigned Opcode,
switch (Opcode) { switch (Opcode) {
case Instruction::PtrToInt: case Instruction::PtrToInt:
// PtrToInt is always a noop, as we know that the int type is pointer sized. // PtrToInt is always a noop, as we know that the int type is pointer sized.
return MatchAddr(AddrInst->getOperand(0), Depth); return matchAddr(AddrInst->getOperand(0), Depth);
case Instruction::IntToPtr: { case Instruction::IntToPtr: {
auto AS = AddrInst->getType()->getPointerAddressSpace(); auto AS = AddrInst->getType()->getPointerAddressSpace();
auto PtrTy = MVT::getIntegerVT(DL.getPointerSizeInBits(AS)); auto PtrTy = MVT::getIntegerVT(DL.getPointerSizeInBits(AS));
// This inttoptr is a no-op if the integer type is pointer sized. // This inttoptr is a no-op if the integer type is pointer sized.
if (TLI.getValueType(DL, AddrInst->getOperand(0)->getType()) == PtrTy) if (TLI.getValueType(DL, AddrInst->getOperand(0)->getType()) == PtrTy)
return MatchAddr(AddrInst->getOperand(0), Depth); return matchAddr(AddrInst->getOperand(0), Depth);
return false; return false;
} }
case Instruction::BitCast: case Instruction::BitCast:
@ -2690,14 +2690,14 @@ bool AddressingModeMatcher::MatchOperationAddr(User *AddrInst, unsigned Opcode,
// and we don't want to mess around with them. Assume it knows what it // and we don't want to mess around with them. Assume it knows what it
// is doing. // is doing.
AddrInst->getOperand(0)->getType() != AddrInst->getType()) AddrInst->getOperand(0)->getType() != AddrInst->getType())
return MatchAddr(AddrInst->getOperand(0), Depth); return matchAddr(AddrInst->getOperand(0), Depth);
return false; return false;
case Instruction::AddrSpaceCast: { case Instruction::AddrSpaceCast: {
unsigned SrcAS unsigned SrcAS
= AddrInst->getOperand(0)->getType()->getPointerAddressSpace(); = AddrInst->getOperand(0)->getType()->getPointerAddressSpace();
unsigned DestAS = AddrInst->getType()->getPointerAddressSpace(); unsigned DestAS = AddrInst->getType()->getPointerAddressSpace();
if (TLI.isNoopAddrSpaceCast(SrcAS, DestAS)) if (TLI.isNoopAddrSpaceCast(SrcAS, DestAS))
return MatchAddr(AddrInst->getOperand(0), Depth); return matchAddr(AddrInst->getOperand(0), Depth);
return false; return false;
} }
case Instruction::Add: { case Instruction::Add: {
@ -2711,8 +2711,8 @@ bool AddressingModeMatcher::MatchOperationAddr(User *AddrInst, unsigned Opcode,
TypePromotionTransaction::ConstRestorationPt LastKnownGood = TypePromotionTransaction::ConstRestorationPt LastKnownGood =
TPT.getRestorationPoint(); TPT.getRestorationPoint();
if (MatchAddr(AddrInst->getOperand(1), Depth+1) && if (matchAddr(AddrInst->getOperand(1), Depth+1) &&
MatchAddr(AddrInst->getOperand(0), Depth+1)) matchAddr(AddrInst->getOperand(0), Depth+1))
return true; return true;
// Restore the old addr mode info. // Restore the old addr mode info.
@ -2721,8 +2721,8 @@ bool AddressingModeMatcher::MatchOperationAddr(User *AddrInst, unsigned Opcode,
TPT.rollback(LastKnownGood); TPT.rollback(LastKnownGood);
// Otherwise this was over-aggressive. Try merging in the LHS then the RHS. // Otherwise this was over-aggressive. Try merging in the LHS then the RHS.
if (MatchAddr(AddrInst->getOperand(0), Depth+1) && if (matchAddr(AddrInst->getOperand(0), Depth+1) &&
MatchAddr(AddrInst->getOperand(1), Depth+1)) matchAddr(AddrInst->getOperand(1), Depth+1))
return true; return true;
// Otherwise we definitely can't merge the ADD in. // Otherwise we definitely can't merge the ADD in.
@ -2744,7 +2744,7 @@ bool AddressingModeMatcher::MatchOperationAddr(User *AddrInst, unsigned Opcode,
if (Opcode == Instruction::Shl) if (Opcode == Instruction::Shl)
Scale = 1LL << Scale; Scale = 1LL << Scale;
return MatchScaledValue(AddrInst->getOperand(0), Scale, Depth); return matchScaledValue(AddrInst->getOperand(0), Scale, Depth);
} }
case Instruction::GetElementPtr: { case Instruction::GetElementPtr: {
// Scan the GEP. We check it if it contains constant offsets and at most // Scan the GEP. We check it if it contains constant offsets and at most
@ -2783,7 +2783,7 @@ bool AddressingModeMatcher::MatchOperationAddr(User *AddrInst, unsigned Opcode,
if (ConstantOffset == 0 || if (ConstantOffset == 0 ||
TLI.isLegalAddressingMode(DL, AddrMode, AccessTy, AddrSpace)) { TLI.isLegalAddressingMode(DL, AddrMode, AccessTy, AddrSpace)) {
// Check to see if we can fold the base pointer in too. // Check to see if we can fold the base pointer in too.
if (MatchAddr(AddrInst->getOperand(0), Depth+1)) if (matchAddr(AddrInst->getOperand(0), Depth+1))
return true; return true;
} }
AddrMode.BaseOffs -= ConstantOffset; AddrMode.BaseOffs -= ConstantOffset;
@ -2798,7 +2798,7 @@ bool AddressingModeMatcher::MatchOperationAddr(User *AddrInst, unsigned Opcode,
AddrMode.BaseOffs += ConstantOffset; AddrMode.BaseOffs += ConstantOffset;
// Match the base operand of the GEP. // Match the base operand of the GEP.
if (!MatchAddr(AddrInst->getOperand(0), Depth+1)) { if (!matchAddr(AddrInst->getOperand(0), Depth+1)) {
// If it couldn't be matched, just stuff the value in a register. // If it couldn't be matched, just stuff the value in a register.
if (AddrMode.HasBaseReg) { if (AddrMode.HasBaseReg) {
AddrMode = BackupAddrMode; AddrMode = BackupAddrMode;
@ -2810,7 +2810,7 @@ bool AddressingModeMatcher::MatchOperationAddr(User *AddrInst, unsigned Opcode,
} }
// Match the remaining variable portion of the GEP. // Match the remaining variable portion of the GEP.
if (!MatchScaledValue(AddrInst->getOperand(VariableOperand), VariableScale, if (!matchScaledValue(AddrInst->getOperand(VariableOperand), VariableScale,
Depth)) { Depth)) {
// If it couldn't be matched, try stuffing the base into a register // If it couldn't be matched, try stuffing the base into a register
// instead of matching it, and retrying the match of the scale. // instead of matching it, and retrying the match of the scale.
@ -2821,7 +2821,7 @@ bool AddressingModeMatcher::MatchOperationAddr(User *AddrInst, unsigned Opcode,
AddrMode.HasBaseReg = true; AddrMode.HasBaseReg = true;
AddrMode.BaseReg = AddrInst->getOperand(0); AddrMode.BaseReg = AddrInst->getOperand(0);
AddrMode.BaseOffs += ConstantOffset; AddrMode.BaseOffs += ConstantOffset;
if (!MatchScaledValue(AddrInst->getOperand(VariableOperand), if (!matchScaledValue(AddrInst->getOperand(VariableOperand),
VariableScale, Depth)) { VariableScale, Depth)) {
// If even that didn't work, bail. // If even that didn't work, bail.
AddrMode = BackupAddrMode; AddrMode = BackupAddrMode;
@ -2871,12 +2871,12 @@ bool AddressingModeMatcher::MatchOperationAddr(User *AddrInst, unsigned Opcode,
ExtAddrMode BackupAddrMode = AddrMode; ExtAddrMode BackupAddrMode = AddrMode;
unsigned OldSize = AddrModeInsts.size(); unsigned OldSize = AddrModeInsts.size();
if (!MatchAddr(PromotedOperand, Depth) || if (!matchAddr(PromotedOperand, Depth) ||
// The total of the new cost is equals to the cost of the created // The total of the new cost is equals to the cost of the created
// instructions. // instructions.
// The total of the old cost is equals to the cost of the extension plus // The total of the old cost is equals to the cost of the extension plus
// what we have saved in the addressing mode. // what we have saved in the addressing mode.
!IsPromotionProfitable(CreatedInstsCost, !isPromotionProfitable(CreatedInstsCost,
ExtCost + (AddrModeInsts.size() - OldSize), ExtCost + (AddrModeInsts.size() - OldSize),
PromotedOperand)) { PromotedOperand)) {
AddrMode = BackupAddrMode; AddrMode = BackupAddrMode;
@ -2896,7 +2896,7 @@ bool AddressingModeMatcher::MatchOperationAddr(User *AddrInst, unsigned Opcode,
/// unmodified. This assumes that Addr is either a pointer type or intptr_t /// unmodified. This assumes that Addr is either a pointer type or intptr_t
/// for the target. /// for the target.
/// ///
bool AddressingModeMatcher::MatchAddr(Value *Addr, unsigned Depth) { bool AddressingModeMatcher::matchAddr(Value *Addr, unsigned Depth) {
// Start a transaction at this point that we will rollback if the matching // Start a transaction at this point that we will rollback if the matching
// fails. // fails.
TypePromotionTransaction::ConstRestorationPt LastKnownGood = TypePromotionTransaction::ConstRestorationPt LastKnownGood =
@ -2921,7 +2921,7 @@ bool AddressingModeMatcher::MatchAddr(Value *Addr, unsigned Depth) {
// Check to see if it is possible to fold this operation. // Check to see if it is possible to fold this operation.
bool MovedAway = false; bool MovedAway = false;
if (MatchOperationAddr(I, I->getOpcode(), Depth, &MovedAway)) { if (matchOperationAddr(I, I->getOpcode(), Depth, &MovedAway)) {
// This instruction may have been move away. If so, there is nothing // This instruction may have been move away. If so, there is nothing
// to check here. // to check here.
if (MovedAway) if (MovedAway)
@ -2930,7 +2930,7 @@ bool AddressingModeMatcher::MatchAddr(Value *Addr, unsigned Depth) {
// *profitable* to do so. We use a simple cost model to avoid increasing // *profitable* to do so. We use a simple cost model to avoid increasing
// register pressure too much. // register pressure too much.
if (I->hasOneUse() || if (I->hasOneUse() ||
IsProfitableToFoldIntoAddressingMode(I, BackupAddrMode, AddrMode)) { isProfitableToFoldIntoAddressingMode(I, BackupAddrMode, AddrMode)) {
AddrModeInsts.push_back(I); AddrModeInsts.push_back(I);
return true; return true;
} }
@ -2942,7 +2942,7 @@ bool AddressingModeMatcher::MatchAddr(Value *Addr, unsigned Depth) {
TPT.rollback(LastKnownGood); TPT.rollback(LastKnownGood);
} }
} else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Addr)) { } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Addr)) {
if (MatchOperationAddr(CE, CE->getOpcode(), Depth)) if (matchOperationAddr(CE, CE->getOpcode(), Depth))
return true; return true;
TPT.rollback(LastKnownGood); TPT.rollback(LastKnownGood);
} else if (isa<ConstantPointerNull>(Addr)) { } else if (isa<ConstantPointerNull>(Addr)) {
@ -3054,7 +3054,7 @@ static bool FindAllMemoryUses(
/// the use site that we're folding it into. If so, there is no cost to /// the use site that we're folding it into. If so, there is no cost to
/// include it in the addressing mode. KnownLive1 and KnownLive2 are two values /// include it in the addressing mode. KnownLive1 and KnownLive2 are two values
/// that we know are live at the instruction already. /// that we know are live at the instruction already.
bool AddressingModeMatcher::ValueAlreadyLiveAtInst(Value *Val,Value *KnownLive1, bool AddressingModeMatcher::valueAlreadyLiveAtInst(Value *Val,Value *KnownLive1,
Value *KnownLive2) { Value *KnownLive2) {
// If Val is either of the known-live values, we know it is live! // If Val is either of the known-live values, we know it is live!
if (Val == nullptr || Val == KnownLive1 || Val == KnownLive2) if (Val == nullptr || Val == KnownLive1 || Val == KnownLive2)
@ -3098,7 +3098,7 @@ bool AddressingModeMatcher::ValueAlreadyLiveAtInst(Value *Val,Value *KnownLive1,
/// X was live across 'load Z' for other reasons, we actually *would* want to /// X was live across 'load Z' for other reasons, we actually *would* want to
/// fold the addressing mode in the Z case. This would make Y die earlier. /// fold the addressing mode in the Z case. This would make Y die earlier.
bool AddressingModeMatcher:: bool AddressingModeMatcher::
IsProfitableToFoldIntoAddressingMode(Instruction *I, ExtAddrMode &AMBefore, isProfitableToFoldIntoAddressingMode(Instruction *I, ExtAddrMode &AMBefore,
ExtAddrMode &AMAfter) { ExtAddrMode &AMAfter) {
if (IgnoreProfitability) return true; if (IgnoreProfitability) return true;
@ -3115,9 +3115,9 @@ IsProfitableToFoldIntoAddressingMode(Instruction *I, ExtAddrMode &AMBefore,
// If the BaseReg or ScaledReg was referenced by the previous addrmode, their // If the BaseReg or ScaledReg was referenced by the previous addrmode, their
// lifetime wasn't extended by adding this instruction. // lifetime wasn't extended by adding this instruction.
if (ValueAlreadyLiveAtInst(BaseReg, AMBefore.BaseReg, AMBefore.ScaledReg)) if (valueAlreadyLiveAtInst(BaseReg, AMBefore.BaseReg, AMBefore.ScaledReg))
BaseReg = nullptr; BaseReg = nullptr;
if (ValueAlreadyLiveAtInst(ScaledReg, AMBefore.BaseReg, AMBefore.ScaledReg)) if (valueAlreadyLiveAtInst(ScaledReg, AMBefore.BaseReg, AMBefore.ScaledReg))
ScaledReg = nullptr; ScaledReg = nullptr;
// If folding this instruction (and it's subexprs) didn't extend any live // If folding this instruction (and it's subexprs) didn't extend any live
@ -3162,7 +3162,7 @@ IsProfitableToFoldIntoAddressingMode(Instruction *I, ExtAddrMode &AMBefore,
MemoryInst, Result, InsertedInsts, MemoryInst, Result, InsertedInsts,
PromotedInsts, TPT); PromotedInsts, TPT);
Matcher.IgnoreProfitability = true; Matcher.IgnoreProfitability = true;
bool Success = Matcher.MatchAddr(Address, 0); bool Success = Matcher.matchAddr(Address, 0);
(void)Success; assert(Success && "Couldn't select *anything*?"); (void)Success; assert(Success && "Couldn't select *anything*?");
// The match was to check the profitability, the changes made are not // The match was to check the profitability, the changes made are not
@ -3199,7 +3199,7 @@ static bool IsNonLocalValue(Value *V, BasicBlock *BB) {
/// ///
/// This method is used to optimize both load/store and inline asms with memory /// This method is used to optimize both load/store and inline asms with memory
/// operands. /// operands.
bool CodeGenPrepare::OptimizeMemoryInst(Instruction *MemoryInst, Value *Addr, bool CodeGenPrepare::optimizeMemoryInst(Instruction *MemoryInst, Value *Addr,
Type *AccessTy, unsigned AddrSpace) { Type *AccessTy, unsigned AddrSpace) {
Value *Repl = Addr; Value *Repl = Addr;
@ -3538,7 +3538,7 @@ bool CodeGenPrepare::OptimizeMemoryInst(Instruction *MemoryInst, Value *Addr,
/// If there are any memory operands, use OptimizeMemoryInst to sink their /// If there are any memory operands, use OptimizeMemoryInst to sink their
/// address computing into the block when possible / profitable. /// address computing into the block when possible / profitable.
bool CodeGenPrepare::OptimizeInlineAsmInst(CallInst *CS) { bool CodeGenPrepare::optimizeInlineAsmInst(CallInst *CS) {
bool MadeChange = false; bool MadeChange = false;
const TargetRegisterInfo *TRI = const TargetRegisterInfo *TRI =
@ -3555,7 +3555,7 @@ bool CodeGenPrepare::OptimizeInlineAsmInst(CallInst *CS) {
if (OpInfo.ConstraintType == TargetLowering::C_Memory && if (OpInfo.ConstraintType == TargetLowering::C_Memory &&
OpInfo.isIndirect) { OpInfo.isIndirect) {
Value *OpVal = CS->getArgOperand(ArgNo++); Value *OpVal = CS->getArgOperand(ArgNo++);
MadeChange |= OptimizeMemoryInst(CS, OpVal, OpVal->getType(), ~0u); MadeChange |= optimizeMemoryInst(CS, OpVal, OpVal->getType(), ~0u);
} else if (OpInfo.Type == InlineAsm::isInput) } else if (OpInfo.Type == InlineAsm::isInput)
ArgNo++; ArgNo++;
} }
@ -3635,7 +3635,7 @@ static bool hasSameExtUse(Instruction *Inst, const TargetLowering &TLI) {
/// %add = add nuw i64 %zext, 4 /// %add = add nuw i64 %zext, 4
/// \encode /// \encode
/// Thanks to the promotion, we can match zext(load i32*) to i64. /// Thanks to the promotion, we can match zext(load i32*) to i64.
bool CodeGenPrepare::ExtLdPromotion(TypePromotionTransaction &TPT, bool CodeGenPrepare::extLdPromotion(TypePromotionTransaction &TPT,
LoadInst *&LI, Instruction *&Inst, LoadInst *&LI, Instruction *&Inst,
const SmallVectorImpl<Instruction *> &Exts, const SmallVectorImpl<Instruction *> &Exts,
unsigned CreatedInstsCost = 0) { unsigned CreatedInstsCost = 0) {
@ -3685,7 +3685,7 @@ bool CodeGenPrepare::ExtLdPromotion(TypePromotionTransaction &TPT,
} }
// The promotion is profitable. // The promotion is profitable.
// Check if it exposes an ext(load). // Check if it exposes an ext(load).
(void)ExtLdPromotion(TPT, LI, Inst, NewExts, TotalCreatedInstsCost); (void)extLdPromotion(TPT, LI, Inst, NewExts, TotalCreatedInstsCost);
if (LI && (StressExtLdPromotion || NewCreatedInstsCost <= ExtCost || if (LI && (StressExtLdPromotion || NewCreatedInstsCost <= ExtCost ||
// If we have created a new extension, i.e., now we have two // If we have created a new extension, i.e., now we have two
// extensions. We must make sure one of them is merged with // extensions. We must make sure one of them is merged with
@ -3708,7 +3708,7 @@ bool CodeGenPrepare::ExtLdPromotion(TypePromotionTransaction &TPT,
/// \p I[in/out] the extension may be modified during the process if some /// \p I[in/out] the extension may be modified during the process if some
/// promotions apply. /// promotions apply.
/// ///
bool CodeGenPrepare::MoveExtToFormExtLoad(Instruction *&I) { bool CodeGenPrepare::moveExtToFormExtLoad(Instruction *&I) {
// Try to promote a chain of computation if it allows to form // Try to promote a chain of computation if it allows to form
// an extended load. // an extended load.
TypePromotionTransaction TPT; TypePromotionTransaction TPT;
@ -3719,7 +3719,7 @@ bool CodeGenPrepare::MoveExtToFormExtLoad(Instruction *&I) {
// Look for a load being extended. // Look for a load being extended.
LoadInst *LI = nullptr; LoadInst *LI = nullptr;
Instruction *OldExt = I; Instruction *OldExt = I;
bool HasPromoted = ExtLdPromotion(TPT, LI, I, Exts); bool HasPromoted = extLdPromotion(TPT, LI, I, Exts);
if (!LI || !I) { if (!LI || !I) {
assert(!HasPromoted && !LI && "If we did not match any load instruction " assert(!HasPromoted && !LI && "If we did not match any load instruction "
"the code must remain the same"); "the code must remain the same");
@ -3769,7 +3769,7 @@ bool CodeGenPrepare::MoveExtToFormExtLoad(Instruction *&I) {
return true; return true;
} }
bool CodeGenPrepare::OptimizeExtUses(Instruction *I) { bool CodeGenPrepare::optimizeExtUses(Instruction *I) {
BasicBlock *DefBB = I->getParent(); BasicBlock *DefBB = I->getParent();
// If the result of a {s|z}ext and its source are both live out, rewrite all // If the result of a {s|z}ext and its source are both live out, rewrite all
@ -3870,7 +3870,7 @@ static bool isFormingBranchFromSelectProfitable(SelectInst *SI) {
/// If we have a SelectInst that will likely profit from branch prediction, /// If we have a SelectInst that will likely profit from branch prediction,
/// turn it into a branch. /// turn it into a branch.
bool CodeGenPrepare::OptimizeSelectInst(SelectInst *SI) { bool CodeGenPrepare::optimizeSelectInst(SelectInst *SI) {
bool VectorCond = !SI->getCondition()->getType()->isIntegerTy(1); bool VectorCond = !SI->getCondition()->getType()->isIntegerTy(1);
// Can we convert the 'select' to CF ? // Can we convert the 'select' to CF ?
@ -3943,7 +3943,7 @@ static bool isBroadcastShuffle(ShuffleVectorInst *SVI) {
/// (e.g. x86 only introduced "vpsllvd" and friends with AVX2). In these cases /// (e.g. x86 only introduced "vpsllvd" and friends with AVX2). In these cases
/// it's often worth sinking a shufflevector splat down to its use so that /// it's often worth sinking a shufflevector splat down to its use so that
/// codegen can spot all lanes are identical. /// codegen can spot all lanes are identical.
bool CodeGenPrepare::OptimizeShuffleVectorInst(ShuffleVectorInst *SVI) { bool CodeGenPrepare::optimizeShuffleVectorInst(ShuffleVectorInst *SVI) {
BasicBlock *DefBB = SVI->getParent(); BasicBlock *DefBB = SVI->getParent();
// Only do this xform if variable vector shifts are particularly expensive. // Only do this xform if variable vector shifts are particularly expensive.
@ -4308,7 +4308,7 @@ void VectorPromoteHelper::promoteImpl(Instruction *ToBePromoted) {
/// Some targets can do store(extractelement) with one instruction. /// Some targets can do store(extractelement) with one instruction.
/// Try to push the extractelement towards the stores when the target /// Try to push the extractelement towards the stores when the target
/// has this feature and this is profitable. /// has this feature and this is profitable.
bool CodeGenPrepare::OptimizeExtractElementInst(Instruction *Inst) { bool CodeGenPrepare::optimizeExtractElementInst(Instruction *Inst) {
unsigned CombineCost = UINT_MAX; unsigned CombineCost = UINT_MAX;
if (DisableStoreExtract || !TLI || if (DisableStoreExtract || !TLI ||
(!StressStoreExtract && (!StressStoreExtract &&
@ -4360,7 +4360,7 @@ bool CodeGenPrepare::OptimizeExtractElementInst(Instruction *Inst) {
return false; return false;
} }
bool CodeGenPrepare::OptimizeInst(Instruction *I, bool& ModifiedDT) { bool CodeGenPrepare::optimizeInst(Instruction *I, bool& ModifiedDT) {
// Bail out if we inserted the instruction to prevent optimizations from // Bail out if we inserted the instruction to prevent optimizations from
// stepping on each other's toes. // stepping on each other's toes.
if (InsertedInsts.count(I)) if (InsertedInsts.count(I))
@ -4401,8 +4401,8 @@ bool CodeGenPrepare::OptimizeInst(Instruction *I, bool& ModifiedDT) {
TargetLowering::TypeExpandInteger) { TargetLowering::TypeExpandInteger) {
return SinkCast(CI); return SinkCast(CI);
} else { } else {
bool MadeChange = MoveExtToFormExtLoad(I); bool MadeChange = moveExtToFormExtLoad(I);
return MadeChange | OptimizeExtUses(I); return MadeChange | optimizeExtUses(I);
} }
} }
return false; return false;
@ -4416,7 +4416,7 @@ bool CodeGenPrepare::OptimizeInst(Instruction *I, bool& ModifiedDT) {
stripInvariantGroupMetadata(*LI); stripInvariantGroupMetadata(*LI);
if (TLI) { if (TLI) {
unsigned AS = LI->getPointerAddressSpace(); unsigned AS = LI->getPointerAddressSpace();
return OptimizeMemoryInst(I, I->getOperand(0), LI->getType(), AS); return optimizeMemoryInst(I, I->getOperand(0), LI->getType(), AS);
} }
return false; return false;
} }
@ -4425,7 +4425,7 @@ bool CodeGenPrepare::OptimizeInst(Instruction *I, bool& ModifiedDT) {
stripInvariantGroupMetadata(*SI); stripInvariantGroupMetadata(*SI);
if (TLI) { if (TLI) {
unsigned AS = SI->getPointerAddressSpace(); unsigned AS = SI->getPointerAddressSpace();
return OptimizeMemoryInst(I, SI->getOperand(1), return optimizeMemoryInst(I, SI->getOperand(1),
SI->getOperand(0)->getType(), AS); SI->getOperand(0)->getType(), AS);
} }
return false; return false;
@ -4450,23 +4450,23 @@ bool CodeGenPrepare::OptimizeInst(Instruction *I, bool& ModifiedDT) {
GEPI->replaceAllUsesWith(NC); GEPI->replaceAllUsesWith(NC);
GEPI->eraseFromParent(); GEPI->eraseFromParent();
++NumGEPsElim; ++NumGEPsElim;
OptimizeInst(NC, ModifiedDT); optimizeInst(NC, ModifiedDT);
return true; return true;
} }
return false; return false;
} }
if (CallInst *CI = dyn_cast<CallInst>(I)) if (CallInst *CI = dyn_cast<CallInst>(I))
return OptimizeCallInst(CI, ModifiedDT); return optimizeCallInst(CI, ModifiedDT);
if (SelectInst *SI = dyn_cast<SelectInst>(I)) if (SelectInst *SI = dyn_cast<SelectInst>(I))
return OptimizeSelectInst(SI); return optimizeSelectInst(SI);
if (ShuffleVectorInst *SVI = dyn_cast<ShuffleVectorInst>(I)) if (ShuffleVectorInst *SVI = dyn_cast<ShuffleVectorInst>(I))
return OptimizeShuffleVectorInst(SVI); return optimizeShuffleVectorInst(SVI);
if (isa<ExtractElementInst>(I)) if (isa<ExtractElementInst>(I))
return OptimizeExtractElementInst(I); return optimizeExtractElementInst(I);
return false; return false;
} }
@ -4474,17 +4474,17 @@ bool CodeGenPrepare::OptimizeInst(Instruction *I, bool& ModifiedDT) {
// In this pass we look for GEP and cast instructions that are used // In this pass we look for GEP and cast instructions that are used
// across basic blocks and rewrite them to improve basic-block-at-a-time // across basic blocks and rewrite them to improve basic-block-at-a-time
// selection. // selection.
bool CodeGenPrepare::OptimizeBlock(BasicBlock &BB, bool& ModifiedDT) { bool CodeGenPrepare::optimizeBlock(BasicBlock &BB, bool& ModifiedDT) {
SunkAddrs.clear(); SunkAddrs.clear();
bool MadeChange = false; bool MadeChange = false;
CurInstIterator = BB.begin(); CurInstIterator = BB.begin();
while (CurInstIterator != BB.end()) { while (CurInstIterator != BB.end()) {
MadeChange |= OptimizeInst(CurInstIterator++, ModifiedDT); MadeChange |= optimizeInst(CurInstIterator++, ModifiedDT);
if (ModifiedDT) if (ModifiedDT)
return true; return true;
} }
MadeChange |= DupRetToEnableTailCallOpts(&BB); MadeChange |= dupRetToEnableTailCallOpts(&BB);
return MadeChange; return MadeChange;
} }
@ -4492,7 +4492,7 @@ bool CodeGenPrepare::OptimizeBlock(BasicBlock &BB, bool& ModifiedDT) {
// llvm.dbg.value is far away from the value then iSel may not be able // llvm.dbg.value is far away from the value then iSel may not be able
// handle it properly. iSel will drop llvm.dbg.value if it can not // handle it properly. iSel will drop llvm.dbg.value if it can not
// find a node corresponding to the value. // find a node corresponding to the value.
bool CodeGenPrepare::PlaceDbgValues(Function &F) { bool CodeGenPrepare::placeDbgValues(Function &F) {
bool MadeChange = false; bool MadeChange = false;
for (BasicBlock &BB : F) { for (BasicBlock &BB : F) {
Instruction *PrevNonDbgInst = nullptr; Instruction *PrevNonDbgInst = nullptr;