forked from OSchip/llvm-project
parent
f91a992c30
commit
8a8ad7d8e8
|
@ -24,7 +24,7 @@ namespace llvm {
|
||||||
/// rewrite expressions in canonical form.
|
/// rewrite expressions in canonical form.
|
||||||
///
|
///
|
||||||
/// Clients should create an instance of this class when rewriting is needed,
|
/// Clients should create an instance of this class when rewriting is needed,
|
||||||
/// and destroy it when finished to allow the release of the associated
|
/// and destroy it when finished to allow the release of the associated
|
||||||
/// memory.
|
/// memory.
|
||||||
struct SCEVExpander : public SCEVVisitor<SCEVExpander, Value*> {
|
struct SCEVExpander : public SCEVVisitor<SCEVExpander, Value*> {
|
||||||
ScalarEvolution &SE;
|
ScalarEvolution &SE;
|
||||||
|
@ -62,7 +62,7 @@ namespace llvm {
|
||||||
|
|
||||||
private:
|
private:
|
||||||
LLVMContext &getContext() const { return SE.getContext(); }
|
LLVMContext &getContext() const { return SE.getContext(); }
|
||||||
|
|
||||||
/// InsertBinop - Insert the specified binary operator, doing a small amount
|
/// InsertBinop - Insert the specified binary operator, doing a small amount
|
||||||
/// of work to avoid inserting an obviously redundant operation.
|
/// of work to avoid inserting an obviously redundant operation.
|
||||||
Value *InsertBinop(Instruction::BinaryOps Opcode, Value *LHS, Value *RHS);
|
Value *InsertBinop(Instruction::BinaryOps Opcode, Value *LHS, Value *RHS);
|
||||||
|
@ -126,4 +126,3 @@ namespace llvm {
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -208,7 +208,7 @@ static Constant *SymbolicallyEvaluateGEP(Constant* const* Ops, unsigned NumOps,
|
||||||
"Computed GetElementPtr has unexpected type!");
|
"Computed GetElementPtr has unexpected type!");
|
||||||
|
|
||||||
// If we ended up indexing a member with a type that doesn't match
|
// If we ended up indexing a member with a type that doesn't match
|
||||||
// type type of what the original indices indexed, add a cast.
|
// the type of what the original indices indexed, add a cast.
|
||||||
if (Ty != cast<PointerType>(ResultTy)->getElementType())
|
if (Ty != cast<PointerType>(ResultTy)->getElementType())
|
||||||
C = ConstantExpr::getBitCast(C, ResultTy);
|
C = ConstantExpr::getBitCast(C, ResultTy);
|
||||||
|
|
||||||
|
|
|
@ -1682,7 +1682,7 @@ const SCEV *ScalarEvolution::getUDivExpr(const SCEV *LHS,
|
||||||
|
|
||||||
if (const SCEVConstant *RHSC = dyn_cast<SCEVConstant>(RHS)) {
|
if (const SCEVConstant *RHSC = dyn_cast<SCEVConstant>(RHS)) {
|
||||||
if (RHSC->getValue()->equalsInt(1))
|
if (RHSC->getValue()->equalsInt(1))
|
||||||
return LHS; // X udiv 1 --> x
|
return LHS; // X udiv 1 --> x
|
||||||
if (RHSC->isZero())
|
if (RHSC->isZero())
|
||||||
return getIntegerSCEV(0, LHS->getType()); // value is undefined
|
return getIntegerSCEV(0, LHS->getType()); // value is undefined
|
||||||
|
|
||||||
|
@ -3533,8 +3533,8 @@ ScalarEvolution::ComputeBackedgeTakenCountFromExitCondICmp(const Loop *L,
|
||||||
if (!isa<SCEVCouldNotCompute>(TC)) return TC;
|
if (!isa<SCEVCouldNotCompute>(TC)) return TC;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ICmpInst::ICMP_EQ: {
|
case ICmpInst::ICMP_EQ: { // while (X == Y)
|
||||||
// Convert to: while (X-Y == 0) // while (X == Y)
|
// Convert to: while (X-Y == 0)
|
||||||
const SCEV *TC = HowFarToNonZero(getMinusSCEV(LHS, RHS), L);
|
const SCEV *TC = HowFarToNonZero(getMinusSCEV(LHS, RHS), L);
|
||||||
if (!isa<SCEVCouldNotCompute>(TC)) return TC;
|
if (!isa<SCEVCouldNotCompute>(TC)) return TC;
|
||||||
break;
|
break;
|
||||||
|
@ -3986,7 +3986,7 @@ const SCEV *ScalarEvolution::getSCEVAtScope(const SCEV *V, const Loop *L) {
|
||||||
getContext());
|
getContext());
|
||||||
else
|
else
|
||||||
C = ConstantFoldInstOperands(I->getOpcode(), I->getType(),
|
C = ConstantFoldInstOperands(I->getOpcode(), I->getType(),
|
||||||
&Operands[0], Operands.size(),
|
&Operands[0], Operands.size(),
|
||||||
getContext());
|
getContext());
|
||||||
Pair.first->second = C;
|
Pair.first->second = C;
|
||||||
return getSCEV(C);
|
return getSCEV(C);
|
||||||
|
@ -4235,7 +4235,7 @@ const SCEV *ScalarEvolution::HowFarToZero(const SCEV *V, const Loop *L) {
|
||||||
|
|
||||||
// First, handle unitary steps.
|
// First, handle unitary steps.
|
||||||
if (StepC->getValue()->equalsInt(1)) // 1*N = -Start (mod 2^BW), so:
|
if (StepC->getValue()->equalsInt(1)) // 1*N = -Start (mod 2^BW), so:
|
||||||
return getNegativeSCEV(Start); // N = -Start (as unsigned)
|
return getNegativeSCEV(Start); // N = -Start (as unsigned)
|
||||||
if (StepC->getValue()->isAllOnesValue()) // -1*N = -Start (mod 2^BW), so:
|
if (StepC->getValue()->isAllOnesValue()) // -1*N = -Start (mod 2^BW), so:
|
||||||
return Start; // N = Start (as unsigned)
|
return Start; // N = Start (as unsigned)
|
||||||
|
|
||||||
|
|
|
@ -53,10 +53,9 @@ Value *SCEVExpander::InsertNoopCastOfTo(Value *V, const Type *Ty) {
|
||||||
return CE->getOperand(0);
|
return CE->getOperand(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: keep track of the cast instruction.
|
|
||||||
if (Constant *C = dyn_cast<Constant>(V))
|
if (Constant *C = dyn_cast<Constant>(V))
|
||||||
return ConstantExpr::getCast(Op, C, Ty);
|
return ConstantExpr::getCast(Op, C, Ty);
|
||||||
|
|
||||||
if (Argument *A = dyn_cast<Argument>(V)) {
|
if (Argument *A = dyn_cast<Argument>(V)) {
|
||||||
// Check to see if there is already a cast!
|
// Check to see if there is already a cast!
|
||||||
for (Value::use_iterator UI = A->use_begin(), E = A->use_end();
|
for (Value::use_iterator UI = A->use_begin(), E = A->use_end();
|
||||||
|
@ -317,13 +316,17 @@ static void SplitAddRecs(SmallVectorImpl<const SCEV *> &Ops,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// expandAddToGEP - Expand a SCEVAddExpr with a pointer type into a GEP
|
/// expandAddToGEP - Expand an addition expression with a pointer type into
|
||||||
/// instead of using ptrtoint+arithmetic+inttoptr. This helps
|
/// a GEP instead of using ptrtoint+arithmetic+inttoptr. This helps
|
||||||
/// BasicAliasAnalysis and other passes analyze the result.
|
/// BasicAliasAnalysis and other passes analyze the result. See the rules
|
||||||
|
/// for getelementptr vs. inttoptr in
|
||||||
|
/// http://llvm.org/docs/LangRef.html#pointeraliasing
|
||||||
|
/// for details.
|
||||||
///
|
///
|
||||||
/// Design note: This depends on ScalarEvolution not recognizing inttoptr
|
/// Design note: The correctness of using getelmeentptr here depends on
|
||||||
/// and ptrtoint operators, as they may introduce pointer arithmetic
|
/// ScalarEvolution not recognizing inttoptr and ptrtoint operators, as
|
||||||
/// which may not be safely converted into getelementptr.
|
/// they may introduce pointer arithmetic which may not be safely converted
|
||||||
|
/// into getelementptr.
|
||||||
///
|
///
|
||||||
/// Design note: It might seem desirable for this function to be more
|
/// Design note: It might seem desirable for this function to be more
|
||||||
/// loop-aware. If some of the indices are loop-invariant while others
|
/// loop-aware. If some of the indices are loop-invariant while others
|
||||||
|
|
Loading…
Reference in New Issue