1 target datalayout = "e-i64:64-f80:128-n8:16:32:64-S128"
2 ; RUN: opt < %s -alignment-from-assumptions -S | FileCheck %s
4 define i32 @foo(i32* nocapture %a) nounwind uwtable readonly {
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
14 ; CHECK: load i32, i32* {{[^,]+}}, align 32
18 define i32 @foo2(i32* nocapture %a) nounwind uwtable readonly {
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
30 ; CHECK: load i32, i32* {{[^,]+}}, align 16
34 define i32 @foo2a(i32* nocapture %a) nounwind uwtable readonly {
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
46 ; CHECK: load i32, i32* {{[^,]+}}, align 32
50 define i32 @goo(i32* nocapture %a) nounwind uwtable readonly {
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
60 ; CHECK: load i32, i32* {{[^,]+}}, align 32
64 define i32 @hoo(i32* nocapture %a) nounwind uwtable readonly {
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)
72 for.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
83 for.end: ; preds = %for.body
84 %add.lcssa = phi i32 [ %add, %for.body ]
88 ; CHECK: load i32, i32* %arrayidx, align 32
89 ; CHECK: ret i32 %add.lcssa
92 define i32 @joo(i32* nocapture %a) nounwind uwtable readonly {
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)
100 for.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
111 for.end: ; preds = %for.body
112 %add.lcssa = phi i32 [ %add, %for.body ]
116 ; CHECK: load i32, i32* %arrayidx, align 16
117 ; CHECK: ret i32 %add.lcssa
120 define i32 @koo(i32* nocapture %a) nounwind uwtable readonly {
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)
128 for.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
139 for.end: ; preds = %for.body
140 %add.lcssa = phi i32 [ %add, %for.body ]
144 ; CHECK: load i32, i32* %arrayidx, align 16
145 ; CHECK: ret i32 %add.lcssa
148 define i32 @koo2(i32* nocapture %a) nounwind uwtable readonly {
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)
156 for.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
167 for.end: ; preds = %for.body
168 %add.lcssa = phi i32 [ %add, %for.body ]
172 ; CHECK: load i32, i32* %arrayidx, align 16
173 ; CHECK: ret i32 %add.lcssa
176 define i32 @moo(i32* nocapture %a) nounwind uwtable {
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)
187 ; CHECK: @llvm.memset.p0i8.i64(i8* %0, i8 0, i64 64, i32 32, i1 false)
188 ; CHECK: ret i32 undef
191 define i32 @moo2(i32* nocapture %a, i32* nocapture %b) nounwind uwtable {
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)
207 ; CHECK: @llvm.memcpy.p0i8.p0i8.i64(i8* %0, i8* %1, i64 64, i32 32, i1 false)
208 ; CHECK: ret i32 undef
211 declare void @llvm.assume(i1) nounwind
213 declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) nounwind
214 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind