forked from OSchip/llvm-project
parent
cbc7b26542
commit
13b860992a
|
@ -77,6 +77,8 @@ class LoopDependenceAnalysis : public LoopPass {
|
|||
bool isAffine(const SCEV*) const;
|
||||
|
||||
/// TODO: doc
|
||||
bool isZIVPair(const SCEV*, const SCEV*) const;
|
||||
DependenceResult analyseZIV(const SCEV*, const SCEV*, Subscript*) const;
|
||||
DependenceResult analyseSubscript(const SCEV*, const SCEV*, Subscript*) const;
|
||||
DependenceResult analysePair(DependencePair*) const;
|
||||
|
||||
|
|
|
@ -136,6 +136,19 @@ bool LoopDependenceAnalysis::isAffine(const SCEV *S) const {
|
|||
return isLoopInvariant(S) || (rec && rec->isAffine());
|
||||
}
|
||||
|
||||
bool LoopDependenceAnalysis::isZIVPair(const SCEV *A, const SCEV *B) const {
|
||||
return isLoopInvariant(A) && isLoopInvariant(B);
|
||||
}
|
||||
|
||||
LoopDependenceAnalysis::DependenceResult
|
||||
LoopDependenceAnalysis::analyseZIV(const SCEV *A,
|
||||
const SCEV *B,
|
||||
Subscript *S) const {
|
||||
assert(isZIVPair(A, B));
|
||||
const SCEV *diff = SE->getMinusSCEV(A, B);
|
||||
return diff->isZero() ? Dependent : Independent;
|
||||
}
|
||||
|
||||
LoopDependenceAnalysis::DependenceResult
|
||||
LoopDependenceAnalysis::analyseSubscript(const SCEV *A,
|
||||
const SCEV *B,
|
||||
|
@ -152,7 +165,10 @@ LoopDependenceAnalysis::analyseSubscript(const SCEV *A,
|
|||
return Unknown;
|
||||
}
|
||||
|
||||
// TODO: Implement ZIV/SIV/MIV testers.
|
||||
if (isZIVPair(A, B))
|
||||
return analyseZIV(A, B, S);
|
||||
|
||||
// TODO: Implement SIV/MIV testers.
|
||||
|
||||
DEBUG(errs() << " -> [?] cannot analyse subscript\n");
|
||||
return Unknown;
|
||||
|
|
|
@ -34,7 +34,7 @@ for.body:
|
|||
%i = phi i64 [ 0, %entry ], [ %i.next, %for.body ]
|
||||
%x = load i32* %x.ld.addr
|
||||
store i32 %x, i32* %x.st.addr
|
||||
; CHECK: 0,1: dep
|
||||
; CHECK: 0,1: ind
|
||||
%i.next = add i64 %i, 1
|
||||
%exitcond = icmp eq i64 %i.next, 256
|
||||
br i1 %exitcond, label %for.end, label %for.body
|
||||
|
|
|
@ -12,7 +12,7 @@ for.body:
|
|||
%i = phi i64 [ 0, %entry ], [ %i.next, %for.body ]
|
||||
%x = load i32* getelementptr ([256 x i32]* @x, i32 0, i64 6)
|
||||
store i32 %x, i32* getelementptr ([256 x i32]* @x, i32 0, i64 5)
|
||||
; CHECK: 0,1: dep
|
||||
; CHECK: 0,1: ind
|
||||
%i.next = add i64 %i, 1
|
||||
%exitcond = icmp eq i64 %i.next, 256
|
||||
br i1 %exitcond, label %for.end, label %for.body
|
||||
|
@ -34,7 +34,7 @@ for.body:
|
|||
%i = phi i64 [ 0, %entry ], [ %i.next, %for.body ]
|
||||
%x = load i32* %x.ld.addr
|
||||
store i32 %x, i32* %x.st.addr
|
||||
; CHECK: 0,1: dep
|
||||
; CHECK: 0,1: ind
|
||||
%i.next = add i64 %i, 1
|
||||
%exitcond = icmp eq i64 %i.next, 256
|
||||
br i1 %exitcond, label %for.end, label %for.body
|
||||
|
|
Loading…
Reference in New Issue