1
1
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2
- ; RUN: opt -p loop-unroll -unroll-allow-partial -unroll-max-count=4 -S %s | FileCheck %s
2
+ ; RUN: opt -p loop-unroll -unroll-add-parallel-reductions -unroll- allow-partial -unroll-max-count=4 -S %s | FileCheck %s
3
3
4
4
define i32 @test_add (ptr %src , i64 %n , i32 %start ) {
5
5
; CHECK-LABEL: define i32 @test_add(
@@ -8,27 +8,33 @@ define i32 @test_add(ptr %src, i64 %n, i32 %start) {
8
8
; CHECK-NEXT: br label %[[LOOP:.*]]
9
9
; CHECK: [[LOOP]]:
10
10
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT_3:%.*]], %[[LOOP]] ]
11
- ; CHECK-NEXT: [[RDX:%.*]] = phi i32 [ [[START]], %[[ENTRY]] ], [ [[RDX_NEXT_3:%.*]], %[[LOOP]] ]
11
+ ; CHECK-NEXT: [[RDX_1:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[RDX_NEXT_3:%.*]], %[[LOOP]] ]
12
+ ; CHECK-NEXT: [[RDX_NEXT_1:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[RDX_NEXT_2:%.*]], %[[LOOP]] ]
13
+ ; CHECK-NEXT: [[RDX_3:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[RDX_NEXT_24:%.*]], %[[LOOP]] ]
14
+ ; CHECK-NEXT: [[RDX:%.*]] = phi i32 [ [[START]], %[[ENTRY]] ], [ [[RDX_NEXT:%.*]], %[[LOOP]] ]
12
15
; CHECK-NEXT: [[IV_NEXT:%.*]] = add nuw nsw i64 [[IV]], 1
13
16
; CHECK-NEXT: [[GEP_SRC:%.*]] = getelementptr i32, ptr [[SRC]], i64 [[IV]]
14
17
; CHECK-NEXT: [[L:%.*]] = load i32, ptr [[GEP_SRC]], align 1
15
- ; CHECK-NEXT: [[RDX_NEXT:%.* ]] = add i32 [[RDX]], [[L]]
18
+ ; CHECK-NEXT: [[RDX_NEXT]] = add i32 [[RDX]], [[L]]
16
19
; CHECK-NEXT: [[IV_NEXT_1:%.*]] = add nuw nsw i64 [[IV]], 2
17
20
; CHECK-NEXT: [[GEP_SRC_1:%.*]] = getelementptr i32, ptr [[SRC]], i64 [[IV_NEXT]]
18
21
; CHECK-NEXT: [[L_1:%.*]] = load i32, ptr [[GEP_SRC_1]], align 1
19
- ; CHECK-NEXT: [[RDX_NEXT_1:%.* ]] = add i32 [[RDX_NEXT ]], [[L_1]]
22
+ ; CHECK-NEXT: [[RDX_NEXT_3 ]] = add i32 [[RDX_1 ]], [[L_1]]
20
23
; CHECK-NEXT: [[IV_NEXT_2:%.*]] = add nuw nsw i64 [[IV]], 3
21
24
; CHECK-NEXT: [[GEP_SRC_2:%.*]] = getelementptr i32, ptr [[SRC]], i64 [[IV_NEXT_1]]
22
25
; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[GEP_SRC_2]], align 1
23
- ; CHECK-NEXT: [[RDX_NEXT_2:%.* ]] = add i32 [[RDX_NEXT_1]], [[L_2]]
26
+ ; CHECK-NEXT: [[RDX_NEXT_2]] = add i32 [[RDX_NEXT_1]], [[L_2]]
24
27
; CHECK-NEXT: [[IV_NEXT_3]] = add nuw nsw i64 [[IV]], 4
25
28
; CHECK-NEXT: [[GEP_SRC_24:%.*]] = getelementptr i32, ptr [[SRC]], i64 [[IV_NEXT_2]]
26
29
; CHECK-NEXT: [[L_24:%.*]] = load i32, ptr [[GEP_SRC_24]], align 1
27
- ; CHECK-NEXT: [[RDX_NEXT_3 ]] = add i32 [[RDX_NEXT_2 ]], [[L_24]]
30
+ ; CHECK-NEXT: [[RDX_NEXT_24 ]] = add i32 [[RDX_3 ]], [[L_24]]
28
31
; CHECK-NEXT: [[EC_3:%.*]] = icmp ne i64 [[IV_NEXT_3]], 1000
29
32
; CHECK-NEXT: br i1 [[EC_3]], label %[[LOOP]], label %[[EXIT:.*]]
30
33
; CHECK: [[EXIT]]:
31
- ; CHECK-NEXT: [[RDX_NEXT_LCSSA:%.*]] = phi i32 [ [[RDX_NEXT_3]], %[[LOOP]] ]
34
+ ; CHECK-NEXT: [[RDX_NEXT_LCSSA1:%.*]] = phi i32 [ [[RDX_NEXT_24]], %[[LOOP]] ]
35
+ ; CHECK-NEXT: [[BIN_RDX:%.*]] = add i32 [[RDX_NEXT_3]], [[RDX_NEXT]]
36
+ ; CHECK-NEXT: [[BIN_RDX1:%.*]] = add i32 [[RDX_NEXT_2]], [[BIN_RDX]]
37
+ ; CHECK-NEXT: [[RDX_NEXT_LCSSA:%.*]] = add i32 [[RDX_NEXT_24]], [[BIN_RDX1]]
32
38
; CHECK-NEXT: ret i32 [[RDX_NEXT_LCSSA]]
33
39
;
34
40
entry:
@@ -203,33 +209,39 @@ define i32 @test_add_and_mul_reduction(ptr %src, i64 %n, i32 %start) {
203
209
; CHECK-NEXT: br label %[[LOOP:.*]]
204
210
; CHECK: [[LOOP]]:
205
211
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT_3:%.*]], %[[LOOP]] ]
206
- ; CHECK-NEXT: [[RDX_1:%.*]] = phi i32 [ [[START]], %[[ENTRY]] ], [ [[RDX_1_NEXT_3:%.*]], %[[LOOP]] ]
212
+ ; CHECK-NEXT: [[RDX_1_1:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[RDX_1_NEXT_1:%.*]], %[[LOOP]] ]
213
+ ; CHECK-NEXT: [[RDX_1_2:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[RDX_1_NEXT_2:%.*]], %[[LOOP]] ]
214
+ ; CHECK-NEXT: [[RDX_1_3:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[RDX_1_NEXT_24:%.*]], %[[LOOP]] ]
215
+ ; CHECK-NEXT: [[RDX_1:%.*]] = phi i32 [ [[START]], %[[ENTRY]] ], [ [[RDX_1_NEXT:%.*]], %[[LOOP]] ]
207
216
; CHECK-NEXT: [[RDX_2:%.*]] = phi i32 [ [[START]], %[[ENTRY]] ], [ [[RDX_2_NEXT_3:%.*]], %[[LOOP]] ]
208
217
; CHECK-NEXT: [[IV_NEXT:%.*]] = add nuw nsw i64 [[IV]], 1
209
218
; CHECK-NEXT: [[GEP_SRC:%.*]] = getelementptr i32, ptr [[SRC]], i64 [[IV]]
210
219
; CHECK-NEXT: [[L:%.*]] = load i32, ptr [[GEP_SRC]], align 1
211
- ; CHECK-NEXT: [[RDX_1_NEXT:%.* ]] = add i32 [[RDX_1]], [[L]]
220
+ ; CHECK-NEXT: [[RDX_1_NEXT]] = add i32 [[RDX_1]], [[L]]
212
221
; CHECK-NEXT: [[RDX_2_NEXT:%.*]] = mul i32 [[RDX_2]], [[L]]
213
222
; CHECK-NEXT: [[IV_NEXT_1:%.*]] = add nuw nsw i64 [[IV]], 2
214
223
; CHECK-NEXT: [[GEP_SRC_1:%.*]] = getelementptr i32, ptr [[SRC]], i64 [[IV_NEXT]]
215
224
; CHECK-NEXT: [[L_1:%.*]] = load i32, ptr [[GEP_SRC_1]], align 1
216
- ; CHECK-NEXT: [[RDX_1_2:%.* ]] = add i32 [[RDX_1_NEXT ]], [[L_1]]
225
+ ; CHECK-NEXT: [[RDX_1_NEXT_1 ]] = add i32 [[RDX_1_1 ]], [[L_1]]
217
226
; CHECK-NEXT: [[RDX_2_2:%.*]] = mul i32 [[RDX_2_NEXT]], [[L_1]]
218
227
; CHECK-NEXT: [[IV_NEXT_2:%.*]] = add nuw nsw i64 [[IV]], 3
219
228
; CHECK-NEXT: [[GEP_SRC_2:%.*]] = getelementptr i32, ptr [[SRC]], i64 [[IV_NEXT_1]]
220
229
; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[GEP_SRC_2]], align 1
221
- ; CHECK-NEXT: [[RDX_1_NEXT_2:%.* ]] = add i32 [[RDX_1_2]], [[L_2]]
230
+ ; CHECK-NEXT: [[RDX_1_NEXT_2]] = add i32 [[RDX_1_2]], [[L_2]]
222
231
; CHECK-NEXT: [[RDX_2_NEXT_2:%.*]] = mul i32 [[RDX_2_2]], [[L_2]]
223
232
; CHECK-NEXT: [[IV_NEXT_3]] = add nuw nsw i64 [[IV]], 4
224
233
; CHECK-NEXT: [[GEP_SRC_24:%.*]] = getelementptr i32, ptr [[SRC]], i64 [[IV_NEXT_2]]
225
234
; CHECK-NEXT: [[L_24:%.*]] = load i32, ptr [[GEP_SRC_24]], align 1
226
- ; CHECK-NEXT: [[RDX_1_NEXT_3 ]] = add i32 [[RDX_1_NEXT_2 ]], [[L_24]]
235
+ ; CHECK-NEXT: [[RDX_1_NEXT_24 ]] = add i32 [[RDX_1_3 ]], [[L_24]]
227
236
; CHECK-NEXT: [[RDX_2_NEXT_3]] = mul i32 [[RDX_2_NEXT_2]], [[L_24]]
228
237
; CHECK-NEXT: [[EC_3:%.*]] = icmp ne i64 [[IV_NEXT_3]], 1000
229
238
; CHECK-NEXT: br i1 [[EC_3]], label %[[LOOP]], label %[[EXIT:.*]]
230
239
; CHECK: [[EXIT]]:
231
- ; CHECK-NEXT: [[RDX_1_NEXT_LCSSA :%.*]] = phi i32 [ [[RDX_1_NEXT_3 ]], %[[LOOP]] ]
240
+ ; CHECK-NEXT: [[RDX_1_NEXT_LCSSA1 :%.*]] = phi i32 [ [[RDX_1_NEXT_24 ]], %[[LOOP]] ]
232
241
; CHECK-NEXT: [[BIN_RDX5:%.*]] = phi i32 [ [[RDX_2_NEXT_3]], %[[LOOP]] ]
242
+ ; CHECK-NEXT: [[BIN_RDX:%.*]] = add i32 [[RDX_1_NEXT_1]], [[RDX_1_NEXT]]
243
+ ; CHECK-NEXT: [[BIN_RDX1:%.*]] = add i32 [[RDX_1_NEXT_2]], [[BIN_RDX]]
244
+ ; CHECK-NEXT: [[RDX_1_NEXT_LCSSA:%.*]] = add i32 [[RDX_1_NEXT_24]], [[BIN_RDX1]]
233
245
; CHECK-NEXT: [[RES:%.*]] = add i32 [[RDX_1_NEXT_LCSSA]], [[BIN_RDX5]]
234
246
; CHECK-NEXT: ret i32 [[RES]]
235
247
;
@@ -509,20 +521,26 @@ define i32 @test_add_with_call(i64 %n, i32 %start) {
509
521
; CHECK-NEXT: br label %[[LOOP:.*]]
510
522
; CHECK: [[LOOP]]:
511
523
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT_3:%.*]], %[[LOOP]] ]
512
- ; CHECK-NEXT: [[RDX:%.*]] = phi i32 [ [[START]], %[[ENTRY]] ], [ [[RDX_NEXT_3:%.*]], %[[LOOP]] ]
524
+ ; CHECK-NEXT: [[RDX_1:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[RDX_NEXT_1:%.*]], %[[LOOP]] ]
525
+ ; CHECK-NEXT: [[RDX_2:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[RDX_NEXT_2:%.*]], %[[LOOP]] ]
526
+ ; CHECK-NEXT: [[RDX_3:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[RDX_NEXT_3:%.*]], %[[LOOP]] ]
527
+ ; CHECK-NEXT: [[RDX:%.*]] = phi i32 [ [[START]], %[[ENTRY]] ], [ [[RDX_NEXT:%.*]], %[[LOOP]] ]
513
528
; CHECK-NEXT: [[L:%.*]] = call i32 @foo()
514
- ; CHECK-NEXT: [[RDX_NEXT:%.* ]] = add i32 [[RDX]], [[L]]
529
+ ; CHECK-NEXT: [[RDX_NEXT]] = add i32 [[RDX]], [[L]]
515
530
; CHECK-NEXT: [[L_1:%.*]] = call i32 @foo()
516
- ; CHECK-NEXT: [[RDX_2:%.* ]] = add i32 [[RDX_NEXT ]], [[L_1]]
531
+ ; CHECK-NEXT: [[RDX_NEXT_1 ]] = add i32 [[RDX_1 ]], [[L_1]]
517
532
; CHECK-NEXT: [[L_2:%.*]] = call i32 @foo()
518
- ; CHECK-NEXT: [[RDX_NEXT_2:%.* ]] = add i32 [[RDX_2]], [[L_2]]
533
+ ; CHECK-NEXT: [[RDX_NEXT_2]] = add i32 [[RDX_2]], [[L_2]]
519
534
; CHECK-NEXT: [[IV_NEXT_3]] = add nuw nsw i64 [[IV]], 4
520
535
; CHECK-NEXT: [[L_3:%.*]] = call i32 @foo()
521
- ; CHECK-NEXT: [[RDX_NEXT_3]] = add i32 [[RDX_NEXT_2 ]], [[L_3]]
536
+ ; CHECK-NEXT: [[RDX_NEXT_3]] = add i32 [[RDX_3 ]], [[L_3]]
522
537
; CHECK-NEXT: [[EC_3:%.*]] = icmp ne i64 [[IV_NEXT_3]], 1000
523
538
; CHECK-NEXT: br i1 [[EC_3]], label %[[LOOP]], label %[[EXIT:.*]]
524
539
; CHECK: [[EXIT]]:
525
- ; CHECK-NEXT: [[BIN_RDX2:%.*]] = phi i32 [ [[RDX_NEXT_3]], %[[LOOP]] ]
540
+ ; CHECK-NEXT: [[RDX_NEXT_LCSSA:%.*]] = phi i32 [ [[RDX_NEXT_3]], %[[LOOP]] ]
541
+ ; CHECK-NEXT: [[BIN_RDX:%.*]] = add i32 [[RDX_NEXT_1]], [[RDX_NEXT]]
542
+ ; CHECK-NEXT: [[BIN_RDX1:%.*]] = add i32 [[RDX_NEXT_2]], [[BIN_RDX]]
543
+ ; CHECK-NEXT: [[BIN_RDX2:%.*]] = add i32 [[RDX_NEXT_3]], [[BIN_RDX1]]
526
544
; CHECK-NEXT: ret i32 [[BIN_RDX2]]
527
545
;
528
546
entry:
@@ -550,35 +568,41 @@ define i32 @test_add_with_backward_dep(ptr %p, i64 %n, i32 %start) {
550
568
; CHECK-NEXT: br label %[[LOOP:.*]]
551
569
; CHECK: [[LOOP]]:
552
570
; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, %[[ENTRY]] ], [ [[IV_NEXT_3:%.*]], %[[LOOP]] ]
553
- ; CHECK-NEXT: [[RDX:%.*]] = phi i32 [ [[START]], %[[ENTRY]] ], [ [[RDX_NEXT_3:%.*]], %[[LOOP]] ]
571
+ ; CHECK-NEXT: [[RDX_1:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[RDX_NEXT_1:%.*]], %[[LOOP]] ]
572
+ ; CHECK-NEXT: [[RDX_2:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[RDX_NEXT_2:%.*]], %[[LOOP]] ]
573
+ ; CHECK-NEXT: [[RDX_3:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[RDX_NEXT_3:%.*]], %[[LOOP]] ]
574
+ ; CHECK-NEXT: [[RDX:%.*]] = phi i32 [ [[START]], %[[ENTRY]] ], [ [[RDX_NEXT:%.*]], %[[LOOP]] ]
554
575
; CHECK-NEXT: [[IV_NEXT:%.*]] = add nuw nsw i64 [[IV]], 1
555
576
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds nuw i32, ptr [[P]], i64 [[IV]]
556
577
; CHECK-NEXT: [[L:%.*]] = load i32, ptr [[GEP]], align 4
557
578
; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds nuw i32, ptr [[P]], i64 [[IV_NEXT]]
558
579
; CHECK-NEXT: store i32 0, ptr [[GEP_1]], align 4
559
- ; CHECK-NEXT: [[RDX_NEXT:%.* ]] = add i32 [[RDX]], [[L]]
580
+ ; CHECK-NEXT: [[RDX_NEXT]] = add i32 [[RDX]], [[L]]
560
581
; CHECK-NEXT: [[IV_NEXT_1:%.*]] = add nuw nsw i64 [[IV]], 2
561
582
; CHECK-NEXT: [[GEP_11:%.*]] = getelementptr inbounds nuw i32, ptr [[P]], i64 [[IV_NEXT]]
562
583
; CHECK-NEXT: [[L_1:%.*]] = load i32, ptr [[GEP_11]], align 4
563
584
; CHECK-NEXT: [[GEP_1_1:%.*]] = getelementptr inbounds nuw i32, ptr [[P]], i64 [[IV_NEXT_1]]
564
585
; CHECK-NEXT: store i32 0, ptr [[GEP_1_1]], align 4
565
- ; CHECK-NEXT: [[RDX_2:%.* ]] = add i32 [[RDX_NEXT ]], [[L_1]]
586
+ ; CHECK-NEXT: [[RDX_NEXT_1 ]] = add i32 [[RDX_1 ]], [[L_1]]
566
587
; CHECK-NEXT: [[IV_NEXT_2:%.*]] = add nuw nsw i64 [[IV]], 3
567
588
; CHECK-NEXT: [[GEP_2:%.*]] = getelementptr inbounds nuw i32, ptr [[P]], i64 [[IV_NEXT_1]]
568
589
; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[GEP_2]], align 4
569
590
; CHECK-NEXT: [[GEP_1_2:%.*]] = getelementptr inbounds nuw i32, ptr [[P]], i64 [[IV_NEXT_2]]
570
591
; CHECK-NEXT: store i32 0, ptr [[GEP_1_2]], align 4
571
- ; CHECK-NEXT: [[RDX_NEXT_2:%.* ]] = add i32 [[RDX_2]], [[L_2]]
592
+ ; CHECK-NEXT: [[RDX_NEXT_2]] = add i32 [[RDX_2]], [[L_2]]
572
593
; CHECK-NEXT: [[IV_NEXT_3]] = add nuw nsw i64 [[IV]], 4
573
594
; CHECK-NEXT: [[GEP_3:%.*]] = getelementptr inbounds nuw i32, ptr [[P]], i64 [[IV_NEXT_2]]
574
595
; CHECK-NEXT: [[L_3:%.*]] = load i32, ptr [[GEP_3]], align 4
575
596
; CHECK-NEXT: [[GEP_1_3:%.*]] = getelementptr inbounds nuw i32, ptr [[P]], i64 [[IV_NEXT_3]]
576
597
; CHECK-NEXT: store i32 0, ptr [[GEP_1_3]], align 4
577
- ; CHECK-NEXT: [[RDX_NEXT_3]] = add i32 [[RDX_NEXT_2 ]], [[L_3]]
598
+ ; CHECK-NEXT: [[RDX_NEXT_3]] = add i32 [[RDX_3 ]], [[L_3]]
578
599
; CHECK-NEXT: [[EC_3:%.*]] = icmp ne i64 [[IV_NEXT_3]], 1000
579
600
; CHECK-NEXT: br i1 [[EC_3]], label %[[LOOP]], label %[[EXIT:.*]]
580
601
; CHECK: [[EXIT]]:
581
- ; CHECK-NEXT: [[BIN_RDX3:%.*]] = phi i32 [ [[RDX_NEXT_3]], %[[LOOP]] ]
602
+ ; CHECK-NEXT: [[RDX_NEXT_LCSSA:%.*]] = phi i32 [ [[RDX_NEXT_3]], %[[LOOP]] ]
603
+ ; CHECK-NEXT: [[BIN_RDX:%.*]] = add i32 [[RDX_NEXT_1]], [[RDX_NEXT]]
604
+ ; CHECK-NEXT: [[BIN_RDX2:%.*]] = add i32 [[RDX_NEXT_2]], [[BIN_RDX]]
605
+ ; CHECK-NEXT: [[BIN_RDX3:%.*]] = add i32 [[RDX_NEXT_3]], [[BIN_RDX2]]
582
606
; CHECK-NEXT: ret i32 [[BIN_RDX3]]
583
607
;
584
608
entry:
0 commit comments