Remove non-executed statements during SCoP simplifcation
A statement with an empty domain complicates the invariant load hoisting and does not help any subsequent analysis or transformation. In fact it might introduce parameter dimensions or increase the schedule dimensionality. To this end, we remove statements with an empty domain early in the SCoP simplification. llvm-svn: 249276
This commit is contained in:
parent
634909c2c9
commit
f17a78ef63
|
@ -2373,7 +2373,10 @@ void Scop::simplifySCoP(bool RemoveIgnoredStmts) {
|
|||
? Stmt.getRegion()->getNode()
|
||||
: getRegion().getBBNode(Stmt.getBasicBlock());
|
||||
|
||||
if (StmtIt->isEmpty() || (RemoveIgnoredStmts && isIgnored(RN))) {
|
||||
if (StmtIt->isEmpty() ||
|
||||
isl_set_is_empty(DomainMap[getRegionNodeBasicBlock(RN)]) ||
|
||||
(RemoveIgnoredStmts && isIgnored(RN))) {
|
||||
|
||||
// Remove the statement because it is unnecessary.
|
||||
if (Stmt.isRegionStmt())
|
||||
for (BasicBlock *BB : Stmt.getRegion()->blocks())
|
||||
|
|
|
@ -0,0 +1,47 @@
|
|||
; RUN: opt %loadPolly -polly-codegen -polly-detect-unprofitable -analyze < %s
|
||||
;
|
||||
;
|
||||
; void f(int *A) {
|
||||
; for (int i = 1; i < 10; i++) {
|
||||
; A[i]++;
|
||||
; if (i > 10)
|
||||
; A[i] += A[0];
|
||||
; }
|
||||
; }
|
||||
;
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
|
||||
define void @f(i32* %A) {
|
||||
entry:
|
||||
br label %for.cond
|
||||
|
||||
for.cond: ; preds = %for.inc, %entry
|
||||
%indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 1, %entry ]
|
||||
%exitcond = icmp ne i64 %indvars.iv, 10
|
||||
br i1 %exitcond, label %for.body, label %for.end
|
||||
|
||||
for.body: ; preds = %for.cond
|
||||
%arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv
|
||||
%tmp = load i32, i32* %arrayidx, align 4
|
||||
%inc = add nsw i32 %tmp, 1
|
||||
store i32 %inc, i32* %arrayidx, align 4
|
||||
br i1 false, label %if.then, label %if.end
|
||||
|
||||
if.then: ; preds = %for.body
|
||||
%tmp1 = load i32, i32* %A, align 4
|
||||
%arrayidx4 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv
|
||||
%tmp2 = load i32, i32* %arrayidx4, align 4
|
||||
%add = add nsw i32 %tmp2, %tmp1
|
||||
store i32 %add, i32* %arrayidx4, align 4
|
||||
br label %if.end
|
||||
|
||||
if.end: ; preds = %if.then, %for.body
|
||||
br label %for.inc
|
||||
|
||||
for.inc: ; preds = %if.end
|
||||
%indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
|
||||
br label %for.cond
|
||||
|
||||
for.end: ; preds = %for.cond
|
||||
ret void
|
||||
}
|
|
@ -43,9 +43,7 @@ return: ; preds = %bb3, %entry
|
|||
ret void
|
||||
}
|
||||
|
||||
; CHECK: Stmt_bb1
|
||||
; CHECK: Domain :=
|
||||
; CHECK: [M, N] -> { Stmt_bb1[i0] : i0 >= 0 and i0 <= -1 + M };
|
||||
; CHECK: Stmt_bb2
|
||||
; CHECK: Domain :=
|
||||
; CHECK: [M, N] -> { Stmt_bb2[i0] : 1 = 0 };
|
||||
; CHECK: Stmt_bb1
|
||||
; CHECK: Domain :=
|
||||
; CHECK: [M] -> { Stmt_bb1[i0] : i0 >= 0 and i0 <= -1 + M };
|
||||
; CHECK-NOT: Stmt_bb2
|
||||
|
|
|
@ -22,9 +22,7 @@
|
|||
; }
|
||||
;
|
||||
; CHECK: Statements {
|
||||
; CHECK: Stmt_sw_default
|
||||
; CHECK: Domain :=
|
||||
; CHECK: [N] -> { Stmt_sw_default[i0] : 1 = 0 };
|
||||
; CHECK-NOT: Stmt_sw_default
|
||||
; CHECK: Stmt_sw_bb
|
||||
; CHECK: Domain :=
|
||||
; CHECK: [N] -> { Stmt_sw_bb[i0] : exists (e0 = floor((i0)/4): 4e0 = i0 and i0 >= 0 and i0 <= -1 + N) };
|
||||
|
|
|
@ -19,10 +19,8 @@
|
|||
; CHECK: Domain :=
|
||||
; CHECK: [N] -> { Stmt_for_body[0] : N >= 1 };
|
||||
; CHECK: Schedule :=
|
||||
; CHECK: [N] -> { Stmt_for_body[i0] -> [0, 0] };
|
||||
; CHECK: Stmt_sw_bb
|
||||
; CHECK: Domain :=
|
||||
; CHECK: [N] -> { Stmt_sw_bb[i0] : 1 = 0 };
|
||||
; CHECK: [N] -> { Stmt_for_body[i0] -> [0] };
|
||||
; CHECK-NOT: Stmt_sw_bb
|
||||
; CHECK: }
|
||||
;
|
||||
; AST: if (N >= 1)
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
; RUN: opt %loadPolly -polly-scops -polly-detect-unprofitable -analyze < %s | FileCheck %s
|
||||
;
|
||||
; CHECK: Invariant Accesses: {
|
||||
; CHECK-NEXT: }
|
||||
;
|
||||
; CHECK-NOT: Stmt_if_then
|
||||
;
|
||||
;
|
||||
; void f(int *A) {
|
||||
; for (int i = 1; i < 10; i++) {
|
||||
; A[i]++;
|
||||
; if (i > 10)
|
||||
; A[i] += A[0];
|
||||
; }
|
||||
; }
|
||||
;
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
|
||||
define void @f(i32* %A) {
|
||||
entry:
|
||||
br label %for.cond
|
||||
|
||||
for.cond: ; preds = %for.inc, %entry
|
||||
%indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ 1, %entry ]
|
||||
%exitcond = icmp ne i64 %indvars.iv, 10
|
||||
br i1 %exitcond, label %for.body, label %for.end
|
||||
|
||||
for.body: ; preds = %for.cond
|
||||
%arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv
|
||||
%tmp = load i32, i32* %arrayidx, align 4
|
||||
%inc = add nsw i32 %tmp, 1
|
||||
store i32 %inc, i32* %arrayidx, align 4
|
||||
br i1 false, label %if.then, label %if.end
|
||||
|
||||
if.then: ; preds = %for.body
|
||||
%tmp1 = load i32, i32* %A, align 4
|
||||
%arrayidx4 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv
|
||||
%tmp2 = load i32, i32* %arrayidx4, align 4
|
||||
%add = add nsw i32 %tmp2, %tmp1
|
||||
store i32 %add, i32* %arrayidx4, align 4
|
||||
br label %if.end
|
||||
|
||||
if.end: ; preds = %if.then, %for.body
|
||||
br label %for.inc
|
||||
|
||||
for.inc: ; preds = %if.end
|
||||
%indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
|
||||
br label %for.cond
|
||||
|
||||
for.end: ; preds = %for.cond
|
||||
ret void
|
||||
}
|
Loading…
Reference in New Issue