diff options
| author | Michael Kruse <llvm@meinersbur.de> | 2017-09-05 19:44:39 +0000 |
|---|---|---|
| committer | Michael Kruse <llvm@meinersbur.de> | 2017-09-05 19:44:39 +0000 |
| commit | 420c4863a932cef3e7cb74fd1bf6cabbf6e5f62b (patch) | |
| tree | 2f6e32dabcf4c49f0fcb3d2e28c70cec6b21dc32 | |
| parent | db419a6f7c13393c2f1b2ed4b6ed4148839263d1 (diff) | |
| download | bcm5719-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.h | 2 | ||||
| -rw-r--r-- | polly/lib/Transform/Simplify.cpp | 5 | ||||
| -rw-r--r-- | polly/test/Simplify/ununsed_read_in_region_entry.ll | 62 |
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 |

