From d5fcbef8ee95058bf6303d3f6522bd941b7adbb6 Mon Sep 17 00:00:00 2001 From: Tobias Grosser Date: Sat, 27 May 2017 04:40:18 +0000 Subject: [PATCH] [Polly] Added the list of Instructions to output in ScopInfo pass Summary: This patch outputs all the list of instructions in BlockStmts. Reviewers: Meinersbur, grosser, bollu Subscribers: bollu, llvm-commits, pollydev Differential Revision: https://reviews.llvm.org/D33163 llvm-svn: 304062 --- polly/include/polly/ScopInfo.h | 14 +++++++++-- polly/lib/Analysis/ScopBuilder.cpp | 6 ++++- polly/lib/Analysis/ScopInfo.cpp | 27 +++++++++++++++++---- polly/test/ScopInfo/statement.ll | 49 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+), 7 deletions(-) create mode 100644 polly/test/ScopInfo/statement.ll diff --git a/polly/include/polly/ScopInfo.h b/polly/include/polly/ScopInfo.h index c6b47c1..a42181b 100644 --- a/polly/include/polly/ScopInfo.h +++ b/polly/include/polly/ScopInfo.h @@ -1141,7 +1141,8 @@ public: const ScopStmt &operator=(const ScopStmt &) = delete; /// Create the ScopStmt from a BasicBlock. - ScopStmt(Scop &parent, BasicBlock &bb, Loop *SurroundingLoop); + ScopStmt(Scop &parent, BasicBlock &bb, Loop *SurroundingLoop, + std::vector Instructions); /// Create an overapproximating ScopStmt for the region @p R. ScopStmt(Scop &parent, Region &R, Loop *SurroundingLoop); @@ -1248,6 +1249,9 @@ private: /// The closest loop that contains this statement. Loop *SurroundingLoop; + /// Vector for Instructions in a BB. + std::vector Instructions; + /// Build the statement. //@{ void buildDomain(); @@ -1533,6 +1537,10 @@ public: /// @param OS The output stream the ScopStmt is printed to. void print(raw_ostream &OS) const; + /// Print the instructions in ScopStmt. + /// + void printInstructions(raw_ostream &OS) const; + /// Print the ScopStmt to stderr. void dump() const; }; @@ -2019,7 +2027,9 @@ private: /// /// @param BB The basic block we build the statement for. /// @param SurroundingLoop The loop the created statement is contained in. - void addScopStmt(BasicBlock *BB, Loop *SurroundingLoop); + /// @param Instructions The instructions in the basic block. + void addScopStmt(BasicBlock *BB, Loop *SurroundingLoop, + std::vector Instructions); /// Create a new SCoP statement for @p R. /// diff --git a/polly/lib/Analysis/ScopBuilder.cpp b/polly/lib/Analysis/ScopBuilder.cpp index 8b20756..8339680 100644 --- a/polly/lib/Analysis/ScopBuilder.cpp +++ b/polly/lib/Analysis/ScopBuilder.cpp @@ -632,8 +632,12 @@ void ScopBuilder::buildStmts(Region &SR) { if (I->isSubRegion()) buildStmts(*I->getNodeAs()); else { + std::vector Instructions; + for (Instruction &Inst : *I->getNodeAs()) + Instructions.push_back(&Inst); Loop *SurroundingLoop = LI.getLoopFor(I->getNodeAs()); - scop->addScopStmt(I->getNodeAs(), SurroundingLoop); + scop->addScopStmt(I->getNodeAs(), SurroundingLoop, + Instructions); } } diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp index 4c64099..08566c5 100644 --- a/polly/lib/Analysis/ScopInfo.cpp +++ b/polly/lib/Analysis/ScopInfo.cpp @@ -168,6 +168,10 @@ static cl::opt XUseInstructionNames( cl::location(UseInstructionNames), cl::Hidden, cl::init(false), cl::ZeroOrMore, cl::cat(PollyCategory)); +static cl::opt PollyPrintInstructions( + "polly-print-instructions", cl::desc("Output instructions per ScopStmt"), + cl::Hidden, cl::Optional, cl::init(false), cl::cat(PollyCategory)); + //===----------------------------------------------------------------------===// // Create a sequence of two schedules. Either argument may be null and is @@ -1647,9 +1651,11 @@ ScopStmt::ScopStmt(Scop &parent, Region &R, Loop *SurroundingLoop) "Stmt", R.getNameStr(), parent.getNextStmtIdx(), "", UseInstructionNames); } -ScopStmt::ScopStmt(Scop &parent, BasicBlock &bb, Loop *SurroundingLoop) +ScopStmt::ScopStmt(Scop &parent, BasicBlock &bb, Loop *SurroundingLoop, + std::vector Instructions) : Parent(parent), InvalidDomain(nullptr), Domain(nullptr), BB(&bb), - R(nullptr), Build(nullptr), SurroundingLoop(SurroundingLoop) { + R(nullptr), Build(nullptr), SurroundingLoop(SurroundingLoop), + Instructions(Instructions) { BaseName = getIslCompatibleName("Stmt", &bb, parent.getNextStmtIdx(), "", UseInstructionNames); @@ -1863,6 +1869,15 @@ ScopStmt::~ScopStmt() { isl_set_free(InvalidDomain); } +void ScopStmt::printInstructions(raw_ostream &OS) const { + OS << "Instructions {\n"; + + for (Instruction *Inst : Instructions) + OS.indent(16) << *Inst << "\n"; + + OS.indent(16) << "}\n"; +} + void ScopStmt::print(raw_ostream &OS) const { OS << "\t" << getBaseName() << "\n"; OS.indent(12) << "Domain :=\n"; @@ -1881,6 +1896,9 @@ void ScopStmt::print(raw_ostream &OS) const { for (MemoryAccess *Access : MemAccs) Access->print(OS); + + if (PollyPrintInstructions) + printInstructions(OS.indent(12)); } void ScopStmt::dump() const { print(dbgs()); } @@ -4616,9 +4634,10 @@ static isl::multi_union_pw_aff mapToDimension(isl::union_set USet, int N) { return isl::multi_union_pw_aff(isl::union_pw_multi_aff(Result)); } -void Scop::addScopStmt(BasicBlock *BB, Loop *SurroundingLoop) { +void Scop::addScopStmt(BasicBlock *BB, Loop *SurroundingLoop, + std::vector Instructions) { assert(BB && "Unexpected nullptr!"); - Stmts.emplace_back(*this, *BB, SurroundingLoop); + Stmts.emplace_back(*this, *BB, SurroundingLoop, Instructions); auto *Stmt = &Stmts.back(); StmtMap[BB] = Stmt; } diff --git a/polly/test/ScopInfo/statement.ll b/polly/test/ScopInfo/statement.ll new file mode 100644 index 0000000..2230451 --- /dev/null +++ b/polly/test/ScopInfo/statement.ll @@ -0,0 +1,49 @@ +; RUN: opt %loadPolly -polly-scops -analyze -polly-print-instructions < %s | FileCheck %s + +; void func(int *A, int *B){ +; for (int i = 0; i < 1024; i+=1) { +; Stmt: +; A[i] = i; +; B[i] = i; +; } +; } + +; CHECK: Instructions { +; CHECK-NEXT: %idxprom = sext i32 %i.0 to i64 +; CHECK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %A, i64 %idxprom +; CHECK-NEXT: store i32 %i.0, i32* %arrayidx, align 4 +; CHECK-NEXT: %idxprom1 = sext i32 %i.0 to i64 +; CHECK-NEXT: %arrayidx2 = getelementptr inbounds i32, i32* %B, i64 %idxprom1 +; CHECK-NEXT: store i32 %i.0, i32* %arrayidx2, align 4 +; CHECK-NEXT: br label %for.inc +; CHECK-NEXT: } + +; Function Attrs: noinline nounwind uwtable +define void @func(i32* %A, i32* %B) #0 { +entry: + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %i.0 = phi i32 [ 0, %entry ], [ %add, %for.inc ] + %cmp = icmp slt i32 %i.0, 1024 + br i1 %cmp, label %for.body, label %for.end + +for.body: ; preds = %for.cond + br label %Stmt + +Stmt: ; preds = %for.body + %idxprom = sext i32 %i.0 to i64 + %arrayidx = getelementptr inbounds i32, i32* %A, i64 %idxprom + store i32 %i.0, i32* %arrayidx, align 4 + %idxprom1 = sext i32 %i.0 to i64 + %arrayidx2 = getelementptr inbounds i32, i32* %B, i64 %idxprom1 + store i32 %i.0, i32* %arrayidx2, align 4 + br label %for.inc + +for.inc: ; preds = %Stmt + %add = add nsw i32 %i.0, 1 + br label %for.cond + +for.end: ; preds = %for.cond + ret void +} -- 2.7.4