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