blob: e9fc845e3fdb8f42656a526bdaf7d2c4472e656d [file] [log] [blame]
Arthur Eubanks9db0c572020-09-15 21:10:22 -07001; RUN: opt < %s -basic-aa -da -analyze -enable-new-pm=0 -delinearize
2; RUN: opt < %s -aa-pipeline=basic-aa -passes='require<da>,print<delinearization>' -disable-output
Sebastian Popb5b84e02014-04-08 21:21:05 +00003;
4; a, b, c, d, g, h;
5; char *f;
6; static fn1(p1) {
7; char *e = p1;
8; for (; d;) {
9; a = 0;
10; for (;; ++a)
11; for (; b; ++b)
12; c = e[b + a];
13; }
14; }
15;
16; fn2() {
17; for (;;)
18; fn1(&f[g * h]);
19; }
20
21@g = common global i32 0, align 4
22@h = common global i32 0, align 4
23@f = common global i8* null, align 4
24@a = common global i32 0, align 4
25@b = common global i32 0, align 4
26@c = common global i32 0, align 4
27@d = common global i32 0, align 4
28
29define i32 @fn2() {
30entry:
David Blaikiea79ac142015-02-27 21:17:42 +000031 %.pr = load i32, i32* @d, align 4
Sebastian Popb5b84e02014-04-08 21:21:05 +000032 %phitmp = icmp eq i32 %.pr, 0
33 br label %for.cond
34
35for.cond:
36 %0 = phi i1 [ true, %for.cond ], [ %phitmp, %entry ]
37 br i1 %0, label %for.cond, label %for.cond2thread-pre-split.preheader.i
38
39for.cond2thread-pre-split.preheader.i:
David Blaikiea79ac142015-02-27 21:17:42 +000040 %1 = load i32, i32* @g, align 4
41 %2 = load i32, i32* @h, align 4
Sebastian Popb5b84e02014-04-08 21:21:05 +000042 %mul = mul nsw i32 %2, %1
David Blaikiea79ac142015-02-27 21:17:42 +000043 %3 = load i8*, i8** @f, align 4
44 %.pr.pre.i = load i32, i32* @b, align 4
Sebastian Popb5b84e02014-04-08 21:21:05 +000045 br label %for.cond2thread-pre-split.i
46
47for.cond2thread-pre-split.i:
48 %.pr.i = phi i32 [ 0, %for.inc5.i ], [ %.pr.pre.i, %for.cond2thread-pre-split.preheader.i ]
49 %storemerge.i = phi i32 [ %inc6.i, %for.inc5.i ], [ 0, %for.cond2thread-pre-split.preheader.i ]
50 store i32 %storemerge.i, i32* @a, align 4
51 %tobool31.i = icmp eq i32 %.pr.i, 0
52 br i1 %tobool31.i, label %for.inc5.i, label %for.body4.preheader.i
53
54for.body4.preheader.i:
55 %4 = icmp slt i32 %.pr.i, -7
56 %add.i = add i32 %storemerge.i, %mul
57 br i1 %4, label %for.body4.i.preheader, label %for.body4.ur.i.preheader
58
59for.body4.i.preheader:
60 %5 = sub i32 -8, %.pr.i
61 %6 = lshr i32 %5, 3
62 %7 = mul i32 %6, 8
63 br label %for.body4.i
64
65for.body4.i:
66 %8 = phi i32 [ %inc.7.i, %for.body4.i ], [ %.pr.i, %for.body4.i.preheader ]
67 %arrayidx.sum1 = add i32 %add.i, %8
David Blaikie79e6c742015-02-27 19:29:02 +000068 %arrayidx.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum1
David Blaikiea79ac142015-02-27 21:17:42 +000069 %9 = load i8, i8* %arrayidx.i, align 1
Sebastian Popb5b84e02014-04-08 21:21:05 +000070 %conv.i = sext i8 %9 to i32
71 store i32 %conv.i, i32* @c, align 4
72 %inc.i = add nsw i32 %8, 1
73 store i32 %inc.i, i32* @b, align 4
74 %arrayidx.sum2 = add i32 %add.i, %inc.i
David Blaikie79e6c742015-02-27 19:29:02 +000075 %arrayidx.1.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum2
David Blaikiea79ac142015-02-27 21:17:42 +000076 %10 = load i8, i8* %arrayidx.1.i, align 1
Sebastian Popb5b84e02014-04-08 21:21:05 +000077 %conv.1.i = sext i8 %10 to i32
78 store i32 %conv.1.i, i32* @c, align 4
79 %inc.1.i = add nsw i32 %8, 2
80 store i32 %inc.1.i, i32* @b, align 4
81 %arrayidx.sum3 = add i32 %add.i, %inc.1.i
David Blaikie79e6c742015-02-27 19:29:02 +000082 %arrayidx.2.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum3
David Blaikiea79ac142015-02-27 21:17:42 +000083 %11 = load i8, i8* %arrayidx.2.i, align 1
Sebastian Popb5b84e02014-04-08 21:21:05 +000084 %conv.2.i = sext i8 %11 to i32
85 store i32 %conv.2.i, i32* @c, align 4
86 %inc.2.i = add nsw i32 %8, 3
87 store i32 %inc.2.i, i32* @b, align 4
88 %arrayidx.sum4 = add i32 %add.i, %inc.2.i
David Blaikie79e6c742015-02-27 19:29:02 +000089 %arrayidx.3.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum4
David Blaikiea79ac142015-02-27 21:17:42 +000090 %12 = load i8, i8* %arrayidx.3.i, align 1
Sebastian Popb5b84e02014-04-08 21:21:05 +000091 %conv.3.i = sext i8 %12 to i32
92 store i32 %conv.3.i, i32* @c, align 4
93 %inc.3.i = add nsw i32 %8, 4
94 store i32 %inc.3.i, i32* @b, align 4
95 %arrayidx.sum5 = add i32 %add.i, %inc.3.i
David Blaikie79e6c742015-02-27 19:29:02 +000096 %arrayidx.4.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum5
David Blaikiea79ac142015-02-27 21:17:42 +000097 %13 = load i8, i8* %arrayidx.4.i, align 1
Sebastian Popb5b84e02014-04-08 21:21:05 +000098 %conv.4.i = sext i8 %13 to i32
99 store i32 %conv.4.i, i32* @c, align 4
100 %inc.4.i = add nsw i32 %8, 5
101 store i32 %inc.4.i, i32* @b, align 4
102 %arrayidx.sum6 = add i32 %add.i, %inc.4.i
David Blaikie79e6c742015-02-27 19:29:02 +0000103 %arrayidx.5.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum6
David Blaikiea79ac142015-02-27 21:17:42 +0000104 %14 = load i8, i8* %arrayidx.5.i, align 1
Sebastian Popb5b84e02014-04-08 21:21:05 +0000105 %conv.5.i = sext i8 %14 to i32
106 store i32 %conv.5.i, i32* @c, align 4
107 %inc.5.i = add nsw i32 %8, 6
108 store i32 %inc.5.i, i32* @b, align 4
109 %arrayidx.sum7 = add i32 %add.i, %inc.5.i
David Blaikie79e6c742015-02-27 19:29:02 +0000110 %arrayidx.6.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum7
David Blaikiea79ac142015-02-27 21:17:42 +0000111 %15 = load i8, i8* %arrayidx.6.i, align 1
Sebastian Popb5b84e02014-04-08 21:21:05 +0000112 %conv.6.i = sext i8 %15 to i32
113 store i32 %conv.6.i, i32* @c, align 4
114 %inc.6.i = add nsw i32 %8, 7
115 store i32 %inc.6.i, i32* @b, align 4
116 %arrayidx.sum8 = add i32 %add.i, %inc.6.i
David Blaikie79e6c742015-02-27 19:29:02 +0000117 %arrayidx.7.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum8
David Blaikiea79ac142015-02-27 21:17:42 +0000118 %16 = load i8, i8* %arrayidx.7.i, align 1
Sebastian Popb5b84e02014-04-08 21:21:05 +0000119 %conv.7.i = sext i8 %16 to i32
120 store i32 %conv.7.i, i32* @c, align 4
121 %inc.7.i = add nsw i32 %8, 8
122 store i32 %inc.7.i, i32* @b, align 4
123 %tobool3.7.i = icmp sgt i32 %inc.7.i, -8
124 br i1 %tobool3.7.i, label %for.inc5.loopexit.ur-lcssa.i, label %for.body4.i
125
126for.inc5.loopexit.ur-lcssa.i:
127 %17 = add i32 %.pr.i, 8
128 %18 = add i32 %17, %7
129 %19 = icmp eq i32 %18, 0
130 br i1 %19, label %for.inc5.i, label %for.body4.ur.i.preheader
131
132for.body4.ur.i.preheader:
133 %.ph = phi i32 [ %18, %for.inc5.loopexit.ur-lcssa.i ], [ %.pr.i, %for.body4.preheader.i ]
134 br label %for.body4.ur.i
135
136for.body4.ur.i:
137 %20 = phi i32 [ %inc.ur.i, %for.body4.ur.i ], [ %.ph, %for.body4.ur.i.preheader ]
138 %arrayidx.sum = add i32 %add.i, %20
David Blaikie79e6c742015-02-27 19:29:02 +0000139 %arrayidx.ur.i = getelementptr inbounds i8, i8* %3, i32 %arrayidx.sum
David Blaikiea79ac142015-02-27 21:17:42 +0000140 %21 = load i8, i8* %arrayidx.ur.i, align 1
Sebastian Popb5b84e02014-04-08 21:21:05 +0000141 %conv.ur.i = sext i8 %21 to i32
142 store i32 %conv.ur.i, i32* @c, align 4
143 %inc.ur.i = add nsw i32 %20, 1
144 store i32 %inc.ur.i, i32* @b, align 4
145 %tobool3.ur.i = icmp eq i32 %inc.ur.i, 0
146 br i1 %tobool3.ur.i, label %for.inc5.i.loopexit, label %for.body4.ur.i
147
148for.inc5.i.loopexit:
149 br label %for.inc5.i
150
151for.inc5.i:
152 %inc6.i = add nsw i32 %storemerge.i, 1
153 br label %for.cond2thread-pre-split.i
154}