summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--polly/include/polly/ScopInfo.h51
-rw-r--r--polly/lib/Analysis/ScopInfo.cpp91
-rw-r--r--polly/test/ScopInfo/cond_in_loop.ll3
-rw-r--r--polly/test/ScopInfo/inter_bb_scalar_dep.ll (renamed from polly/test/TempScop/inter_bb_scalar_dep.ll)15
-rw-r--r--polly/test/ScopInfo/intra_and_inter_bb_scalar_dep.ll (renamed from polly/test/TempScop/intra_and_inter_bb_scalar_dep.ll)19
-rw-r--r--polly/test/ScopInfo/intra_bb_scalar_dep.ll (renamed from polly/test/TempScop/intra_bb_scalar_dep.ll)8
-rw-r--r--polly/test/ScopInfo/nested-loops.ll (renamed from polly/test/TempScop/nested-loops.ll)0
-rw-r--r--polly/test/ScopInfo/not-a-reduction.ll (renamed from polly/test/TempScop/not-a-reduction.ll)0
-rw-r--r--polly/test/ScopInfo/scalar_to_array.ll (renamed from polly/test/TempScop/scalar_to_array.ll)48
-rw-r--r--polly/test/ScopInfo/tempscop-printing.ll (renamed from polly/test/TempScop/tempscop-printing.ll)36
10 files changed, 118 insertions, 153 deletions
diff --git a/polly/include/polly/ScopInfo.h b/polly/include/polly/ScopInfo.h
index 47aa62114f8..1dc059853ae 100644
--- a/polly/include/polly/ScopInfo.h
+++ b/polly/include/polly/ScopInfo.h
@@ -333,11 +333,6 @@ private:
///
Value *AccessValue;
- /// @brief Accessed element relative to the base pointer (in bytes).
- ///
- /// Currently only used by printIR.
- const SCEV *Offset;
-
/// @brief Are all the subscripts affine expression?
bool IsAffine;
@@ -358,8 +353,6 @@ private:
/// @brief Is this MemoryAccess modeling special PHI node accesses?
bool isPHI() const { return IsPHI; }
- void printIR(raw_ostream &OS) const;
-
void setStatement(ScopStmt *Stmt) { this->Statement = Stmt; }
__isl_give isl_basic_map *createBasicAccessMap(ScopStmt *Statement);
@@ -426,7 +419,6 @@ public:
/// @param Id Identifier that is guranteed to be unique within the
/// same ScopStmt.
/// @param BaseAddr The accessed array's address.
- /// @param Offset Accessed memoray location relative to @p BaseAddr.
/// @param ElemBytes Number of accessed bytes.
/// @param AccType Whether read or write access.
/// @param IsAffine Whether the subscripts are affine expressions.
@@ -435,10 +427,9 @@ public:
/// @param Sizes Dimension lengths of the accessed array.
/// @param BaseName Name of the acessed array.
MemoryAccess(Instruction *AccessInst, __isl_take isl_id *Id, AccessType Type,
- Value *BaseAddress, const SCEV *Offset, unsigned ElemBytes,
- bool Affine, ArrayRef<const SCEV *> Subscripts,
- ArrayRef<const SCEV *> Sizes, Value *AccessValue, bool IsPHI,
- StringRef BaseName);
+ Value *BaseAddress, unsigned ElemBytes, bool Affine,
+ ArrayRef<const SCEV *> Subscripts, ArrayRef<const SCEV *> Sizes,
+ Value *AccessValue, bool IsPHI, StringRef BaseName);
~MemoryAccess();
/// @brief Get the type of a memory access.
@@ -1120,22 +1111,6 @@ public:
}
//@}
- /// @brief Print data access information.
- ///
- /// @param OS The output stream the access functions is printed to.
- /// @param SE The ScalarEvolution to help printing more details.
- /// @param LI The LoopInfo that help printing the access functions.
- void printIRAccesses(raw_ostream &OS, ScalarEvolution *SE,
- LoopInfo *LI) const;
-
- /// @brief Print the access functions and loop bounds in this Scop.
- ///
- /// @param OS The output stream the access functions is printed to.
- /// @param SE The ScalarEvolution that help printing the access functions.
- /// @param LI The LoopInfo that help printing the access functions.
- void printIRAccessesDetail(raw_ostream &OS, ScalarEvolution *SE, LoopInfo *LI,
- const Region *Reg, unsigned ind) const;
-
ScalarEvolution *getSE() const;
/// @brief Get the count of parameters used in this Scop.
@@ -1503,7 +1478,6 @@ class ScopInfo : public RegionPass {
/// inside @p BB.
/// @param Type The kind of access.
/// @param BaseAddress The accessed array's base address.
- /// @param Offset Accessed location relative to @p BaseAddress.
/// @param ElemBytes Size of accessed array element.
/// @param Affine Whether all subscripts are affine expressions.
/// @param AccessValue Value read or written.
@@ -1512,26 +1486,25 @@ class ScopInfo : public RegionPass {
/// @param IsPHI Whether this is an emulated PHI node.
void addMemoryAccess(BasicBlock *BB, Instruction *Inst,
MemoryAccess::AccessType Type, Value *BaseAddress,
- const SCEV *Offset, unsigned ElemBytes, bool Affine,
- Value *AccessValue, ArrayRef<const SCEV *> Subscripts,
+ unsigned ElemBytes, bool Affine, Value *AccessValue,
+ ArrayRef<const SCEV *> Subscripts,
ArrayRef<const SCEV *> Sizes, bool IsPHI);
void addMemoryAccess(BasicBlock *BB, Instruction *Inst,
MemoryAccess::AccessType Type, Value *BaseAddress,
- const SCEV *Offset, unsigned ElemBytes, bool Affine,
- Value *AccessValue, bool IsPHI = false) {
- addMemoryAccess(BB, Inst, Type, BaseAddress, Offset, ElemBytes, Affine,
- AccessValue, ArrayRef<const SCEV *>(),
- ArrayRef<const SCEV *>(), IsPHI);
+ unsigned ElemBytes, bool Affine, Value *AccessValue,
+ bool IsPHI = false) {
+ addMemoryAccess(BB, Inst, Type, BaseAddress, ElemBytes, Affine, AccessValue,
+ ArrayRef<const SCEV *>(), ArrayRef<const SCEV *>(), IsPHI);
}
void addMemoryAccess(BasicBlock *BB, Instruction *Inst,
MemoryAccess::AccessType Type, Value *BaseAddress,
- const SCEV *Offset, unsigned ElemBytes, bool Affine,
+ unsigned ElemBytes, bool Affine,
ArrayRef<const SCEV *> Subscripts,
ArrayRef<const SCEV *> Sizes, Value *AccessValue) {
- addMemoryAccess(BB, Inst, Type, BaseAddress, Offset, ElemBytes, Affine,
- AccessValue, Subscripts, Sizes, false);
+ addMemoryAccess(BB, Inst, Type, BaseAddress, ElemBytes, Affine, AccessValue,
+ Subscripts, Sizes, false);
}
public:
diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp
index efa42600e7e..d3fcdcba911 100644
--- a/polly/lib/Analysis/ScopInfo.cpp
+++ b/polly/lib/Analysis/ScopInfo.cpp
@@ -227,17 +227,6 @@ const ScopArrayInfo *ScopArrayInfo::getFromId(isl_id *Id) {
return SAI;
}
-void MemoryAccess::printIR(raw_ostream &OS) const {
- if (isRead())
- OS << "Read ";
- else {
- if (isMayWrite())
- OS << "May";
- OS << "Write ";
- }
- OS << BaseAddr->getName() << '[' << *Offset << "]\n";
-}
-
const std::string
MemoryAccess::getReductionOperatorStr(MemoryAccess::ReductionType RT) {
switch (RT) {
@@ -614,14 +603,14 @@ void MemoryAccess::buildAccessRelation(const ScopArrayInfo *SAI) {
MemoryAccess::MemoryAccess(Instruction *AccessInst, __isl_take isl_id *Id,
AccessType Type, Value *BaseAddress,
- const SCEV *Offset, unsigned ElemBytes, bool Affine,
+ unsigned ElemBytes, bool Affine,
ArrayRef<const SCEV *> Subscripts,
ArrayRef<const SCEV *> Sizes, Value *AccessValue,
bool IsPHI, StringRef BaseName)
: Id(Id), IsPHI(IsPHI), AccType(Type), RedType(RT_NONE), Statement(nullptr),
BaseAddr(BaseAddress), BaseName(BaseName), ElemBytes(ElemBytes),
Sizes(Sizes.begin(), Sizes.end()), AccessInstruction(AccessInst),
- AccessValue(AccessValue), Offset(Offset), IsAffine(Affine),
+ AccessValue(AccessValue), IsAffine(Affine),
Subscripts(Subscripts.begin(), Subscripts.end()), AccessRelation(nullptr),
NewAccessRelation(nullptr) {}
@@ -2668,34 +2657,6 @@ ScopStmt *Scop::getStmtForBasicBlock(BasicBlock *BB) const {
return StmtMapIt->second;
}
-void Scop::printIRAccesses(raw_ostream &OS, ScalarEvolution *SE,
- LoopInfo *LI) const {
- OS << "Scop: " << R.getNameStr() << "\n";
-
- printIRAccessesDetail(OS, SE, LI, &R, 0);
-}
-
-void Scop::printIRAccessesDetail(raw_ostream &OS, ScalarEvolution *SE,
- LoopInfo *LI, const Region *CurR,
- unsigned ind) const {
- // FIXME: Print other details rather than memory accesses.
- for (const auto &CurBlock : CurR->blocks()) {
- AccFuncMapType::const_iterator AccSetIt = AccFuncMap.find(CurBlock);
-
- // Ignore trivial blocks that do not contain any memory access.
- if (AccSetIt == AccFuncMap.end())
- continue;
-
- OS.indent(ind) << "BB: " << CurBlock->getName() << '\n';
- typedef AccFuncSetType::const_iterator access_iterator;
- const AccFuncSetType &AccFuncs = AccSetIt->second;
-
- for (access_iterator AI = AccFuncs.begin(), AE = AccFuncs.end(); AI != AE;
- ++AI)
- AI->printIR(OS.indent(ind + 2));
- }
-}
-
int Scop::getRelativeLoopDepth(const Loop *L) const {
Loop *OuterLoop =
L ? R.outermostLoopInRegion(const_cast<Loop *>(L)) : nullptr;
@@ -2742,10 +2703,9 @@ void ScopInfo::buildPHIAccesses(PHINode *PHI, Region &R,
// we have to insert a scalar dependence from the definition of OpI to
// OpBB if the definition is not in OpBB.
if (OpIBB != OpBB) {
- addMemoryAccess(OpBB, PHI, MemoryAccess::READ, OpI, ZeroOffset, 1, true,
+ addMemoryAccess(OpBB, PHI, MemoryAccess::READ, OpI, 1, true, OpI);
+ addMemoryAccess(OpIBB, OpI, MemoryAccess::MUST_WRITE, OpI, 1, true,
OpI);
- addMemoryAccess(OpIBB, OpI, MemoryAccess::MUST_WRITE, OpI, ZeroOffset,
- 1, true, OpI);
}
}
@@ -2753,13 +2713,13 @@ void ScopInfo::buildPHIAccesses(PHINode *PHI, Region &R,
// instruction.
OpI = OpBB->getTerminator();
- addMemoryAccess(OpBB, OpI, MemoryAccess::MUST_WRITE, PHI, ZeroOffset, 1,
- true, Op, /* IsPHI */ !IsExitBlock);
+ addMemoryAccess(OpBB, OpI, MemoryAccess::MUST_WRITE, PHI, 1, true, Op,
+ /* IsPHI */ !IsExitBlock);
}
if (!OnlyNonAffineSubRegionOperands) {
- addMemoryAccess(PHI->getParent(), PHI, MemoryAccess::READ, PHI, ZeroOffset,
- 1, true, PHI,
+ addMemoryAccess(PHI->getParent(), PHI, MemoryAccess::READ, PHI, 1, true,
+ PHI,
/* IsPHI */ !IsExitBlock);
}
}
@@ -2816,8 +2776,7 @@ bool ScopInfo::buildScalarDependences(Instruction *Inst, Region *R,
// Do not build a read access that is not in the current SCoP
// Use the def instruction as base address of the MemoryAccess, so that it
// will become the name of the scalar access in the polyhedral form.
- addMemoryAccess(UseParent, UI, MemoryAccess::READ, Inst, ZeroOffset, 1,
- true, Inst);
+ addMemoryAccess(UseParent, UI, MemoryAccess::READ, Inst, 1, true, Inst);
}
if (ModelReadOnlyScalars) {
@@ -2832,8 +2791,8 @@ bool ScopInfo::buildScalarDependences(Instruction *Inst, Region *R,
if (isa<Constant>(Op))
continue;
- addMemoryAccess(Inst->getParent(), Inst, MemoryAccess::READ, Op,
- ZeroOffset, 1, true, Op);
+ addMemoryAccess(Inst->getParent(), Inst, MemoryAccess::READ, Op, 1, true,
+ Op);
}
}
@@ -2905,7 +2864,7 @@ void ScopInfo::buildMemoryAccess(
IntegerType::getInt64Ty(BasePtr->getContext()), Size)));
addMemoryAccess(Inst->getParent(), Inst, Type, BasePointer->getValue(),
- AccessFunction, Size, true, Subscripts, SizesSCEV, Val);
+ Size, true, Subscripts, SizesSCEV, Val);
return;
}
}
@@ -2914,8 +2873,7 @@ void ScopInfo::buildMemoryAccess(
auto AccItr = InsnToMemAcc.find(Inst);
if (PollyDelinearize && AccItr != InsnToMemAcc.end()) {
addMemoryAccess(Inst->getParent(), Inst, Type, BasePointer->getValue(),
- AccessFunction, Size, true,
- AccItr->second.DelinearizedSubscripts,
+ Size, true, AccItr->second.DelinearizedSubscripts,
AccItr->second.Shape->DelinearizedSizes, Val);
return;
}
@@ -2940,8 +2898,8 @@ void ScopInfo::buildMemoryAccess(
if (!IsAffine && Type == MemoryAccess::MUST_WRITE)
Type = MemoryAccess::MAY_WRITE;
- addMemoryAccess(Inst->getParent(), Inst, Type, BasePointer->getValue(),
- AccessFunction, Size, IsAffine, Subscripts, Sizes, Val);
+ addMemoryAccess(Inst->getParent(), Inst, Type, BasePointer->getValue(), Size,
+ IsAffine, Subscripts, Sizes, Val);
}
void ScopInfo::buildAccessFunctions(Region &R, Region &SR) {
@@ -2986,17 +2944,19 @@ void ScopInfo::buildAccessFunctions(Region &R, BasicBlock &BB,
if (buildScalarDependences(Inst, &R, NonAffineSubRegion)) {
if (!isa<StoreInst>(Inst))
- addMemoryAccess(&BB, Inst, MemoryAccess::MUST_WRITE, Inst, ZeroOffset,
- 1, true, Inst);
+ addMemoryAccess(&BB, Inst, MemoryAccess::MUST_WRITE, Inst, 1, true,
+ Inst);
}
}
}
-void ScopInfo::addMemoryAccess(
- BasicBlock *BB, Instruction *Inst, MemoryAccess::AccessType Type,
- Value *BaseAddress, const SCEV *Offset, unsigned ElemBytes, bool Affine,
- Value *AccessValue, ArrayRef<const SCEV *> Subscripts,
- ArrayRef<const SCEV *> Sizes, bool IsPHI = false) {
+void ScopInfo::addMemoryAccess(BasicBlock *BB, Instruction *Inst,
+ MemoryAccess::AccessType Type,
+ Value *BaseAddress, unsigned ElemBytes,
+ bool Affine, Value *AccessValue,
+ ArrayRef<const SCEV *> Subscripts,
+ ArrayRef<const SCEV *> Sizes,
+ bool IsPHI = false) {
AccFuncSetType &AccList = AccFuncMap[BB];
size_t Identifier = AccList.size();
@@ -3006,7 +2966,7 @@ void ScopInfo::addMemoryAccess(
std::string IdName = "__polly_array_ref_" + std::to_string(Identifier);
isl_id *Id = isl_id_alloc(ctx, IdName.c_str(), nullptr);
- AccList.emplace_back(Inst, Id, Type, BaseAddress, Offset, ElemBytes, Affine,
+ AccList.emplace_back(Inst, Id, Type, BaseAddress, ElemBytes, Affine,
Subscripts, Sizes, AccessValue, IsPHI, BaseName);
}
@@ -3036,7 +2996,6 @@ void ScopInfo::print(raw_ostream &OS, const Module *) const {
return;
}
- scop->printIRAccesses(OS, SE, LI);
scop->print(OS);
}
diff --git a/polly/test/ScopInfo/cond_in_loop.ll b/polly/test/ScopInfo/cond_in_loop.ll
index 47d4d017657..c5898a305de 100644
--- a/polly/test/ScopInfo/cond_in_loop.ll
+++ b/polly/test/ScopInfo/cond_in_loop.ll
@@ -45,4 +45,5 @@ return: ; preds = %bb3, %entry
}
; CHECK-LABEL: Printing analysis 'Polly - Create polyhedral description of Scops' for region: 'bb => return' in function 'f':
-; CHECK-NEXT: Scop: bb => return
+; CHECK-NEXT: Function: f
+; CHECK-NEXT: Region: %bb---%return
diff --git a/polly/test/TempScop/inter_bb_scalar_dep.ll b/polly/test/ScopInfo/inter_bb_scalar_dep.ll
index cc684fba841..f8d91fba5c4 100644
--- a/polly/test/TempScop/inter_bb_scalar_dep.ll
+++ b/polly/test/ScopInfo/inter_bb_scalar_dep.ll
@@ -25,16 +25,21 @@ for.i: ; preds = %for.i.end, %entry
entry.next: ; preds = %for.i
%init = load i64, i64* %init_ptr
-; CHECK: BB: entry.next
-; CHECK: Read init_ptr[0]
-; CHECK: Write init[0]
+; CHECK-LABEL: Stmt_entry_next
+; CHECK: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: [N] -> { Stmt_entry_next[i0] -> MemRef_init_ptr[0] };
+; CHECK: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
+; CHECK-NEXT: [N] -> { Stmt_entry_next[i0] -> MemRef_init[] };
br label %for.j
for.j: ; preds = %for.j, %entry.next
%indvar.j = phi i64 [ 0, %entry.next ], [ %indvar.j.next, %for.j ]
%init_plus_two = add i64 %init, 2
-; CHECK: Read init[0]
-; CHECK: Write A[{0,+,8}<%for.j>]
+; CHECK-LABEL: Stmt_for_j
+; CHECK: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
+; CHECK-NEXT: [N] -> { Stmt_for_j[i0, i1] -> MemRef_init[] };
+; CHECK: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: [N] -> { Stmt_for_j[i0, i1] -> MemRef_A[i1] };
%scevgep = getelementptr i64, i64* %A, i64 %indvar.j
store i64 %init_plus_two, i64* %scevgep
%indvar.j.next = add nsw i64 %indvar.j, 1
diff --git a/polly/test/TempScop/intra_and_inter_bb_scalar_dep.ll b/polly/test/ScopInfo/intra_and_inter_bb_scalar_dep.ll
index c459f8cc7eb..3766e17d136 100644
--- a/polly/test/TempScop/intra_and_inter_bb_scalar_dep.ll
+++ b/polly/test/ScopInfo/intra_and_inter_bb_scalar_dep.ll
@@ -26,19 +26,24 @@ for.i: ; preds = %for.i.end, %entry
entry.next: ; preds = %for.i
%init = load i64, i64* %init_ptr
-; CHECK: BB: entry.next
-; CHECK: Read init_ptr[0]
-; CHECK: Write init[0]
+; CHECK-LABEL: Stmt_entry_next
+; CHECK: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: [N] -> { Stmt_entry_next[i0] -> MemRef_init_ptr[0] };
+; CHECK: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
+; CHECK-NEXT: [N] -> { Stmt_entry_next[i0] -> MemRef_init[] };
br label %for.j
for.j: ; preds = %for.j, %entry.next
%indvar.j = phi i64 [ 0, %entry.next ], [ %indvar.j.next, %for.j ]
%init_2 = load i64, i64* %init_ptr
%init_sum = add i64 %init, %init_2
-; CHECK: BB: for.j
-; CHECK: Read init[0]
-; CHECK: Read init_ptr[0]
-; CHECK: Write A[{0,+,8}<%for.j>]
+; CHECK-LABEL: Stmt_for_j
+; CHECK: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
+; CHECK-NEXT: [N] -> { Stmt_for_j[i0, i1] -> MemRef_init[] };
+; CHECK: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: [N] -> { Stmt_for_j[i0, i1] -> MemRef_init_ptr[0] };
+; CHECK: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: [N] -> { Stmt_for_j[i0, i1] -> MemRef_A[i1] };
%scevgep = getelementptr i64, i64* %A, i64 %indvar.j
store i64 %init_sum, i64* %scevgep
%indvar.j.next = add nsw i64 %indvar.j, 1
diff --git a/polly/test/TempScop/intra_bb_scalar_dep.ll b/polly/test/ScopInfo/intra_bb_scalar_dep.ll
index ed260eb53d6..5476077511f 100644
--- a/polly/test/TempScop/intra_bb_scalar_dep.ll
+++ b/polly/test/ScopInfo/intra_bb_scalar_dep.ll
@@ -32,9 +32,11 @@ for.j: ; preds = %for.j, %entry.next
%init_plus_two = add i64 %init, 2
%scevgep = getelementptr i64, i64* %A, i64 %indvar.j
store i64 %init_plus_two, i64* %scevgep
-; CHECK: BB: for.j
-; CHECK: Read init_ptr[0]
-; CHECK: Write A[{0,+,8}<%for.j>]
+; CHECK-LABEL: Stmt_for_j
+; CHECK: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: [N] -> { Stmt_for_j[i0, i1] -> MemRef_init_ptr[0] };
+; CHECK: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: [N] -> { Stmt_for_j[i0, i1] -> MemRef_A[i1] };
%indvar.j.next = add nsw i64 %indvar.j, 1
%exitcond.j = icmp eq i64 %indvar.j.next, %N
br i1 %exitcond.j, label %for.i.end, label %for.j
diff --git a/polly/test/TempScop/nested-loops.ll b/polly/test/ScopInfo/nested-loops.ll
index 1c4e3447e30..1c4e3447e30 100644
--- a/polly/test/TempScop/nested-loops.ll
+++ b/polly/test/ScopInfo/nested-loops.ll
diff --git a/polly/test/TempScop/not-a-reduction.ll b/polly/test/ScopInfo/not-a-reduction.ll
index ece8f35952b..ece8f35952b 100644
--- a/polly/test/TempScop/not-a-reduction.ll
+++ b/polly/test/ScopInfo/not-a-reduction.ll
diff --git a/polly/test/TempScop/scalar_to_array.ll b/polly/test/ScopInfo/scalar_to_array.ll
index 0f139d80b88..e4854537811 100644
--- a/polly/test/TempScop/scalar_to_array.ll
+++ b/polly/test/ScopInfo/scalar_to_array.ll
@@ -5,7 +5,9 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3
@A = common global [1024 x float] zeroinitializer, align 8
-; CHECK: empty
+; Terminating loops without side-effects will be optimzied away, hence
+; detecting a scop would be pointless.
+; CHECK-NOT: Function: empty
; Function Attrs: nounwind
define i32 @empty() #0 {
entry:
@@ -29,7 +31,7 @@ return: ; preds = %for.cond
ret i32 0
}
-; CHECK: array_access
+; CHECK-LABEL: Function: array_access
; Function Attrs: nounwind
define i32 @array_access() #0 {
entry:
@@ -46,9 +48,10 @@ for.body: ; preds = %for.cond
%float = uitofp i64 %indvar to float
store float %float, float* %arrayidx
br label %for.inc
-; CHECK: BB: for.body
-; CHECK-NOT: Read
-; CHECK: Write A[{0,+,4}<%for.cond>]
+; CHECK: Stmt_for_body
+; CHECK-NOT: ReadAccess
+; CHECK: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: { Stmt_for_body[i0] -> MemRef_A[i0] };
for.inc: ; preds = %for.body
%indvar.next = add i64 %indvar, 1
@@ -60,7 +63,7 @@ return: ; preds = %for.cond
}
; Function Attrs: nounwind
-; CHECK: intra_scop_dep
+; CHECK-LABEL: Function: intra_scop_dep
define i32 @intra_scop_dep() #0 {
entry:
fence seq_cst
@@ -75,9 +78,11 @@ for.body.a: ; preds = %for.cond
%arrayidx = getelementptr [1024 x float], [1024 x float]* @A, i64 0, i64 %indvar
%scalar = load float, float* %arrayidx
br label %for.body.b
-; CHECK: BB: for.body.a
-; CHECK: Read A[{0,+,4}<%for.cond>]
-; CHECK: Write scalar[0]
+; CHECK: Stmt_for_body_a
+; CHECK: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: { Stmt_for_body_a[i0] -> MemRef_A[i0] };
+; CHECK: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
+; CHECK-NEXT: { Stmt_for_body_a[i0] -> MemRef_scalar[] };
for.body.b: ; preds = %for.body.a
%arrayidx2 = getelementptr [1024 x float], [1024 x float]* @A, i64 0, i64 %indvar
@@ -85,9 +90,11 @@ for.body.b: ; preds = %for.body.a
%sum = fadd float %scalar, %float
store float %sum, float* %arrayidx2
br label %for.inc
-; CHECK: BB: for.body.b
-; CHECK: Read scalar[0]
-; CHECK: Write A[{0,+,4}<%for.cond>]
+; CHECK: Stmt_for_body_b
+; CHECK: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
+; CHECK-NEXT: { Stmt_for_body_b[i0] -> MemRef_scalar[] };
+; CHECK: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: { Stmt_for_body_b[i0] -> MemRef_A[i0] };
for.inc: ; preds = %for.body.b
%indvar.next = add i64 %indvar, 1
@@ -104,7 +111,7 @@ return: ; preds = %for.cond
; Please note that this is still required when scalar to array rewritting is
; disabled.
-; CHECK: use_after_scop
+; CHECK-LABEL: Function: use_after_scop
; Function Attrs: nounwind
define i32 @use_after_scop() #0 {
entry:
@@ -121,9 +128,11 @@ for.body: ; preds = %for.head
%scalar = load float, float* %arrayidx
store float %scalar, float* %scalar.s2a
; Escaped uses are still required to be rewritten to stack variable.
-; CHECK: BB: for.body
-; CHECK: Read A[{0,+,4}<%for.head>]
-; CHECK: Write scalar.s2a[0]
+; CHECK: Stmt_for_body
+; CHECK: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: { Stmt_for_body[i0] -> MemRef_A[i0] };
+; CHECK: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: { Stmt_for_body[i0] -> MemRef_scalar_s2a[0] };
br label %for.inc
for.inc: ; preds = %for.body
@@ -149,7 +158,7 @@ return: ; preds = %for.after
; o For integer values, such a translation may block the use of scalar
; evolution on those values.
;
-; CHECK: before_scop
+; CHECK-LABEL: Function: before_scop
; Function Attrs: nounwind
define i32 @before_scop() #0 {
entry:
@@ -169,8 +178,9 @@ for.body: ; preds = %for.cond
%arrayidx = getelementptr [1024 x float], [1024 x float]* @A, i64 0, i64 %indvar
store float %scalar, float* %arrayidx
br label %for.inc
-; CHECK: BB: for.body
-; CHECK: Write A[{0,+,4}<%for.cond>]
+; CHECK: Stmt_for_body
+; CHECK: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: { Stmt_for_body[i0] -> MemRef_A[i0] };
for.inc: ; preds = %for.body
%indvar.next = add i64 %indvar, 1
diff --git a/polly/test/TempScop/tempscop-printing.ll b/polly/test/ScopInfo/tempscop-printing.ll
index e0183273472..52027fef257 100644
--- a/polly/test/TempScop/tempscop-printing.ll
+++ b/polly/test/ScopInfo/tempscop-printing.ll
@@ -1,4 +1,4 @@
-; RUN: opt %loadPolly -polly-detect-unprofitable -basicaa -polly-scops -analyze < %s | FileCheck %s -check-prefix=SCALARACCESS
+; RUN: opt %loadPolly -polly-detect-unprofitable -basicaa -polly-scops -analyze < %s | FileCheck %s
; void f(long A[], int N, int *init_ptr) {
; long i, j;
@@ -13,6 +13,7 @@
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
+; CHECK-LABEL: Function: f
define void @f(i64* noalias %A, i64 %N, i64* noalias %init_ptr) nounwind {
entry:
br label %for.i
@@ -23,17 +24,21 @@ for.i:
br label %entry.next
entry.next:
-; SCALARACCESS: BB: entry.next
+; CHECK: Stmt_entry_next
%init = load i64, i64* %init_ptr
-; SCALARACCESS: Read init_ptr[0]
-; SCALARACCESS: Write init[0]
+; CHECK: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: [N] -> { Stmt_entry_next[i0] -> MemRef_init_ptr[0] };
+; CHECK: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
+; CHECK-NEXT: [N] -> { Stmt_entry_next[i0] -> MemRef_init[] };
br label %for.j
for.j:
%indvar.j = phi i64 [ 0, %entry.next ], [ %indvar.j.next, %for.j ]
-; SCALARACCESS: BB: for.j
-; SCALARACCESS: Read init
-; SCALARACCESS: Write A[{0,+,8}<%for.j>]
+; CHECK: Stmt_for_j
+; CHECK: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
+; CHECK-NEXT: [N] -> { Stmt_for_j[i0, i1] -> MemRef_init[] };
+; CHECK: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: [N] -> { Stmt_for_j[i0, i1] -> MemRef_A[i1] };
%init_plus_two = add i64 %init, 2
%scevgep = getelementptr i64, i64* %A, i64 %indvar.j
store i64 %init_plus_two, i64* %scevgep
@@ -49,6 +54,7 @@ return:
ret void
}
+; CHECK-LABEL: Function: g
define void @g(i64* noalias %A, i64 %N, i64* noalias %init_ptr) nounwind {
entry:
br label %for.i
@@ -59,19 +65,23 @@ for.i:
br label %entry.next
entry.next:
-; SCALARACCESS: BB: entry.next
+; CHECK: Stmt_entry_next
%init = load i64, i64* %init_ptr
-; SCALARACCESS: Read init_ptr[0]
-; SCALARACCESS: Write init[0]
+; CHECK: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: [N] -> { Stmt_entry_next[i0] -> MemRef_init_ptr[0] };
+; CHECK: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
+; CHECK-NEXT: [N] -> { Stmt_entry_next[i0] -> MemRef_init[] };
br label %for.j
for.j:
-; SCALARACCESS: BB: for.j
+; CHECK: Stmt_for_j
%indvar.j = phi i64 [ 0, %entry.next ], [ %indvar.j.next, %for.j ]
%scevgep = getelementptr i64, i64* %A, i64 %indvar.j
store i64 %init, i64* %scevgep
-; SCALARACCESS: Read init
-; SCALARACCESS: Write A[{0,+,8}<%for.j>]
+; CHECK: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
+; CHECK-NEXT: [N] -> { Stmt_for_j[i0, i1] -> MemRef_init[] };
+; CHECK: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: [N] -> { Stmt_for_j[i0, i1] -> MemRef_A[i1] };
%indvar.j.next = add nsw i64 %indvar.j, 1
%exitcond.j = icmp eq i64 %indvar.j.next, %N
br i1 %exitcond.j, label %for.i.end, label %for.j
OpenPOWER on IntegriCloud