Skip to content

Commit aadfa9f

Browse files
committed
[LV] Add additional tests for narrowing interleave groups.
Extend test coverage for llvm#106441.
1 parent 6616acd commit aadfa9f

4 files changed

+1825
-1530
lines changed
Lines changed: 245 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,245 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --version 5
2+
; RUN: opt -p loop-vectorize -S %s | FileCheck --check-prefixes=CHECK %s
3+
4+
target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32"
5+
target triple = "arm64-apple-macosx15.0.0"
6+
7+
define void @test_add_double_same_const_args_1(ptr %res, ptr noalias %A, ptr noalias %B) {
8+
; CHECK-LABEL: define void @test_add_double_same_const_args_1(
9+
; CHECK-SAME: ptr [[RES:%.*]], ptr noalias [[A:%.*]], ptr noalias [[B:%.*]]) {
10+
; CHECK-NEXT: [[ENTRY:.*]]:
11+
; CHECK-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
12+
; CHECK: [[VECTOR_PH]]:
13+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
14+
; CHECK: [[VECTOR_BODY]]:
15+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
16+
; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0
17+
; CHECK-NEXT: [[TMP1:%.*]] = add i64 [[INDEX]], 2
18+
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[A]], i64 [[TMP0]]
19+
; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[A]], i64 [[TMP1]]
20+
; CHECK-NEXT: [[WIDE_VEC:%.*]] = load <4 x double>, ptr [[TMP2]], align 4
21+
; CHECK-NEXT: [[STRIDED_VEC:%.*]] = shufflevector <4 x double> [[WIDE_VEC]], <4 x double> poison, <2 x i32> <i32 0, i32 2>
22+
; CHECK-NEXT: [[STRIDED_VEC1:%.*]] = shufflevector <4 x double> [[WIDE_VEC]], <4 x double> poison, <2 x i32> <i32 1, i32 3>
23+
; CHECK-NEXT: [[WIDE_VEC2:%.*]] = load <4 x double>, ptr [[TMP3]], align 4
24+
; CHECK-NEXT: [[STRIDED_VEC3:%.*]] = shufflevector <4 x double> [[WIDE_VEC2]], <4 x double> poison, <2 x i32> <i32 0, i32 2>
25+
; CHECK-NEXT: [[STRIDED_VEC4:%.*]] = shufflevector <4 x double> [[WIDE_VEC2]], <4 x double> poison, <2 x i32> <i32 1, i32 3>
26+
; CHECK-NEXT: [[TMP4:%.*]] = fadd <2 x double> [[STRIDED_VEC]], splat (double 1.000000e+00)
27+
; CHECK-NEXT: [[TMP5:%.*]] = fadd <2 x double> [[STRIDED_VEC3]], splat (double 1.000000e+00)
28+
; CHECK-NEXT: [[TMP6:%.*]] = fadd <2 x double> [[STRIDED_VEC1]], splat (double 1.000000e+00)
29+
; CHECK-NEXT: [[TMP7:%.*]] = fadd <2 x double> [[STRIDED_VEC4]], splat (double 1.000000e+00)
30+
; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[RES]], i64 [[TMP0]]
31+
; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[RES]], i64 [[TMP1]]
32+
; CHECK-NEXT: [[TMP10:%.*]] = shufflevector <2 x double> [[TMP4]], <2 x double> [[TMP6]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>
33+
; CHECK-NEXT: [[INTERLEAVED_VEC:%.*]] = shufflevector <4 x double> [[TMP10]], <4 x double> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
34+
; CHECK-NEXT: store <4 x double> [[INTERLEAVED_VEC]], ptr [[TMP8]], align 4
35+
; CHECK-NEXT: [[TMP11:%.*]] = shufflevector <2 x double> [[TMP5]], <2 x double> [[TMP7]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>
36+
; CHECK-NEXT: [[INTERLEAVED_VEC5:%.*]] = shufflevector <4 x double> [[TMP11]], <4 x double> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
37+
; CHECK-NEXT: store <4 x double> [[INTERLEAVED_VEC5]], ptr [[TMP9]], align 4
38+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
39+
; CHECK-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100
40+
; CHECK-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]
41+
; CHECK: [[MIDDLE_BLOCK]]:
42+
; CHECK-NEXT: br i1 true, label %[[EXIT:.*]], label %[[SCALAR_PH]]
43+
; CHECK: [[SCALAR_PH]]:
44+
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 100, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
45+
; CHECK-NEXT: br label %[[LOOP:.*]]
46+
; CHECK: [[LOOP]]:
47+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
48+
; CHECK-NEXT: [[GEP_A_0:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[A]], i64 [[IV]]
49+
; CHECK-NEXT: [[L_A_0:%.*]] = load double, ptr [[GEP_A_0]], align 4
50+
; CHECK-NEXT: [[GEP_A_1:%.*]] = getelementptr inbounds nuw i8, ptr [[GEP_A_0]], i64 8
51+
; CHECK-NEXT: [[L_A_1:%.*]] = load double, ptr [[GEP_A_1]], align 4
52+
; CHECK-NEXT: [[ADD_0:%.*]] = fadd double [[L_A_0]], 1.000000e+00
53+
; CHECK-NEXT: [[ADD_1:%.*]] = fadd double [[L_A_1]], 1.000000e+00
54+
; CHECK-NEXT: [[GEP_RES_0:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[RES]], i64 [[IV]]
55+
; CHECK-NEXT: store double [[ADD_0]], ptr [[GEP_RES_0]], align 4
56+
; CHECK-NEXT: [[GEP_RES_1:%.*]] = getelementptr inbounds nuw i8, ptr [[GEP_RES_0]], i64 8
57+
; CHECK-NEXT: store double [[ADD_1]], ptr [[GEP_RES_1]], align 4
58+
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
59+
; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], 100
60+
; CHECK-NEXT: br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], !llvm.loop [[LOOP3:![0-9]+]]
61+
; CHECK: [[EXIT]]:
62+
; CHECK-NEXT: ret void
63+
;
64+
entry:
65+
br label %loop
66+
67+
loop:
68+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
69+
%gep.A.0 = getelementptr inbounds nuw { double, double }, ptr %A, i64 %iv
70+
%l.A.0 = load double, ptr %gep.A.0, align 4
71+
%gep.A.1 = getelementptr inbounds nuw i8, ptr %gep.A.0, i64 8
72+
%l.A.1 = load double, ptr %gep.A.1, align 4
73+
%add.0 = fadd double %l.A.0, 1.0
74+
%add.1 = fadd double %l.A.1, 1.0
75+
%gep.res.0 = getelementptr inbounds nuw { double, double }, ptr %res, i64 %iv
76+
store double %add.0, ptr %gep.res.0, align 4
77+
%gep.res.1 = getelementptr inbounds nuw i8, ptr %gep.res.0, i64 8
78+
store double %add.1, ptr %gep.res.1, align 4
79+
%iv.next = add nuw nsw i64 %iv, 1
80+
%ec = icmp eq i64 %iv.next, 100
81+
br i1 %ec, label %exit, label %loop
82+
83+
exit:
84+
ret void
85+
}
86+
87+
define void @test_add_double_same_const_args_2(ptr %res, ptr noalias %A, ptr noalias %B) {
88+
; CHECK-LABEL: define void @test_add_double_same_const_args_2(
89+
; CHECK-SAME: ptr [[RES:%.*]], ptr noalias [[A:%.*]], ptr noalias [[B:%.*]]) {
90+
; CHECK-NEXT: [[ENTRY:.*]]:
91+
; CHECK-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
92+
; CHECK: [[VECTOR_PH]]:
93+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
94+
; CHECK: [[VECTOR_BODY]]:
95+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
96+
; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0
97+
; CHECK-NEXT: [[TMP1:%.*]] = add i64 [[INDEX]], 2
98+
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[B]], i64 [[TMP0]]
99+
; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[B]], i64 [[TMP1]]
100+
; CHECK-NEXT: [[WIDE_VEC:%.*]] = load <4 x double>, ptr [[TMP2]], align 4
101+
; CHECK-NEXT: [[STRIDED_VEC:%.*]] = shufflevector <4 x double> [[WIDE_VEC]], <4 x double> poison, <2 x i32> <i32 0, i32 2>
102+
; CHECK-NEXT: [[STRIDED_VEC1:%.*]] = shufflevector <4 x double> [[WIDE_VEC]], <4 x double> poison, <2 x i32> <i32 1, i32 3>
103+
; CHECK-NEXT: [[WIDE_VEC2:%.*]] = load <4 x double>, ptr [[TMP3]], align 4
104+
; CHECK-NEXT: [[STRIDED_VEC3:%.*]] = shufflevector <4 x double> [[WIDE_VEC2]], <4 x double> poison, <2 x i32> <i32 0, i32 2>
105+
; CHECK-NEXT: [[STRIDED_VEC4:%.*]] = shufflevector <4 x double> [[WIDE_VEC2]], <4 x double> poison, <2 x i32> <i32 1, i32 3>
106+
; CHECK-NEXT: [[TMP4:%.*]] = fadd <2 x double> splat (double 1.000000e+00), [[STRIDED_VEC]]
107+
; CHECK-NEXT: [[TMP5:%.*]] = fadd <2 x double> splat (double 1.000000e+00), [[STRIDED_VEC3]]
108+
; CHECK-NEXT: [[TMP6:%.*]] = fadd <2 x double> splat (double 1.000000e+00), [[STRIDED_VEC1]]
109+
; CHECK-NEXT: [[TMP7:%.*]] = fadd <2 x double> splat (double 1.000000e+00), [[STRIDED_VEC4]]
110+
; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[RES]], i64 [[TMP0]]
111+
; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[RES]], i64 [[TMP1]]
112+
; CHECK-NEXT: [[TMP10:%.*]] = shufflevector <2 x double> [[TMP4]], <2 x double> [[TMP6]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>
113+
; CHECK-NEXT: [[INTERLEAVED_VEC:%.*]] = shufflevector <4 x double> [[TMP10]], <4 x double> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
114+
; CHECK-NEXT: store <4 x double> [[INTERLEAVED_VEC]], ptr [[TMP8]], align 4
115+
; CHECK-NEXT: [[TMP11:%.*]] = shufflevector <2 x double> [[TMP5]], <2 x double> [[TMP7]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>
116+
; CHECK-NEXT: [[INTERLEAVED_VEC5:%.*]] = shufflevector <4 x double> [[TMP11]], <4 x double> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
117+
; CHECK-NEXT: store <4 x double> [[INTERLEAVED_VEC5]], ptr [[TMP9]], align 4
118+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
119+
; CHECK-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100
120+
; CHECK-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
121+
; CHECK: [[MIDDLE_BLOCK]]:
122+
; CHECK-NEXT: br i1 true, label %[[EXIT:.*]], label %[[SCALAR_PH]]
123+
; CHECK: [[SCALAR_PH]]:
124+
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 100, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
125+
; CHECK-NEXT: br label %[[LOOP:.*]]
126+
; CHECK: [[LOOP]]:
127+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
128+
; CHECK-NEXT: [[GEP_B_0:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[B]], i64 [[IV]]
129+
; CHECK-NEXT: [[L_B_0:%.*]] = load double, ptr [[GEP_B_0]], align 4
130+
; CHECK-NEXT: [[ADD_0:%.*]] = fadd double 1.000000e+00, [[L_B_0]]
131+
; CHECK-NEXT: [[GEP_B_1:%.*]] = getelementptr inbounds nuw i8, ptr [[GEP_B_0]], i64 8
132+
; CHECK-NEXT: [[L_B_1:%.*]] = load double, ptr [[GEP_B_1]], align 4
133+
; CHECK-NEXT: [[ADD_1:%.*]] = fadd double 1.000000e+00, [[L_B_1]]
134+
; CHECK-NEXT: [[GEP_RES_0:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[RES]], i64 [[IV]]
135+
; CHECK-NEXT: store double [[ADD_0]], ptr [[GEP_RES_0]], align 4
136+
; CHECK-NEXT: [[GEP_RES_1:%.*]] = getelementptr inbounds nuw i8, ptr [[GEP_RES_0]], i64 8
137+
; CHECK-NEXT: store double [[ADD_1]], ptr [[GEP_RES_1]], align 4
138+
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
139+
; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], 100
140+
; CHECK-NEXT: br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], !llvm.loop [[LOOP5:![0-9]+]]
141+
; CHECK: [[EXIT]]:
142+
; CHECK-NEXT: ret void
143+
;
144+
entry:
145+
br label %loop
146+
147+
loop:
148+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
149+
%gep.B.0 = getelementptr inbounds nuw { double, double }, ptr %B, i64 %iv
150+
%l.B.0 = load double, ptr %gep.B.0, align 4
151+
%add.0 = fadd double 1.0, %l.B.0
152+
%gep.B.1 = getelementptr inbounds nuw i8, ptr %gep.B.0, i64 8
153+
%l.B.1 = load double, ptr %gep.B.1, align 4
154+
%add.1 = fadd double 1.0, %l.B.1
155+
%gep.res.0 = getelementptr inbounds nuw { double, double }, ptr %res, i64 %iv
156+
store double %add.0, ptr %gep.res.0, align 4
157+
%gep.res.1 = getelementptr inbounds nuw i8, ptr %gep.res.0, i64 8
158+
store double %add.1, ptr %gep.res.1, align 4
159+
%iv.next = add nuw nsw i64 %iv, 1
160+
%ec = icmp eq i64 %iv.next, 100
161+
br i1 %ec, label %exit, label %loop
162+
163+
exit:
164+
ret void
165+
}
166+
167+
define void @test_add_double_mixed_const_args(ptr %res, ptr noalias %A, ptr noalias %B) {
168+
; CHECK-LABEL: define void @test_add_double_mixed_const_args(
169+
; CHECK-SAME: ptr [[RES:%.*]], ptr noalias [[A:%.*]], ptr noalias [[B:%.*]]) {
170+
; CHECK-NEXT: [[ENTRY:.*]]:
171+
; CHECK-NEXT: br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
172+
; CHECK: [[VECTOR_PH]]:
173+
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
174+
; CHECK: [[VECTOR_BODY]]:
175+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
176+
; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0
177+
; CHECK-NEXT: [[TMP1:%.*]] = add i64 [[INDEX]], 2
178+
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[B]], i64 [[TMP0]]
179+
; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[B]], i64 [[TMP1]]
180+
; CHECK-NEXT: [[WIDE_VEC:%.*]] = load <4 x double>, ptr [[TMP2]], align 4
181+
; CHECK-NEXT: [[STRIDED_VEC:%.*]] = shufflevector <4 x double> [[WIDE_VEC]], <4 x double> poison, <2 x i32> <i32 0, i32 2>
182+
; CHECK-NEXT: [[STRIDED_VEC1:%.*]] = shufflevector <4 x double> [[WIDE_VEC]], <4 x double> poison, <2 x i32> <i32 1, i32 3>
183+
; CHECK-NEXT: [[WIDE_VEC2:%.*]] = load <4 x double>, ptr [[TMP3]], align 4
184+
; CHECK-NEXT: [[STRIDED_VEC3:%.*]] = shufflevector <4 x double> [[WIDE_VEC2]], <4 x double> poison, <2 x i32> <i32 0, i32 2>
185+
; CHECK-NEXT: [[STRIDED_VEC4:%.*]] = shufflevector <4 x double> [[WIDE_VEC2]], <4 x double> poison, <2 x i32> <i32 1, i32 3>
186+
; CHECK-NEXT: [[TMP4:%.*]] = fadd <2 x double> splat (double 1.000000e+00), [[STRIDED_VEC]]
187+
; CHECK-NEXT: [[TMP5:%.*]] = fadd <2 x double> splat (double 1.000000e+00), [[STRIDED_VEC3]]
188+
; CHECK-NEXT: [[TMP6:%.*]] = fadd <2 x double> splat (double 2.000000e+00), [[STRIDED_VEC1]]
189+
; CHECK-NEXT: [[TMP7:%.*]] = fadd <2 x double> splat (double 2.000000e+00), [[STRIDED_VEC4]]
190+
; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[RES]], i64 [[TMP0]]
191+
; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[RES]], i64 [[TMP1]]
192+
; CHECK-NEXT: [[TMP10:%.*]] = shufflevector <2 x double> [[TMP4]], <2 x double> [[TMP6]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>
193+
; CHECK-NEXT: [[INTERLEAVED_VEC:%.*]] = shufflevector <4 x double> [[TMP10]], <4 x double> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
194+
; CHECK-NEXT: store <4 x double> [[INTERLEAVED_VEC]], ptr [[TMP8]], align 4
195+
; CHECK-NEXT: [[TMP11:%.*]] = shufflevector <2 x double> [[TMP5]], <2 x double> [[TMP7]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>
196+
; CHECK-NEXT: [[INTERLEAVED_VEC5:%.*]] = shufflevector <4 x double> [[TMP11]], <4 x double> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>
197+
; CHECK-NEXT: store <4 x double> [[INTERLEAVED_VEC5]], ptr [[TMP9]], align 4
198+
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
199+
; CHECK-NEXT: [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100
200+
; CHECK-NEXT: br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
201+
; CHECK: [[MIDDLE_BLOCK]]:
202+
; CHECK-NEXT: br i1 true, label %[[EXIT:.*]], label %[[SCALAR_PH]]
203+
; CHECK: [[SCALAR_PH]]:
204+
; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 100, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
205+
; CHECK-NEXT: br label %[[LOOP:.*]]
206+
; CHECK: [[LOOP]]:
207+
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
208+
; CHECK-NEXT: [[GEP_B_0:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[B]], i64 [[IV]]
209+
; CHECK-NEXT: [[L_B_0:%.*]] = load double, ptr [[GEP_B_0]], align 4
210+
; CHECK-NEXT: [[ADD_0:%.*]] = fadd double 1.000000e+00, [[L_B_0]]
211+
; CHECK-NEXT: [[GEP_B_1:%.*]] = getelementptr inbounds nuw i8, ptr [[GEP_B_0]], i64 8
212+
; CHECK-NEXT: [[L_B_1:%.*]] = load double, ptr [[GEP_B_1]], align 4
213+
; CHECK-NEXT: [[ADD_1:%.*]] = fadd double 2.000000e+00, [[L_B_1]]
214+
; CHECK-NEXT: [[GEP_RES_0:%.*]] = getelementptr inbounds nuw { double, double }, ptr [[RES]], i64 [[IV]]
215+
; CHECK-NEXT: store double [[ADD_0]], ptr [[GEP_RES_0]], align 4
216+
; CHECK-NEXT: [[GEP_RES_1:%.*]] = getelementptr inbounds nuw i8, ptr [[GEP_RES_0]], i64 8
217+
; CHECK-NEXT: store double [[ADD_1]], ptr [[GEP_RES_1]], align 4
218+
; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
219+
; CHECK-NEXT: [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], 100
220+
; CHECK-NEXT: br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], !llvm.loop [[LOOP7:![0-9]+]]
221+
; CHECK: [[EXIT]]:
222+
; CHECK-NEXT: ret void
223+
;
224+
entry:
225+
br label %loop
226+
227+
loop:
228+
%iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
229+
%gep.B.0 = getelementptr inbounds nuw { double, double }, ptr %B, i64 %iv
230+
%l.B.0 = load double, ptr %gep.B.0, align 4
231+
%add.0 = fadd double 1.0, %l.B.0
232+
%gep.B.1 = getelementptr inbounds nuw i8, ptr %gep.B.0, i64 8
233+
%l.B.1 = load double, ptr %gep.B.1, align 4
234+
%add.1 = fadd double 2.0, %l.B.1
235+
%gep.res.0 = getelementptr inbounds nuw { double, double }, ptr %res, i64 %iv
236+
store double %add.0, ptr %gep.res.0, align 4
237+
%gep.res.1 = getelementptr inbounds nuw i8, ptr %gep.res.0, i64 8
238+
store double %add.1, ptr %gep.res.1, align 4
239+
%iv.next = add nuw nsw i64 %iv, 1
240+
%ec = icmp eq i64 %iv.next, 100
241+
br i1 %ec, label %exit, label %loop
242+
243+
exit:
244+
ret void
245+
}

0 commit comments

Comments
 (0)