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:
Johannes Doerfert 2015-10-04 15:00:05 +00:00
parent 634909c2c9
commit f17a78ef63
6 changed files with 110 additions and 14 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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