• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc < %s -mtriple aarch64--none-eabi -mcpu=cortex-a57 -verify-machineinstrs | FileCheck %s --check-prefix=CHECK --check-prefix=LE
2; RUN: llc < %s -mtriple aarch64_be--none-eabi -mcpu=cortex-a57 -verify-machineinstrs | FileCheck %s --check-prefix=CHECK --check-prefix=BE
3
4; CHECK-LABEL: Ldrh_merge
5; CHECK-NOT: ldrh
6; CHECK: ldr [[NEW_DEST:w[0-9]+]]
7; CHECK-DAG: and [[LO_PART:w[0-9]+]], [[NEW_DEST]], #0xffff
8; CHECK-DAG: lsr [[HI_PART:w[0-9]+]], [[NEW_DEST]], #16
9; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
10; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
11define i16 @Ldrh_merge(i16* nocapture readonly %p) {
12  %1 = load i16, i16* %p, align 2
13  %arrayidx2 = getelementptr inbounds i16, i16* %p, i64 1
14  %2 = load i16, i16* %arrayidx2, align 2
15  %add = sub nuw nsw i16 %1, %2
16  ret i16 %add
17}
18
19; CHECK-LABEL: Ldurh_merge
20; CHECK-NOT: ldurh
21; CHECK: ldur [[NEW_DEST:w[0-9]+]]
22; CHECK-DAG: and [[LO_PART:w[0-9]+]], [[NEW_DEST]], #0xffff
23; CHECK-DAG: lsr  [[HI_PART:w[0-9]+]], [[NEW_DEST]]
24; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
25; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
26define i16 @Ldurh_merge(i16* nocapture readonly %p)  {
27entry:
28  %arrayidx = getelementptr inbounds i16, i16* %p, i64 -2
29  %0 = load i16, i16* %arrayidx
30  %arrayidx3 = getelementptr inbounds i16, i16* %p, i64 -1
31  %1 = load i16, i16* %arrayidx3
32  %add = sub nuw nsw i16 %0, %1
33  ret i16 %add
34}
35
36; CHECK-LABEL: Ldrh_4_merge
37; CHECK-NOT: ldrh
38; CHECK: ldp [[WORD1:w[0-9]+]], [[WORD2:w[0-9]+]], [x0]
39; CHECK-DAG: and [[WORD1LO:w[0-9]+]], [[WORD1]], #0xffff
40; CHECK-DAG: lsr [[WORD1HI:w[0-9]+]], [[WORD1]], #16
41; CHECK-DAG: and [[WORD2LO:w[0-9]+]], [[WORD2]], #0xffff
42; CHECK-DAG: lsr [[WORD2HI:w[0-9]+]], [[WORD2]], #16
43; LE-DAG: sub [[TEMP1:w[0-9]+]], [[WORD1HI]], [[WORD1LO]]
44; BE-DAG: sub [[TEMP1:w[0-9]+]], [[WORD1LO]], [[WORD1HI]]
45; LE: udiv [[TEMP2:w[0-9]+]], [[TEMP1]], [[WORD2LO]]
46; BE: udiv [[TEMP2:w[0-9]+]], [[TEMP1]], [[WORD2HI]]
47; LE: sub w0, [[TEMP2]], [[WORD2HI]]
48; BE: sub w0, [[TEMP2]], [[WORD2LO]]
49define i16 @Ldrh_4_merge(i16* nocapture readonly %P) {
50  %arrayidx = getelementptr inbounds i16, i16* %P, i64 0
51  %l0 = load i16, i16* %arrayidx
52  %arrayidx2 = getelementptr inbounds i16, i16* %P, i64 1
53  %l1 = load i16, i16* %arrayidx2
54  %arrayidx7 = getelementptr inbounds i16, i16* %P, i64 2
55  %l2 = load i16, i16* %arrayidx7
56  %arrayidx12 = getelementptr inbounds i16, i16* %P, i64 3
57  %l3 = load i16, i16* %arrayidx12
58  %add4 = sub nuw nsw i16 %l1, %l0
59  %add9 = udiv i16 %add4, %l2
60  %add14 = sub nuw nsw i16 %add9, %l3
61  ret i16 %add14
62}
63
64; CHECK-LABEL: Ldrsh_merge
65; CHECK: ldr [[NEW_DEST:w[0-9]+]]
66; CHECK-DAG: asr [[LO_PART:w[0-9]+]], [[NEW_DEST]], #16
67; CHECK-DAG: sxth [[HI_PART:w[0-9]+]], [[NEW_DEST]]
68; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
69; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
70
71define i32 @Ldrsh_merge(i16* %p) nounwind {
72  %add.ptr0 = getelementptr inbounds i16, i16* %p, i64 4
73  %tmp = load i16, i16* %add.ptr0
74  %add.ptr = getelementptr inbounds i16, i16* %p, i64 5
75  %tmp1 = load i16, i16* %add.ptr
76  %sexttmp = sext i16 %tmp to i32
77  %sexttmp1 = sext i16 %tmp1 to i32
78  %add = sub nsw i32 %sexttmp1, %sexttmp
79  ret i32 %add
80}
81
82; CHECK-LABEL: Ldrsh_zsext_merge
83; CHECK: ldr [[NEW_DEST:w[0-9]+]]
84; LE-DAG: and [[LO_PART:w[0-9]+]], [[NEW_DEST]], #0xffff
85; LE-DAG: asr [[HI_PART:w[0-9]+]], [[NEW_DEST]], #16
86; BE-DAG: sxth [[LO_PART:w[0-9]+]], [[NEW_DEST]]
87; BE-DAG: lsr [[HI_PART:w[0-9]+]], [[NEW_DEST]], #16
88; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
89; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
90define i32 @Ldrsh_zsext_merge(i16* %p) nounwind {
91  %add.ptr0 = getelementptr inbounds i16, i16* %p, i64 4
92  %tmp = load i16, i16* %add.ptr0
93  %add.ptr = getelementptr inbounds i16, i16* %p, i64 5
94  %tmp1 = load i16, i16* %add.ptr
95  %sexttmp = zext i16 %tmp to i32
96  %sexttmp1 = sext i16 %tmp1 to i32
97  %add = sub nsw i32 %sexttmp, %sexttmp1
98  ret i32 %add
99}
100
101; CHECK-LABEL: Ldrsh_szext_merge
102; CHECK: ldr [[NEW_DEST:w[0-9]+]]
103; LE-DAG: sxth [[LO_PART:w[0-9]+]], [[NEW_DEST]]
104; LE-DAG: lsr [[HI_PART:w[0-9]+]], [[NEW_DEST]], #16
105; BE-DAG: and [[LO_PART:w[0-9]+]], [[NEW_DEST]], #0xffff
106; BE-DAG: asr [[HI_PART:w[0-9]+]], [[NEW_DEST]], #16
107; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
108; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
109define i32 @Ldrsh_szext_merge(i16* %p) nounwind {
110  %add.ptr0 = getelementptr inbounds i16, i16* %p, i64 4
111  %tmp = load i16, i16* %add.ptr0
112  %add.ptr = getelementptr inbounds i16, i16* %p, i64 5
113  %tmp1 = load i16, i16* %add.ptr
114  %sexttmp = sext i16 %tmp to i32
115  %sexttmp1 = zext i16 %tmp1 to i32
116  %add = sub nsw i32 %sexttmp, %sexttmp1
117  ret i32 %add
118}
119
120; CHECK-LABEL: Ldrb_merge
121; CHECK: ldrh [[NEW_DEST:w[0-9]+]]
122; CHECK-DAG: and [[LO_PART:w[0-9]+]], [[NEW_DEST]], #0xff
123; CHECK-DAG: ubfx [[HI_PART:w[0-9]+]], [[NEW_DEST]], #8, #8
124; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
125; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
126define i32 @Ldrb_merge(i8* %p) nounwind {
127  %add.ptr0 = getelementptr inbounds i8, i8* %p, i64 2
128  %tmp = load i8, i8* %add.ptr0
129  %add.ptr = getelementptr inbounds i8, i8* %p, i64 3
130  %tmp1 = load i8, i8* %add.ptr
131  %sexttmp = zext i8 %tmp to i32
132  %sexttmp1 = zext i8 %tmp1 to i32
133  %add = sub nsw i32 %sexttmp, %sexttmp1
134  ret i32 %add
135}
136
137; CHECK-LABEL: Ldrsb_merge
138; CHECK: ldrh [[NEW_DEST:w[0-9]+]]
139; CHECK-DAG: sxtb [[LO_PART:w[0-9]+]], [[NEW_DEST]]
140; CHECK-DAG: sbfx [[HI_PART:w[0-9]+]], [[NEW_DEST]], #8, #8
141; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
142; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
143define i32 @Ldrsb_merge(i8* %p) nounwind {
144  %add.ptr0 = getelementptr inbounds i8, i8* %p, i64 2
145  %tmp = load i8, i8* %add.ptr0
146  %add.ptr = getelementptr inbounds i8, i8* %p, i64 3
147  %tmp1 = load i8, i8* %add.ptr
148  %sexttmp = sext i8 %tmp to i32
149  %sexttmp1 = sext i8 %tmp1 to i32
150  %add = sub nsw i32 %sexttmp, %sexttmp1
151  ret i32 %add
152}
153
154; CHECK-LABEL: Ldrsb_zsext_merge
155; CHECK: ldrh [[NEW_DEST:w[0-9]+]]
156; LE-DAG: and [[LO_PART:w[0-9]+]], [[NEW_DEST]], #0xff
157; LE-DAG: sbfx [[HI_PART:w[0-9]+]], [[NEW_DEST]], #8, #8
158; BE-DAG: sxtb [[LO_PART:w[0-9]+]], [[NEW_DEST]]
159; BE-DAG: ubfx [[HI_PART:w[0-9]+]], [[NEW_DEST]], #8, #8
160; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
161; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
162define i32 @Ldrsb_zsext_merge(i8* %p) nounwind {
163  %add.ptr0 = getelementptr inbounds i8, i8* %p, i64 2
164  %tmp = load i8, i8* %add.ptr0
165  %add.ptr = getelementptr inbounds i8, i8* %p, i64 3
166  %tmp1 = load i8, i8* %add.ptr
167  %sexttmp = zext i8 %tmp to i32
168  %sexttmp1 = sext i8 %tmp1 to i32
169  %add = sub nsw i32 %sexttmp, %sexttmp1
170  ret i32 %add
171}
172
173; CHECK-LABEL: Ldrsb_szext_merge
174; CHECK: ldrh [[NEW_DEST:w[0-9]+]]
175; LE-DAG: sxtb [[LO_PART:w[0-9]+]], [[NEW_DEST]]
176; LE-DAG: ubfx [[HI_PART:w[0-9]+]], [[NEW_DEST]], #8, #8
177; BE-DAG: and [[LO_PART:w[0-9]+]], [[NEW_DEST]], #0xff
178; BE-DAG: sbfx [[HI_PART:w[0-9]+]], [[NEW_DEST]], #8, #8
179; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
180; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
181define i32 @Ldrsb_szext_merge(i8* %p) nounwind {
182  %add.ptr0 = getelementptr inbounds i8, i8* %p, i64 2
183  %tmp = load i8, i8* %add.ptr0
184  %add.ptr = getelementptr inbounds i8, i8* %p, i64 3
185  %tmp1 = load i8, i8* %add.ptr
186  %sexttmp = sext i8 %tmp to i32
187  %sexttmp1 = zext i8 %tmp1 to i32
188  %add = sub nsw i32 %sexttmp, %sexttmp1
189  ret i32 %add
190}
191
192; CHECK-LABEL: Ldursh_merge
193; CHECK: ldur [[NEW_DEST:w[0-9]+]]
194; CHECK-DAG: asr  [[LO_PART:w[0-9]+]], [[NEW_DEST]], #16
195; CHECK-DAG: sxth [[HI_PART:w[0-9]+]], [[NEW_DEST]]
196; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
197; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
198define i32 @Ldursh_merge(i16* %p) nounwind {
199  %add.ptr0 = getelementptr inbounds i16, i16* %p, i64 -1
200  %tmp = load i16, i16* %add.ptr0
201  %add.ptr = getelementptr inbounds i16, i16* %p, i64 -2
202  %tmp1 = load i16, i16* %add.ptr
203  %sexttmp = sext i16 %tmp to i32
204  %sexttmp1 = sext i16 %tmp1 to i32
205  %add = sub nsw i32 %sexttmp, %sexttmp1
206  ret i32 %add
207}
208
209; CHECK-LABEL: Ldursh_zsext_merge
210; CHECK: ldur [[NEW_DEST:w[0-9]+]]
211; LE-DAG: lsr  [[LO_PART:w[0-9]+]], [[NEW_DEST]], #16
212; LE-DAG: sxth [[HI_PART:w[0-9]+]], [[NEW_DEST]]
213; BE-DAG: asr  [[LO_PART:w[0-9]+]], [[NEW_DEST]], #16
214; BE-DAG: and [[HI_PART:w[0-9]+]], [[NEW_DEST]], #0xffff
215; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
216; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
217define i32 @Ldursh_zsext_merge(i16* %p) nounwind {
218  %add.ptr0 = getelementptr inbounds i16, i16* %p, i64 -1
219  %tmp = load i16, i16* %add.ptr0
220  %add.ptr = getelementptr inbounds i16, i16* %p, i64 -2
221  %tmp1 = load i16, i16* %add.ptr
222  %sexttmp = zext i16 %tmp to i32
223  %sexttmp1 = sext i16 %tmp1 to i32
224  %add = sub nsw i32 %sexttmp, %sexttmp1
225  ret i32 %add
226}
227
228; CHECK-LABEL: Ldursh_szext_merge
229; CHECK: ldur [[NEW_DEST:w[0-9]+]]
230; LE-DAG: asr  [[LO_PART:w[0-9]+]], [[NEW_DEST]], #16
231; LE-DAG: and [[HI_PART:w[0-9]+]], [[NEW_DEST]], #0xffff
232; BE-DAG: lsr  [[LO_PART:w[0-9]+]], [[NEW_DEST]], #16
233; BE-DAG: sxth [[HI_PART:w[0-9]+]], [[NEW_DEST]]
234; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
235; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
236define i32 @Ldursh_szext_merge(i16* %p) nounwind {
237  %add.ptr0 = getelementptr inbounds i16, i16* %p, i64 -1
238  %tmp = load i16, i16* %add.ptr0
239  %add.ptr = getelementptr inbounds i16, i16* %p, i64 -2
240  %tmp1 = load i16, i16* %add.ptr
241  %sexttmp = sext i16 %tmp to i32
242  %sexttmp1 = zext i16 %tmp1 to i32
243  %add = sub nsw i32 %sexttmp, %sexttmp1
244  ret i32 %add
245}
246
247; CHECK-LABEL: Ldurb_merge
248; CHECK: ldurh [[NEW_DEST:w[0-9]+]]
249; CHECK-DAG: ubfx  [[LO_PART:w[0-9]+]], [[NEW_DEST]], #8, #8
250; CHECK-DAG: and [[HI_PART:w[0-9]+]], [[NEW_DEST]], #0xff
251; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
252; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
253define i32 @Ldurb_merge(i8* %p) nounwind {
254  %add.ptr0 = getelementptr inbounds i8, i8* %p, i64 -1
255  %tmp = load i8, i8* %add.ptr0
256  %add.ptr = getelementptr inbounds i8, i8* %p, i64 -2
257  %tmp1 = load i8, i8* %add.ptr
258  %sexttmp = zext i8 %tmp to i32
259  %sexttmp1 = zext i8 %tmp1 to i32
260  %add = sub nsw i32 %sexttmp, %sexttmp1
261  ret i32 %add
262}
263
264; CHECK-LABEL: Ldursb_merge
265; CHECK: ldurh [[NEW_DEST:w[0-9]+]]
266; CHECK-DAG: sbfx [[LO_PART:w[0-9]+]], [[NEW_DEST]], #8, #8
267; CHECK-DAG: sxtb [[HI_PART:w[0-9]+]], [[NEW_DEST]]
268; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
269; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
270define i32 @Ldursb_merge(i8* %p) nounwind {
271  %add.ptr0 = getelementptr inbounds i8, i8* %p, i64 -1
272  %tmp = load i8, i8* %add.ptr0
273  %add.ptr = getelementptr inbounds i8, i8* %p, i64 -2
274  %tmp1 = load i8, i8* %add.ptr
275  %sexttmp = sext i8 %tmp to i32
276  %sexttmp1 = sext i8 %tmp1 to i32
277  %add = sub nsw i32 %sexttmp, %sexttmp1
278  ret i32 %add
279}
280
281; CHECK-LABEL: Ldursb_zsext_merge
282; CHECK: ldurh [[NEW_DEST:w[0-9]+]]
283; LE-DAG: ubfx [[LO_PART:w[0-9]+]], [[NEW_DEST]], #8, #8
284; LE-DAG: sxtb [[HI_PART:w[0-9]+]], [[NEW_DEST]]
285; BE-DAG: sbfx [[LO_PART:w[0-9]+]], [[NEW_DEST]], #8, #8
286; BE-DAG: and [[HI_PART:w[0-9]+]], [[NEW_DEST]], #0xff
287; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
288; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
289define i32 @Ldursb_zsext_merge(i8* %p) nounwind {
290  %add.ptr0 = getelementptr inbounds i8, i8* %p, i64 -1
291  %tmp = load i8, i8* %add.ptr0
292  %add.ptr = getelementptr inbounds i8, i8* %p, i64 -2
293  %tmp1 = load i8, i8* %add.ptr
294  %sexttmp = zext i8 %tmp to i32
295  %sexttmp1 = sext i8 %tmp1 to i32
296  %add = sub nsw i32 %sexttmp, %sexttmp1
297  ret i32 %add
298}
299
300; CHECK-LABEL: Ldursb_szext_merge
301; CHECK: ldurh [[NEW_DEST:w[0-9]+]]
302; LE-DAG: sbfx [[LO_PART:w[0-9]+]], [[NEW_DEST]], #8, #8
303; LE-DAG: and [[HI_PART:w[0-9]+]], [[NEW_DEST]], #0xff
304; BE-DAG: ubfx [[LO_PART:w[0-9]+]], [[NEW_DEST]], #8, #8
305; BE-DAG: sxtb [[HI_PART:w[0-9]+]], [[NEW_DEST]]
306; LE: sub {{w[0-9]+}}, [[LO_PART]], [[HI_PART]]
307; BE: sub {{w[0-9]+}}, [[HI_PART]], [[LO_PART]]
308define i32 @Ldursb_szext_merge(i8* %p) nounwind {
309  %add.ptr0 = getelementptr inbounds i8, i8* %p, i64 -1
310  %tmp = load i8, i8* %add.ptr0
311  %add.ptr = getelementptr inbounds i8, i8* %p, i64 -2
312  %tmp1 = load i8, i8* %add.ptr
313  %sexttmp = sext i8 %tmp to i32
314  %sexttmp1 = zext i8 %tmp1 to i32
315  %add = sub nsw i32 %sexttmp, %sexttmp1
316  ret i32 %add
317}
318
319; CHECK-LABEL: Strh_zero
320; CHECK: str wzr
321define void @Strh_zero(i16* nocapture %P, i32 %n) {
322entry:
323 %idxprom = sext i32 %n to i64
324  %arrayidx = getelementptr inbounds i16, i16* %P, i64 %idxprom
325 store i16 0, i16* %arrayidx
326  %add = add nsw i32 %n, 1
327  %idxprom1 = sext i32 %add to i64
328  %arrayidx2 = getelementptr inbounds i16, i16* %P, i64 %idxprom1
329  store i16 0, i16* %arrayidx2
330  ret void
331}
332
333; CHECK-LABEL: Strh_zero_4
334; CHECK: stp wzr, wzr
335define void @Strh_zero_4(i16* nocapture %P, i32 %n) {
336entry:
337  %idxprom = sext i32 %n to i64
338  %arrayidx = getelementptr inbounds i16, i16* %P, i64 %idxprom
339  store i16 0, i16* %arrayidx
340  %add = add nsw i32 %n, 1
341  %idxprom1 = sext i32 %add to i64
342  %arrayidx2 = getelementptr inbounds i16, i16* %P, i64 %idxprom1
343  store i16 0, i16* %arrayidx2
344  %add3 = add nsw i32 %n, 2
345  %idxprom4 = sext i32 %add3 to i64
346  %arrayidx5 = getelementptr inbounds i16, i16* %P, i64 %idxprom4
347  store i16 0, i16* %arrayidx5
348  %add6 = add nsw i32 %n, 3
349  %idxprom7 = sext i32 %add6 to i64
350  %arrayidx8 = getelementptr inbounds i16, i16* %P, i64 %idxprom7
351  store i16 0, i16* %arrayidx8
352  ret void
353}
354
355; CHECK-LABEL: Sturb_zero
356; CHECK: sturh wzr
357define void @Sturb_zero(i8* nocapture %P, i32 %n) #0 {
358entry:
359  %sub = add nsw i32 %n, -2
360  %idxprom = sext i32 %sub to i64
361  %arrayidx = getelementptr inbounds i8, i8* %P, i64 %idxprom
362  store i8 0, i8* %arrayidx
363  %sub2= add nsw i32 %n, -1
364  %idxprom1 = sext i32 %sub2 to i64
365  %arrayidx2 = getelementptr inbounds i8, i8* %P, i64 %idxprom1
366  store i8 0, i8* %arrayidx2
367  ret void
368}
369
370; CHECK-LABEL: Sturh_zero
371; CHECK: stur wzr
372define void @Sturh_zero(i16* nocapture %P, i32 %n) {
373entry:
374  %sub = add nsw i32 %n, -2
375  %idxprom = sext i32 %sub to i64
376  %arrayidx = getelementptr inbounds i16, i16* %P, i64 %idxprom
377  store i16 0, i16* %arrayidx
378  %sub1 = add nsw i32 %n, -3
379  %idxprom2 = sext i32 %sub1 to i64
380  %arrayidx3 = getelementptr inbounds i16, i16* %P, i64 %idxprom2
381  store i16 0, i16* %arrayidx3
382  ret void
383}
384
385; CHECK-LABEL: Sturh_zero_4
386; CHECK: stp wzr, wzr
387define void @Sturh_zero_4(i16* nocapture %P, i32 %n) {
388entry:
389  %sub = add nsw i32 %n, -3
390  %idxprom = sext i32 %sub to i64
391  %arrayidx = getelementptr inbounds i16, i16* %P, i64 %idxprom
392  store i16 0, i16* %arrayidx
393  %sub1 = add nsw i32 %n, -4
394  %idxprom2 = sext i32 %sub1 to i64
395  %arrayidx3 = getelementptr inbounds i16, i16* %P, i64 %idxprom2
396  store i16 0, i16* %arrayidx3
397  %sub4 = add nsw i32 %n, -2
398  %idxprom5 = sext i32 %sub4 to i64
399  %arrayidx6 = getelementptr inbounds i16, i16* %P, i64 %idxprom5
400  store i16 0, i16* %arrayidx6
401  %sub7 = add nsw i32 %n, -1
402  %idxprom8 = sext i32 %sub7 to i64
403  %arrayidx9 = getelementptr inbounds i16, i16* %P, i64 %idxprom8
404  store i16 0, i16* %arrayidx9
405  ret void
406}
407