mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-24 14:20:17 +00:00
[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:
parent
db419a6f7c
commit
420c4863a9
@ -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());
|
||||
}
|
||||
|
||||
|
@ -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());
|
||||
|
62
polly/test/Simplify/ununsed_read_in_region_entry.ll
Normal file
62
polly/test/Simplify/ununsed_read_in_region_entry.ll
Normal 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
|
Loading…
Reference in New Issue
Block a user