diff options
| -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 |

