Skip to content

Commit f1ee262

Browse files
author
Johannes Doerfert
committedOct 6, 2014
[Fix] Dead statements should not confuse the RTC generation
This fixes http://llvm.org/bugs/show_bug.cgi?id=21166 . Differential Revision: http://reviews.llvm.org/D5623 llvm-svn: 219131
1 parent a7a90a2 commit f1ee262

File tree

2 files changed

+61
-0
lines changed

2 files changed

+61
-0
lines changed
 

‎polly/lib/Analysis/ScopInfo.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -1270,6 +1270,14 @@ bool Scop::buildAliasGroups(AliasAnalysis &AA) {
12701270
DenseMap<Value *, MemoryAccess *> PtrToAcc;
12711271
DenseSet<Value *> HasWriteAccess;
12721272
for (ScopStmt *Stmt : *this) {
1273+
1274+
// Skip statements with an empty domain as they will never be executed.
1275+
isl_set *StmtDomain = Stmt->getDomain();
1276+
bool StmtDomainEmpty = isl_set_is_empty(StmtDomain);
1277+
isl_set_free(StmtDomain);
1278+
if (StmtDomainEmpty)
1279+
continue;
1280+
12731281
for (MemoryAccess *MA : *Stmt) {
12741282
if (MA->isScalar())
12751283
continue;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
; RUN: opt %loadPolly -polly-codegen-scev -polly-code-generator=isl -analyze -polly-scops < %s | FileCheck %s
2+
;
3+
; Check that RTC generation does not die when accesses are dead.
4+
;
5+
; CHECK: Alias Groups (0):
6+
;
7+
; void jd(int *A, int *B) {
8+
; for (int i = 0; i < 1024; i++)
9+
; for (int j = i; j < 0; j++)
10+
; A[i] = B[i];
11+
; }
12+
;
13+
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
14+
15+
define void @jd(i32* %A, i32* %B) {
16+
entry:
17+
br label %for.cond
18+
19+
for.cond: ; preds = %for.inc6, %entry
20+
%indvars.iv = phi i64 [ %indvars.iv.next, %for.inc6 ], [ 0, %entry ]
21+
%exitcond = icmp ne i64 %indvars.iv, 1024
22+
br i1 %exitcond, label %for.body, label %for.end8
23+
24+
for.body: ; preds = %for.cond
25+
%tmp = trunc i64 %indvars.iv to i32
26+
br label %for.cond1
27+
28+
for.cond1: ; preds = %for.inc, %for.body
29+
%j.0 = phi i32 [ %tmp, %for.body ], [ %inc, %for.inc ]
30+
%cmp2 = icmp slt i32 %j.0, 0
31+
br i1 %cmp2, label %for.body3, label %for.end
32+
33+
for.body3: ; preds = %for.cond1
34+
%arrayidx = getelementptr inbounds i32* %B, i64 %indvars.iv
35+
%tmp1 = load i32* %arrayidx, align 4
36+
%arrayidx5 = getelementptr inbounds i32* %A, i64 %indvars.iv
37+
store i32 %tmp1, i32* %arrayidx5, align 4
38+
br label %for.inc
39+
40+
for.inc: ; preds = %for.body3
41+
%inc = add nsw i32 %j.0, 1
42+
br label %for.cond1
43+
44+
for.end: ; preds = %for.cond1
45+
br label %for.inc6
46+
47+
for.inc6: ; preds = %for.end
48+
%indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
49+
br label %for.cond
50+
51+
for.end8: ; preds = %for.cond
52+
ret void
53+
}

0 commit comments

Comments
 (0)
Please sign in to comment.