1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -ppc-asm-full-reg-names -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 < %s | FileCheck %s
3
4; test_no_prep:
5; unsigned long test_no_prep(char *p, int count) {
6;   unsigned long i=0, res=0;
7;   int DISP1 = 4001;
8;   int DISP2 = 4002;
9;   int DISP3 = 4003;
10;   int DISP4 = 4004;
11;   for (; i < count ; i++) {
12;     unsigned long x1 = *(unsigned long *)(p + i + DISP1);
13;     unsigned long x2 = *(unsigned long *)(p + i + DISP2);
14;     unsigned long x3 = *(unsigned long *)(p + i + DISP3);
15;     unsigned long x4 = *(unsigned long *)(p + i + DISP4);
16;     res += x1*x2*x3*x4;
17;   }
18;   return res + count;
19; }
20
21define i64 @test_no_prep(i8* %0, i32 signext %1) {
22; CHECK-LABEL: test_no_prep:
23; CHECK:       # %bb.0:
24; CHECK-NEXT:    cmplwi r4, 0
25; CHECK-NEXT:    beq cr0, .LBB0_4
26; CHECK-NEXT:  # %bb.1: # %.preheader
27; CHECK-NEXT:    cmpldi r4, 1
28; CHECK-NEXT:    li r5, 1
29; CHECK-NEXT:    addi r3, r3, 4004
30; CHECK-NEXT:    li r6, -3
31; CHECK-NEXT:    li r7, -2
32; CHECK-NEXT:    li r8, -1
33; CHECK-NEXT:    iselgt r5, r4, r5
34; CHECK-NEXT:    mtctr r5
35; CHECK-NEXT:    li r5, 0
36; CHECK-NEXT:    .p2align 4
37; CHECK-NEXT:  .LBB0_2:
38; CHECK-NEXT:    ldx r9, r3, r6
39; CHECK-NEXT:    ldx r10, r3, r7
40; CHECK-NEXT:    ldx r11, r3, r8
41; CHECK-NEXT:    ld r12, 0(r3)
42; CHECK-NEXT:    addi r3, r3, 1
43; CHECK-NEXT:    mulld r9, r10, r9
44; CHECK-NEXT:    mulld r9, r9, r11
45; CHECK-NEXT:    maddld r5, r9, r12, r5
46; CHECK-NEXT:    bdnz .LBB0_2
47; CHECK-NEXT:  # %bb.3:
48; CHECK-NEXT:    add r3, r5, r4
49; CHECK-NEXT:    blr
50; CHECK-NEXT:  .LBB0_4:
51; CHECK-NEXT:    addi r3, r4, 0
52; CHECK-NEXT:    blr
53  %3 = sext i32 %1 to i64
54  %4 = icmp eq i32 %1, 0
55  br i1 %4, label %27, label %5
56
575:                                                ; preds = %2, %5
58  %6 = phi i64 [ %25, %5 ], [ 0, %2 ]
59  %7 = phi i64 [ %24, %5 ], [ 0, %2 ]
60  %8 = getelementptr inbounds i8, i8* %0, i64 %6
61  %9 = getelementptr inbounds i8, i8* %8, i64 4001
62  %10 = bitcast i8* %9 to i64*
63  %11 = load i64, i64* %10, align 8
64  %12 = getelementptr inbounds i8, i8* %8, i64 4002
65  %13 = bitcast i8* %12 to i64*
66  %14 = load i64, i64* %13, align 8
67  %15 = getelementptr inbounds i8, i8* %8, i64 4003
68  %16 = bitcast i8* %15 to i64*
69  %17 = load i64, i64* %16, align 8
70  %18 = getelementptr inbounds i8, i8* %8, i64 4004
71  %19 = bitcast i8* %18 to i64*
72  %20 = load i64, i64* %19, align 8
73  %21 = mul i64 %14, %11
74  %22 = mul i64 %21, %17
75  %23 = mul i64 %22, %20
76  %24 = add i64 %23, %7
77  %25 = add nuw i64 %6, 1
78  %26 = icmp ult i64 %25, %3
79  br i1 %26, label %5, label %27
80
8127:                                               ; preds = %5, %2
82  %28 = phi i64 [ 0, %2 ], [ %24, %5 ]
83  %29 = add i64 %28, %3
84  ret i64 %29
85}
86
87; test_ds_prep:
88; unsigned long test_ds_prep(char *p, int count) {
89;   unsigned long i=0, res=0;
90;   int DISP1 = 4001;
91;   int DISP2 = 4002;
92;   int DISP3 = 4003;
93;   int DISP4 = 4006;
94;   for (; i < count ; i++) {
95;     unsigned long x1 = *(unsigned long *)(p + i + DISP1);
96;     unsigned long x2 = *(unsigned long *)(p + i + DISP2);
97;     unsigned long x3 = *(unsigned long *)(p + i + DISP3);
98;     unsigned long x4 = *(unsigned long *)(p + i + DISP4);
99;     res += x1*x2*x3*x4;
100;   }
101;   return res + count;
102; }
103
104define i64 @test_ds_prep(i8* %0, i32 signext %1) {
105; CHECK-LABEL: test_ds_prep:
106; CHECK:       # %bb.0:
107; CHECK-NEXT:    cmplwi r4, 0
108; CHECK-NEXT:    beq cr0, .LBB1_4
109; CHECK-NEXT:  # %bb.1: # %.preheader
110; CHECK-NEXT:    cmpldi r4, 1
111; CHECK-NEXT:    li r5, 1
112; CHECK-NEXT:    addi r6, r3, 4002
113; CHECK-NEXT:    li r7, -1
114; CHECK-NEXT:    iselgt r3, r4, r5
115; CHECK-NEXT:    mtctr r3
116; CHECK-NEXT:    li r3, 0
117; CHECK-NEXT:    .p2align 4
118; CHECK-NEXT:  .LBB1_2:
119; CHECK-NEXT:    ldx r8, r6, r7
120; CHECK-NEXT:    ld r9, 0(r6)
121; CHECK-NEXT:    ldx r10, r6, r5
122; CHECK-NEXT:    ld r11, 4(r6)
123; CHECK-NEXT:    addi r6, r6, 1
124; CHECK-NEXT:    mulld r8, r9, r8
125; CHECK-NEXT:    mulld r8, r8, r10
126; CHECK-NEXT:    maddld r3, r8, r11, r3
127; CHECK-NEXT:    bdnz .LBB1_2
128; CHECK-NEXT:  # %bb.3:
129; CHECK-NEXT:    add r3, r3, r4
130; CHECK-NEXT:    blr
131; CHECK-NEXT:  .LBB1_4:
132; CHECK-NEXT:    addi r3, r4, 0
133; CHECK-NEXT:    blr
134  %3 = sext i32 %1 to i64
135  %4 = icmp eq i32 %1, 0
136  br i1 %4, label %27, label %5
137
1385:                                                ; preds = %2, %5
139  %6 = phi i64 [ %25, %5 ], [ 0, %2 ]
140  %7 = phi i64 [ %24, %5 ], [ 0, %2 ]
141  %8 = getelementptr inbounds i8, i8* %0, i64 %6
142  %9 = getelementptr inbounds i8, i8* %8, i64 4001
143  %10 = bitcast i8* %9 to i64*
144  %11 = load i64, i64* %10, align 8
145  %12 = getelementptr inbounds i8, i8* %8, i64 4002
146  %13 = bitcast i8* %12 to i64*
147  %14 = load i64, i64* %13, align 8
148  %15 = getelementptr inbounds i8, i8* %8, i64 4003
149  %16 = bitcast i8* %15 to i64*
150  %17 = load i64, i64* %16, align 8
151  %18 = getelementptr inbounds i8, i8* %8, i64 4006
152  %19 = bitcast i8* %18 to i64*
153  %20 = load i64, i64* %19, align 8
154  %21 = mul i64 %14, %11
155  %22 = mul i64 %21, %17
156  %23 = mul i64 %22, %20
157  %24 = add i64 %23, %7
158  %25 = add nuw i64 %6, 1
159  %26 = icmp ult i64 %25, %3
160  br i1 %26, label %5, label %27
161
16227:                                               ; preds = %5, %2
163  %28 = phi i64 [ 0, %2 ], [ %24, %5 ]
164  %29 = add i64 %28, %3
165  ret i64 %29
166}
167
168; test_max_number_reminder:
169; unsigned long test_max_number_reminder(char *p, int count) {
170;  unsigned long i=0, res=0;
171;  int DISP1 = 4001;
172;  int DISP2 = 4002;
173;  int DISP3 = 4003;
174;  int DISP4 = 4005;
175;  int DISP5 = 4006;
176;  int DISP6 = 4007;
177;  int DISP7 = 4014;
178;  int DISP8 = 4010;
179;  int DISP9 = 4011;
180;  for (; i < count ; i++) {
181;    unsigned long x1 = *(unsigned long *)(p + i + DISP1);
182;    unsigned long x2 = *(unsigned long *)(p + i + DISP2);
183;    unsigned long x3 = *(unsigned long *)(p + i + DISP3);
184;    unsigned long x4 = *(unsigned long *)(p + i + DISP4);
185;    unsigned long x5 = *(unsigned long *)(p + i + DISP5);
186;    unsigned long x6 = *(unsigned long *)(p + i + DISP6);
187;    unsigned long x7 = *(unsigned long *)(p + i + DISP7);
188;    unsigned long x8 = *(unsigned long *)(p + i + DISP8);
189;    unsigned long x9 = *(unsigned long *)(p + i + DISP9);
190;    res += x1*x2*x3*x4*x5*x6*x7*x8*x9;
191;  }
192;  return res + count;
193;}
194
195define i64 @test_max_number_reminder(i8* %0, i32 signext %1) {
196; CHECK-LABEL: test_max_number_reminder:
197; CHECK:       # %bb.0:
198; CHECK-NEXT:    cmplwi r4, 0
199; CHECK-NEXT:    std r25, -56(r1) # 8-byte Folded Spill
200; CHECK-NEXT:    std r26, -48(r1) # 8-byte Folded Spill
201; CHECK-NEXT:    std r27, -40(r1) # 8-byte Folded Spill
202; CHECK-NEXT:    std r28, -32(r1) # 8-byte Folded Spill
203; CHECK-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
204; CHECK-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
205; CHECK-NEXT:    beq cr0, .LBB2_3
206; CHECK-NEXT:  # %bb.1: # %.preheader
207; CHECK-NEXT:    cmpldi r4, 1
208; CHECK-NEXT:    li r5, 1
209; CHECK-NEXT:    addi r9, r3, 4002
210; CHECK-NEXT:    li r6, -1
211; CHECK-NEXT:    li r7, 3
212; CHECK-NEXT:    li r8, 5
213; CHECK-NEXT:    li r10, 9
214; CHECK-NEXT:    iselgt r3, r4, r5
215; CHECK-NEXT:    mtctr r3
216; CHECK-NEXT:    li r3, 0
217; CHECK-NEXT:    .p2align 4
218; CHECK-NEXT:  .LBB2_2:
219; CHECK-NEXT:    ldx r11, r9, r6
220; CHECK-NEXT:    ld r12, 0(r9)
221; CHECK-NEXT:    ldx r0, r9, r5
222; CHECK-NEXT:    ldx r30, r9, r7
223; CHECK-NEXT:    mulld r11, r12, r11
224; CHECK-NEXT:    ld r29, 4(r9)
225; CHECK-NEXT:    ldx r28, r9, r8
226; CHECK-NEXT:    ld r27, 12(r9)
227; CHECK-NEXT:    ld r26, 8(r9)
228; CHECK-NEXT:    ldx r25, r9, r10
229; CHECK-NEXT:    addi r9, r9, 1
230; CHECK-NEXT:    mulld r11, r11, r0
231; CHECK-NEXT:    mulld r11, r11, r30
232; CHECK-NEXT:    mulld r11, r11, r29
233; CHECK-NEXT:    mulld r11, r11, r28
234; CHECK-NEXT:    mulld r11, r11, r27
235; CHECK-NEXT:    mulld r11, r11, r26
236; CHECK-NEXT:    maddld r3, r11, r25, r3
237; CHECK-NEXT:    bdnz .LBB2_2
238; CHECK-NEXT:    b .LBB2_4
239; CHECK-NEXT:  .LBB2_3:
240; CHECK-NEXT:    li r3, 0
241; CHECK-NEXT:  .LBB2_4:
242; CHECK-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
243; CHECK-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
244; CHECK-NEXT:    ld r28, -32(r1) # 8-byte Folded Reload
245; CHECK-NEXT:    ld r27, -40(r1) # 8-byte Folded Reload
246; CHECK-NEXT:    add r3, r3, r4
247; CHECK-NEXT:    ld r26, -48(r1) # 8-byte Folded Reload
248; CHECK-NEXT:    ld r25, -56(r1) # 8-byte Folded Reload
249; CHECK-NEXT:    blr
250  %3 = sext i32 %1 to i64
251  %4 = icmp eq i32 %1, 0
252  br i1 %4, label %47, label %5
253
2545:                                                ; preds = %2, %5
255  %6 = phi i64 [ %45, %5 ], [ 0, %2 ]
256  %7 = phi i64 [ %44, %5 ], [ 0, %2 ]
257  %8 = getelementptr inbounds i8, i8* %0, i64 %6
258  %9 = getelementptr inbounds i8, i8* %8, i64 4001
259  %10 = bitcast i8* %9 to i64*
260  %11 = load i64, i64* %10, align 8
261  %12 = getelementptr inbounds i8, i8* %8, i64 4002
262  %13 = bitcast i8* %12 to i64*
263  %14 = load i64, i64* %13, align 8
264  %15 = getelementptr inbounds i8, i8* %8, i64 4003
265  %16 = bitcast i8* %15 to i64*
266  %17 = load i64, i64* %16, align 8
267  %18 = getelementptr inbounds i8, i8* %8, i64 4005
268  %19 = bitcast i8* %18 to i64*
269  %20 = load i64, i64* %19, align 8
270  %21 = getelementptr inbounds i8, i8* %8, i64 4006
271  %22 = bitcast i8* %21 to i64*
272  %23 = load i64, i64* %22, align 8
273  %24 = getelementptr inbounds i8, i8* %8, i64 4007
274  %25 = bitcast i8* %24 to i64*
275  %26 = load i64, i64* %25, align 8
276  %27 = getelementptr inbounds i8, i8* %8, i64 4014
277  %28 = bitcast i8* %27 to i64*
278  %29 = load i64, i64* %28, align 8
279  %30 = getelementptr inbounds i8, i8* %8, i64 4010
280  %31 = bitcast i8* %30 to i64*
281  %32 = load i64, i64* %31, align 8
282  %33 = getelementptr inbounds i8, i8* %8, i64 4011
283  %34 = bitcast i8* %33 to i64*
284  %35 = load i64, i64* %34, align 8
285  %36 = mul i64 %14, %11
286  %37 = mul i64 %36, %17
287  %38 = mul i64 %37, %20
288  %39 = mul i64 %38, %23
289  %40 = mul i64 %39, %26
290  %41 = mul i64 %40, %29
291  %42 = mul i64 %41, %32
292  %43 = mul i64 %42, %35
293  %44 = add i64 %43, %7
294  %45 = add nuw i64 %6, 1
295  %46 = icmp ult i64 %45, %3
296  br i1 %46, label %5, label %47
297
29847:                                               ; preds = %5, %2
299  %48 = phi i64 [ 0, %2 ], [ %44, %5 ]
300  %49 = add i64 %48, %3
301  ret i64 %49
302}
303
304; test_update_ds_prep_interact:
305; unsigned long test_update_ds_prep_interact(char *p, int count) {
306;   unsigned long i=0, res=0;
307;   int DISP1 = 4001;
308;   int DISP2 = 4002;
309;   int DISP3 = 4003;
310;   int DISP4 = 4006;
311;   for (; i < count ; i++) {
312;     unsigned long x1 = *(unsigned long *)(p + 4 * i + DISP1);
313;     unsigned long x2 = *(unsigned long *)(p + 4 * i + DISP2);
314;     unsigned long x3 = *(unsigned long *)(p + 4 * i + DISP3);
315;     unsigned long x4 = *(unsigned long *)(p + 4 * i + DISP4);
316;     res += x1*x2*x3*x4;
317;   }
318;   return res + count;
319; }
320
321define dso_local i64 @test_update_ds_prep_interact(i8* %0, i32 signext %1) {
322; CHECK-LABEL: test_update_ds_prep_interact:
323; CHECK:       # %bb.0:
324; CHECK-NEXT:    cmplwi r4, 0
325; CHECK-NEXT:    beq cr0, .LBB3_4
326; CHECK-NEXT:  # %bb.1: # %.preheader
327; CHECK-NEXT:    cmpldi r4, 1
328; CHECK-NEXT:    li r6, 1
329; CHECK-NEXT:    addi r3, r3, 3998
330; CHECK-NEXT:    li r7, -1
331; CHECK-NEXT:    iselgt r5, r4, r6
332; CHECK-NEXT:    mtctr r5
333; CHECK-NEXT:    li r5, 0
334; CHECK-NEXT:    .p2align 5
335; CHECK-NEXT:  .LBB3_2:
336; CHECK-NEXT:    ldu r8, 4(r3)
337; CHECK-NEXT:    ldx r9, r3, r7
338; CHECK-NEXT:    ldx r10, r3, r6
339; CHECK-NEXT:    ld r11, 4(r3)
340; CHECK-NEXT:    mulld r8, r8, r9
341; CHECK-NEXT:    mulld r8, r8, r10
342; CHECK-NEXT:    maddld r5, r8, r11, r5
343; CHECK-NEXT:    bdnz .LBB3_2
344; CHECK-NEXT:  # %bb.3:
345; CHECK-NEXT:    add r3, r5, r4
346; CHECK-NEXT:    blr
347; CHECK-NEXT:  .LBB3_4:
348; CHECK-NEXT:    addi r3, r4, 0
349; CHECK-NEXT:    blr
350  %3 = sext i32 %1 to i64
351  %4 = icmp eq i32 %1, 0
352  br i1 %4, label %28, label %5
353
3545:                                                ; preds = %2, %5
355  %6 = phi i64 [ %26, %5 ], [ 0, %2 ]
356  %7 = phi i64 [ %25, %5 ], [ 0, %2 ]
357  %8 = shl i64 %6, 2
358  %9 = getelementptr inbounds i8, i8* %0, i64 %8
359  %10 = getelementptr inbounds i8, i8* %9, i64 4001
360  %11 = bitcast i8* %10 to i64*
361  %12 = load i64, i64* %11, align 8
362  %13 = getelementptr inbounds i8, i8* %9, i64 4002
363  %14 = bitcast i8* %13 to i64*
364  %15 = load i64, i64* %14, align 8
365  %16 = getelementptr inbounds i8, i8* %9, i64 4003
366  %17 = bitcast i8* %16 to i64*
367  %18 = load i64, i64* %17, align 8
368  %19 = getelementptr inbounds i8, i8* %9, i64 4006
369  %20 = bitcast i8* %19 to i64*
370  %21 = load i64, i64* %20, align 8
371  %22 = mul i64 %15, %12
372  %23 = mul i64 %22, %18
373  %24 = mul i64 %23, %21
374  %25 = add i64 %24, %7
375  %26 = add nuw i64 %6, 1
376  %27 = icmp ult i64 %26, %3
377  br i1 %27, label %5, label %28
378
37928:                                               ; preds = %5, %2
380  %29 = phi i64 [ 0, %2 ], [ %25, %5 ]
381  %30 = add i64 %29, %3
382  ret i64 %30
383}
384
385; test_update_ds_prep_nointeract:
386; unsigned long test_update_ds_prep_nointeract(char *p, int count) {
387;   unsigned long i=0, res=0;
388;   int DISP1 = 4001;
389;   int DISP2 = 4002;
390;   int DISP3 = 4003;
391;   int DISP4 = 4007;
392;   for (; i < count ; i++) {
393;     char x1 = *(p + i + DISP1);
394;     unsigned long x2 = *(unsigned long *)(p + i + DISP2);
395;     unsigned long x3 = *(unsigned long *)(p + i + DISP3);
396;     unsigned long x4 = *(unsigned long *)(p + i + DISP4);
397;     res += (unsigned long)x1*x2*x3*x4;
398;   }
399;   return res + count;
400; }
401
402define i64 @test_update_ds_prep_nointeract(i8* %0, i32 signext %1) {
403; CHECK-LABEL: test_update_ds_prep_nointeract:
404; CHECK:       # %bb.0:
405; CHECK-NEXT:    cmplwi r4, 0
406; CHECK-NEXT:    beq cr0, .LBB4_4
407; CHECK-NEXT:  # %bb.1: # %.preheader
408; CHECK-NEXT:    cmpldi r4, 1
409; CHECK-NEXT:    li r6, 1
410; CHECK-NEXT:    addi r5, r3, 4000
411; CHECK-NEXT:    addi r3, r3, 4003
412; CHECK-NEXT:    li r7, -1
413; CHECK-NEXT:    iselgt r6, r4, r6
414; CHECK-NEXT:    mtctr r6
415; CHECK-NEXT:    li r6, 0
416; CHECK-NEXT:    .p2align 4
417; CHECK-NEXT:  .LBB4_2:
418; CHECK-NEXT:    lbzu r8, 1(r5)
419; CHECK-NEXT:    ldx r9, r3, r7
420; CHECK-NEXT:    ld r10, 0(r3)
421; CHECK-NEXT:    ld r11, 4(r3)
422; CHECK-NEXT:    addi r3, r3, 1
423; CHECK-NEXT:    mulld r8, r9, r8
424; CHECK-NEXT:    mulld r8, r8, r10
425; CHECK-NEXT:    maddld r6, r8, r11, r6
426; CHECK-NEXT:    bdnz .LBB4_2
427; CHECK-NEXT:  # %bb.3:
428; CHECK-NEXT:    add r3, r6, r4
429; CHECK-NEXT:    blr
430; CHECK-NEXT:  .LBB4_4:
431; CHECK-NEXT:    addi r3, r4, 0
432; CHECK-NEXT:    blr
433  %3 = sext i32 %1 to i64
434  %4 = icmp eq i32 %1, 0
435  br i1 %4, label %27, label %5
436
4375:                                                ; preds = %2, %5
438  %6 = phi i64 [ %25, %5 ], [ 0, %2 ]
439  %7 = phi i64 [ %24, %5 ], [ 0, %2 ]
440  %8 = getelementptr inbounds i8, i8* %0, i64 %6
441  %9 = getelementptr inbounds i8, i8* %8, i64 4001
442  %10 = load i8, i8* %9, align 1
443  %11 = getelementptr inbounds i8, i8* %8, i64 4002
444  %12 = bitcast i8* %11 to i64*
445  %13 = load i64, i64* %12, align 8
446  %14 = getelementptr inbounds i8, i8* %8, i64 4003
447  %15 = bitcast i8* %14 to i64*
448  %16 = load i64, i64* %15, align 8
449  %17 = getelementptr inbounds i8, i8* %8, i64 4007
450  %18 = bitcast i8* %17 to i64*
451  %19 = load i64, i64* %18, align 8
452  %20 = zext i8 %10 to i64
453  %21 = mul i64 %13, %20
454  %22 = mul i64 %21, %16
455  %23 = mul i64 %22, %19
456  %24 = add i64 %23, %7
457  %25 = add nuw i64 %6, 1
458  %26 = icmp ult i64 %25, %3
459  br i1 %26, label %5, label %27
460
46127:                                               ; preds = %5, %2
462  %28 = phi i64 [ 0, %2 ], [ %24, %5 ]
463  %29 = add i64 %28, %3
464  ret i64 %29
465}
466
467; test_ds_multiple_chains:
468; unsigned long test_ds_multiple_chains(char *p, char *q, int count) {
469;   unsigned long i=0, res=0;
470;   int DISP1 = 4001;
471;   int DISP2 = 4010;
472;   int DISP3 = 4005;
473;   int DISP4 = 4009;
474;   for (; i < count ; i++) {
475;     unsigned long x1 = *(unsigned long *)(p + i + DISP1);
476;     unsigned long x2 = *(unsigned long *)(p + i + DISP2);
477;     unsigned long x3 = *(unsigned long *)(p + i + DISP3);
478;     unsigned long x4 = *(unsigned long *)(p + i + DISP4);
479;     unsigned long x5 = *(unsigned long *)(q + i + DISP1);
480;     unsigned long x6 = *(unsigned long *)(q + i + DISP2);
481;     unsigned long x7 = *(unsigned long *)(q + i + DISP3);
482;     unsigned long x8 = *(unsigned long *)(q + i + DISP4);
483;     res += x1*x2*x3*x4*x5*x6*x7*x8;
484;   }
485;   return res + count;
486; }
487
488define dso_local i64 @test_ds_multiple_chains(i8* %0, i8* %1, i32 signext %2) {
489; CHECK-LABEL: test_ds_multiple_chains:
490; CHECK:       # %bb.0:
491; CHECK-NEXT:    cmplwi r5, 0
492; CHECK-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
493; CHECK-NEXT:    beq cr0, .LBB5_3
494; CHECK-NEXT:  # %bb.1: # %.preheader
495; CHECK-NEXT:    cmpldi r5, 1
496; CHECK-NEXT:    li r6, 1
497; CHECK-NEXT:    addi r3, r3, 4001
498; CHECK-NEXT:    addi r4, r4, 4001
499; CHECK-NEXT:    li r7, 9
500; CHECK-NEXT:    iselgt r6, r5, r6
501; CHECK-NEXT:    mtctr r6
502; CHECK-NEXT:    li r6, 0
503; CHECK-NEXT:    .p2align 4
504; CHECK-NEXT:  .LBB5_2:
505; CHECK-NEXT:    ld r8, 0(r3)
506; CHECK-NEXT:    ldx r9, r3, r7
507; CHECK-NEXT:    ld r10, 4(r3)
508; CHECK-NEXT:    ld r11, 8(r3)
509; CHECK-NEXT:    addi r3, r3, 1
510; CHECK-NEXT:    mulld r8, r9, r8
511; CHECK-NEXT:    ld r12, 0(r4)
512; CHECK-NEXT:    ldx r0, r4, r7
513; CHECK-NEXT:    ld r30, 4(r4)
514; CHECK-NEXT:    ld r9, 8(r4)
515; CHECK-NEXT:    addi r4, r4, 1
516; CHECK-NEXT:    mulld r8, r8, r10
517; CHECK-NEXT:    mulld r8, r8, r11
518; CHECK-NEXT:    mulld r8, r8, r12
519; CHECK-NEXT:    mulld r8, r8, r0
520; CHECK-NEXT:    mulld r8, r8, r30
521; CHECK-NEXT:    maddld r6, r8, r9, r6
522; CHECK-NEXT:    bdnz .LBB5_2
523; CHECK-NEXT:    b .LBB5_4
524; CHECK-NEXT:  .LBB5_3:
525; CHECK-NEXT:    li r6, 0
526; CHECK-NEXT:  .LBB5_4:
527; CHECK-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
528; CHECK-NEXT:    add r3, r6, r5
529; CHECK-NEXT:    blr
530  %4 = sext i32 %2 to i64
531  %5 = icmp eq i32 %2, 0
532  br i1 %5, label %45, label %6
533
5346:                                                ; preds = %3, %6
535  %7 = phi i64 [ %43, %6 ], [ 0, %3 ]
536  %8 = phi i64 [ %42, %6 ], [ 0, %3 ]
537  %9 = getelementptr inbounds i8, i8* %0, i64 %7
538  %10 = getelementptr inbounds i8, i8* %9, i64 4001
539  %11 = bitcast i8* %10 to i64*
540  %12 = load i64, i64* %11, align 8
541  %13 = getelementptr inbounds i8, i8* %9, i64 4010
542  %14 = bitcast i8* %13 to i64*
543  %15 = load i64, i64* %14, align 8
544  %16 = getelementptr inbounds i8, i8* %9, i64 4005
545  %17 = bitcast i8* %16 to i64*
546  %18 = load i64, i64* %17, align 8
547  %19 = getelementptr inbounds i8, i8* %9, i64 4009
548  %20 = bitcast i8* %19 to i64*
549  %21 = load i64, i64* %20, align 8
550  %22 = getelementptr inbounds i8, i8* %1, i64 %7
551  %23 = getelementptr inbounds i8, i8* %22, i64 4001
552  %24 = bitcast i8* %23 to i64*
553  %25 = load i64, i64* %24, align 8
554  %26 = getelementptr inbounds i8, i8* %22, i64 4010
555  %27 = bitcast i8* %26 to i64*
556  %28 = load i64, i64* %27, align 8
557  %29 = getelementptr inbounds i8, i8* %22, i64 4005
558  %30 = bitcast i8* %29 to i64*
559  %31 = load i64, i64* %30, align 8
560  %32 = getelementptr inbounds i8, i8* %22, i64 4009
561  %33 = bitcast i8* %32 to i64*
562  %34 = load i64, i64* %33, align 8
563  %35 = mul i64 %15, %12
564  %36 = mul i64 %35, %18
565  %37 = mul i64 %36, %21
566  %38 = mul i64 %37, %25
567  %39 = mul i64 %38, %28
568  %40 = mul i64 %39, %31
569  %41 = mul i64 %40, %34
570  %42 = add i64 %41, %8
571  %43 = add nuw i64 %7, 1
572  %44 = icmp ult i64 %43, %4
573  br i1 %44, label %6, label %45
574
57545:                                               ; preds = %6, %3
576  %46 = phi i64 [ 0, %3 ], [ %42, %6 ]
577  %47 = add i64 %46, %4
578  ret i64 %47
579}
580
581; test_ds_cross_basic_blocks:
582;extern char *arr;
583;unsigned long foo(char *p, int count)
584;{
585;  unsigned long i=0, res=0;
586;  int DISP1 = 4000;
587;  int DISP2 = 4001;
588;  int DISP3 = 4002;
589;  int DISP4 = 4003;
590;  int DISP5 = 4005;
591;  int DISP6 = 4009;
592;  unsigned long x1, x2, x3, x4, x5, x6;
593;  x1=x2=x3=x4=x5=x6=1;
594;  for (; i < count ; i++) {
595;    if (arr[i] % 3 == 1) {
596;      x1 += *(unsigned long *)(p + i + DISP1);
597;      x2 += *(unsigned long *)(p + i + DISP2);
598;    }
599;    else if (arr[i] % 3 == 2) {
600;      x3 += *(unsigned long *)(p + i + DISP3);
601;      x4 += *(unsigned long *)(p + i + DISP5);
602;    }
603;    else {
604;      x5 += *(unsigned long *)(p + i + DISP4);
605;      x6 += *(unsigned long *)(p + i + DISP6);
606;    }
607;    res += x1*x2*x3*x4*x5*x6;
608;  }
609;  return res;
610;}
611
612@arr = external local_unnamed_addr global i8*, align 8
613
614define i64 @test_ds_cross_basic_blocks(i8* %0, i32 signext %1) {
615; CHECK-LABEL: test_ds_cross_basic_blocks:
616; CHECK:       # %bb.0:
617; CHECK-NEXT:    cmplwi r4, 0
618; CHECK-NEXT:    std r27, -40(r1) # 8-byte Folded Spill
619; CHECK-NEXT:    std r28, -32(r1) # 8-byte Folded Spill
620; CHECK-NEXT:    std r29, -24(r1) # 8-byte Folded Spill
621; CHECK-NEXT:    std r30, -16(r1) # 8-byte Folded Spill
622; CHECK-NEXT:    beq cr0, .LBB6_8
623; CHECK-NEXT:  # %bb.1:
624; CHECK-NEXT:    addis r5, r2, .LC0@toc@ha
625; CHECK-NEXT:    cmpldi r4, 1
626; CHECK-NEXT:    li r7, 1
627; CHECK-NEXT:    addi r6, r3, 4009
628; CHECK-NEXT:    ld r5, .LC0@toc@l(r5)
629; CHECK-NEXT:    iselgt r4, r4, r7
630; CHECK-NEXT:    li r3, 0
631; CHECK-NEXT:    li r8, -7
632; CHECK-NEXT:    li r9, -6
633; CHECK-NEXT:    li r10, 1
634; CHECK-NEXT:    li r11, 1
635; CHECK-NEXT:    li r12, 1
636; CHECK-NEXT:    li r30, 1
637; CHECK-NEXT:    ld r5, 0(r5)
638; CHECK-NEXT:    mtctr r4
639; CHECK-NEXT:    li r4, -9
640; CHECK-NEXT:    li r29, 1
641; CHECK-NEXT:    addi r5, r5, -1
642; CHECK-NEXT:    b .LBB6_4
643; CHECK-NEXT:    .p2align 4
644; CHECK-NEXT:  .LBB6_2:
645; CHECK-NEXT:    ldx r0, r6, r4
646; CHECK-NEXT:    add r29, r0, r29
647; CHECK-NEXT:    ld r0, -8(r6)
648; CHECK-NEXT:    add r30, r0, r30
649; CHECK-NEXT:  .LBB6_3:
650; CHECK-NEXT:    mulld r0, r30, r29
651; CHECK-NEXT:    addi r6, r6, 1
652; CHECK-NEXT:    mulld r0, r0, r12
653; CHECK-NEXT:    mulld r0, r0, r11
654; CHECK-NEXT:    mulld r0, r0, r10
655; CHECK-NEXT:    maddld r3, r0, r7, r3
656; CHECK-NEXT:    bdz .LBB6_9
657; CHECK-NEXT:  .LBB6_4:
658; CHECK-NEXT:    lbzu r0, 1(r5)
659; CHECK-NEXT:    mulli r28, r0, 171
660; CHECK-NEXT:    rlwinm r27, r28, 24, 8, 30
661; CHECK-NEXT:    srwi r28, r28, 9
662; CHECK-NEXT:    add r28, r28, r27
663; CHECK-NEXT:    sub r0, r0, r28
664; CHECK-NEXT:    clrlwi r0, r0, 24
665; CHECK-NEXT:    cmplwi r0, 1
666; CHECK-NEXT:    beq cr0, .LBB6_2
667; CHECK-NEXT:  # %bb.5:
668; CHECK-NEXT:    cmplwi r0, 2
669; CHECK-NEXT:    bne cr0, .LBB6_7
670; CHECK-NEXT:  # %bb.6:
671; CHECK-NEXT:    ldx r0, r6, r8
672; CHECK-NEXT:    add r12, r0, r12
673; CHECK-NEXT:    ld r0, -4(r6)
674; CHECK-NEXT:    add r11, r0, r11
675; CHECK-NEXT:    b .LBB6_3
676; CHECK-NEXT:    .p2align 4
677; CHECK-NEXT:  .LBB6_7:
678; CHECK-NEXT:    ldx r0, r6, r9
679; CHECK-NEXT:    add r10, r0, r10
680; CHECK-NEXT:    ld r0, 0(r6)
681; CHECK-NEXT:    add r7, r0, r7
682; CHECK-NEXT:    b .LBB6_3
683; CHECK-NEXT:  .LBB6_8:
684; CHECK-NEXT:    li r3, 0
685; CHECK-NEXT:  .LBB6_9:
686; CHECK-NEXT:    ld r30, -16(r1) # 8-byte Folded Reload
687; CHECK-NEXT:    ld r29, -24(r1) # 8-byte Folded Reload
688; CHECK-NEXT:    ld r28, -32(r1) # 8-byte Folded Reload
689; CHECK-NEXT:    ld r27, -40(r1) # 8-byte Folded Reload
690; CHECK-NEXT:    blr
691  %3 = sext i32 %1 to i64
692  %4 = icmp eq i32 %1, 0
693  br i1 %4, label %66, label %5
694
6955:                                                ; preds = %2
696  %6 = load i8*, i8** @arr, align 8
697  br label %7
698
6997:                                                ; preds = %5, %51
700  %8 = phi i64 [ 1, %5 ], [ %57, %51 ]
701  %9 = phi i64 [ 1, %5 ], [ %56, %51 ]
702  %10 = phi i64 [ 1, %5 ], [ %55, %51 ]
703  %11 = phi i64 [ 1, %5 ], [ %54, %51 ]
704  %12 = phi i64 [ 1, %5 ], [ %53, %51 ]
705  %13 = phi i64 [ 1, %5 ], [ %52, %51 ]
706  %14 = phi i64 [ 0, %5 ], [ %64, %51 ]
707  %15 = phi i64 [ 0, %5 ], [ %63, %51 ]
708  %16 = getelementptr inbounds i8, i8* %6, i64 %14
709  %17 = load i8, i8* %16, align 1
710  %18 = urem i8 %17, 3
711  %19 = icmp eq i8 %18, 1
712  br i1 %19, label %20, label %30
713
71420:                                               ; preds = %7
715  %21 = getelementptr inbounds i8, i8* %0, i64 %14
716  %22 = getelementptr inbounds i8, i8* %21, i64 4000
717  %23 = bitcast i8* %22 to i64*
718  %24 = load i64, i64* %23, align 8
719  %25 = add i64 %24, %13
720  %26 = getelementptr inbounds i8, i8* %21, i64 4001
721  %27 = bitcast i8* %26 to i64*
722  %28 = load i64, i64* %27, align 8
723  %29 = add i64 %28, %12
724  br label %51
725
72630:                                               ; preds = %7
727  %31 = icmp eq i8 %18, 2
728  %32 = getelementptr inbounds i8, i8* %0, i64 %14
729  br i1 %31, label %33, label %42
730
73133:                                               ; preds = %30
732  %34 = getelementptr inbounds i8, i8* %32, i64 4002
733  %35 = bitcast i8* %34 to i64*
734  %36 = load i64, i64* %35, align 8
735  %37 = add i64 %36, %11
736  %38 = getelementptr inbounds i8, i8* %32, i64 4005
737  %39 = bitcast i8* %38 to i64*
738  %40 = load i64, i64* %39, align 8
739  %41 = add i64 %40, %10
740  br label %51
741
74242:                                               ; preds = %30
743  %43 = getelementptr inbounds i8, i8* %32, i64 4003
744  %44 = bitcast i8* %43 to i64*
745  %45 = load i64, i64* %44, align 8
746  %46 = add i64 %45, %9
747  %47 = getelementptr inbounds i8, i8* %32, i64 4009
748  %48 = bitcast i8* %47 to i64*
749  %49 = load i64, i64* %48, align 8
750  %50 = add i64 %49, %8
751  br label %51
752
75351:                                               ; preds = %33, %42, %20
754  %52 = phi i64 [ %25, %20 ], [ %13, %33 ], [ %13, %42 ]
755  %53 = phi i64 [ %29, %20 ], [ %12, %33 ], [ %12, %42 ]
756  %54 = phi i64 [ %11, %20 ], [ %37, %33 ], [ %11, %42 ]
757  %55 = phi i64 [ %10, %20 ], [ %41, %33 ], [ %10, %42 ]
758  %56 = phi i64 [ %9, %20 ], [ %9, %33 ], [ %46, %42 ]
759  %57 = phi i64 [ %8, %20 ], [ %8, %33 ], [ %50, %42 ]
760  %58 = mul i64 %53, %52
761  %59 = mul i64 %58, %54
762  %60 = mul i64 %59, %55
763  %61 = mul i64 %60, %56
764  %62 = mul i64 %61, %57
765  %63 = add i64 %62, %15
766  %64 = add nuw i64 %14, 1
767  %65 = icmp ult i64 %64, %3
768  br i1 %65, label %7, label %66
769
77066:                                               ; preds = %51, %2
771  %67 = phi i64 [ 0, %2 ], [ %63, %51 ]
772  ret i64 %67
773}
774
775; test_ds_float:
776;float test_ds_float(char *p, int count) {
777;  int i=0 ;
778;  float res=0;
779;  int DISP1 = 4001;
780;  int DISP2 = 4002;
781;  int DISP3 = 4022;
782;  int DISP4 = 4062;
783;  for (; i < count ; i++) {
784;    float x1 = *(float *)(p + i + DISP1);
785;    float x2 = *(float *)(p + i + DISP2);
786;    float x3 = *(float *)(p + i + DISP3);
787;    float x4 = *(float *)(p + i + DISP4);
788;    res += x1*x2*x3*x4;
789;  }
790;  return res;
791;}
792
793define float @test_ds_float(i8* %0, i32 signext %1) {
794; CHECK-LABEL: test_ds_float:
795; CHECK:       # %bb.0:
796; CHECK-NEXT:    cmpwi r4, 1
797; CHECK-NEXT:    blt cr0, .LBB7_4
798; CHECK-NEXT:  # %bb.1:
799; CHECK-NEXT:    clrldi r4, r4, 32
800; CHECK-NEXT:    addi r3, r3, 4002
801; CHECK-NEXT:    xxlxor f1, f1, f1
802; CHECK-NEXT:    mtctr r4
803; CHECK-NEXT:    li r4, -1
804; CHECK-NEXT:    .p2align 4
805; CHECK-NEXT:  .LBB7_2:
806; CHECK-NEXT:    lfsx f0, r3, r4
807; CHECK-NEXT:    lfs f2, 0(r3)
808; CHECK-NEXT:    xsmulsp f0, f0, f2
809; CHECK-NEXT:    lfs f3, 20(r3)
810; CHECK-NEXT:    xsmulsp f0, f0, f3
811; CHECK-NEXT:    lfs f4, 60(r3)
812; CHECK-NEXT:    addi r3, r3, 1
813; CHECK-NEXT:    xsmulsp f0, f0, f4
814; CHECK-NEXT:    xsaddsp f1, f1, f0
815; CHECK-NEXT:    bdnz .LBB7_2
816; CHECK-NEXT:  # %bb.3:
817; CHECK-NEXT:    blr
818; CHECK-NEXT:  .LBB7_4:
819; CHECK-NEXT:    xxlxor f1, f1, f1
820; CHECK-NEXT:    blr
821  %3 = icmp sgt i32 %1, 0
822  br i1 %3, label %4, label %28
823
8244:                                                ; preds = %2
825  %5 = zext i32 %1 to i64
826  br label %6
827
8286:                                                ; preds = %6, %4
829  %7 = phi i64 [ 0, %4 ], [ %26, %6 ]
830  %8 = phi float [ 0.000000e+00, %4 ], [ %25, %6 ]
831  %9 = getelementptr inbounds i8, i8* %0, i64 %7
832  %10 = getelementptr inbounds i8, i8* %9, i64 4001
833  %11 = bitcast i8* %10 to float*
834  %12 = load float, float* %11, align 4
835  %13 = getelementptr inbounds i8, i8* %9, i64 4002
836  %14 = bitcast i8* %13 to float*
837  %15 = load float, float* %14, align 4
838  %16 = getelementptr inbounds i8, i8* %9, i64 4022
839  %17 = bitcast i8* %16 to float*
840  %18 = load float, float* %17, align 4
841  %19 = getelementptr inbounds i8, i8* %9, i64 4062
842  %20 = bitcast i8* %19 to float*
843  %21 = load float, float* %20, align 4
844  %22 = fmul float %12, %15
845  %23 = fmul float %22, %18
846  %24 = fmul float %23, %21
847  %25 = fadd float %8, %24
848  %26 = add nuw nsw i64 %7, 1
849  %27 = icmp eq i64 %26, %5
850  br i1 %27, label %28, label %6
851
85228:                                               ; preds = %6, %2
853  %29 = phi float [ 0.000000e+00, %2 ], [ %25, %6 ]
854  ret float %29
855}
856
857; test_ds_combine_float_int:
858;float test_ds_combine_float_int(char *p, int count) {
859;  int i=0 ;
860;  float res=0;
861;  int DISP1 = 4001;
862;  int DISP2 = 4002;
863;  int DISP3 = 4022;
864;  int DISP4 = 4062;
865;  for (; i < count ; i++) {
866;    float x1 = *(float *)(p + i + DISP1);
867;    unsigned long x2 = *(unsigned long*)(p + i + DISP2);
868;    float x3 = *(float *)(p + i + DISP3);
869;    float x4 = *(float *)(p + i + DISP4);
870;    res += x1*x2*x3*x4;
871;  }
872;  return res;
873;}
874
875define float @test_ds_combine_float_int(i8* %0, i32 signext %1) {
876; CHECK-LABEL: test_ds_combine_float_int:
877; CHECK:       # %bb.0:
878; CHECK-NEXT:    cmpwi r4, 1
879; CHECK-NEXT:    blt cr0, .LBB8_4
880; CHECK-NEXT:  # %bb.1:
881; CHECK-NEXT:    clrldi r4, r4, 32
882; CHECK-NEXT:    addi r3, r3, 4002
883; CHECK-NEXT:    xxlxor f1, f1, f1
884; CHECK-NEXT:    mtctr r4
885; CHECK-NEXT:    li r4, -1
886; CHECK-NEXT:    .p2align 4
887; CHECK-NEXT:  .LBB8_2:
888; CHECK-NEXT:    lfd f4, 0(r3)
889; CHECK-NEXT:    lfsx f0, r3, r4
890; CHECK-NEXT:    xscvuxdsp f4, f4
891; CHECK-NEXT:    lfs f2, 20(r3)
892; CHECK-NEXT:    lfs f3, 60(r3)
893; CHECK-NEXT:    addi r3, r3, 1
894; CHECK-NEXT:    xsmulsp f0, f0, f4
895; CHECK-NEXT:    xsmulsp f0, f2, f0
896; CHECK-NEXT:    xsmulsp f0, f3, f0
897; CHECK-NEXT:    xsaddsp f1, f1, f0
898; CHECK-NEXT:    bdnz .LBB8_2
899; CHECK-NEXT:  # %bb.3:
900; CHECK-NEXT:    blr
901; CHECK-NEXT:  .LBB8_4:
902; CHECK-NEXT:    xxlxor f1, f1, f1
903; CHECK-NEXT:    blr
904  %3 = icmp sgt i32 %1, 0
905  br i1 %3, label %4, label %29
906
9074:                                                ; preds = %2
908  %5 = zext i32 %1 to i64
909  br label %6
910
9116:                                                ; preds = %6, %4
912  %7 = phi i64 [ 0, %4 ], [ %27, %6 ]
913  %8 = phi float [ 0.000000e+00, %4 ], [ %26, %6 ]
914  %9 = getelementptr inbounds i8, i8* %0, i64 %7
915  %10 = getelementptr inbounds i8, i8* %9, i64 4001
916  %11 = bitcast i8* %10 to float*
917  %12 = load float, float* %11, align 4
918  %13 = getelementptr inbounds i8, i8* %9, i64 4002
919  %14 = bitcast i8* %13 to i64*
920  %15 = load i64, i64* %14, align 8
921  %16 = getelementptr inbounds i8, i8* %9, i64 4022
922  %17 = bitcast i8* %16 to float*
923  %18 = load float, float* %17, align 4
924  %19 = getelementptr inbounds i8, i8* %9, i64 4062
925  %20 = bitcast i8* %19 to float*
926  %21 = load float, float* %20, align 4
927  %22 = uitofp i64 %15 to float
928  %23 = fmul float %12, %22
929  %24 = fmul float %18, %23
930  %25 = fmul float %21, %24
931  %26 = fadd float %8, %25
932  %27 = add nuw nsw i64 %7, 1
933  %28 = icmp eq i64 %27, %5
934  br i1 %28, label %29, label %6
935
93629:                                               ; preds = %6, %2
937  %30 = phi float [ 0.000000e+00, %2 ], [ %26, %6 ]
938  ret float %30
939}
940
941; test_ds_lwa_prep:
942; long long test_ds_lwa_prep(char *p, int count) {
943;   long long i=0, res=0;
944;   int DISP1 = 4001;
945;   int DISP2 = 4002;
946;   int DISP3 = 4006;
947;   int DISP4 = 4010;
948;   for (; i < count ; i++) {
949;     long long x1 = *(int *)(p + i + DISP1);
950;     long long x2 = *(int *)(p + i + DISP2);
951;     long long x3 = *(int *)(p + i + DISP3);
952;     long long x4 = *(int *)(p + i + DISP4);
953;     res += x1*x2*x3*x4;
954;   }
955;   return res + count;
956; }
957
958define i64 @test_ds_lwa_prep(i8* %0, i32 signext %1) {
959; CHECK-LABEL: test_ds_lwa_prep:
960; CHECK:       # %bb.0:
961; CHECK-NEXT:    cmpwi r4, 1
962; CHECK-NEXT:    blt cr0, .LBB9_4
963; CHECK-NEXT:  # %bb.1: # %.preheader
964; CHECK-NEXT:    mtctr r4
965; CHECK-NEXT:    addi r5, r3, 2
966; CHECK-NEXT:    li r3, 0
967; CHECK-NEXT:    li r6, -1
968; CHECK-NEXT:    .p2align 4
969; CHECK-NEXT:  .LBB9_2:
970; CHECK-NEXT:    lwax r7, r5, r6
971; CHECK-NEXT:    lwa r8, 0(r5)
972; CHECK-NEXT:    lwa r9, 4(r5)
973; CHECK-NEXT:    lwa r10, 8(r5)
974; CHECK-NEXT:    addi r5, r5, 1
975; CHECK-NEXT:    mulld r7, r8, r7
976; CHECK-NEXT:    mulld r7, r7, r9
977; CHECK-NEXT:    maddld r3, r7, r10, r3
978; CHECK-NEXT:    bdnz .LBB9_2
979; CHECK-NEXT:  # %bb.3:
980; CHECK-NEXT:    add r3, r3, r4
981; CHECK-NEXT:    blr
982; CHECK-NEXT:  .LBB9_4:
983; CHECK-NEXT:    addi r3, r4, 0
984; CHECK-NEXT:    blr
985
986  %3 = sext i32 %1 to i64
987  %4 = icmp sgt i32 %1, 0
988  br i1 %4, label %5, label %31
989
9905:                                                ; preds = %2, %5
991  %6 = phi i64 [ %29, %5 ], [ 0, %2 ]
992  %7 = phi i64 [ %28, %5 ], [ 0, %2 ]
993  %8 = getelementptr inbounds i8, i8* %0, i64 %6
994  %9 = getelementptr inbounds i8, i8* %8, i64 1
995  %10 = bitcast i8* %9 to i32*
996  %11 = load i32, i32* %10, align 4
997  %12 = sext i32 %11 to i64
998  %13 = getelementptr inbounds i8, i8* %8, i64 2
999  %14 = bitcast i8* %13 to i32*
1000  %15 = load i32, i32* %14, align 4
1001  %16 = sext i32 %15 to i64
1002  %17 = getelementptr inbounds i8, i8* %8, i64 6
1003  %18 = bitcast i8* %17 to i32*
1004  %19 = load i32, i32* %18, align 4
1005  %20 = sext i32 %19 to i64
1006  %21 = getelementptr inbounds i8, i8* %8, i64 10
1007  %22 = bitcast i8* %21 to i32*
1008  %23 = load i32, i32* %22, align 4
1009  %24 = sext i32 %23 to i64
1010  %25 = mul nsw i64 %16, %12
1011  %26 = mul nsw i64 %25, %20
1012  %27 = mul nsw i64 %26, %24
1013  %28 = add nsw i64 %27, %7
1014  %29 = add nuw nsw i64 %6, 1
1015  %30 = icmp eq i64 %29, %3
1016  br i1 %30, label %31, label %5
1017
101831:                                               ; preds = %5, %2
1019  %32 = phi i64 [ 0, %2 ], [ %28, %5 ]
1020  %33 = add nsw i64 %32, %3
1021  ret i64 %33
1022}
1023
1024