blob: 493866f2df7e0f53fb9809a1e60a0b82cc6c61ae [file] [log] [blame]
Johannes Doerfertf61df692015-10-04 14:56:08 +00001; RUN: opt %loadPolly -polly-detect -analyze \
2; RUN: -polly-allow-nonaffine-loops < %s | FileCheck %s
3;
4; RUN: opt %loadPolly -polly-detect -polly-detect-unprofitable -analyze \
5; RUN: -polly-allow-nonaffine-loops < %s | FileCheck %s --check-prefix=UNPROFIT
6;
7; Even if we allow non-affine loops we can only model the outermost loop, all
8; other loops are boxed in non-affine regions
9;
10; CHECK-NOT: Valid
11; UNPROFIT: Valid Region for Scop: for.cond => for.end.51
12;
13; void f(int *A) {
14; for (int i = 0; i < 100; i++) {
15; // Non-affine
16; for (int j = 0; j < i * i; j++)
17; for (int k = 0; k < i; k++)
18; A[i]++;
19; // Non-affine
20; for (int j = 0; j < i * i; j++)
21; // Non-affine
22; for (int k = 0; k < j; k++)
23; A[i]++;
24; // Non-affine
25; if (A[i])
26; for (int j = 0; j < 100; j++)
27; for (int k = 0; k < j * j; k++)
28; A[i]++;
29; }
30; }
31;
32target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
33
34define void @f(i32* %A) {
35entry:
36 br label %for.cond
37
38for.cond: ; preds = %for.inc.49, %entry
39 %indvars.iv5 = phi i64 [ %indvars.iv.next6, %for.inc.49 ], [ 0, %entry ]
40 %indvars.iv = phi i32 [ %indvars.iv.next, %for.inc.49 ], [ 0, %entry ]
41 %exitcond9 = icmp ne i64 %indvars.iv5, 100
42 br i1 %exitcond9, label %for.body, label %for.end.51
43
44for.body: ; preds = %for.cond
45 br label %for.cond.1
46
47for.cond.1: ; preds = %for.inc.8, %for.body
48 %j.0 = phi i32 [ 0, %for.body ], [ %inc9, %for.inc.8 ]
49 %tmp = mul nsw i64 %indvars.iv5, %indvars.iv5
50 %tmp10 = sext i32 %j.0 to i64
51 %cmp2 = icmp slt i64 %tmp10, %tmp
52 br i1 %cmp2, label %for.body.3, label %for.end.10
53
54for.body.3: ; preds = %for.cond.1
55 br label %for.cond.4
56
57for.cond.4: ; preds = %for.inc, %for.body.3
58 %k.0 = phi i32 [ 0, %for.body.3 ], [ %inc7, %for.inc ]
59 %exitcond = icmp ne i32 %k.0, %indvars.iv
60 br i1 %exitcond, label %for.body.6, label %for.end
61
62for.body.6: ; preds = %for.cond.4
63 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv5
64 %tmp11 = load i32, i32* %arrayidx, align 4
65 %inc = add nsw i32 %tmp11, 1
66 store i32 %inc, i32* %arrayidx, align 4
67 br label %for.inc
68
69for.inc: ; preds = %for.body.6
70 %inc7 = add nuw nsw i32 %k.0, 1
71 br label %for.cond.4
72
73for.end: ; preds = %for.cond.4
74 br label %for.inc.8
75
76for.inc.8: ; preds = %for.end
77 %inc9 = add nuw nsw i32 %j.0, 1
78 br label %for.cond.1
79
80for.end.10: ; preds = %for.cond.1
81 br label %for.cond.12
82
83for.cond.12: ; preds = %for.inc.26, %for.end.10
84 %indvars.iv1 = phi i32 [ %indvars.iv.next2, %for.inc.26 ], [ 0, %for.end.10 ]
85 %tmp12 = mul nsw i64 %indvars.iv5, %indvars.iv5
86 %tmp13 = sext i32 %indvars.iv1 to i64
87 %cmp14 = icmp slt i64 %tmp13, %tmp12
88 br i1 %cmp14, label %for.body.15, label %for.end.28
89
90for.body.15: ; preds = %for.cond.12
91 br label %for.cond.17
92
93for.cond.17: ; preds = %for.inc.23, %for.body.15
94 %k16.0 = phi i32 [ 0, %for.body.15 ], [ %inc24, %for.inc.23 ]
95 %exitcond3 = icmp ne i32 %k16.0, %indvars.iv1
96 br i1 %exitcond3, label %for.body.19, label %for.end.25
97
98for.body.19: ; preds = %for.cond.17
99 %arrayidx21 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv5
100 %tmp14 = load i32, i32* %arrayidx21, align 4
101 %inc22 = add nsw i32 %tmp14, 1
102 store i32 %inc22, i32* %arrayidx21, align 4
103 br label %for.inc.23
104
105for.inc.23: ; preds = %for.body.19
106 %inc24 = add nuw nsw i32 %k16.0, 1
107 br label %for.cond.17
108
109for.end.25: ; preds = %for.cond.17
110 br label %for.inc.26
111
112for.inc.26: ; preds = %for.end.25
113 %indvars.iv.next2 = add nuw nsw i32 %indvars.iv1, 1
114 br label %for.cond.12
115
116for.end.28: ; preds = %for.cond.12
117 %arrayidx30 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv5
118 %tmp15 = load i32, i32* %arrayidx30, align 4
119 %tobool = icmp eq i32 %tmp15, 0
120 br i1 %tobool, label %if.end, label %if.then
121
122if.then: ; preds = %for.end.28
123 br label %for.cond.32
124
125for.cond.32: ; preds = %for.inc.46, %if.then
126 %j31.0 = phi i32 [ 0, %if.then ], [ %inc47, %for.inc.46 ]
127 %exitcond4 = icmp ne i32 %j31.0, 100
128 br i1 %exitcond4, label %for.body.34, label %for.end.48
129
130for.body.34: ; preds = %for.cond.32
131 br label %for.cond.36
132
133for.cond.36: ; preds = %for.inc.43, %for.body.34
134 %k35.0 = phi i32 [ 0, %for.body.34 ], [ %inc44, %for.inc.43 ]
135 %mul37 = mul nsw i32 %j31.0, %j31.0
136 %cmp38 = icmp slt i32 %k35.0, %mul37
137 br i1 %cmp38, label %for.body.39, label %for.end.45
138
139for.body.39: ; preds = %for.cond.36
140 %arrayidx41 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv5
141 %tmp16 = load i32, i32* %arrayidx41, align 4
142 %inc42 = add nsw i32 %tmp16, 1
143 store i32 %inc42, i32* %arrayidx41, align 4
144 br label %for.inc.43
145
146for.inc.43: ; preds = %for.body.39
147 %inc44 = add nuw nsw i32 %k35.0, 1
148 br label %for.cond.36
149
150for.end.45: ; preds = %for.cond.36
151 br label %for.inc.46
152
153for.inc.46: ; preds = %for.end.45
154 %inc47 = add nuw nsw i32 %j31.0, 1
155 br label %for.cond.32
156
157for.end.48: ; preds = %for.cond.32
158 br label %if.end
159
160if.end: ; preds = %for.end.28, %for.end.48
161 br label %for.inc.49
162
163for.inc.49: ; preds = %if.end
164 %indvars.iv.next6 = add nuw nsw i64 %indvars.iv5, 1
165 %indvars.iv.next = add nuw nsw i32 %indvars.iv, 1
166 br label %for.cond
167
168for.end.51: ; preds = %for.cond
169 ret void
170}