[polly] r312249 - [ForwardOpTree] Allow forwarding in the presence of region statements
Tobias Grosser via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 31 09:04:49 PDT 2017
Author: grosser
Date: Thu Aug 31 09:04:49 2017
New Revision: 312249
URL: http://llvm.org/viewvc/llvm-project?rev=312249&view=rev
Log:
[ForwardOpTree] Allow forwarding in the presence of region statements
Summary:
After region statements now also have instruction lists, this is a
straightforward extension.
Reviewers: Meinersbur, bollu, singam-sanjay, gareevroman
Reviewed By: Meinersbur
Subscribers: hfinkel, pollydev, llvm-commits
Tags: #polly
Differential Revision: https://reviews.llvm.org/D37298
Added:
polly/trunk/test/ForwardOpTree/forward_from_region.ll
polly/trunk/test/ForwardOpTree/forward_into_region.ll
polly/trunk/test/ForwardOpTree/noforward_from_region.ll
- copied, changed from r312239, polly/trunk/test/ForwardOpTree/noforward_region.ll
Removed:
polly/trunk/test/ForwardOpTree/noforward_region.ll
Modified:
polly/trunk/include/polly/ScopInfo.h
polly/trunk/lib/Support/VirtualInstruction.cpp
polly/trunk/lib/Transform/ForwardOpTree.cpp
Modified: polly/trunk/include/polly/ScopInfo.h
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/ScopInfo.h?rev=312249&r1=312248&r2=312249&view=diff
==============================================================================
--- polly/trunk/include/polly/ScopInfo.h (original)
+++ polly/trunk/include/polly/ScopInfo.h Thu Aug 31 09:04:49 2017
@@ -1601,7 +1601,6 @@ public:
/// Insert an instruction before all other instructions in this statement.
void prependInstruction(Instruction *Inst) {
- assert(isBlockStmt() && "Only block statements support instruction lists");
Instructions.insert(Instructions.begin(), Inst);
}
Modified: polly/trunk/lib/Support/VirtualInstruction.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Support/VirtualInstruction.cpp?rev=312249&r1=312248&r2=312249&view=diff
==============================================================================
--- polly/trunk/lib/Support/VirtualInstruction.cpp (original)
+++ polly/trunk/lib/Support/VirtualInstruction.cpp Thu Aug 31 09:04:49 2017
@@ -180,12 +180,16 @@ static bool isEscaping(MemoryAccess *MA)
static void
addInstructionRoots(ScopStmt *Stmt,
SmallVectorImpl<VirtualInstruction> &RootInsts) {
- // For region statements we must keep all instructions because we do not
- // support removing instructions from region statements.
if (!Stmt->isBlockStmt()) {
- for (auto *BB : Stmt->getRegion()->blocks())
- for (Instruction &Inst : *BB)
- RootInsts.emplace_back(Stmt, &Inst);
+ // In region statements the terminator statement and all statements that
+ // are not in the entry block cannot be eliminated and consequently must
+ // be roots.
+ RootInsts.emplace_back(Stmt,
+ Stmt->getRegion()->getEntry()->getTerminator());
+ for (BasicBlock *BB : Stmt->getRegion()->blocks())
+ if (Stmt->getRegion()->getEntry() != BB)
+ for (Instruction &Inst : *BB)
+ RootInsts.emplace_back(Stmt, &Inst);
return;
}
Modified: polly/trunk/lib/Transform/ForwardOpTree.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Transform/ForwardOpTree.cpp?rev=312249&r1=312248&r2=312249&view=diff
==============================================================================
--- polly/trunk/lib/Transform/ForwardOpTree.cpp (original)
+++ polly/trunk/lib/Transform/ForwardOpTree.cpp Thu Aug 31 09:04:49 2017
@@ -767,10 +767,6 @@ public:
/// to forward them into the statement.
bool forwardOperandTrees() {
for (ScopStmt &Stmt : *S) {
- // Currently we cannot modify the instruction list of region statements.
- if (!Stmt.isBlockStmt())
- continue;
-
bool StmtModified = false;
// Because we are modifying the MemoryAccess list, collect them first to
Added: polly/trunk/test/ForwardOpTree/forward_from_region.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ForwardOpTree/forward_from_region.ll?rev=312249&view=auto
==============================================================================
--- polly/trunk/test/ForwardOpTree/forward_from_region.ll (added)
+++ polly/trunk/test/ForwardOpTree/forward_from_region.ll Thu Aug 31 09:04:49 2017
@@ -0,0 +1,78 @@
+; RUN: opt %loadPolly -polly-optree -analyze < %s | FileCheck %s -match-full-lines
+;
+; Move instructions from region statements.
+;
+; for (int j = 0; j < n; j += 1) {
+; bodyA:
+; double val = 21.0 + 21.0;
+; if (cond)
+;
+; bodyA_true:
+; A[0] = 42;
+;
+; bodyB:
+; A[0] = val;
+; }
+;
+define void @func(i32 %n, double* noalias nonnull %A) {
+entry:
+ br label %for
+
+for:
+ %j = phi i32 [0, %entry], [%j.inc, %inc]
+ %j.cmp = icmp slt i32 %j, %n
+ br i1 %j.cmp, label %bodyA, label %exit
+
+ bodyA:
+ %val = fadd double 21.0, 21.0
+ %cond = fcmp oeq double 21.0, 21.0
+ br i1 %cond, label %bodyA_true, label %bodyB
+
+ bodyA_true:
+ store double 42.0, double* %A
+ br label %bodyB
+
+ bodyB:
+ store double %val, double* %A
+ br label %bodyB_exit
+
+ bodyB_exit:
+ br label %inc
+
+inc:
+ %j.inc = add nuw nsw i32 %j, 1
+ br label %for
+
+exit:
+ br label %return
+
+return:
+ ret void
+}
+
+; CHECK: Statistics {
+; CHECK: Instructions copied: 1
+; CHECK: Known loads forwarded: 0
+; CHECK: Read-only accesses copied: 0
+; CHECK: Operand trees forwarded: 1
+; CHECK: Statements with forwarded operand trees: 1
+; CHECK: }
+; CHECK: After statements {
+; CHECK: Stmt_bodyA__TO__bodyB
+; CHECK: MayWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK: [n] -> { Stmt_bodyA__TO__bodyB[i0] -> MemRef_A[0] };
+; CHECK: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
+; CHECK: [n] -> { Stmt_bodyA__TO__bodyB[i0] -> MemRef_val[] };
+; CHECK: Instructions {
+; CHECK: %val = fadd double 2.100000e+01, 2.100000e+01
+; CHECK: %cond = fcmp oeq double 2.100000e+01, 2.100000e+01
+; CHECK: }
+; CHECK: Stmt_bodyB
+; CHECK: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK: [n] -> { Stmt_bodyB[i0] -> MemRef_A[0] };
+; CHECK: Instructions {
+; CHECK: %val = fadd double 2.100000e+01, 2.100000e+01
+; CHECK: store double %val, double* %A
+; CHECK: }
+; CHECK: }
+
Added: polly/trunk/test/ForwardOpTree/forward_into_region.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ForwardOpTree/forward_into_region.ll?rev=312249&view=auto
==============================================================================
--- polly/trunk/test/ForwardOpTree/forward_into_region.ll (added)
+++ polly/trunk/test/ForwardOpTree/forward_into_region.ll Thu Aug 31 09:04:49 2017
@@ -0,0 +1,72 @@
+; RUN: opt %loadPolly -polly-optree -analyze < %s | FileCheck %s -match-full-lines
+;
+; Move instructions to region statements.
+;
+; for (int j = 0; j < n; j += 1) {
+; bodyA:
+; double val = 21.0 + 21.0;
+;
+; bodyB:
+; if (cond)
+; body_true:
+; A[0] = val;
+; }
+;
+define void @func(i32 %n, double* noalias nonnull %A) {
+entry:
+ br label %for
+
+for:
+ %j = phi i32 [0, %entry], [%j.inc, %inc]
+ %j.cmp = icmp slt i32 %j, %n
+ br i1 %j.cmp, label %bodyA, label %exit
+
+ bodyA:
+ %val = fadd double 21.0, 21.0
+ br label %bodyB
+
+ bodyB:
+ %cond = fcmp oeq double 21.0, 21.0
+ br i1 %cond, label %bodyB_true, label %bodyB_exit
+
+ bodyB_true:
+ store double %val, double* %A
+ br label %bodyB_exit
+
+ bodyB_exit:
+ br label %inc
+
+inc:
+ %j.inc = add nuw nsw i32 %j, 1
+ br label %for
+
+exit:
+ br label %return
+
+return:
+ ret void
+}
+
+; CHECK: Statistics {
+; CHECK: Instructions copied: 1
+; CHECK: Known loads forwarded: 0
+; CHECK: Read-only accesses copied: 0
+; CHECK: Operand trees forwarded: 1
+; CHECK: Statements with forwarded operand trees: 1
+; CHECK: }
+
+; CHECK: After statements {
+; CHECK-NEXT: Stmt_bodyA
+; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
+; CHECK-NEXT: [n] -> { Stmt_bodyA[i0] -> MemRef_val[] };
+; CHECK-NEXT: Instructions {
+; CHECK-NEXT: %val = fadd double 2.100000e+01, 2.100000e+01
+; CHECK-NEXT: }
+; CHECK-NEXT: Stmt_bodyB__TO__bodyB_exit
+; CHECK-NEXT: MayWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: [n] -> { Stmt_bodyB__TO__bodyB_exit[i0] -> MemRef_A[0] };
+; CHECK-NEXT: Instructions {
+; CHECK-NEXT: %val = fadd double 2.100000e+01, 2.100000e+01
+; CHECK-NEXT: %cond = fcmp oeq double 2.100000e+01, 2.100000e+01
+; CHECK-NEXT: }
+; CHECK-NEXT: }
Copied: polly/trunk/test/ForwardOpTree/noforward_from_region.ll (from r312239, polly/trunk/test/ForwardOpTree/noforward_region.ll)
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ForwardOpTree/noforward_from_region.ll?p2=polly/trunk/test/ForwardOpTree/noforward_from_region.ll&p1=polly/trunk/test/ForwardOpTree/noforward_region.ll&r1=312239&r2=312249&rev=312249&view=diff
==============================================================================
--- polly/trunk/test/ForwardOpTree/noforward_region.ll (original)
+++ polly/trunk/test/ForwardOpTree/noforward_from_region.ll Thu Aug 31 09:04:49 2017
@@ -1,14 +1,19 @@
; RUN: opt %loadPolly -polly-optree -analyze < %s | FileCheck %s -match-full-lines
;
-; Do not move instructions to region statements.
+; Ensure we do not move instructions from region statements in case the
+; instruction to move loads from an array which is also written to from
+; within the region. This is necessary as complex region statements may prevent
+; us from detecting possible memory conflicts.
;
; for (int j = 0; j < n; j += 1) {
; bodyA:
-; double val = 21.0 + 21.0;
+; double val = A[0];
+; if (cond)
;
-; bodyB_entry:
-; if (undef)
-; body_true:
+; bodyA_true:
+; A[0] = 42;
+;
+; bodyB:
; A[0] = val;
; }
;
@@ -22,14 +27,15 @@ for:
br i1 %j.cmp, label %bodyA, label %exit
bodyA:
- %val = fadd double 21.0, 21.0
+ %val = load double, double* %A
+ %cond = fcmp oeq double 21.0, 21.0
+ br i1 %cond, label %bodyA_true, label %bodyB
+
+ bodyA_true:
+ store double 42.0, double* %A
br label %bodyB
bodyB:
- %cond = fcmp oeq double 21.0, 21.0
- br i1 %cond, label %bodyB_true, label %bodyB_exit
-
- bodyB_true:
store double %val, double* %A
br label %bodyB_exit
@@ -47,5 +53,4 @@ return:
ret void
}
-
; CHECK: ForwardOpTree executed, but did not modify anything
Removed: polly/trunk/test/ForwardOpTree/noforward_region.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ForwardOpTree/noforward_region.ll?rev=312248&view=auto
==============================================================================
--- polly/trunk/test/ForwardOpTree/noforward_region.ll (original)
+++ polly/trunk/test/ForwardOpTree/noforward_region.ll (removed)
@@ -1,51 +0,0 @@
-; RUN: opt %loadPolly -polly-optree -analyze < %s | FileCheck %s -match-full-lines
-;
-; Do not move instructions to region statements.
-;
-; for (int j = 0; j < n; j += 1) {
-; bodyA:
-; double val = 21.0 + 21.0;
-;
-; bodyB_entry:
-; if (undef)
-; body_true:
-; A[0] = val;
-; }
-;
-define void @func(i32 %n, double* noalias nonnull %A) {
-entry:
- br label %for
-
-for:
- %j = phi i32 [0, %entry], [%j.inc, %inc]
- %j.cmp = icmp slt i32 %j, %n
- br i1 %j.cmp, label %bodyA, label %exit
-
- bodyA:
- %val = fadd double 21.0, 21.0
- br label %bodyB
-
- bodyB:
- %cond = fcmp oeq double 21.0, 21.0
- br i1 %cond, label %bodyB_true, label %bodyB_exit
-
- bodyB_true:
- store double %val, double* %A
- br label %bodyB_exit
-
- bodyB_exit:
- br label %inc
-
-inc:
- %j.inc = add nuw nsw i32 %j, 1
- br label %for
-
-exit:
- br label %return
-
-return:
- ret void
-}
-
-
-; CHECK: ForwardOpTree executed, but did not modify anything
More information about the llvm-commits
mailing list