FullDependence &Result) const {
DEBUG(dbgs() << "starting gcd\n");
++GCDapplications;
- unsigned BitWidth = Src->getType()->getIntegerBitWidth();
+ unsigned BitWidth = SE->getTypeSizeInBits(Src->getType());
APInt RunningGCD = APInt::getNullValue(BitWidth);
// Examine Src coefficients.
// Goff, Kennedy, Tseng
// PLDI 1991
//
-// Care is required to keep the code below up to date w.r.t. this routine.
+// Care is required to keep the routine below, getSplitIteration(),
+// up to date with respect to this routine.
Dependence *DependenceAnalysis::depends(Instruction *Src,
Instruction *Dst,
bool PossiblyLoopIndependent) {
// if both instructions don't reference memory, there's no dependence
return NULL;
- if (!isLoadOrStore(Src) || !isLoadOrStore(Dst))
+ if (!isLoadOrStore(Src) || !isLoadOrStore(Dst)) {
// can only analyze simple loads and stores, i.e., no calls, invokes, etc.
+ DEBUG(dbgs() << "can only handle simple loads and stores\n");
return new Dependence(Src, Dst);
+ }
Value *SrcPtr = getPointerOperand(Src);
Value *DstPtr = getPointerOperand(Dst);
case AliasAnalysis::MayAlias:
case AliasAnalysis::PartialAlias:
// cannot analyse objects if we don't understand their aliasing.
+ DEBUG(dbgs() << "can't analyze may or partial alias\n");
return new Dependence(Src, Dst);
case AliasAnalysis::NoAlias:
// If the objects noalias, they are distinct, accesses are independent.
+ DEBUG(dbgs() << "no alias\n");
return NULL;
case AliasAnalysis::MustAlias:
break; // The underlying objects alias; test accesses for dependence.
}
- GEPOperator *SrcGEP = dyn_cast<GEPOperator>(SrcPtr);
- GEPOperator *DstGEP = dyn_cast<GEPOperator>(DstPtr);
- if (!SrcGEP || !DstGEP)
- return new Dependence(Src, Dst); // missing GEP, assume dependence
-
- if (SrcGEP->getPointerOperandType() != DstGEP->getPointerOperandType())
- return new Dependence(Src, Dst); // different types, assume dependence
-
// establish loop nesting levels
establishNestingLevels(Src, Dst);
DEBUG(dbgs() << " common nesting levels = " << CommonLevels << "\n");
FullDependence Result(Src, Dst, PossiblyLoopIndependent, CommonLevels);
++TotalArrayPairs;
- // classify subscript pairs
- unsigned Pairs = SrcGEP->idx_end() - SrcGEP->idx_begin();
+ // See if there are GEPs we can use.
+ bool UsefulGEP = false;
+ GEPOperator *SrcGEP = dyn_cast<GEPOperator>(SrcPtr);
+ GEPOperator *DstGEP = dyn_cast<GEPOperator>(DstPtr);
+ if (SrcGEP && DstGEP &&
+ SrcGEP->getPointerOperandType() == DstGEP->getPointerOperandType()) {
+ const SCEV *SrcPtrSCEV = SE->getSCEV(SrcGEP->getPointerOperand());
+ const SCEV *DstPtrSCEV = SE->getSCEV(DstGEP->getPointerOperand());
+ DEBUG(dbgs() << " SrcPtrSCEV = " << *SrcPtrSCEV << "\n");
+ DEBUG(dbgs() << " DstPtrSCEV = " << *DstPtrSCEV << "\n");
+
+ UsefulGEP =
+ isLoopInvariant(SrcPtrSCEV, LI->getLoopFor(Src->getParent())) &&
+ isLoopInvariant(DstPtrSCEV, LI->getLoopFor(Dst->getParent()));
+ }
+ unsigned Pairs = UsefulGEP ? SrcGEP->idx_end() - SrcGEP->idx_begin() : 1;
SmallVector<Subscript, 4> Pair(Pairs);
- for (unsigned SI = 0; SI < Pairs; ++SI) {
- Pair[SI].Loops.resize(MaxLevels + 1);
- Pair[SI].GroupLoops.resize(MaxLevels + 1);
- Pair[SI].Group.resize(Pairs);
- }
- Pairs = 0;
- for (GEPOperator::const_op_iterator SrcIdx = SrcGEP->idx_begin(),
- SrcEnd = SrcGEP->idx_end(),
- DstIdx = DstGEP->idx_begin(),
- DstEnd = DstGEP->idx_end();
- SrcIdx != SrcEnd && DstIdx != DstEnd;
- ++SrcIdx, ++DstIdx, ++Pairs) {
- Pair[Pairs].Src = SE->getSCEV(*SrcIdx);
- Pair[Pairs].Dst = SE->getSCEV(*DstIdx);
- removeMatchingExtensions(&Pair[Pairs]);
- Pair[Pairs].Classification =
- classifyPair(Pair[Pairs].Src, LI->getLoopFor(Src->getParent()),
- Pair[Pairs].Dst, LI->getLoopFor(Dst->getParent()),
- Pair[Pairs].Loops);
- Pair[Pairs].GroupLoops = Pair[Pairs].Loops;
- Pair[Pairs].Group.set(Pairs);
- DEBUG(dbgs() << " subscript " << Pairs << "\n");
- DEBUG(dbgs() << "\tsrc = " << *Pair[Pairs].Src << "\n");
- DEBUG(dbgs() << "\tdst = " << *Pair[Pairs].Dst << "\n");
- DEBUG(dbgs() << "\tclass = " << Pair[Pairs].Classification << "\n");
+ if (UsefulGEP) {
+ DEBUG(dbgs() << " using GEPs\n");
+ unsigned P = 0;
+ for (GEPOperator::const_op_iterator SrcIdx = SrcGEP->idx_begin(),
+ SrcEnd = SrcGEP->idx_end(),
+ DstIdx = DstGEP->idx_begin();
+ SrcIdx != SrcEnd;
+ ++SrcIdx, ++DstIdx, ++P) {
+ Pair[P].Src = SE->getSCEV(*SrcIdx);
+ Pair[P].Dst = SE->getSCEV(*DstIdx);
+ }
+ }
+ else {
+ DEBUG(dbgs() << " ignoring GEPs\n");
+ const SCEV *SrcSCEV = SE->getSCEV(SrcPtr);
+ const SCEV *DstSCEV = SE->getSCEV(DstPtr);
+ DEBUG(dbgs() << " SrcSCEV = " << *SrcSCEV << "\n");
+ DEBUG(dbgs() << " DstSCEV = " << *DstSCEV << "\n");
+ Pair[0].Src = SrcSCEV;
+ Pair[0].Dst = DstSCEV;
+ }
+
+ for (unsigned P = 0; P < Pairs; ++P) {
+ Pair[P].Loops.resize(MaxLevels + 1);
+ Pair[P].GroupLoops.resize(MaxLevels + 1);
+ Pair[P].Group.resize(Pairs);
+ removeMatchingExtensions(&Pair[P]);
+ Pair[P].Classification =
+ classifyPair(Pair[P].Src, LI->getLoopFor(Src->getParent()),
+ Pair[P].Dst, LI->getLoopFor(Dst->getParent()),
+ Pair[P].Loops);
+ Pair[P].GroupLoops = Pair[P].Loops;
+ Pair[P].Group.set(P);
+ DEBUG(dbgs() << " subscript " << P << "\n");
+ DEBUG(dbgs() << "\tsrc = " << *Pair[P].Src << "\n");
+ DEBUG(dbgs() << "\tdst = " << *Pair[P].Dst << "\n");
+ DEBUG(dbgs() << "\tclass = " << Pair[P].Classification << "\n");
DEBUG(dbgs() << "\tloops = ");
- DEBUG(dumpSmallBitVector(Pair[Pairs].Loops));
+ DEBUG(dumpSmallBitVector(Pair[P].Loops));
}
SmallBitVector Separable(Pairs);
// though simplified since we know that the dependence exists.
// It's tedious, since we must go through all propagations, etc.
//
-// Care is required to keep this code up to date w.r.t. the code above.
+// Care is required to keep this code up to date with respect to the routine
+// above, depends().
//
// Generally, the dependence analyzer will be used to build
// a dependence graph for a function (basically a map from instructions
assert(Dst->mayReadFromMemory() || Dst->mayWriteToMemory());
assert(isLoadOrStore(Src));
assert(isLoadOrStore(Dst));
- const Value *SrcPtr = getPointerOperand(Src);
- const Value *DstPtr = getPointerOperand(Dst);
+ Value *SrcPtr = getPointerOperand(Src);
+ Value *DstPtr = getPointerOperand(Dst);
assert(underlyingObjectsAlias(AA, DstPtr, SrcPtr) ==
AliasAnalysis::MustAlias);
- const GEPOperator *SrcGEP = dyn_cast<GEPOperator>(SrcPtr);
- const GEPOperator *DstGEP = dyn_cast<GEPOperator>(DstPtr);
- assert(SrcGEP);
- assert(DstGEP);
- assert(SrcGEP->getPointerOperandType() == DstGEP->getPointerOperandType());
// establish loop nesting levels
establishNestingLevels(Src, Dst);
FullDependence Result(Src, Dst, false, CommonLevels);
- // classify subscript pairs
- unsigned Pairs = SrcGEP->idx_end() - SrcGEP->idx_begin();
+ // See if there are GEPs we can use.
+ bool UsefulGEP = false;
+ GEPOperator *SrcGEP = dyn_cast<GEPOperator>(SrcPtr);
+ GEPOperator *DstGEP = dyn_cast<GEPOperator>(DstPtr);
+ if (SrcGEP && DstGEP &&
+ SrcGEP->getPointerOperandType() == DstGEP->getPointerOperandType()) {
+ const SCEV *SrcPtrSCEV = SE->getSCEV(SrcGEP->getPointerOperand());
+ const SCEV *DstPtrSCEV = SE->getSCEV(DstGEP->getPointerOperand());
+ UsefulGEP =
+ isLoopInvariant(SrcPtrSCEV, LI->getLoopFor(Src->getParent())) &&
+ isLoopInvariant(DstPtrSCEV, LI->getLoopFor(Dst->getParent()));
+ }
+ unsigned Pairs = UsefulGEP ? SrcGEP->idx_end() - SrcGEP->idx_begin() : 1;
SmallVector<Subscript, 4> Pair(Pairs);
- for (unsigned SI = 0; SI < Pairs; ++SI) {
- Pair[SI].Loops.resize(MaxLevels + 1);
- Pair[SI].GroupLoops.resize(MaxLevels + 1);
- Pair[SI].Group.resize(Pairs);
- }
- Pairs = 0;
- for (GEPOperator::const_op_iterator SrcIdx = SrcGEP->idx_begin(),
- SrcEnd = SrcGEP->idx_end(),
- DstIdx = DstGEP->idx_begin(),
- DstEnd = DstGEP->idx_end();
- SrcIdx != SrcEnd && DstIdx != DstEnd;
- ++SrcIdx, ++DstIdx, ++Pairs) {
- Pair[Pairs].Src = SE->getSCEV(*SrcIdx);
- Pair[Pairs].Dst = SE->getSCEV(*DstIdx);
- Pair[Pairs].Classification =
- classifyPair(Pair[Pairs].Src, LI->getLoopFor(Src->getParent()),
- Pair[Pairs].Dst, LI->getLoopFor(Dst->getParent()),
- Pair[Pairs].Loops);
- Pair[Pairs].GroupLoops = Pair[Pairs].Loops;
- Pair[Pairs].Group.set(Pairs);
+ if (UsefulGEP) {
+ unsigned P = 0;
+ for (GEPOperator::const_op_iterator SrcIdx = SrcGEP->idx_begin(),
+ SrcEnd = SrcGEP->idx_end(),
+ DstIdx = DstGEP->idx_begin();
+ SrcIdx != SrcEnd;
+ ++SrcIdx, ++DstIdx, ++P) {
+ Pair[P].Src = SE->getSCEV(*SrcIdx);
+ Pair[P].Dst = SE->getSCEV(*DstIdx);
+ }
+ }
+ else {
+ const SCEV *SrcSCEV = SE->getSCEV(SrcPtr);
+ const SCEV *DstSCEV = SE->getSCEV(DstPtr);
+ Pair[0].Src = SrcSCEV;
+ Pair[0].Dst = DstSCEV;
+ }
+
+ for (unsigned P = 0; P < Pairs; ++P) {
+ Pair[P].Loops.resize(MaxLevels + 1);
+ Pair[P].GroupLoops.resize(MaxLevels + 1);
+ Pair[P].Group.resize(Pairs);
+ removeMatchingExtensions(&Pair[P]);
+ Pair[P].Classification =
+ classifyPair(Pair[P].Src, LI->getLoopFor(Src->getParent()),
+ Pair[P].Dst, LI->getLoopFor(Dst->getParent()),
+ Pair[P].Loops);
+ Pair[P].GroupLoops = Pair[P].Loops;
+ Pair[P].Group.set(P);
}
SmallBitVector Separable(Pairs);
; CHECK: da analyze - confused!
; CHECK: da analyze - input [= =|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc7
%B.addr.04 = phi i64* [ %B, %entry ], [ %scevgep, %for.inc7 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - input [* *|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [* *|<]!
for.cond1.preheader.preheader: ; preds = %entry
%0 = add i64 %n, 1
; CHECK: da analyze - confused!
; CHECK: da analyze - input [= =|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc8
%B.addr.04 = phi i64* [ %B, %entry ], [ %scevgep, %for.inc8 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - input [= =|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc8
%B.addr.04 = phi i64* [ %B, %entry ], [ %scevgep, %for.inc8 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - input [= =|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc7
%B.addr.04 = phi i64* [ %B, %entry ], [ %scevgep, %for.inc7 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - input [= =|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc7
%B.addr.04 = phi i64* [ %B, %entry ], [ %scevgep, %for.inc7 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - input [= =|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc8
%B.addr.04 = phi i64* [ %B, %entry ], [ %scevgep, %for.inc8 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - input [= =|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc8
%B.addr.04 = phi i64* [ %B, %entry ], [ %scevgep, %for.inc8 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - input [= =|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc8
%B.addr.04 = phi i64* [ %B, %entry ], [ %scevgep, %for.inc8 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - input [= =|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc8
%B.addr.04 = phi i64* [ %B, %entry ], [ %scevgep, %for.inc8 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - input [= =|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc7
%B.addr.04 = phi i64* [ %B, %entry ], [ %scevgep, %for.inc7 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - input [= =|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc7
%B.addr.04 = phi i64* [ %B, %entry ], [ %scevgep, %for.inc7 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - input [= =|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc7
%B.addr.04 = phi i64* [ %B, %entry ], [ %scevgep, %for.inc7 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [S S|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc5
%B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc5 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [S S|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc5
%B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc5 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [S S|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc5
%B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc5 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [S S|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc5
%B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc5 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - input [* *|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc8
%B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc8 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - input [* *|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc9
%B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc9 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - input [* *|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc9
%B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc9 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - input [* *|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc7
%B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc7 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - input [* *|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc17
%B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc17 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - input [* *|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc17
%B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc17 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - input [* *|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [* *|<]!
for.cond1.preheader.preheader: ; preds = %entry
br label %for.cond1.preheader
; CHECK: da analyze - confused!
; CHECK: da analyze - input [* *|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [* *|<]!
for.cond1.preheader.preheader: ; preds = %entry
br label %for.cond1.preheader
; CHECK: da analyze - confused!
; CHECK: da analyze - input [* *|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [* *|<]!
for.cond1.preheader.preheader: ; preds = %entry
br label %for.cond1.preheader
; CHECK: da analyze - confused!
; CHECK: da analyze - input [* *|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [* *|<]!
for.cond1.preheader.preheader: ; preds = %entry
br label %for.cond1.preheader
entry:
store i32 %n, i32* %A, align 4
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output!
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input!
entry:
store i32 %n, i32* %A, align 4
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output!
; CHECK: da analyze - none!
; CHECK: da analyze - consistent input!
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0 0 0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [* * *|<]!
for.cond1.preheader.preheader: ; preds = %entry
br label %for.cond1.preheader
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0 S 0 0 S 0 S S S S 0 0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [* * * * * * * * * * * *|<]!
for.cond1.preheader.preheader: ; preds = %entry
br label %for.cond1.preheader
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output!
store i32 0, i32* %arrayidx, align 4
%conv = sext i8 %n to i64
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output!
%conv = sext i16 %n to i64
%add = add i64 %conv, 1
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output!
%add = add nsw i32 %n, 1
%idxprom1 = sext i32 %add to i64
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output!
%add = add i32 %n, 1
%idxprom1 = zext i32 %add to i64
store i32 %0, i32* %B, align 4
ret void
}
+
+
+;;typedef struct { int v; } S;
+;;
+;;void f(S *s, unsigned size) {
+;; S *i = s, *e = s + size - 1;
+;; while (i != e) {
+;; *i = *(i + 1);
+;; ++i;
+
+%struct.S = type { i32 }
+
+define void @f(%struct.S* %s, i32 %size) nounwind uwtable ssp {
+entry:
+ %idx.ext = zext i32 %size to i64
+ %add.ptr.sum = add i64 %idx.ext, -1
+ %add.ptr1 = getelementptr inbounds %struct.S* %s, i64 %add.ptr.sum
+ %cmp1 = icmp eq i64 %add.ptr.sum, 0
+ br i1 %cmp1, label %while.end, label %while.body.preheader
+
+; CHECK: da analyze - consistent input [0|<]!
+; CHECK: da analyze - consistent anti [1]!
+; CHECK: da analyze - consistent output [0|<]!
+
+while.body.preheader: ; preds = %entry
+ br label %while.body
+
+while.body: ; preds = %while.body.preheader, %while.body
+ %i.02 = phi %struct.S* [ %incdec.ptr, %while.body ], [ %s, %while.body.preheader ]
+ %0 = getelementptr inbounds %struct.S* %i.02, i64 1, i32 0
+ %1 = load i32* %0, align 4
+ %2 = getelementptr inbounds %struct.S* %i.02, i64 0, i32 0
+ store i32 %1, i32* %2, align 4
+ %incdec.ptr = getelementptr inbounds %struct.S* %i.02, i64 1
+ %cmp = icmp eq %struct.S* %incdec.ptr, %add.ptr1
+ br i1 %cmp, label %while.end.loopexit, label %while.body
+
+while.end.loopexit: ; preds = %while.body
+ br label %while.end
+
+while.end: ; preds = %while.end.loopexit, %entry
+ ret void
+}
+
+declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0 0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc9
%B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc9 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0 0 0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= = =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc18
%B.addr.06 = phi i32* [ %B, %entry ], [ %scevgep7, %for.inc18 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0 0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc8
%B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc8 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0 0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc9
%B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc9 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0 0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc11
%B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc11 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0 0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc13
%B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc13 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0 0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc12
%B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc12 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0 0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc14
%B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc14 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0 0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc10
%B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc10 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [S 0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc10
%B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc10 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - input [0 * S *|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= = = =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc22
%B.addr.08 = phi i32* [ %B, %entry ], [ %scevgep11, %for.inc22 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - input [0 * S *|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= = = =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc22
%B.addr.08 = phi i32* [ %B, %entry ], [ %scevgep11, %for.inc22 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - input [0 * * 0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= = = =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc26
%B.addr.08 = phi i32* [ %B, %entry ], [ %scevgep11, %for.inc26 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - input [0 * * 0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [= = = =|<]!
for.cond1.preheader: ; preds = %entry, %for.inc27
%B.addr.08 = phi i32* [ %B, %entry ], [ %scevgep11, %for.inc27 ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
%0 = sext i32 %n to i64
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [S S|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - output [* *|<]!
for.cond1.preheader.preheader: ; preds = %entry
br label %for.cond1.preheader
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %for.body.preheader, %for.body
%i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [S|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [S|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [S|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [S|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [S|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [S|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [S|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input [0|<]!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output [0|<]!
for.body.preheader: ; preds = %entry
br label %for.body
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output!
%add1 = add i64 %n, 1
%arrayidx2 = getelementptr inbounds i32* %A, i64 %add1
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output!
%add = add i64 %n, 1
%arrayidx1 = getelementptr inbounds i32* %A, i64 %add
; CHECK: da analyze - confused!
; CHECK: da analyze - consistent input!
; CHECK: da analyze - confused!
-; CHECK: da analyze - confused!
+; CHECK: da analyze - consistent output!
%arrayidx1 = getelementptr inbounds i32* %A, i64 %m
%0 = load i32* %arrayidx1, align 4