• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1target datalayout = "e-i64:64-f80:128-n8:16:32:64-S128"
2; RUN: opt < %s -alignment-from-assumptions -S | FileCheck %s
3
4define i32 @foo(i32* nocapture %a) nounwind uwtable readonly {
5entry:
6  %ptrint = ptrtoint i32* %a to i64
7  %maskedptr = and i64 %ptrint, 31
8  %maskcond = icmp eq i64 %maskedptr, 0
9  tail call void @llvm.assume(i1 %maskcond)
10  %0 = load i32, i32* %a, align 4
11  ret i32 %0
12
13; CHECK-LABEL: @foo
14; CHECK: load i32, i32* {{[^,]+}}, align 32
15; CHECK: ret i32
16}
17
18define i32 @foo2(i32* nocapture %a) nounwind uwtable readonly {
19entry:
20  %ptrint = ptrtoint i32* %a to i64
21  %offsetptr = add i64 %ptrint, 24
22  %maskedptr = and i64 %offsetptr, 31
23  %maskcond = icmp eq i64 %maskedptr, 0
24  tail call void @llvm.assume(i1 %maskcond)
25  %arrayidx = getelementptr inbounds i32, i32* %a, i64 2
26  %0 = load i32, i32* %arrayidx, align 4
27  ret i32 %0
28
29; CHECK-LABEL: @foo2
30; CHECK: load i32, i32* {{[^,]+}}, align 16
31; CHECK: ret i32
32}
33
34define i32 @foo2a(i32* nocapture %a) nounwind uwtable readonly {
35entry:
36  %ptrint = ptrtoint i32* %a to i64
37  %offsetptr = add i64 %ptrint, 28
38  %maskedptr = and i64 %offsetptr, 31
39  %maskcond = icmp eq i64 %maskedptr, 0
40  tail call void @llvm.assume(i1 %maskcond)
41  %arrayidx = getelementptr inbounds i32, i32* %a, i64 -1
42  %0 = load i32, i32* %arrayidx, align 4
43  ret i32 %0
44
45; CHECK-LABEL: @foo2a
46; CHECK: load i32, i32* {{[^,]+}}, align 32
47; CHECK: ret i32
48}
49
50define i32 @goo(i32* nocapture %a) nounwind uwtable readonly {
51entry:
52  %ptrint = ptrtoint i32* %a to i64
53  %maskedptr = and i64 %ptrint, 31
54  %maskcond = icmp eq i64 %maskedptr, 0
55  tail call void @llvm.assume(i1 %maskcond)
56  %0 = load i32, i32* %a, align 4
57  ret i32 %0
58
59; CHECK-LABEL: @goo
60; CHECK: load i32, i32* {{[^,]+}}, align 32
61; CHECK: ret i32
62}
63
64define i32 @hoo(i32* nocapture %a) nounwind uwtable readonly {
65entry:
66  %ptrint = ptrtoint i32* %a to i64
67  %maskedptr = and i64 %ptrint, 31
68  %maskcond = icmp eq i64 %maskedptr, 0
69  tail call void @llvm.assume(i1 %maskcond)
70  br label %for.body
71
72for.body:                                         ; preds = %entry, %for.body
73  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
74  %r.06 = phi i32 [ 0, %entry ], [ %add, %for.body ]
75  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
76  %0 = load i32, i32* %arrayidx, align 4
77  %add = add nsw i32 %0, %r.06
78  %indvars.iv.next = add i64 %indvars.iv, 8
79  %1 = trunc i64 %indvars.iv.next to i32
80  %cmp = icmp slt i32 %1, 2048
81  br i1 %cmp, label %for.body, label %for.end
82
83for.end:                                          ; preds = %for.body
84  %add.lcssa = phi i32 [ %add, %for.body ]
85  ret i32 %add.lcssa
86
87; CHECK-LABEL: @hoo
88; CHECK: load i32, i32* %arrayidx, align 32
89; CHECK: ret i32 %add.lcssa
90}
91
92define i32 @joo(i32* nocapture %a) nounwind uwtable readonly {
93entry:
94  %ptrint = ptrtoint i32* %a to i64
95  %maskedptr = and i64 %ptrint, 31
96  %maskcond = icmp eq i64 %maskedptr, 0
97  tail call void @llvm.assume(i1 %maskcond)
98  br label %for.body
99
100for.body:                                         ; preds = %entry, %for.body
101  %indvars.iv = phi i64 [ 4, %entry ], [ %indvars.iv.next, %for.body ]
102  %r.06 = phi i32 [ 0, %entry ], [ %add, %for.body ]
103  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
104  %0 = load i32, i32* %arrayidx, align 4
105  %add = add nsw i32 %0, %r.06
106  %indvars.iv.next = add i64 %indvars.iv, 8
107  %1 = trunc i64 %indvars.iv.next to i32
108  %cmp = icmp slt i32 %1, 2048
109  br i1 %cmp, label %for.body, label %for.end
110
111for.end:                                          ; preds = %for.body
112  %add.lcssa = phi i32 [ %add, %for.body ]
113  ret i32 %add.lcssa
114
115; CHECK-LABEL: @joo
116; CHECK: load i32, i32* %arrayidx, align 16
117; CHECK: ret i32 %add.lcssa
118}
119
120define i32 @koo(i32* nocapture %a) nounwind uwtable readonly {
121entry:
122  %ptrint = ptrtoint i32* %a to i64
123  %maskedptr = and i64 %ptrint, 31
124  %maskcond = icmp eq i64 %maskedptr, 0
125  tail call void @llvm.assume(i1 %maskcond)
126  br label %for.body
127
128for.body:                                         ; preds = %entry, %for.body
129  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
130  %r.06 = phi i32 [ 0, %entry ], [ %add, %for.body ]
131  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
132  %0 = load i32, i32* %arrayidx, align 4
133  %add = add nsw i32 %0, %r.06
134  %indvars.iv.next = add i64 %indvars.iv, 4
135  %1 = trunc i64 %indvars.iv.next to i32
136  %cmp = icmp slt i32 %1, 2048
137  br i1 %cmp, label %for.body, label %for.end
138
139for.end:                                          ; preds = %for.body
140  %add.lcssa = phi i32 [ %add, %for.body ]
141  ret i32 %add.lcssa
142
143; CHECK-LABEL: @koo
144; CHECK: load i32, i32* %arrayidx, align 16
145; CHECK: ret i32 %add.lcssa
146}
147
148define i32 @koo2(i32* nocapture %a) nounwind uwtable readonly {
149entry:
150  %ptrint = ptrtoint i32* %a to i64
151  %maskedptr = and i64 %ptrint, 31
152  %maskcond = icmp eq i64 %maskedptr, 0
153  tail call void @llvm.assume(i1 %maskcond)
154  br label %for.body
155
156for.body:                                         ; preds = %entry, %for.body
157  %indvars.iv = phi i64 [ -4, %entry ], [ %indvars.iv.next, %for.body ]
158  %r.06 = phi i32 [ 0, %entry ], [ %add, %for.body ]
159  %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
160  %0 = load i32, i32* %arrayidx, align 4
161  %add = add nsw i32 %0, %r.06
162  %indvars.iv.next = add i64 %indvars.iv, 4
163  %1 = trunc i64 %indvars.iv.next to i32
164  %cmp = icmp slt i32 %1, 2048
165  br i1 %cmp, label %for.body, label %for.end
166
167for.end:                                          ; preds = %for.body
168  %add.lcssa = phi i32 [ %add, %for.body ]
169  ret i32 %add.lcssa
170
171; CHECK-LABEL: @koo2
172; CHECK: load i32, i32* %arrayidx, align 16
173; CHECK: ret i32 %add.lcssa
174}
175
176define i32 @moo(i32* nocapture %a) nounwind uwtable {
177entry:
178  %ptrint = ptrtoint i32* %a to i64
179  %maskedptr = and i64 %ptrint, 31
180  %maskcond = icmp eq i64 %maskedptr, 0
181  tail call void @llvm.assume(i1 %maskcond)
182  %0 = bitcast i32* %a to i8*
183  tail call void @llvm.memset.p0i8.i64(i8* %0, i8 0, i64 64, i32 4, i1 false)
184  ret i32 undef
185
186; CHECK-LABEL: @moo
187; CHECK: @llvm.memset.p0i8.i64(i8* %0, i8 0, i64 64, i32 32, i1 false)
188; CHECK: ret i32 undef
189}
190
191define i32 @moo2(i32* nocapture %a, i32* nocapture %b) nounwind uwtable {
192entry:
193  %ptrint = ptrtoint i32* %a to i64
194  %maskedptr = and i64 %ptrint, 31
195  %maskcond = icmp eq i64 %maskedptr, 0
196  tail call void @llvm.assume(i1 %maskcond)
197  %ptrint1 = ptrtoint i32* %b to i64
198  %maskedptr3 = and i64 %ptrint1, 127
199  %maskcond4 = icmp eq i64 %maskedptr3, 0
200  tail call void @llvm.assume(i1 %maskcond4)
201  %0 = bitcast i32* %a to i8*
202  %1 = bitcast i32* %b to i8*
203  tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %0, i8* %1, i64 64, i32 4, i1 false)
204  ret i32 undef
205
206; CHECK-LABEL: @moo2
207; CHECK: @llvm.memcpy.p0i8.p0i8.i64(i8* %0, i8* %1, i64 64, i32 32, i1 false)
208; CHECK: ret i32 undef
209}
210
211declare void @llvm.assume(i1) nounwind
212
213declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) nounwind
214declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind
215
216