summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Kruse <llvm@meinersbur.de>2017-09-05 19:44:39 +0000
committerMichael Kruse <llvm@meinersbur.de>2017-09-05 19:44:39 +0000
commit420c4863a932cef3e7cb74fd1bf6cabbf6e5f62b (patch)
tree2f6e32dabcf4c49f0fcb3d2e28c70cec6b21dc32
parentdb419a6f7c13393c2f1b2ed4b6ed4148839263d1 (diff)
downloadbcm5719-llvm-420c4863a932cef3e7cb74fd1bf6cabbf6e5f62b.tar.gz
bcm5719-llvm-420c4863a932cef3e7cb74fd1bf6cabbf6e5f62b.zip
[Simplify] Actually remove unsed instruction from region header.
Since r312249 instructions of a entry block of region statements are not marked as root anymore and hence can theoretically be removed if unused. Theoretically, because the instruction list was not changed. Still, MemoryAccesses for unused instructions were removed. This lead to a failed assertion in the code generator when the MemoryAccess for the still listed instruction was not found. This hould fix the Assertion failed: ArrayAccess && "No array access found for instruction!", file ScopInfo.h, line 1494 compiler crashes. llvm-svn: 312566
-rw-r--r--polly/include/polly/ScopInfo.h2
-rw-r--r--polly/lib/Transform/Simplify.cpp5
-rw-r--r--polly/test/Simplify/ununsed_read_in_region_entry.ll62
3 files changed, 65 insertions, 4 deletions
diff --git a/polly/include/polly/ScopInfo.h b/polly/include/polly/ScopInfo.h
index c4f45de72f5..7baa641f237 100644
--- a/polly/include/polly/ScopInfo.h
+++ b/polly/include/polly/ScopInfo.h
@@ -1585,8 +1585,6 @@ public:
/// Set the list of instructions for this statement. It replaces the current
/// list.
void setInstructions(ArrayRef<Instruction *> Range) {
- assert(isBlockStmt() &&
- "The instruction list only matters for block-statements");
Instructions.assign(Range.begin(), Range.end());
}
diff --git a/polly/lib/Transform/Simplify.cpp b/polly/lib/Transform/Simplify.cpp
index 351e0275735..f56ac4f18cb 100644
--- a/polly/lib/Transform/Simplify.cpp
+++ b/polly/lib/Transform/Simplify.cpp
@@ -558,8 +558,9 @@ private:
// Remove all non-reachable instructions.
for (ScopStmt &Stmt : *S) {
- if (!Stmt.isBlockStmt())
- continue;
+ // Note that for region statements, we can only remove the non-terminator
+ // instructions of the entry block. All other instructions are not in the
+ // instructions list, but implicitly always part of the statement.
SmallVector<Instruction *, 32> AllInsts(Stmt.insts_begin(),
Stmt.insts_end());
diff --git a/polly/test/Simplify/ununsed_read_in_region_entry.ll b/polly/test/Simplify/ununsed_read_in_region_entry.ll
new file mode 100644
index 00000000000..4270013212d
--- /dev/null
+++ b/polly/test/Simplify/ununsed_read_in_region_entry.ll
@@ -0,0 +1,62 @@
+; RUN: opt %loadPolly -polly-simplify -analyze < %s | FileCheck %s -match-full-lines
+; RUN: opt %loadPolly -polly-simplify -polly-codegen -S < %s | FileCheck %s -check-prefix=CODEGEN
+;
+; for (int i = 0; i < n; i+=1) {
+; (void)A[0];
+; if (21.0 == 0.0)
+; B[0] = 42.0;
+; }
+;
+define void @func(i32 %n, double* noalias nonnull %A, double* noalias nonnull %B) {
+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 %region_entry, label %exit
+
+
+ region_entry:
+ %val = load double, double* %A
+ %cmp = fcmp oeq double 21.0, 0.0
+ br i1 %cmp, label %region_true, label %region_exit
+
+ region_true:
+ store double 42.0, double* %B
+ br label %region_exit
+
+ region_exit:
+ br label %body
+
+ body:
+ 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: Dead accesses removed: 1
+; CHECK: Dead instructions removed: 1
+; CHECK: }
+
+; CHECK: After accesses {
+; CHECK-NEXT: Stmt_region_entry__TO__region_exit
+; CHECK-NEXT: MayWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK-NEXT: [n] -> { Stmt_region_entry__TO__region_exit[i0] -> MemRef_B[0] };
+; CHECK-NEXT: }
+
+
+; CODEGEN: polly.stmt.region_entry:
+; CODEGEN-NEXT: %p_cmp = fcmp oeq double 2.100000e+01, 0.000000e+00
+; CODEGEN-NEXT: br i1 %p_cmp
OpenPOWER on IntegriCloud