mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-04 07:32:13 +00:00
Second batch of passes using LLVMContext.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74753 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2889ccea62
commit
1ff50b380e
@ -14,6 +14,7 @@
|
||||
#define DEBUG_TYPE "jump-threading"
|
||||
#include "llvm/Transforms/Scalar.h"
|
||||
#include "llvm/IntrinsicInst.h"
|
||||
#include "llvm/LLVMContext.h"
|
||||
#include "llvm/Pass.h"
|
||||
#include "llvm/Analysis/ConstantFolding.h"
|
||||
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
|
||||
@ -434,7 +435,7 @@ bool JumpThreading::ProcessBranchOnDuplicateCond(BasicBlock *PredBB,
|
||||
<< "' folding condition to '" << BranchDir << "': "
|
||||
<< *BB->getTerminator();
|
||||
++NumFolds;
|
||||
DestBI->setCondition(ConstantInt::get(Type::Int1Ty, BranchDir));
|
||||
DestBI->setCondition(Context->getConstantInt(Type::Int1Ty, BranchDir));
|
||||
ConstantFoldTerminator(BB);
|
||||
return true;
|
||||
}
|
||||
@ -563,7 +564,7 @@ bool JumpThreading::SimplifyPartiallyRedundantLoad(LoadInst *LI) {
|
||||
|
||||
// If the returned value is the load itself, replace with an undef. This can
|
||||
// only happen in dead loops.
|
||||
if (AvailableVal == LI) AvailableVal = UndefValue::get(LI->getType());
|
||||
if (AvailableVal == LI) AvailableVal = Context->getUndef(LI->getType());
|
||||
LI->replaceAllUsesWith(AvailableVal);
|
||||
LI->eraseFromParent();
|
||||
return true;
|
||||
@ -717,7 +718,7 @@ bool JumpThreading::ProcessJumpOnPHI(PHINode *PN) {
|
||||
// Next, figure out which successor we are threading to.
|
||||
BasicBlock *SuccBB;
|
||||
if (BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator()))
|
||||
SuccBB = BI->getSuccessor(PredCst == ConstantInt::getFalse());
|
||||
SuccBB = BI->getSuccessor(PredCst == Context->getConstantIntFalse());
|
||||
else {
|
||||
SwitchInst *SI = cast<SwitchInst>(BB->getTerminator());
|
||||
SuccBB = SI->getSuccessor(SI->findCaseValue(PredCst));
|
||||
@ -755,7 +756,7 @@ bool JumpThreading::ProcessBranchOnLogical(Value *V, BasicBlock *BB,
|
||||
// We can only do the simplification for phi nodes of 'false' with AND or
|
||||
// 'true' with OR. See if we have any entries in the phi for this.
|
||||
unsigned PredNo = ~0U;
|
||||
ConstantInt *PredCst = ConstantInt::get(Type::Int1Ty, !isAnd);
|
||||
ConstantInt *PredCst = Context->getConstantInt(Type::Int1Ty, !isAnd);
|
||||
for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
|
||||
if (PN->getIncomingValue(i) == PredCst) {
|
||||
PredNo = i;
|
||||
@ -793,15 +794,16 @@ bool JumpThreading::ProcessBranchOnLogical(Value *V, BasicBlock *BB,
|
||||
/// hand sides of the compare instruction, try to determine the result. If the
|
||||
/// result can not be determined, a null pointer is returned.
|
||||
static Constant *GetResultOfComparison(CmpInst::Predicate pred,
|
||||
Value *LHS, Value *RHS) {
|
||||
Value *LHS, Value *RHS,
|
||||
LLVMContext* Context) {
|
||||
if (Constant *CLHS = dyn_cast<Constant>(LHS))
|
||||
if (Constant *CRHS = dyn_cast<Constant>(RHS))
|
||||
return ConstantExpr::getCompare(pred, CLHS, CRHS);
|
||||
return Context->getConstantExprCompare(pred, CLHS, CRHS);
|
||||
|
||||
if (LHS == RHS)
|
||||
if (isa<IntegerType>(LHS->getType()) || isa<PointerType>(LHS->getType()))
|
||||
return ICmpInst::isTrueWhenEqual(pred) ?
|
||||
ConstantInt::getTrue() : ConstantInt::getFalse();
|
||||
Context->getConstantIntTrue() : Context->getConstantIntFalse();
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -826,7 +828,8 @@ bool JumpThreading::ProcessBranchOnCompare(CmpInst *Cmp, BasicBlock *BB) {
|
||||
for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
|
||||
PredVal = PN->getIncomingValue(i);
|
||||
|
||||
Constant *Res = GetResultOfComparison(Cmp->getPredicate(), PredVal, RHS);
|
||||
Constant *Res = GetResultOfComparison(Cmp->getPredicate(), PredVal,
|
||||
RHS, Context);
|
||||
if (!Res) {
|
||||
PredVal = 0;
|
||||
continue;
|
||||
|
@ -36,6 +36,7 @@
|
||||
#include "llvm/Constants.h"
|
||||
#include "llvm/DerivedTypes.h"
|
||||
#include "llvm/Instructions.h"
|
||||
#include "llvm/LLVMContext.h"
|
||||
#include "llvm/Target/TargetData.h"
|
||||
#include "llvm/Analysis/LoopInfo.h"
|
||||
#include "llvm/Analysis/LoopPass.h"
|
||||
@ -482,7 +483,7 @@ void LICM::sink(Instruction &I) {
|
||||
// Instruction is not used, just delete it.
|
||||
CurAST->deleteValue(&I);
|
||||
if (!I.use_empty()) // If I has users in unreachable blocks, eliminate.
|
||||
I.replaceAllUsesWith(UndefValue::get(I.getType()));
|
||||
I.replaceAllUsesWith(Context->getUndef(I.getType()));
|
||||
I.eraseFromParent();
|
||||
} else {
|
||||
// Move the instruction to the start of the exit block, after any PHI
|
||||
@ -496,7 +497,7 @@ void LICM::sink(Instruction &I) {
|
||||
// The instruction is actually dead if there ARE NO exit blocks.
|
||||
CurAST->deleteValue(&I);
|
||||
if (!I.use_empty()) // If I has users in unreachable blocks, eliminate.
|
||||
I.replaceAllUsesWith(UndefValue::get(I.getType()));
|
||||
I.replaceAllUsesWith(Context->getUndef(I.getType()));
|
||||
I.eraseFromParent();
|
||||
} else {
|
||||
// Otherwise, if we have multiple exits, use the PromoteMem2Reg function to
|
||||
|
@ -54,6 +54,7 @@
|
||||
|
||||
#include "llvm/Transforms/Scalar.h"
|
||||
#include "llvm/IntrinsicInst.h"
|
||||
#include "llvm/LLVMContext.h"
|
||||
#include "llvm/Analysis/LoopPass.h"
|
||||
#include "llvm/Analysis/ScalarEvolution.h"
|
||||
#include "llvm/Analysis/Dominators.h"
|
||||
@ -292,14 +293,16 @@ static bool isUsedOutsideLoop(Value *V, Loop *L) {
|
||||
}
|
||||
|
||||
// Return V+1
|
||||
static Value *getPlusOne(Value *V, bool Sign, Instruction *InsertPt) {
|
||||
Constant *One = ConstantInt::get(V->getType(), 1, Sign);
|
||||
static Value *getPlusOne(Value *V, bool Sign, Instruction *InsertPt,
|
||||
LLVMContext* Context) {
|
||||
Constant *One = Context->getConstantInt(V->getType(), 1, Sign);
|
||||
return BinaryOperator::CreateAdd(V, One, "lsp", InsertPt);
|
||||
}
|
||||
|
||||
// Return V-1
|
||||
static Value *getMinusOne(Value *V, bool Sign, Instruction *InsertPt) {
|
||||
Constant *One = ConstantInt::get(V->getType(), 1, Sign);
|
||||
static Value *getMinusOne(Value *V, bool Sign, Instruction *InsertPt,
|
||||
LLVMContext* Context) {
|
||||
Constant *One = Context->getConstantInt(V->getType(), 1, Sign);
|
||||
return BinaryOperator::CreateSub(V, One, "lsp", InsertPt);
|
||||
}
|
||||
|
||||
@ -494,16 +497,16 @@ bool LoopIndexSplit::restrictLoopBound(ICmpInst &Op) {
|
||||
if (Value *V = IVisLT(Op)) {
|
||||
// Restrict upper bound.
|
||||
if (IVisLE(*ExitCondition))
|
||||
V = getMinusOne(V, Sign, PHTerm);
|
||||
V = getMinusOne(V, Sign, PHTerm, Context);
|
||||
NUB = getMin(V, IVExitValue, Sign, PHTerm);
|
||||
} else if (Value *V = IVisLE(Op)) {
|
||||
// Restrict upper bound.
|
||||
if (IVisLT(*ExitCondition))
|
||||
V = getPlusOne(V, Sign, PHTerm);
|
||||
V = getPlusOne(V, Sign, PHTerm, Context);
|
||||
NUB = getMin(V, IVExitValue, Sign, PHTerm);
|
||||
} else if (Value *V = IVisGT(Op)) {
|
||||
// Restrict lower bound.
|
||||
V = getPlusOne(V, Sign, PHTerm);
|
||||
V = getPlusOne(V, Sign, PHTerm, Context);
|
||||
NLB = getMax(V, IVStartValue, Sign, PHTerm);
|
||||
} else if (Value *V = IVisGE(Op))
|
||||
// Restrict lower bound.
|
||||
@ -964,18 +967,18 @@ bool LoopIndexSplit::splitLoop() {
|
||||
/* Do nothing */
|
||||
}
|
||||
else if (IVisLE(*SplitCondition)) {
|
||||
AEV = getPlusOne(SplitValue, Sign, PHTerm);
|
||||
BSV = getPlusOne(SplitValue, Sign, PHTerm);
|
||||
AEV = getPlusOne(SplitValue, Sign, PHTerm, Context);
|
||||
BSV = getPlusOne(SplitValue, Sign, PHTerm, Context);
|
||||
} else {
|
||||
assert (0 && "Unexpected split condition!");
|
||||
}
|
||||
}
|
||||
else if (IVisLE(*ExitCondition)) {
|
||||
if (IVisLT(*SplitCondition)) {
|
||||
AEV = getMinusOne(SplitValue, Sign, PHTerm);
|
||||
AEV = getMinusOne(SplitValue, Sign, PHTerm, Context);
|
||||
}
|
||||
else if (IVisLE(*SplitCondition)) {
|
||||
BSV = getPlusOne(SplitValue, Sign, PHTerm);
|
||||
BSV = getPlusOne(SplitValue, Sign, PHTerm, Context);
|
||||
} else {
|
||||
assert (0 && "Unexpected split condition!");
|
||||
}
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include "llvm/Constants.h"
|
||||
#include "llvm/Instructions.h"
|
||||
#include "llvm/IntrinsicInst.h"
|
||||
#include "llvm/LLVMContext.h"
|
||||
#include "llvm/Type.h"
|
||||
#include "llvm/DerivedTypes.h"
|
||||
#include "llvm/Analysis/Dominators.h"
|
||||
@ -1575,7 +1576,7 @@ void LoopStrengthReduce::StrengthReduceStridedIVUsers(const SCEV* const &Stride,
|
||||
BasicBlock *LatchBlock = L->getLoopLatch();
|
||||
Instruction *IVIncInsertPt = LatchBlock->getTerminator();
|
||||
|
||||
Value *CommonBaseV = Constant::getNullValue(ReplacedTy);
|
||||
Value *CommonBaseV = Context->getNullValue(ReplacedTy);
|
||||
|
||||
const SCEV* RewriteFactor = SE->getIntegerSCEV(0, ReplacedTy);
|
||||
IVExpr ReuseIV(SE->getIntegerSCEV(0, Type::Int32Ty),
|
||||
@ -1941,7 +1942,7 @@ ICmpInst *LoopStrengthReduce::ChangeCompareStride(Loop *L, ICmpInst *Cond,
|
||||
|
||||
NewCmpTy = NewCmpLHS->getType();
|
||||
NewTyBits = SE->getTypeSizeInBits(NewCmpTy);
|
||||
const Type *NewCmpIntTy = IntegerType::get(NewTyBits);
|
||||
const Type *NewCmpIntTy = Context->getIntegerType(NewTyBits);
|
||||
if (RequiresTypeConversion(NewCmpTy, CmpTy)) {
|
||||
// Check if it is possible to rewrite it using
|
||||
// an iv / stride of a smaller integer type.
|
||||
@ -1986,10 +1987,10 @@ ICmpInst *LoopStrengthReduce::ChangeCompareStride(Loop *L, ICmpInst *Cond,
|
||||
|
||||
NewStride = &IU->StrideOrder[i];
|
||||
if (!isa<PointerType>(NewCmpTy))
|
||||
NewCmpRHS = ConstantInt::get(NewCmpTy, NewCmpVal);
|
||||
NewCmpRHS = Context->getConstantInt(NewCmpTy, NewCmpVal);
|
||||
else {
|
||||
Constant *CI = ConstantInt::get(NewCmpIntTy, NewCmpVal);
|
||||
NewCmpRHS = ConstantExpr::getIntToPtr(CI, NewCmpTy);
|
||||
Constant *CI = Context->getConstantInt(NewCmpIntTy, NewCmpVal);
|
||||
NewCmpRHS = Context->getConstantExprIntToPtr(CI, NewCmpTy);
|
||||
}
|
||||
NewOffset = TyBits == NewTyBits
|
||||
? SE->getMulExpr(CondUse->getOffset(),
|
||||
@ -2233,7 +2234,7 @@ void LoopStrengthReduce::OptimizeShadowIV(Loop *L) {
|
||||
|
||||
ConstantInt *Init = dyn_cast<ConstantInt>(PH->getIncomingValue(Entry));
|
||||
if (!Init) continue;
|
||||
Constant *NewInit = ConstantFP::get(DestTy, Init->getZExtValue());
|
||||
Constant *NewInit = Context->getConstantFP(DestTy, Init->getZExtValue());
|
||||
|
||||
BinaryOperator *Incr =
|
||||
dyn_cast<BinaryOperator>(PH->getIncomingValue(Latch));
|
||||
@ -2257,7 +2258,7 @@ void LoopStrengthReduce::OptimizeShadowIV(Loop *L) {
|
||||
PHINode *NewPH = PHINode::Create(DestTy, "IV.S.", PH);
|
||||
|
||||
/* create new increment. '++d' in above example. */
|
||||
Constant *CFP = ConstantFP::get(DestTy, C->getZExtValue());
|
||||
Constant *CFP = Context->getConstantFP(DestTy, C->getZExtValue());
|
||||
BinaryOperator *NewIncr =
|
||||
BinaryOperator::Create(Incr->getOpcode() == Instruction::Add ?
|
||||
Instruction::FAdd : Instruction::FSub,
|
||||
@ -2496,7 +2497,7 @@ void LoopStrengthReduce::OptimizeLoopCountIV(Loop *L) {
|
||||
Value *startVal = phi->getIncomingValue(inBlock);
|
||||
Value *endVal = Cond->getOperand(1);
|
||||
// FIXME check for case where both are constant
|
||||
Constant* Zero = ConstantInt::get(Cond->getOperand(1)->getType(), 0);
|
||||
Constant* Zero = Context->getConstantInt(Cond->getOperand(1)->getType(), 0);
|
||||
BinaryOperator *NewStartVal =
|
||||
BinaryOperator::Create(Instruction::Sub, endVal, startVal,
|
||||
"tmp", PreInsertPt);
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include "llvm/DerivedTypes.h"
|
||||
#include "llvm/Function.h"
|
||||
#include "llvm/Instructions.h"
|
||||
#include "llvm/LLVMContext.h"
|
||||
#include "llvm/Analysis/ConstantFolding.h"
|
||||
#include "llvm/Analysis/LoopInfo.h"
|
||||
#include "llvm/Analysis/LoopPass.h"
|
||||
@ -230,7 +231,7 @@ bool LoopUnswitch::processCurrentLoop() {
|
||||
Value *LoopCond = FindLIVLoopCondition(BI->getCondition(),
|
||||
currentLoop, Changed);
|
||||
if (LoopCond && UnswitchIfProfitable(LoopCond,
|
||||
ConstantInt::getTrue())) {
|
||||
Context->getConstantIntTrue())) {
|
||||
++NumBranches;
|
||||
return true;
|
||||
}
|
||||
@ -260,7 +261,7 @@ bool LoopUnswitch::processCurrentLoop() {
|
||||
Value *LoopCond = FindLIVLoopCondition(SI->getCondition(),
|
||||
currentLoop, Changed);
|
||||
if (LoopCond && UnswitchIfProfitable(LoopCond,
|
||||
ConstantInt::getTrue())) {
|
||||
Context->getConstantIntTrue())) {
|
||||
++NumSelects;
|
||||
return true;
|
||||
}
|
||||
@ -348,10 +349,10 @@ bool LoopUnswitch::IsTrivialUnswitchCondition(Value *Cond, Constant **Val,
|
||||
// this.
|
||||
if ((LoopExitBB = isTrivialLoopExitBlock(currentLoop,
|
||||
BI->getSuccessor(0)))) {
|
||||
if (Val) *Val = ConstantInt::getTrue();
|
||||
if (Val) *Val = Context->getConstantIntTrue();
|
||||
} else if ((LoopExitBB = isTrivialLoopExitBlock(currentLoop,
|
||||
BI->getSuccessor(1)))) {
|
||||
if (Val) *Val = ConstantInt::getFalse();
|
||||
if (Val) *Val = Context->getConstantIntFalse();
|
||||
}
|
||||
} else if (SwitchInst *SI = dyn_cast<SwitchInst>(HeaderTerm)) {
|
||||
// If this isn't a switch on Cond, we can't handle it.
|
||||
@ -507,7 +508,7 @@ void LoopUnswitch::EmitPreheaderBranchOnCondition(Value *LIC, Constant *Val,
|
||||
Value *BranchVal = LIC;
|
||||
if (!isa<ConstantInt>(Val) || Val->getType() != Type::Int1Ty)
|
||||
BranchVal = new ICmpInst(ICmpInst::ICMP_EQ, LIC, Val, "tmp", InsertPt);
|
||||
else if (Val != ConstantInt::getTrue())
|
||||
else if (Val != Context->getConstantIntTrue())
|
||||
// We want to enter the new loop when the condition is true.
|
||||
std::swap(TrueDest, FalseDest);
|
||||
|
||||
@ -815,7 +816,7 @@ void LoopUnswitch::RemoveBlockIfDead(BasicBlock *BB,
|
||||
// Anything that uses the instructions in this basic block should have their
|
||||
// uses replaced with undefs.
|
||||
if (!I->use_empty())
|
||||
I->replaceAllUsesWith(UndefValue::get(I->getType()));
|
||||
I->replaceAllUsesWith(Context->getUndef(I->getType()));
|
||||
}
|
||||
|
||||
// If this is the edge to the header block for a loop, remove the loop and
|
||||
@ -904,7 +905,7 @@ void LoopUnswitch::RewriteLoopBodyWithConditionConstant(Loop *L, Value *LIC,
|
||||
if (IsEqual)
|
||||
Replacement = Val;
|
||||
else
|
||||
Replacement = ConstantInt::get(Type::Int1Ty,
|
||||
Replacement = Context->getConstantInt(Type::Int1Ty,
|
||||
!cast<ConstantInt>(Val)->getZExtValue());
|
||||
|
||||
for (unsigned i = 0, e = Users.size(); i != e; ++i)
|
||||
@ -944,7 +945,7 @@ void LoopUnswitch::RewriteLoopBodyWithConditionConstant(Loop *L, Value *LIC,
|
||||
|
||||
Instruction* OldTerm = Old->getTerminator();
|
||||
BranchInst::Create(Split, SISucc,
|
||||
ConstantInt::getTrue(), OldTerm);
|
||||
Context->getConstantIntTrue(), OldTerm);
|
||||
|
||||
LPM->deleteSimpleAnalysisValue(Old->getTerminator(), L);
|
||||
Old->getTerminator()->eraseFromParent();
|
||||
|
Loading…
x
Reference in New Issue
Block a user