[MIParser] Set RegClassOrRegBank during instruction parsing
[llvm-complete.git] / test / CodeGen / PowerPC / loop-instr-form-prepare.ll
blob593d276f95bd7fe2e348a005298631c77675fe31
1 ; RUN: llc -ppc-asm-full-reg-names -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 < %s | FileCheck %s
3 ; test_no_prep:
4 ; unsigned long test_no_prep(char *p, int count) {
5 ;   unsigned long i=0, res=0;
6 ;   int DISP1 = 4001;
7 ;   int DISP2 = 4002;
8 ;   int DISP3 = 4003;
9 ;   int DISP4 = 4004;
10 ;   for (; i < count ; i++) {
11 ;     unsigned long x1 = *(unsigned long *)(p + i + DISP1);
12 ;     unsigned long x2 = *(unsigned long *)(p + i + DISP2);
13 ;     unsigned long x3 = *(unsigned long *)(p + i + DISP3);
14 ;     unsigned long x4 = *(unsigned long *)(p + i + DISP4);
15 ;     res += x1*x2*x3*x4;
16 ;   }
17 ;   return res + count;
18 ; }
20 define i64 @test_no_prep(i8* %0, i32 signext %1) {
21 ; CHECK-LABEL: test_no_prep:
22 ; CHECK:         addi r3, r3, 4004
23 ; CHECK:       .LBB0_2: #
24 ; CHECK-NEXT:    ldx r9, r3, r6
25 ; CHECK-NEXT:    ldx r10, r3, r7
26 ; CHECK-NEXT:    mulld r9, r10, r9
27 ; CHECK-NEXT:    ldx r11, r3, r8
28 ; CHECK-NEXT:    mulld r9, r9, r11
29 ; CHECK-NEXT:    ld r12, 0(r3)
30 ; CHECK-NEXT:    addi r3, r3, 1
31 ; CHECK-NEXT:    maddld r5, r9, r12, r5
32 ; CHECK-NEXT:    bdnz .LBB0_2
33   %3 = sext i32 %1 to i64
34   %4 = icmp eq i32 %1, 0
35   br i1 %4, label %27, label %5
37 5:                                                ; preds = %2, %5
38   %6 = phi i64 [ %25, %5 ], [ 0, %2 ]
39   %7 = phi i64 [ %24, %5 ], [ 0, %2 ]
40   %8 = getelementptr inbounds i8, i8* %0, i64 %6
41   %9 = getelementptr inbounds i8, i8* %8, i64 4001
42   %10 = bitcast i8* %9 to i64*
43   %11 = load i64, i64* %10, align 8
44   %12 = getelementptr inbounds i8, i8* %8, i64 4002
45   %13 = bitcast i8* %12 to i64*
46   %14 = load i64, i64* %13, align 8
47   %15 = getelementptr inbounds i8, i8* %8, i64 4003
48   %16 = bitcast i8* %15 to i64*
49   %17 = load i64, i64* %16, align 8
50   %18 = getelementptr inbounds i8, i8* %8, i64 4004
51   %19 = bitcast i8* %18 to i64*
52   %20 = load i64, i64* %19, align 8
53   %21 = mul i64 %14, %11
54   %22 = mul i64 %21, %17
55   %23 = mul i64 %22, %20
56   %24 = add i64 %23, %7
57   %25 = add nuw i64 %6, 1
58   %26 = icmp ult i64 %25, %3
59   br i1 %26, label %5, label %27
61 27:                                               ; preds = %5, %2
62   %28 = phi i64 [ 0, %2 ], [ %24, %5 ]
63   %29 = add i64 %28, %3
64   ret i64 %29
67 ; test_ds_prep:
68 ; unsigned long test_ds_prep(char *p, int count) {
69 ;   unsigned long i=0, res=0;
70 ;   int DISP1 = 4001;
71 ;   int DISP2 = 4002;
72 ;   int DISP3 = 4003;
73 ;   int DISP4 = 4006;
74 ;   for (; i < count ; i++) {
75 ;     unsigned long x1 = *(unsigned long *)(p + i + DISP1);
76 ;     unsigned long x2 = *(unsigned long *)(p + i + DISP2);
77 ;     unsigned long x3 = *(unsigned long *)(p + i + DISP3);
78 ;     unsigned long x4 = *(unsigned long *)(p + i + DISP4);
79 ;     res += x1*x2*x3*x4;
80 ;   }
81 ;   return res + count;
82 ; }
84 define i64 @test_ds_prep(i8* %0, i32 signext %1) {
85 ; CHECK-LABEL: test_ds_prep:
86 ; CHECK:         addi r6, r3, 4001
87 ; CHECK:       .LBB1_2: #
88 ; CHECK-NEXT:    ld r10, 0(r6)
89 ; CHECK-NEXT:    ldx r11, r6, r5
90 ; CHECK-NEXT:    mulld r10, r11, r10
91 ; CHECK-NEXT:    ldx r12, r6, r7
92 ; CHECK-NEXT:    mulld r10, r10, r12
93 ; CHECK-NEXT:    addi r9, r6, 1
94 ; CHECK-NEXT:    ldx r6, r6, r8
95 ; CHECK-NEXT:    maddld r3, r10, r6, r3
96 ; CHECK-NEXT:    mr r6, r9
97 ; CHECK-NEXT:    bdnz .LBB1_2
98   %3 = sext i32 %1 to i64
99   %4 = icmp eq i32 %1, 0
100   br i1 %4, label %27, label %5
102 5:                                                ; preds = %2, %5
103   %6 = phi i64 [ %25, %5 ], [ 0, %2 ]
104   %7 = phi i64 [ %24, %5 ], [ 0, %2 ]
105   %8 = getelementptr inbounds i8, i8* %0, i64 %6
106   %9 = getelementptr inbounds i8, i8* %8, i64 4001
107   %10 = bitcast i8* %9 to i64*
108   %11 = load i64, i64* %10, align 8
109   %12 = getelementptr inbounds i8, i8* %8, i64 4002
110   %13 = bitcast i8* %12 to i64*
111   %14 = load i64, i64* %13, align 8
112   %15 = getelementptr inbounds i8, i8* %8, i64 4003
113   %16 = bitcast i8* %15 to i64*
114   %17 = load i64, i64* %16, align 8
115   %18 = getelementptr inbounds i8, i8* %8, i64 4006
116   %19 = bitcast i8* %18 to i64*
117   %20 = load i64, i64* %19, align 8
118   %21 = mul i64 %14, %11
119   %22 = mul i64 %21, %17
120   %23 = mul i64 %22, %20
121   %24 = add i64 %23, %7
122   %25 = add nuw i64 %6, 1
123   %26 = icmp ult i64 %25, %3
124   br i1 %26, label %5, label %27
126 27:                                               ; preds = %5, %2
127   %28 = phi i64 [ 0, %2 ], [ %24, %5 ]
128   %29 = add i64 %28, %3
129   ret i64 %29
132 ; test_max_number_reminder:
133 ; unsigned long test_max_number_reminder(char *p, int count) {
134 ;  unsigned long i=0, res=0;
135 ;  int DISP1 = 4001;
136 ;  int DISP2 = 4002;
137 ;  int DISP3 = 4003;
138 ;  int DISP4 = 4005;
139 ;  int DISP5 = 4006;
140 ;  int DISP6 = 4007;
141 ;  int DISP7 = 4014;
142 ;  int DISP8 = 4010;
143 ;  int DISP9 = 4011;
144 ;  for (; i < count ; i++) {
145 ;    unsigned long x1 = *(unsigned long *)(p + i + DISP1);
146 ;    unsigned long x2 = *(unsigned long *)(p + i + DISP2);
147 ;    unsigned long x3 = *(unsigned long *)(p + i + DISP3);
148 ;    unsigned long x4 = *(unsigned long *)(p + i + DISP4);
149 ;    unsigned long x5 = *(unsigned long *)(p + i + DISP5);
150 ;    unsigned long x6 = *(unsigned long *)(p + i + DISP6);
151 ;    unsigned long x7 = *(unsigned long *)(p + i + DISP7);
152 ;    unsigned long x8 = *(unsigned long *)(p + i + DISP8);
153 ;    unsigned long x9 = *(unsigned long *)(p + i + DISP9);
154 ;    res += x1*x2*x3*x4*x5*x6*x7*x8*x9;
155 ;  }
156 ;  return res + count;
159 define i64 @test_max_number_reminder(i8* %0, i32 signext %1) {
160 ; CHECK-LABEL: test_max_number_reminder:
161 ; CHECK:         addi r8, r3, 4001
162 ; CHECK:       .LBB2_2: #
163 ; CHECK-NEXT:    ld r30, 0(r8)
164 ; CHECK-NEXT:    ldx r29, r8, r5
165 ; CHECK-NEXT:    mulld r30, r29, r30
166 ; CHECK-NEXT:    addi r0, r8, 1
167 ; CHECK-NEXT:    ld r28, 4(r8)
168 ; CHECK-NEXT:    ldx r27, r8, r7
169 ; CHECK-NEXT:    ldx r26, r8, r9
170 ; CHECK-NEXT:    ldx r25, r8, r10
171 ; CHECK-NEXT:    ldx r24, r8, r11
172 ; CHECK-NEXT:    ldx r23, r8, r12
173 ; CHECK-NEXT:    ldx r8, r8, r6
174 ; CHECK-NEXT:    mulld r8, r30, r8
175 ; CHECK-NEXT:    mulld r8, r8, r28
176 ; CHECK-NEXT:    mulld r8, r8, r27
177 ; CHECK-NEXT:    mulld r8, r8, r26
178 ; CHECK-NEXT:    mulld r8, r8, r25
179 ; CHECK-NEXT:    mulld r8, r8, r24
180 ; CHECK-NEXT:    maddld r3, r8, r23, r3
181 ; CHECK-NEXT:    mr r8, r0
182 ; CHECK-NEXT:    bdnz .LBB2_2
183   %3 = sext i32 %1 to i64
184   %4 = icmp eq i32 %1, 0
185   br i1 %4, label %47, label %5
187 5:                                                ; preds = %2, %5
188   %6 = phi i64 [ %45, %5 ], [ 0, %2 ]
189   %7 = phi i64 [ %44, %5 ], [ 0, %2 ]
190   %8 = getelementptr inbounds i8, i8* %0, i64 %6
191   %9 = getelementptr inbounds i8, i8* %8, i64 4001
192   %10 = bitcast i8* %9 to i64*
193   %11 = load i64, i64* %10, align 8
194   %12 = getelementptr inbounds i8, i8* %8, i64 4002
195   %13 = bitcast i8* %12 to i64*
196   %14 = load i64, i64* %13, align 8
197   %15 = getelementptr inbounds i8, i8* %8, i64 4003
198   %16 = bitcast i8* %15 to i64*
199   %17 = load i64, i64* %16, align 8
200   %18 = getelementptr inbounds i8, i8* %8, i64 4005
201   %19 = bitcast i8* %18 to i64*
202   %20 = load i64, i64* %19, align 8
203   %21 = getelementptr inbounds i8, i8* %8, i64 4006
204   %22 = bitcast i8* %21 to i64*
205   %23 = load i64, i64* %22, align 8
206   %24 = getelementptr inbounds i8, i8* %8, i64 4007
207   %25 = bitcast i8* %24 to i64*
208   %26 = load i64, i64* %25, align 8
209   %27 = getelementptr inbounds i8, i8* %8, i64 4014
210   %28 = bitcast i8* %27 to i64*
211   %29 = load i64, i64* %28, align 8
212   %30 = getelementptr inbounds i8, i8* %8, i64 4010
213   %31 = bitcast i8* %30 to i64*
214   %32 = load i64, i64* %31, align 8
215   %33 = getelementptr inbounds i8, i8* %8, i64 4011
216   %34 = bitcast i8* %33 to i64*
217   %35 = load i64, i64* %34, align 8
218   %36 = mul i64 %14, %11
219   %37 = mul i64 %36, %17
220   %38 = mul i64 %37, %20
221   %39 = mul i64 %38, %23
222   %40 = mul i64 %39, %26
223   %41 = mul i64 %40, %29
224   %42 = mul i64 %41, %32
225   %43 = mul i64 %42, %35
226   %44 = add i64 %43, %7
227   %45 = add nuw i64 %6, 1
228   %46 = icmp ult i64 %45, %3
229   br i1 %46, label %5, label %47
231 47:                                               ; preds = %5, %2
232   %48 = phi i64 [ 0, %2 ], [ %44, %5 ]
233   %49 = add i64 %48, %3
234   ret i64 %49
237 ; test_update_ds_prep_interact:
238 ; unsigned long test_update_ds_prep_interact(char *p, int count) {
239 ;   unsigned long i=0, res=0;
240 ;   int DISP1 = 4001;
241 ;   int DISP2 = 4002;
242 ;   int DISP3 = 4003;
243 ;   int DISP4 = 4006;
244 ;   for (; i < count ; i++) {
245 ;     unsigned long x1 = *(unsigned long *)(p + 4 * i + DISP1);
246 ;     unsigned long x2 = *(unsigned long *)(p + 4 * i + DISP2);
247 ;     unsigned long x3 = *(unsigned long *)(p + 4 * i + DISP3);
248 ;     unsigned long x4 = *(unsigned long *)(p + 4 * i + DISP4);
249 ;     res += x1*x2*x3*x4;
250 ;   }
251 ;   return res + count;
252 ; }
254 define dso_local i64 @test_update_ds_prep_interact(i8* %0, i32 signext %1) {
255 ; CHECK-LABEL: test_update_ds_prep_interact:
256 ; CHECK:         addi r3, r3, 3997
257 ; CHECK:       .LBB3_2: #
258 ; CHECK-NEXT:    ldu r9, 4(r3)
259 ; CHECK-NEXT:    ldx r10, r3, r6
260 ; CHECK-NEXT:    mulld r9, r10, r9
261 ; CHECK-NEXT:    ldx r11, r3, r7
262 ; CHECK-NEXT:    mulld r9, r9, r11
263 ; CHECK-NEXT:    ldx r12, r3, r8
264 ; CHECK-NEXT:    maddld r5, r9, r12, r5
265 ; CHECK-NEXT:    bdnz .LBB3_2
266   %3 = sext i32 %1 to i64
267   %4 = icmp eq i32 %1, 0
268   br i1 %4, label %28, label %5
270 5:                                                ; preds = %2, %5
271   %6 = phi i64 [ %26, %5 ], [ 0, %2 ]
272   %7 = phi i64 [ %25, %5 ], [ 0, %2 ]
273   %8 = shl i64 %6, 2
274   %9 = getelementptr inbounds i8, i8* %0, i64 %8
275   %10 = getelementptr inbounds i8, i8* %9, i64 4001
276   %11 = bitcast i8* %10 to i64*
277   %12 = load i64, i64* %11, align 8
278   %13 = getelementptr inbounds i8, i8* %9, i64 4002
279   %14 = bitcast i8* %13 to i64*
280   %15 = load i64, i64* %14, align 8
281   %16 = getelementptr inbounds i8, i8* %9, i64 4003
282   %17 = bitcast i8* %16 to i64*
283   %18 = load i64, i64* %17, align 8
284   %19 = getelementptr inbounds i8, i8* %9, i64 4006
285   %20 = bitcast i8* %19 to i64*
286   %21 = load i64, i64* %20, align 8
287   %22 = mul i64 %15, %12
288   %23 = mul i64 %22, %18
289   %24 = mul i64 %23, %21
290   %25 = add i64 %24, %7
291   %26 = add nuw i64 %6, 1
292   %27 = icmp ult i64 %26, %3
293   br i1 %27, label %5, label %28
295 28:                                               ; preds = %5, %2
296   %29 = phi i64 [ 0, %2 ], [ %25, %5 ]
297   %30 = add i64 %29, %3
298   ret i64 %30
301 ; test_update_ds_prep_nointeract:
302 ; unsigned long test_update_ds_prep_nointeract(char *p, int count) {
303 ;   unsigned long i=0, res=0;
304 ;   int DISP1 = 4001;
305 ;   int DISP2 = 4002;
306 ;   int DISP3 = 4003;
307 ;   int DISP4 = 4007;
308 ;   for (; i < count ; i++) {
309 ;     char x1 = *(p + i + DISP1);
310 ;     unsigned long x2 = *(unsigned long *)(p + i + DISP2);
311 ;     unsigned long x3 = *(unsigned long *)(p + i + DISP3);
312 ;     unsigned long x4 = *(unsigned long *)(p + i + DISP4);
313 ;     res += (unsigned long)x1*x2*x3*x4;
314 ;   }
315 ;   return res + count;
316 ; }
318 define i64 @test_update_ds_prep_nointeract(i8* %0, i32 signext %1) {
319 ; CHECK-LABEL: test_update_ds_prep_nointeract:
320 ; CHECK:         addi r3, r3, 4000
321 ; CHECK:       .LBB4_2: #
322 ; CHECK-NEXT:    lbzu r9, 1(r3)
323 ; CHECK-NEXT:    ldx r10, r3, r6
324 ; CHECK-NEXT:    mulld r9, r10, r9
325 ; CHECK-NEXT:    ldx r11, r3, r7
326 ; CHECK-NEXT:    mulld r9, r9, r11
327 ; CHECK-NEXT:    ldx r12, r3, r8
328 ; CHECK-NEXT:    maddld r5, r9, r12, r5
329 ; CHECK-NEXT:    bdnz .LBB4_2
330   %3 = sext i32 %1 to i64
331   %4 = icmp eq i32 %1, 0
332   br i1 %4, label %27, label %5
334 5:                                                ; preds = %2, %5
335   %6 = phi i64 [ %25, %5 ], [ 0, %2 ]
336   %7 = phi i64 [ %24, %5 ], [ 0, %2 ]
337   %8 = getelementptr inbounds i8, i8* %0, i64 %6
338   %9 = getelementptr inbounds i8, i8* %8, i64 4001
339   %10 = load i8, i8* %9, align 1
340   %11 = getelementptr inbounds i8, i8* %8, i64 4002
341   %12 = bitcast i8* %11 to i64*
342   %13 = load i64, i64* %12, align 8
343   %14 = getelementptr inbounds i8, i8* %8, i64 4003
344   %15 = bitcast i8* %14 to i64*
345   %16 = load i64, i64* %15, align 8
346   %17 = getelementptr inbounds i8, i8* %8, i64 4007
347   %18 = bitcast i8* %17 to i64*
348   %19 = load i64, i64* %18, align 8
349   %20 = zext i8 %10 to i64
350   %21 = mul i64 %13, %20
351   %22 = mul i64 %21, %16
352   %23 = mul i64 %22, %19
353   %24 = add i64 %23, %7
354   %25 = add nuw i64 %6, 1
355   %26 = icmp ult i64 %25, %3
356   br i1 %26, label %5, label %27
358 27:                                               ; preds = %5, %2
359   %28 = phi i64 [ 0, %2 ], [ %24, %5 ]
360   %29 = add i64 %28, %3
361   ret i64 %29
364 ; test_ds_multiple_chains:
365 ; unsigned long test_ds_multiple_chains(char *p, char *q, int count) {
366 ;   unsigned long i=0, res=0;
367 ;   int DISP1 = 4001;
368 ;   int DISP2 = 4010;
369 ;   int DISP3 = 4005;
370 ;   int DISP4 = 4009;
371 ;   for (; i < count ; i++) {
372 ;     unsigned long x1 = *(unsigned long *)(p + i + DISP1);
373 ;     unsigned long x2 = *(unsigned long *)(p + i + DISP2);
374 ;     unsigned long x3 = *(unsigned long *)(p + i + DISP3);
375 ;     unsigned long x4 = *(unsigned long *)(p + i + DISP4);
376 ;     unsigned long x5 = *(unsigned long *)(q + i + DISP1);
377 ;     unsigned long x6 = *(unsigned long *)(q + i + DISP2);
378 ;     unsigned long x7 = *(unsigned long *)(q + i + DISP3);
379 ;     unsigned long x8 = *(unsigned long *)(q + i + DISP4);
380 ;     res += x1*x2*x3*x4*x5*x6*x7*x8;
381 ;   }
382 ;   return res + count;
383 ; }
385 define dso_local i64 @test_ds_multiple_chains(i8* %0, i8* %1, i32 signext %2) {
386 ; CHECK-LABEL: test_ds_multiple_chains:
387 ; CHECK:         addi r3, r3, 4010
388 ; CHECK:         addi r4, r4, 4010
389 ; CHECK:       .LBB5_2: #
390 ; CHECK-NEXT:    ldx r10, r3, r7
391 ; CHECK-NEXT:    ld r11, 0(r3)
392 ; CHECK-NEXT:    mulld r10, r11, r10
393 ; CHECK-NEXT:    ldx r11, r3, r8
394 ; CHECK-NEXT:    mulld r10, r10, r11
395 ; CHECK-NEXT:    ldx r12, r3, r9
396 ; CHECK-NEXT:    addi r3, r3, 1
397 ; CHECK-NEXT:    mulld r10, r10, r12
398 ; CHECK-NEXT:    ldx r0, r4, r7
399 ; CHECK-NEXT:    mulld r10, r10, r0
400 ; CHECK-NEXT:    ld r30, 0(r4)
401 ; CHECK-NEXT:    mulld r10, r10, r30
402 ; CHECK-NEXT:    ldx r29, r4, r8
403 ; CHECK-NEXT:    mulld r10, r10, r29
404 ; CHECK-NEXT:    ldx r28, r4, r9
405 ; CHECK-NEXT:    addi r4, r4, 1
406 ; CHECK-NEXT:    maddld r6, r10, r28, r6
407 ; CHECK-NEXT:    bdnz .LBB5_2
408   %4 = sext i32 %2 to i64
409   %5 = icmp eq i32 %2, 0
410   br i1 %5, label %45, label %6
412 6:                                                ; preds = %3, %6
413   %7 = phi i64 [ %43, %6 ], [ 0, %3 ]
414   %8 = phi i64 [ %42, %6 ], [ 0, %3 ]
415   %9 = getelementptr inbounds i8, i8* %0, i64 %7
416   %10 = getelementptr inbounds i8, i8* %9, i64 4001
417   %11 = bitcast i8* %10 to i64*
418   %12 = load i64, i64* %11, align 8
419   %13 = getelementptr inbounds i8, i8* %9, i64 4010
420   %14 = bitcast i8* %13 to i64*
421   %15 = load i64, i64* %14, align 8
422   %16 = getelementptr inbounds i8, i8* %9, i64 4005
423   %17 = bitcast i8* %16 to i64*
424   %18 = load i64, i64* %17, align 8
425   %19 = getelementptr inbounds i8, i8* %9, i64 4009
426   %20 = bitcast i8* %19 to i64*
427   %21 = load i64, i64* %20, align 8
428   %22 = getelementptr inbounds i8, i8* %1, i64 %7
429   %23 = getelementptr inbounds i8, i8* %22, i64 4001
430   %24 = bitcast i8* %23 to i64*
431   %25 = load i64, i64* %24, align 8
432   %26 = getelementptr inbounds i8, i8* %22, i64 4010
433   %27 = bitcast i8* %26 to i64*
434   %28 = load i64, i64* %27, align 8
435   %29 = getelementptr inbounds i8, i8* %22, i64 4005
436   %30 = bitcast i8* %29 to i64*
437   %31 = load i64, i64* %30, align 8
438   %32 = getelementptr inbounds i8, i8* %22, i64 4009
439   %33 = bitcast i8* %32 to i64*
440   %34 = load i64, i64* %33, align 8
441   %35 = mul i64 %15, %12
442   %36 = mul i64 %35, %18
443   %37 = mul i64 %36, %21
444   %38 = mul i64 %37, %25
445   %39 = mul i64 %38, %28
446   %40 = mul i64 %39, %31
447   %41 = mul i64 %40, %34
448   %42 = add i64 %41, %8
449   %43 = add nuw i64 %7, 1
450   %44 = icmp ult i64 %43, %4
451   br i1 %44, label %6, label %45
453 45:                                               ; preds = %6, %3
454   %46 = phi i64 [ 0, %3 ], [ %42, %6 ]
455   %47 = add i64 %46, %4
456   ret i64 %47
459 ; test_ds_cross_basic_blocks:
460 ;extern char *arr;
461 ;unsigned long foo(char *p, int count)
463 ;  unsigned long i=0, res=0;
464 ;  int DISP1 = 4000;
465 ;  int DISP2 = 4001;
466 ;  int DISP3 = 4002;
467 ;  int DISP4 = 4003;
468 ;  int DISP5 = 4005;
469 ;  int DISP6 = 4009;
470 ;  unsigned long x1, x2, x3, x4, x5, x6;
471 ;  x1=x2=x3=x4=x5=x6=1;
472 ;  for (; i < count ; i++) {
473 ;    if (arr[i] % 3 == 1) {
474 ;      x1 += *(unsigned long *)(p + i + DISP1);
475 ;      x2 += *(unsigned long *)(p + i + DISP2);
476 ;    }
477 ;    else if (arr[i] % 3 == 2) {
478 ;      x3 += *(unsigned long *)(p + i + DISP3);
479 ;      x4 += *(unsigned long *)(p + i + DISP5);
480 ;    }
481 ;    else {
482 ;      x5 += *(unsigned long *)(p + i + DISP4);
483 ;      x6 += *(unsigned long *)(p + i + DISP6);
484 ;    }
485 ;    res += x1*x2*x3*x4*x5*x6;
486 ;  }
487 ;  return res;
490 @arr = external local_unnamed_addr global i8*, align 8
492 define i64 @test_ds_cross_basic_blocks(i8* %0, i32 signext %1) {
493 ; CHECK-LABEL: test_ds_cross_basic_blocks:
494 ; CHECK:         addi r5, r3, 4000
495 ; CHECK:       .LBB6_2: #
496 ; CHECK-NEXT:    ld r0, 0(r5)
497 ; CHECK-NEXT:    add r26, r0, r26
498 ; CHECK-NEXT:    ldx r0, r5, r7
499 ; CHECK-NEXT:    add r27, r0, r27
500 ; CHECK-NEXT:  .LBB6_3: #
501 ; CHECK-NEXT:    mulld r0, r27, r26
502 ; CHECK-NEXT:    mulld r0, r0, r28
503 ; CHECK-NEXT:    mulld r0, r0, r29
504 ; CHECK-NEXT:    mulld r0, r0, r30
505 ; CHECK-NEXT:    maddld r3, r0, r12, r3
506 ; CHECK-NEXT:    addi r5, r5, 1
507 ; CHECK-NEXT:    bdz .LBB6_9
508 ; CHECK-NEXT:  .LBB6_4: #
509 ; CHECK-NEXT:    lbzu r0, 1(r6)
510 ; CHECK-NEXT:    clrldi r25, r0, 32
511 ; CHECK-NEXT:    mulld r25, r25, r4
512 ; CHECK-NEXT:    rldicl r25, r25, 31, 33
513 ; CHECK-NEXT:    slwi r24, r25, 1
514 ; CHECK-NEXT:    add r25, r25, r24
515 ; CHECK-NEXT:    subf r0, r25, r0
516 ; CHECK-NEXT:    cmplwi r0, 1
517 ; CHECK-NEXT:    beq cr0, .LBB6_2
518 ; CHECK-NEXT:  # %bb.5: #
519 ; CHECK-NEXT:    clrlwi r0, r0, 24
520 ; CHECK-NEXT:    cmplwi r0, 2
521 ; CHECK-NEXT:    bne cr0, .LBB6_7
522 ; CHECK-NEXT:  # %bb.6: #
523 ; CHECK-NEXT:    ldx r0, r5, r8
524 ; CHECK-NEXT:    add r28, r0, r28
525 ; CHECK-NEXT:    ldx r0, r5, r9
526 ; CHECK-NEXT:    add r29, r0, r29
527 ; CHECK-NEXT:    b .LBB6_3
528 ; CHECK-NEXT:    .p2align 4
529 ; CHECK-NEXT:  .LBB6_7: #
530 ; CHECK-NEXT:    ldx r0, r5, r10
531 ; CHECK-NEXT:    add r30, r0, r30
532 ; CHECK-NEXT:    ldx r0, r5, r11
533 ; CHECK-NEXT:    add r12, r0, r12
534   %3 = sext i32 %1 to i64
535   %4 = icmp eq i32 %1, 0
536   br i1 %4, label %66, label %5
538 5:                                                ; preds = %2
539   %6 = load i8*, i8** @arr, align 8
540   br label %7
542 7:                                                ; preds = %5, %51
543   %8 = phi i64 [ 1, %5 ], [ %57, %51 ]
544   %9 = phi i64 [ 1, %5 ], [ %56, %51 ]
545   %10 = phi i64 [ 1, %5 ], [ %55, %51 ]
546   %11 = phi i64 [ 1, %5 ], [ %54, %51 ]
547   %12 = phi i64 [ 1, %5 ], [ %53, %51 ]
548   %13 = phi i64 [ 1, %5 ], [ %52, %51 ]
549   %14 = phi i64 [ 0, %5 ], [ %64, %51 ]
550   %15 = phi i64 [ 0, %5 ], [ %63, %51 ]
551   %16 = getelementptr inbounds i8, i8* %6, i64 %14
552   %17 = load i8, i8* %16, align 1
553   %18 = urem i8 %17, 3
554   %19 = icmp eq i8 %18, 1
555   br i1 %19, label %20, label %30
557 20:                                               ; preds = %7
558   %21 = getelementptr inbounds i8, i8* %0, i64 %14
559   %22 = getelementptr inbounds i8, i8* %21, i64 4000
560   %23 = bitcast i8* %22 to i64*
561   %24 = load i64, i64* %23, align 8
562   %25 = add i64 %24, %13
563   %26 = getelementptr inbounds i8, i8* %21, i64 4001
564   %27 = bitcast i8* %26 to i64*
565   %28 = load i64, i64* %27, align 8
566   %29 = add i64 %28, %12
567   br label %51
569 30:                                               ; preds = %7
570   %31 = icmp eq i8 %18, 2
571   %32 = getelementptr inbounds i8, i8* %0, i64 %14
572   br i1 %31, label %33, label %42
574 33:                                               ; preds = %30
575   %34 = getelementptr inbounds i8, i8* %32, i64 4002
576   %35 = bitcast i8* %34 to i64*
577   %36 = load i64, i64* %35, align 8
578   %37 = add i64 %36, %11
579   %38 = getelementptr inbounds i8, i8* %32, i64 4005
580   %39 = bitcast i8* %38 to i64*
581   %40 = load i64, i64* %39, align 8
582   %41 = add i64 %40, %10
583   br label %51
585 42:                                               ; preds = %30
586   %43 = getelementptr inbounds i8, i8* %32, i64 4003
587   %44 = bitcast i8* %43 to i64*
588   %45 = load i64, i64* %44, align 8
589   %46 = add i64 %45, %9
590   %47 = getelementptr inbounds i8, i8* %32, i64 4009
591   %48 = bitcast i8* %47 to i64*
592   %49 = load i64, i64* %48, align 8
593   %50 = add i64 %49, %8
594   br label %51
596 51:                                               ; preds = %33, %42, %20
597   %52 = phi i64 [ %25, %20 ], [ %13, %33 ], [ %13, %42 ]
598   %53 = phi i64 [ %29, %20 ], [ %12, %33 ], [ %12, %42 ]
599   %54 = phi i64 [ %11, %20 ], [ %37, %33 ], [ %11, %42 ]
600   %55 = phi i64 [ %10, %20 ], [ %41, %33 ], [ %10, %42 ]
601   %56 = phi i64 [ %9, %20 ], [ %9, %33 ], [ %46, %42 ]
602   %57 = phi i64 [ %8, %20 ], [ %8, %33 ], [ %50, %42 ]
603   %58 = mul i64 %53, %52
604   %59 = mul i64 %58, %54
605   %60 = mul i64 %59, %55
606   %61 = mul i64 %60, %56
607   %62 = mul i64 %61, %57
608   %63 = add i64 %62, %15
609   %64 = add nuw i64 %14, 1
610   %65 = icmp ult i64 %64, %3
611   br i1 %65, label %7, label %66
613 66:                                               ; preds = %51, %2
614   %67 = phi i64 [ 0, %2 ], [ %63, %51 ]
615   ret i64 %67
618 ; test_ds_float:
619 ;float test_ds_float(char *p, int count) {
620 ;  int i=0 ;
621 ;  float res=0;
622 ;  int DISP1 = 4001;
623 ;  int DISP2 = 4002;
624 ;  int DISP3 = 4022;
625 ;  int DISP4 = 4062;
626 ;  for (; i < count ; i++) {
627 ;    float x1 = *(float *)(p + i + DISP1);
628 ;    float x2 = *(float *)(p + i + DISP2);
629 ;    float x3 = *(float *)(p + i + DISP3);
630 ;    float x4 = *(float *)(p + i + DISP4);
631 ;    res += x1*x2*x3*x4;
632 ;  }
633 ;  return res;
636 define float @test_ds_float(i8* %0, i32 signext %1) {
637 ; CHECK-LABEL: test_ds_float:
638 ; CHECK:         addi r3, r3, 4000
639 ; CHECK:       .LBB7_2: #
640 ; CHECK-NEXT:    lfsu f0, 1(r3)
641 ; CHECK-NEXT:    lfsx f2, r3, r4
642 ; CHECK-NEXT:    lfsx f3, r3, r5
643 ; CHECK-NEXT:    xsmulsp f0, f0, f2
644 ; CHECK-NEXT:    lfsx f4, r3, r6
645 ; CHECK-NEXT:    xsmulsp f0, f0, f3
646 ; CHECK-NEXT:    xsmulsp f0, f0, f4
647 ; CHECK-NEXT:    xsaddsp f1, f1, f0
648 ; CHECK-NEXT:    bdnz .LBB7_2
649   %3 = icmp sgt i32 %1, 0
650   br i1 %3, label %4, label %28
652 4:                                                ; preds = %2
653   %5 = zext i32 %1 to i64
654   br label %6
656 6:                                                ; preds = %6, %4
657   %7 = phi i64 [ 0, %4 ], [ %26, %6 ]
658   %8 = phi float [ 0.000000e+00, %4 ], [ %25, %6 ]
659   %9 = getelementptr inbounds i8, i8* %0, i64 %7
660   %10 = getelementptr inbounds i8, i8* %9, i64 4001
661   %11 = bitcast i8* %10 to float*
662   %12 = load float, float* %11, align 4
663   %13 = getelementptr inbounds i8, i8* %9, i64 4002
664   %14 = bitcast i8* %13 to float*
665   %15 = load float, float* %14, align 4
666   %16 = getelementptr inbounds i8, i8* %9, i64 4022
667   %17 = bitcast i8* %16 to float*
668   %18 = load float, float* %17, align 4
669   %19 = getelementptr inbounds i8, i8* %9, i64 4062
670   %20 = bitcast i8* %19 to float*
671   %21 = load float, float* %20, align 4
672   %22 = fmul float %12, %15
673   %23 = fmul float %22, %18
674   %24 = fmul float %23, %21
675   %25 = fadd float %8, %24
676   %26 = add nuw nsw i64 %7, 1
677   %27 = icmp eq i64 %26, %5
678   br i1 %27, label %28, label %6
680 28:                                               ; preds = %6, %2
681   %29 = phi float [ 0.000000e+00, %2 ], [ %25, %6 ]
682   ret float %29
685 ; test_ds_combine_float_int:
686 ;float test_ds_combine_float_int(char *p, int count) {
687 ;  int i=0 ;
688 ;  float res=0;
689 ;  int DISP1 = 4001;
690 ;  int DISP2 = 4002;
691 ;  int DISP3 = 4022;
692 ;  int DISP4 = 4062;
693 ;  for (; i < count ; i++) {
694 ;    float x1 = *(float *)(p + i + DISP1);
695 ;    unsigned long x2 = *(unsigned long*)(p + i + DISP2);
696 ;    float x3 = *(float *)(p + i + DISP3);
697 ;    float x4 = *(float *)(p + i + DISP4);
698 ;    res += x1*x2*x3*x4;
699 ;  }
700 ;  return res;
703 define float @test_ds_combine_float_int(i8* %0, i32 signext %1) {
704 ; CHECK-LABEL: test_ds_combine_float_int:
705 ; CHECK:         addi r4, r3, 4001
706 ; CHECK:         addi r3, r3, 4000
707 ; CHECK:       .LBB8_2: #
708 ; CHECK-NEXT:    lfdu f4, 1(r4)
709 ; CHECK-NEXT:    lfsu f0, 1(r3)
710 ; CHECK-NEXT:    xscvuxdsp f4, f4
711 ; CHECK-NEXT:    lfsx f2, r3, r5
712 ; CHECK-NEXT:    lfsx f3, r3, r6
713 ; CHECK-NEXT:    xsmulsp f0, f0, f4
714 ; CHECK-NEXT:    xsmulsp f0, f2, f0
715 ; CHECK-NEXT:    xsmulsp f0, f3, f0
716 ; CHECK-NEXT:    xsaddsp f1, f1, f0
717 ; CHECK-NEXT:    bdnz .LBB8_2
718   %3 = icmp sgt i32 %1, 0
719   br i1 %3, label %4, label %29
721 4:                                                ; preds = %2
722   %5 = zext i32 %1 to i64
723   br label %6
725 6:                                                ; preds = %6, %4
726   %7 = phi i64 [ 0, %4 ], [ %27, %6 ]
727   %8 = phi float [ 0.000000e+00, %4 ], [ %26, %6 ]
728   %9 = getelementptr inbounds i8, i8* %0, i64 %7
729   %10 = getelementptr inbounds i8, i8* %9, i64 4001
730   %11 = bitcast i8* %10 to float*
731   %12 = load float, float* %11, align 4
732   %13 = getelementptr inbounds i8, i8* %9, i64 4002
733   %14 = bitcast i8* %13 to i64*
734   %15 = load i64, i64* %14, align 8
735   %16 = getelementptr inbounds i8, i8* %9, i64 4022
736   %17 = bitcast i8* %16 to float*
737   %18 = load float, float* %17, align 4
738   %19 = getelementptr inbounds i8, i8* %9, i64 4062
739   %20 = bitcast i8* %19 to float*
740   %21 = load float, float* %20, align 4
741   %22 = uitofp i64 %15 to float
742   %23 = fmul float %12, %22
743   %24 = fmul float %18, %23
744   %25 = fmul float %21, %24
745   %26 = fadd float %8, %25
746   %27 = add nuw nsw i64 %7, 1
747   %28 = icmp eq i64 %27, %5
748   br i1 %28, label %29, label %6
750 29:                                               ; preds = %6, %2
751   %30 = phi float [ 0.000000e+00, %2 ], [ %26, %6 ]
752   ret float %30