[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
This commit is contained in:
Michael Kruse 2017-09-05 19:44:39 +00:00
parent db419a6f7c
commit 420c4863a9
3 changed files with 65 additions and 4 deletions

View File

@ -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());
}

View File

@ -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());

View File

@ -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