[polly] r312107 - [ScopBuilder] Introduce metadata for splitting scop statement.
Michael Kruse via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 30 03:11:06 PDT 2017
Author: meinersbur
Date: Wed Aug 30 03:11:06 2017
New Revision: 312107
URL: http://llvm.org/viewvc/llvm-project?rev=312107&view=rev
Log:
[ScopBuilder] Introduce metadata for splitting scop statement.
This patch allows annotating of metadata in ir instruction
(with "polly_split_after"), which specifies where to split a particular
scop statement.
Contributed-by: Nandini Singhal <cs15mtech01004 at iith.ac.in>
Differential Revision: https://reviews.llvm.org/D36402
Added:
polly/trunk/test/Isl/CodeGen/stmt_split_no_dependence.ll
- copied, changed from r312021, polly/trunk/test/ScopInfo/statement.ll
polly/trunk/test/ScopInfo/stmt_split_exit_of_region_stmt.ll
polly/trunk/test/ScopInfo/stmt_split_no_dependence.ll
- copied, changed from r312021, polly/trunk/test/ScopInfo/statement.ll
polly/trunk/test/ScopInfo/stmt_split_on_synthesizable.ll
polly/trunk/test/ScopInfo/stmt_split_phi_in_beginning_bb.ll
polly/trunk/test/ScopInfo/stmt_split_phi_in_stmt.ll
polly/trunk/test/ScopInfo/stmt_split_within_loop.ll
Removed:
polly/trunk/test/ScopInfo/statement.ll
Modified:
polly/trunk/include/polly/ScopBuilder.h
polly/trunk/include/polly/ScopInfo.h
polly/trunk/lib/Analysis/ScopBuilder.cpp
polly/trunk/lib/Analysis/ScopInfo.cpp
Modified: polly/trunk/include/polly/ScopBuilder.h
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/ScopBuilder.h?rev=312107&r1=312106&r2=312107&view=diff
==============================================================================
--- polly/trunk/include/polly/ScopBuilder.h (original)
+++ polly/trunk/include/polly/ScopBuilder.h Wed Aug 30 03:11:06 2017
@@ -229,8 +229,8 @@ class ScopBuilder {
/// access any memory and thus have no effect.
void buildStmts(Region &SR);
- /// Build the access functions for the basic block @p BB in or represented by
- /// @p Stmt.
+ /// Build the access functions for the statement @p Stmt in or represented by
+ /// @p BB.
///
/// @param Stmt Statement to add MemoryAccesses to.
/// @param BB A basic block in @p R.
Modified: polly/trunk/include/polly/ScopInfo.h
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/ScopInfo.h?rev=312107&r1=312106&r2=312107&view=diff
==============================================================================
--- polly/trunk/include/polly/ScopInfo.h (original)
+++ polly/trunk/include/polly/ScopInfo.h Wed Aug 30 03:11:06 2017
@@ -1192,7 +1192,7 @@ class ScopStmt {
public:
/// Create the ScopStmt from a BasicBlock.
ScopStmt(Scop &parent, BasicBlock &bb, Loop *SurroundingLoop,
- std::vector<Instruction *> Instructions);
+ std::vector<Instruction *> Instructions, int Count);
/// Create an overapproximating ScopStmt for the region @p R.
ScopStmt(Scop &parent, Region &R, Loop *SurroundingLoop);
@@ -2203,8 +2203,9 @@ private:
/// @param BB The basic block we build the statement for.
/// @param SurroundingLoop The loop the created statement is contained in.
/// @param Instructions The instructions in the statement.
+ /// @param Count The index of the created statement in @p BB.
void addScopStmt(BasicBlock *BB, Loop *SurroundingLoop,
- std::vector<Instruction *> Instructions);
+ std::vector<Instruction *> Instructions, int Count);
/// Create a new SCoP statement for @p R.
///
Modified: polly/trunk/lib/Analysis/ScopBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopBuilder.cpp?rev=312107&r1=312106&r2=312107&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopBuilder.cpp (original)
+++ polly/trunk/lib/Analysis/ScopBuilder.cpp Wed Aug 30 03:11:06 2017
@@ -658,16 +658,24 @@ void ScopBuilder::buildStmts(Region &SR)
if (I->isSubRegion())
buildStmts(*I->getNodeAs<Region>());
else {
+ int Count = 0;
std::vector<Instruction *> Instructions;
for (Instruction &Inst : *I->getNodeAs<BasicBlock>()) {
Loop *L = LI.getLoopFor(Inst.getParent());
if (!isa<TerminatorInst>(&Inst) && !isIgnoredIntrinsic(&Inst) &&
!canSynthesize(&Inst, *scop, &SE, L))
Instructions.push_back(&Inst);
+ if (Inst.getMetadata("polly_split_after")) {
+ Loop *SurroundingLoop = LI.getLoopFor(I->getNodeAs<BasicBlock>());
+ scop->addScopStmt(I->getNodeAs<BasicBlock>(), SurroundingLoop,
+ Instructions, Count);
+ Count++;
+ Instructions.clear();
+ }
}
Loop *SurroundingLoop = LI.getLoopFor(I->getNodeAs<BasicBlock>());
scop->addScopStmt(I->getNodeAs<BasicBlock>(), SurroundingLoop,
- Instructions);
+ Instructions, Count);
}
}
@@ -684,7 +692,19 @@ void ScopBuilder::buildAccessFunctions(S
if (isErrorBlock(BB, scop->getRegion(), LI, DT) && !IsExitBlock)
return;
+ int Count = 0;
+ bool Split = false;
for (Instruction &Inst : BB) {
+ if (Split) {
+ Split = false;
+ Count++;
+ }
+ if (Inst.getMetadata("polly_split_after"))
+ Split = true;
+
+ if (Stmt && Stmt->isBlockStmt() && Stmt != scop->getStmtListFor(&BB)[Count])
+ continue;
+
PHINode *PHI = dyn_cast<PHINode>(&Inst);
if (PHI)
buildPHIAccesses(Stmt, PHI, NonAffineSubRegion, IsExitBlock);
Modified: polly/trunk/lib/Analysis/ScopInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopInfo.cpp?rev=312107&r1=312106&r2=312107&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopInfo.cpp (original)
+++ polly/trunk/lib/Analysis/ScopInfo.cpp Wed Aug 30 03:11:06 2017
@@ -1764,11 +1764,14 @@ ScopStmt::ScopStmt(Scop &parent, Region
}
ScopStmt::ScopStmt(Scop &parent, BasicBlock &bb, Loop *SurroundingLoop,
- std::vector<Instruction *> Instructions)
+ std::vector<Instruction *> Instructions, int Count)
: Parent(parent), InvalidDomain(nullptr), Domain(nullptr), BB(&bb),
Build(nullptr), SurroundingLoop(SurroundingLoop),
Instructions(Instructions) {
- BaseName = getIslCompatibleName("Stmt", &bb, parent.getNextStmtIdx(), "",
+ std::string S = "";
+ if (Count != 0)
+ S += std::to_string(Count);
+ BaseName = getIslCompatibleName("Stmt", &bb, parent.getNextStmtIdx(), S,
UseInstructionNames);
}
@@ -4880,9 +4883,9 @@ static isl::multi_union_pw_aff mapToDime
}
void Scop::addScopStmt(BasicBlock *BB, Loop *SurroundingLoop,
- std::vector<Instruction *> Instructions) {
+ std::vector<Instruction *> Instructions, int Count) {
assert(BB && "Unexpected nullptr!");
- Stmts.emplace_back(*this, *BB, SurroundingLoop, Instructions);
+ Stmts.emplace_back(*this, *BB, SurroundingLoop, Instructions, Count);
auto *Stmt = &Stmts.back();
StmtMap[BB].push_back(Stmt);
for (Instruction *Inst : Instructions) {
@@ -5049,8 +5052,6 @@ ArrayRef<ScopStmt *> Scop::getStmtListFo
auto StmtMapIt = StmtMap.find(BB);
if (StmtMapIt == StmtMap.end())
return {};
- assert(StmtMapIt->second.size() == 1 &&
- "Each statement corresponds to exactly one BB.");
return StmtMapIt->second;
}
Copied: polly/trunk/test/Isl/CodeGen/stmt_split_no_dependence.ll (from r312021, polly/trunk/test/ScopInfo/statement.ll)
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/Isl/CodeGen/stmt_split_no_dependence.ll?p2=polly/trunk/test/Isl/CodeGen/stmt_split_no_dependence.ll&p1=polly/trunk/test/ScopInfo/statement.ll&r1=312021&r2=312107&rev=312107&view=diff
==============================================================================
--- polly/trunk/test/ScopInfo/statement.ll (original)
+++ polly/trunk/test/Isl/CodeGen/stmt_split_no_dependence.ll Wed Aug 30 03:11:06 2017
@@ -1,5 +1,8 @@
-; RUN: opt %loadPolly -polly-scops -analyze -polly-print-instructions < %s | FileCheck %s
-
+; RUN: opt %loadPolly -polly-codegen -S < %s | FileCheck %s
+;
+; CHECK: store i32 %8, i32* %scevgep, align 4, !alias.scope !1, !noalias !3
+; CHECK: store i32 %9, i32* %scevgep4, align 4, !alias.scope !4, !noalias !5
+;
; void func(int *A, int *B){
; for (int i = 0; i < 1024; i+=1) {
; Stmt:
@@ -7,38 +10,35 @@
; B[i] = i;
; }
; }
-
-; CHECK: Instructions {
-; CHECK-NEXT: store i32 %i.0, i32* %arrayidx, align 4
-; CHECK-NEXT: store i32 %i.0, i32* %arrayidx2, align 4
-; 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
+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
+for.body: ; preds = %for.cond
br label %Stmt
-Stmt: ; preds = %for.body
+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
+ store i32 %i.0, i32* %arrayidx, align 4, !polly_split_after !0
%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
+for.inc: ; preds = %Stmt
%add = add nsw i32 %i.0, 1
br label %for.cond
-for.end: ; preds = %for.cond
+for.end: ; preds = %for.cond
ret void
}
+
+!0 = !{!"polly_split_after"}
Removed: polly/trunk/test/ScopInfo/statement.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/statement.ll?rev=312106&view=auto
==============================================================================
--- polly/trunk/test/ScopInfo/statement.ll (original)
+++ polly/trunk/test/ScopInfo/statement.ll (removed)
@@ -1,44 +0,0 @@
-; 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: store i32 %i.0, i32* %arrayidx, align 4
-; CHECK-NEXT: store i32 %i.0, i32* %arrayidx2, align 4
-; 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
-}
Added: polly/trunk/test/ScopInfo/stmt_split_exit_of_region_stmt.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/stmt_split_exit_of_region_stmt.ll?rev=312107&view=auto
==============================================================================
--- polly/trunk/test/ScopInfo/stmt_split_exit_of_region_stmt.ll (added)
+++ polly/trunk/test/ScopInfo/stmt_split_exit_of_region_stmt.ll Wed Aug 30 03:11:06 2017
@@ -0,0 +1,71 @@
+; RUN: opt %loadPolly -polly-scops -analyze -polly-print-instructions < %s | FileCheck %s
+;
+; CHECK: Statements {
+; CHECK-NEXT: Stmt_Region__TO__Stmt
+; CHECK-NEXT: Domain :=
+; CHECK-NEXT: { Stmt_Region__TO__Stmt[i0] : 0 <= i0 <= 1023 };
+; CHECK-NEXT: Schedule :=
+; CHECK-NEXT: { Stmt_Region__TO__Stmt[i0] -> [i0, 0] };
+; CHECK-NEXT: MayWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: { Stmt_Region__TO__Stmt[i0] -> MemRef_C[0] };
+; CHECK-NEXT: Stmt_Stmt
+; CHECK-NEXT: Domain :=
+; CHECK-NEXT: { Stmt_Stmt[i0] : 0 <= i0 <= 1023 };
+; CHECK-NEXT: Schedule :=
+; CHECK-NEXT: { Stmt_Stmt[i0] -> [i0, 1] };
+; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: { Stmt_Stmt[i0] -> MemRef_A[i0] };
+; CHECK-NEXT: Instructions {
+; CHECK-NEXT: store i32 %i.0, i32* %arrayidx, align 4, !polly_split_after !0
+; CHECK-NEXT: }
+; CHECK-NEXT: Stmt_Stmt1
+; CHECK-NEXT: Domain :=
+; CHECK-NEXT: { Stmt_Stmt1[i0] : 0 <= i0 <= 1023 };
+; CHECK-NEXT: Schedule :=
+; CHECK-NEXT: { Stmt_Stmt1[i0] -> [i0, 2] };
+; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: { Stmt_Stmt1[i0] -> MemRef_B[i0] };
+; CHECK-NEXT: Instructions {
+; CHECK-NEXT: store i32 %i.0, i32* %arrayidx2, align 4
+; CHECK-NEXT: }
+; CHECK-NEXT: }
+;
+; Function Attrs: noinline nounwind uwtable
+define void @func(i32* %A, i32* %B, double* %C) {
+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 %Region
+
+Region: ; preds = %for.body
+ %cond = fcmp oeq double 2.100000e+01, 2.100000e+01
+ br i1 %cond, label %Region_true, label %Stmt
+
+Region_true: ; preds = %Region
+ store double 0.000000e+00, double* %C
+ br label %Stmt
+
+Stmt: ; preds = %Region_true, %Region
+ %idxprom = sext i32 %i.0 to i64
+ %arrayidx = getelementptr inbounds i32, i32* %A, i64 %idxprom
+ store i32 %i.0, i32* %arrayidx, align 4, !polly_split_after !0
+ %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
+}
+
+!0 = !{!"polly_split_after"}
Copied: polly/trunk/test/ScopInfo/stmt_split_no_dependence.ll (from r312021, polly/trunk/test/ScopInfo/statement.ll)
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/stmt_split_no_dependence.ll?p2=polly/trunk/test/ScopInfo/stmt_split_no_dependence.ll&p1=polly/trunk/test/ScopInfo/statement.ll&r1=312021&r2=312107&rev=312107&view=diff
==============================================================================
--- polly/trunk/test/ScopInfo/statement.ll (original)
+++ polly/trunk/test/ScopInfo/stmt_split_no_dependence.ll Wed Aug 30 03:11:06 2017
@@ -7,12 +7,30 @@
; B[i] = i;
; }
; }
-
-; CHECK: Instructions {
-; CHECK-NEXT: store i32 %i.0, i32* %arrayidx, align 4
-; CHECK-NEXT: store i32 %i.0, i32* %arrayidx2, align 4
+;
+; CHECK: Statements {
+; CHECK-NEXT: Stmt_Stmt
+; CHECK-NEXT: Domain :=
+; CHECK-NEXT: { Stmt_Stmt[i0] : 0 <= i0 <= 1023 };
+; CHECK-NEXT: Schedule :=
+; CHECK-NEXT: { Stmt_Stmt[i0] -> [i0, 0] };
+; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: { Stmt_Stmt[i0] -> MemRef_A[i0] };
+; CHECK-NEXT: Instructions {
+; CHECK-NEXT: store i32 %i.0, i32* %arrayidx, align 4, !polly_split_after !0
+; CHECK-NEXT: }
+; CHECK-NEXT: Stmt_Stmt1
+; CHECK-NEXT: Domain :=
+; CHECK-NEXT: { Stmt_Stmt1[i0] : 0 <= i0 <= 1023 };
+; CHECK-NEXT: Schedule :=
+; CHECK-NEXT: { Stmt_Stmt1[i0] -> [i0, 1] };
+; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: { Stmt_Stmt1[i0] -> MemRef_B[i0] };
+; CHECK-NEXT: Instructions {
+; CHECK-NEXT: store i32 %i.0, i32* %arrayidx2, align 4
+; CHECK-NEXT: }
; CHECK-NEXT: }
-
+;
; Function Attrs: noinline nounwind uwtable
define void @func(i32* %A, i32* %B) #0 {
entry:
@@ -29,7 +47,7 @@ for.body:
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
+ store i32 %i.0, i32* %arrayidx, align 4, !polly_split_after !0
%idxprom1 = sext i32 %i.0 to i64
%arrayidx2 = getelementptr inbounds i32, i32* %B, i64 %idxprom1
store i32 %i.0, i32* %arrayidx2, align 4
@@ -42,3 +60,5 @@ for.inc:
for.end: ; preds = %for.cond
ret void
}
+
+!0 = !{!"polly_split_after"}
Added: polly/trunk/test/ScopInfo/stmt_split_on_synthesizable.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/stmt_split_on_synthesizable.ll?rev=312107&view=auto
==============================================================================
--- polly/trunk/test/ScopInfo/stmt_split_on_synthesizable.ll (added)
+++ polly/trunk/test/ScopInfo/stmt_split_on_synthesizable.ll Wed Aug 30 03:11:06 2017
@@ -0,0 +1,56 @@
+; RUN: opt %loadPolly -polly-scops -analyze -polly-print-instructions < %s | FileCheck %s
+;
+; CHECK: Statements {
+; CHECK-NEXT: Stmt_Stmt
+; CHECK-NEXT: Domain :=
+; CHECK-NEXT: { Stmt_Stmt[i0] : 0 <= i0 <= 1023 };
+; CHECK-NEXT: Schedule :=
+; CHECK-NEXT: { Stmt_Stmt[i0] -> [i0, 0] };
+; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: { Stmt_Stmt[i0] -> MemRef_A[i0] };
+; CHECK-NEXT: Instructions {
+; CHECK-NEXT: store i32 %i.0, i32* %arrayidx, align 4
+; CHECK-NEXT: }
+; CHECK-NEXT: Stmt_Stmt1
+; CHECK-NEXT: Domain :=
+; CHECK-NEXT: { Stmt_Stmt1[i0] : 0 <= i0 <= 1023 };
+; CHECK-NEXT: Schedule :=
+; CHECK-NEXT: { Stmt_Stmt1[i0] -> [i0, 1] };
+; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: { Stmt_Stmt1[i0] -> MemRef_B[i0] };
+; CHECK-NEXT: Instructions {
+; CHECK-NEXT: store i32 %i.0, i32* %arrayidx2, align 4
+; CHECK-NEXT: }
+; CHECK-NEXT: }
+;
+; Function Attrs: noinline nounwind uwtable
+define void @func(i32* %A, i32* %B, double* %C) #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:
+ %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, !polly_split_after !0
+ %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
+}
+
+!0 = !{!"polly_split_after"}
Added: polly/trunk/test/ScopInfo/stmt_split_phi_in_beginning_bb.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/stmt_split_phi_in_beginning_bb.ll?rev=312107&view=auto
==============================================================================
--- polly/trunk/test/ScopInfo/stmt_split_phi_in_beginning_bb.ll (added)
+++ polly/trunk/test/ScopInfo/stmt_split_phi_in_beginning_bb.ll Wed Aug 30 03:11:06 2017
@@ -0,0 +1,57 @@
+; RUN: opt %loadPolly -polly-scops -analyze -polly-print-instructions < %s | FileCheck %s
+;
+; CHECK: Statements {
+; CHECK-NEXT: Stmt_Stmt
+; CHECK-NEXT: Domain :=
+; CHECK-NEXT: { Stmt_Stmt[i0] : 0 <= i0 <= 1023 };
+; CHECK-NEXT: Schedule :=
+; CHECK-NEXT: { Stmt_Stmt[i0] -> [i0, 0] };
+; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: { Stmt_Stmt[i0] -> MemRef_A[i0] };
+; CHECK-NEXT: Instructions {
+; CHECK-NEXT: store i32 %phi, i32* %arrayidx, align 4, !polly_split_after !0
+; CHECK-NEXT: }
+; CHECK-NEXT: Stmt_Stmt1
+; CHECK-NEXT: Domain :=
+; CHECK-NEXT: { Stmt_Stmt1[i0] : 0 <= i0 <= 1023 };
+; CHECK-NEXT: Schedule :=
+; CHECK-NEXT: { Stmt_Stmt1[i0] -> [i0, 1] };
+; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: { Stmt_Stmt1[i0] -> MemRef_B[i0] };
+; CHECK-NEXT: Instructions {
+; CHECK-NEXT: store i32 %i.0, i32* %arrayidx2, align 4
+; CHECK-NEXT: }
+; 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:
+ %phi = phi i32 [0, %for.body]
+ %idxprom = sext i32 %i.0 to i64
+ %arrayidx = getelementptr inbounds i32, i32* %A, i64 %idxprom
+ store i32 %phi, i32* %arrayidx, align 4, !polly_split_after !0
+ %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
+}
+
+!0 = !{!"polly_split_after"}
Added: polly/trunk/test/ScopInfo/stmt_split_phi_in_stmt.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/stmt_split_phi_in_stmt.ll?rev=312107&view=auto
==============================================================================
--- polly/trunk/test/ScopInfo/stmt_split_phi_in_stmt.ll (added)
+++ polly/trunk/test/ScopInfo/stmt_split_phi_in_stmt.ll Wed Aug 30 03:11:06 2017
@@ -0,0 +1,75 @@
+; RUN: opt %loadPolly -polly-scops -analyze -polly-print-instructions < %s | FileCheck %s
+;
+; CHECK: Statements {
+; CHECK-NEXT: Stmt_Stmt
+; CHECK-NEXT: Domain :=
+; CHECK-NEXT: { Stmt_Stmt[i0] : 0 <= i0 <= 1023 };
+; CHECK-NEXT: Schedule :=
+; CHECK-NEXT: { Stmt_Stmt[i0] -> [i0, 0] };
+; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: { Stmt_Stmt[i0] -> MemRef_A[i0] };
+; CHECK-NEXT: Instructions {
+; CHECK-NEXT: store i32 %i.0, i32* %arrayidx, align 4, !polly_split_after !0
+; CHECK-NEXT: }
+; CHECK-NEXT: Stmt_Stmt1
+; CHECK-NEXT: Domain :=
+; CHECK-NEXT: { Stmt_Stmt1[i0] : 0 <= i0 <= 1023 };
+; CHECK-NEXT: Schedule :=
+; CHECK-NEXT: { Stmt_Stmt1[i0] -> [i0, 1] };
+; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: { Stmt_Stmt1[i0] -> MemRef_B[i0] };
+; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
+; CHECK-NEXT: { Stmt_Stmt1[i0] -> MemRef_phi__phi[] };
+; CHECK-NEXT: Instructions {
+; CHECK-NEXT: %d = fadd double 2.100000e+01, 2.100000e+01
+; CHECK-NEXT: store i32 %i.0, i32* %arrayidx2, align 4
+; CHECK-NEXT: }
+; CHECK-NEXT: Stmt_for_inc
+; CHECK-NEXT: Domain :=
+; CHECK-NEXT: { Stmt_for_inc[i0] : 0 <= i0 <= 1023 };
+; CHECK-NEXT: Schedule :=
+; CHECK-NEXT: { Stmt_for_inc[i0] -> [i0, 2] };
+; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 1]
+; CHECK-NEXT: { Stmt_for_inc[i0] -> MemRef_phi__phi[] };
+; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: { Stmt_for_inc[i0] -> MemRef_C[0] };
+; CHECK-NEXT: Instructions {
+; CHECK-NEXT: %phi = phi double [ %d, %Stmt ]
+; CHECK-NEXT: store double %phi, double* %C
+; CHECK-NEXT: }
+; CHECK-NEXT: }
+;
+; Function Attrs: noinline nounwind uwtable
+define void @func(i32* %A, i32* %B, double* %C) #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:
+ %idxprom = sext i32 %i.0 to i64
+ %arrayidx = getelementptr inbounds i32, i32* %A, i64 %idxprom
+ store i32 %i.0, i32* %arrayidx, align 4, !polly_split_after !0
+ %idxprom1 = sext i32 %i.0 to i64
+ %d = fadd double 21.0, 21.0
+ %arrayidx2 = getelementptr inbounds i32, i32* %B, i64 %idxprom1
+ store i32 %i.0, i32* %arrayidx2, align 4
+ br label %for.inc
+
+for.inc: ; preds = %Stmt
+ %phi = phi double [%d, %Stmt]
+ store double %phi, double* %C
+ %add = add nsw i32 %i.0, 1
+ br label %for.cond
+
+for.end: ; preds = %for.cond
+ ret void
+}
+
+!0 = !{!"polly_split_after"}
Added: polly/trunk/test/ScopInfo/stmt_split_within_loop.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/stmt_split_within_loop.ll?rev=312107&view=auto
==============================================================================
--- polly/trunk/test/ScopInfo/stmt_split_within_loop.ll (added)
+++ polly/trunk/test/ScopInfo/stmt_split_within_loop.ll Wed Aug 30 03:11:06 2017
@@ -0,0 +1,60 @@
+; RUN: opt %loadPolly -polly-scops -analyze -polly-print-instructions < %s | FileCheck %s
+;
+; CHECK: Statements {
+; CHECK-NEXT: Stmt_Stmt
+; CHECK-NEXT: Domain :=
+; CHECK-NEXT: { Stmt_Stmt[i0, i1] : 0 <= i0 <= 1023 and 0 <= i1 <= 512 };
+; CHECK-NEXT: Schedule :=
+; CHECK-NEXT: { Stmt_Stmt[i0, i1] -> [i0, i1, 0] };
+; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: { Stmt_Stmt[i0, i1] -> MemRef_A[i0] };
+; CHECK-NEXT: Instructions {
+; CHECK-NEXT: store i32 %i.0, i32* %arrayidx, align 4, !polly_split_after !0
+; CHECK-NEXT: }
+; CHECK-NEXT: Stmt_Stmt1
+; CHECK-NEXT: Domain :=
+; CHECK-NEXT: { Stmt_Stmt1[i0, i1] : 0 <= i0 <= 1023 and 0 <= i1 <= 512 };
+; CHECK-NEXT: Schedule :=
+; CHECK-NEXT: { Stmt_Stmt1[i0, i1] -> [i0, i1, 1] };
+; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: { Stmt_Stmt1[i0, i1] -> MemRef_B[i0] };
+; CHECK-NEXT: Instructions {
+; CHECK-NEXT: store i32 %i.0, i32* %arrayidx2, align 4
+; CHECK-NEXT: %cond = icmp slt i32 %j, 512
+; CHECK-NEXT: }
+; CHECK-NEXT: }
+;
+; Function Attrs: noinline nounwind uwtable
+define void @func(i32* %A, i32* %B, double* %C) #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:
+ %j = phi i32 [ 0, %for.body ], [ %inc, %Stmt ]
+ %idxprom = sext i32 %i.0 to i64
+ %arrayidx = getelementptr inbounds i32, i32* %A, i64 %idxprom
+ store i32 %i.0, i32* %arrayidx, align 4, !polly_split_after !0
+ %idxprom1 = sext i32 %i.0 to i64
+ %arrayidx2 = getelementptr inbounds i32, i32* %B, i64 %idxprom1
+ store i32 %i.0, i32* %arrayidx2, align 4
+ %inc = add nsw i32 %j, 1
+ %cond = icmp slt i32 %j, 512
+ br i1 %cond, label %Stmt, 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
+}
+
+!0 = !{!"polly_split_after"}
More information about the llvm-commits
mailing list