11; 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
33
44define i32 @test_add (ptr %src , i64 %n , i32 %start ) {
55; CHECK-LABEL: define i32 @test_add(
@@ -8,27 +8,33 @@ define i32 @test_add(ptr %src, i64 %n, i32 %start) {
88; CHECK-NEXT: br label %[[LOOP:.*]]
99; CHECK: [[LOOP]]:
1010; 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]] ]
1215; CHECK-NEXT: [[IV_NEXT:%.*]] = add nuw nsw i64 [[IV]], 1
1316; CHECK-NEXT: [[GEP_SRC:%.*]] = getelementptr i32, ptr [[SRC]], i64 [[IV]]
1417; 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]]
1619; CHECK-NEXT: [[IV_NEXT_1:%.*]] = add nuw nsw i64 [[IV]], 2
1720; CHECK-NEXT: [[GEP_SRC_1:%.*]] = getelementptr i32, ptr [[SRC]], i64 [[IV_NEXT]]
1821; 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]]
2023; CHECK-NEXT: [[IV_NEXT_2:%.*]] = add nuw nsw i64 [[IV]], 3
2124; CHECK-NEXT: [[GEP_SRC_2:%.*]] = getelementptr i32, ptr [[SRC]], i64 [[IV_NEXT_1]]
2225; 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]]
2427; CHECK-NEXT: [[IV_NEXT_3]] = add nuw nsw i64 [[IV]], 4
2528; CHECK-NEXT: [[GEP_SRC_24:%.*]] = getelementptr i32, ptr [[SRC]], i64 [[IV_NEXT_2]]
2629; 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]]
2831; CHECK-NEXT: [[EC_3:%.*]] = icmp ne i64 [[IV_NEXT_3]], 1000
2932; CHECK-NEXT: br i1 [[EC_3]], label %[[LOOP]], label %[[EXIT:.*]]
3033; 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]]
3238; CHECK-NEXT: ret i32 [[RDX_NEXT_LCSSA]]
3339;
3440entry:
@@ -203,33 +209,39 @@ define i32 @test_add_and_mul_reduction(ptr %src, i64 %n, i32 %start) {
203209; CHECK-NEXT: br label %[[LOOP:.*]]
204210; CHECK: [[LOOP]]:
205211; 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]] ]
207216; CHECK-NEXT: [[RDX_2:%.*]] = phi i32 [ [[START]], %[[ENTRY]] ], [ [[RDX_2_NEXT_3:%.*]], %[[LOOP]] ]
208217; CHECK-NEXT: [[IV_NEXT:%.*]] = add nuw nsw i64 [[IV]], 1
209218; CHECK-NEXT: [[GEP_SRC:%.*]] = getelementptr i32, ptr [[SRC]], i64 [[IV]]
210219; 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]]
212221; CHECK-NEXT: [[RDX_2_NEXT:%.*]] = mul i32 [[RDX_2]], [[L]]
213222; CHECK-NEXT: [[IV_NEXT_1:%.*]] = add nuw nsw i64 [[IV]], 2
214223; CHECK-NEXT: [[GEP_SRC_1:%.*]] = getelementptr i32, ptr [[SRC]], i64 [[IV_NEXT]]
215224; 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]]
217226; CHECK-NEXT: [[RDX_2_2:%.*]] = mul i32 [[RDX_2_NEXT]], [[L_1]]
218227; CHECK-NEXT: [[IV_NEXT_2:%.*]] = add nuw nsw i64 [[IV]], 3
219228; CHECK-NEXT: [[GEP_SRC_2:%.*]] = getelementptr i32, ptr [[SRC]], i64 [[IV_NEXT_1]]
220229; 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]]
222231; CHECK-NEXT: [[RDX_2_NEXT_2:%.*]] = mul i32 [[RDX_2_2]], [[L_2]]
223232; CHECK-NEXT: [[IV_NEXT_3]] = add nuw nsw i64 [[IV]], 4
224233; CHECK-NEXT: [[GEP_SRC_24:%.*]] = getelementptr i32, ptr [[SRC]], i64 [[IV_NEXT_2]]
225234; 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]]
227236; CHECK-NEXT: [[RDX_2_NEXT_3]] = mul i32 [[RDX_2_NEXT_2]], [[L_24]]
228237; CHECK-NEXT: [[EC_3:%.*]] = icmp ne i64 [[IV_NEXT_3]], 1000
229238; CHECK-NEXT: br i1 [[EC_3]], label %[[LOOP]], label %[[EXIT:.*]]
230239; 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]] ]
232241; 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]]
233245; CHECK-NEXT: [[RES:%.*]] = add i32 [[RDX_1_NEXT_LCSSA]], [[BIN_RDX5]]
234246; CHECK-NEXT: ret i32 [[RES]]
235247;
@@ -509,20 +521,26 @@ define i32 @test_add_with_call(i64 %n, i32 %start) {
509521; CHECK-NEXT: br label %[[LOOP:.*]]
510522; CHECK: [[LOOP]]:
511523; 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]] ]
513528; CHECK-NEXT: [[L:%.*]] = call i32 @foo()
514- ; CHECK-NEXT: [[RDX_NEXT:%.* ]] = add i32 [[RDX]], [[L]]
529+ ; CHECK-NEXT: [[RDX_NEXT]] = add i32 [[RDX]], [[L]]
515530; 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]]
517532; 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]]
519534; CHECK-NEXT: [[IV_NEXT_3]] = add nuw nsw i64 [[IV]], 4
520535; 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]]
522537; CHECK-NEXT: [[EC_3:%.*]] = icmp ne i64 [[IV_NEXT_3]], 1000
523538; CHECK-NEXT: br i1 [[EC_3]], label %[[LOOP]], label %[[EXIT:.*]]
524539; 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]]
526544; CHECK-NEXT: ret i32 [[BIN_RDX2]]
527545;
528546entry:
@@ -550,35 +568,41 @@ define i32 @test_add_with_backward_dep(ptr %p, i64 %n, i32 %start) {
550568; CHECK-NEXT: br label %[[LOOP:.*]]
551569; CHECK: [[LOOP]]:
552570; 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]] ]
554575; CHECK-NEXT: [[IV_NEXT:%.*]] = add nuw nsw i64 [[IV]], 1
555576; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds nuw i32, ptr [[P]], i64 [[IV]]
556577; CHECK-NEXT: [[L:%.*]] = load i32, ptr [[GEP]], align 4
557578; CHECK-NEXT: [[GEP_1:%.*]] = getelementptr inbounds nuw i32, ptr [[P]], i64 [[IV_NEXT]]
558579; 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]]
560581; CHECK-NEXT: [[IV_NEXT_1:%.*]] = add nuw nsw i64 [[IV]], 2
561582; CHECK-NEXT: [[GEP_11:%.*]] = getelementptr inbounds nuw i32, ptr [[P]], i64 [[IV_NEXT]]
562583; CHECK-NEXT: [[L_1:%.*]] = load i32, ptr [[GEP_11]], align 4
563584; CHECK-NEXT: [[GEP_1_1:%.*]] = getelementptr inbounds nuw i32, ptr [[P]], i64 [[IV_NEXT_1]]
564585; 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]]
566587; CHECK-NEXT: [[IV_NEXT_2:%.*]] = add nuw nsw i64 [[IV]], 3
567588; CHECK-NEXT: [[GEP_2:%.*]] = getelementptr inbounds nuw i32, ptr [[P]], i64 [[IV_NEXT_1]]
568589; CHECK-NEXT: [[L_2:%.*]] = load i32, ptr [[GEP_2]], align 4
569590; CHECK-NEXT: [[GEP_1_2:%.*]] = getelementptr inbounds nuw i32, ptr [[P]], i64 [[IV_NEXT_2]]
570591; 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]]
572593; CHECK-NEXT: [[IV_NEXT_3]] = add nuw nsw i64 [[IV]], 4
573594; CHECK-NEXT: [[GEP_3:%.*]] = getelementptr inbounds nuw i32, ptr [[P]], i64 [[IV_NEXT_2]]
574595; CHECK-NEXT: [[L_3:%.*]] = load i32, ptr [[GEP_3]], align 4
575596; CHECK-NEXT: [[GEP_1_3:%.*]] = getelementptr inbounds nuw i32, ptr [[P]], i64 [[IV_NEXT_3]]
576597; 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]]
578599; CHECK-NEXT: [[EC_3:%.*]] = icmp ne i64 [[IV_NEXT_3]], 1000
579600; CHECK-NEXT: br i1 [[EC_3]], label %[[LOOP]], label %[[EXIT:.*]]
580601; 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]]
582606; CHECK-NEXT: ret i32 [[BIN_RDX3]]
583607;
584608entry:
0 commit comments