[polly] r312566 - [Simplify] Actually remove unsed instruction from region header.

Michael Kruse via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 5 12:44:39 PDT 2017


Author: meinersbur
Date: Tue Sep  5 12:44:39 2017
New Revision: 312566

URL: http://llvm.org/viewvc/llvm-project?rev=312566&view=rev
Log:
[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.

Added:
    polly/trunk/test/Simplify/ununsed_read_in_region_entry.ll
Modified:
    polly/trunk/include/polly/ScopInfo.h
    polly/trunk/lib/Transform/Simplify.cpp

Modified: polly/trunk/include/polly/ScopInfo.h
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/ScopInfo.h?rev=312566&r1=312565&r2=312566&view=diff
==============================================================================
--- polly/trunk/include/polly/ScopInfo.h (original)
+++ polly/trunk/include/polly/ScopInfo.h Tue Sep  5 12:44:39 2017
@@ -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());
   }
 

Modified: polly/trunk/lib/Transform/Simplify.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Transform/Simplify.cpp?rev=312566&r1=312565&r2=312566&view=diff
==============================================================================
--- polly/trunk/lib/Transform/Simplify.cpp (original)
+++ polly/trunk/lib/Transform/Simplify.cpp Tue Sep  5 12:44:39 2017
@@ -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());

Added: polly/trunk/test/Simplify/ununsed_read_in_region_entry.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/Simplify/ununsed_read_in_region_entry.ll?rev=312566&view=auto
==============================================================================
--- polly/trunk/test/Simplify/ununsed_read_in_region_entry.ll (added)
+++ polly/trunk/test/Simplify/ununsed_read_in_region_entry.ll Tue Sep  5 12:44:39 2017
@@ -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




More information about the llvm-commits mailing list