forked from OSchip/llvm-project
parent
f91a992c30
commit
8a8ad7d8e8
|
@ -24,7 +24,7 @@ namespace llvm {
|
|||
/// rewrite expressions in canonical form.
|
||||
///
|
||||
/// 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.
|
||||
struct SCEVExpander : public SCEVVisitor<SCEVExpander, Value*> {
|
||||
ScalarEvolution &SE;
|
||||
|
@ -62,7 +62,7 @@ namespace llvm {
|
|||
|
||||
private:
|
||||
LLVMContext &getContext() const { return SE.getContext(); }
|
||||
|
||||
|
||||
/// InsertBinop - Insert the specified binary operator, doing a small amount
|
||||
/// of work to avoid inserting an obviously redundant operation.
|
||||
Value *InsertBinop(Instruction::BinaryOps Opcode, Value *LHS, Value *RHS);
|
||||
|
@ -126,4 +126,3 @@ namespace llvm {
|
|||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -208,7 +208,7 @@ static Constant *SymbolicallyEvaluateGEP(Constant* const* Ops, unsigned NumOps,
|
|||
"Computed GetElementPtr has unexpected type!");
|
||||
|
||||
// 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())
|
||||
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 (RHSC->getValue()->equalsInt(1))
|
||||
return LHS; // X udiv 1 --> x
|
||||
return LHS; // X udiv 1 --> x
|
||||
if (RHSC->isZero())
|
||||
return getIntegerSCEV(0, LHS->getType()); // value is undefined
|
||||
|
||||
|
@ -3533,8 +3533,8 @@ ScalarEvolution::ComputeBackedgeTakenCountFromExitCondICmp(const Loop *L,
|
|||
if (!isa<SCEVCouldNotCompute>(TC)) return TC;
|
||||
break;
|
||||
}
|
||||
case ICmpInst::ICMP_EQ: {
|
||||
// Convert to: while (X-Y == 0) // while (X == Y)
|
||||
case ICmpInst::ICMP_EQ: { // while (X == Y)
|
||||
// Convert to: while (X-Y == 0)
|
||||
const SCEV *TC = HowFarToNonZero(getMinusSCEV(LHS, RHS), L);
|
||||
if (!isa<SCEVCouldNotCompute>(TC)) return TC;
|
||||
break;
|
||||
|
@ -3986,7 +3986,7 @@ const SCEV *ScalarEvolution::getSCEVAtScope(const SCEV *V, const Loop *L) {
|
|||
getContext());
|
||||
else
|
||||
C = ConstantFoldInstOperands(I->getOpcode(), I->getType(),
|
||||
&Operands[0], Operands.size(),
|
||||
&Operands[0], Operands.size(),
|
||||
getContext());
|
||||
Pair.first->second = C;
|
||||
return getSCEV(C);
|
||||
|
@ -4235,7 +4235,7 @@ const SCEV *ScalarEvolution::HowFarToZero(const SCEV *V, const Loop *L) {
|
|||
|
||||
// First, handle unitary steps.
|
||||
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:
|
||||
return Start; // N = Start (as unsigned)
|
||||
|
||||
|
|
|
@ -53,10 +53,9 @@ Value *SCEVExpander::InsertNoopCastOfTo(Value *V, const Type *Ty) {
|
|||
return CE->getOperand(0);
|
||||
}
|
||||
|
||||
// FIXME: keep track of the cast instruction.
|
||||
if (Constant *C = dyn_cast<Constant>(V))
|
||||
return ConstantExpr::getCast(Op, C, Ty);
|
||||
|
||||
|
||||
if (Argument *A = dyn_cast<Argument>(V)) {
|
||||
// Check to see if there is already a cast!
|
||||
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
|
||||
/// instead of using ptrtoint+arithmetic+inttoptr. This helps
|
||||
/// BasicAliasAnalysis and other passes analyze the result.
|
||||
/// expandAddToGEP - Expand an addition expression with a pointer type into
|
||||
/// a GEP instead of using ptrtoint+arithmetic+inttoptr. This helps
|
||||
/// 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
|
||||
/// and ptrtoint operators, as they may introduce pointer arithmetic
|
||||
/// which may not be safely converted into getelementptr.
|
||||
/// Design note: The correctness of using getelmeentptr here depends on
|
||||
/// ScalarEvolution not recognizing inttoptr and ptrtoint operators, as
|
||||
/// 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
|
||||
/// loop-aware. If some of the indices are loop-invariant while others
|
||||
|
|
Loading…
Reference in New Issue