@@ -64,27 +64,27 @@ define i32 @main(ptr %0, i32 %1) {
6464; CHECK-LABEL: define i32 @main(
6565; CHECK-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) {
6666; CHECK-NEXT: call void @func.specialized.2(ptr [[TMP0]], i32 [[TMP1]])
67- ; CHECK-NEXT: call void @func.specialized.1(ptr [[TMP0]], i32 0 )
67+ ; CHECK-NEXT: call void @func.specialized.1(ptr [[TMP0]])
6868; CHECK-NEXT: ret i32 0
6969;
7070;
7171; CHECK-LABEL: define internal void @func.specialized.1(
72- ; CHECK-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]] ) {
72+ ; CHECK-SAME: ptr [[TMP0:%.*]]) {
7373; CHECK-NEXT: [[TMP2:%.*]] = alloca i32, align 4
74- ; CHECK-NEXT: store i32 [[TMP1]] , ptr [[TMP2]], align 4
74+ ; CHECK-NEXT: store i32 0 , ptr [[TMP2]], align 4
7575; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4
7676; CHECK-NEXT: [[TMP4:%.*]] = icmp slt i32 [[TMP3]], 1
77- ; CHECK-NEXT: br i1 [[TMP4]], label %[[BB12 :.*]], label %[[BB6 :.*]]
78- ; CHECK: [[BB6 ]]:
77+ ; CHECK-NEXT: br i1 [[TMP4]], label %[[BB11 :.*]], label %[[BB5 :.*]]
78+ ; CHECK: [[BB5 ]]:
7979; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP2]], align 4
8080; CHECK-NEXT: [[TMP7:%.*]] = sext i32 [[TMP6]] to i64
8181; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 [[TMP7]]
8282; CHECK-NEXT: call void @decrement(ptr [[TMP8]])
8383; CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP2]], align 4
8484; CHECK-NEXT: [[TMP10:%.*]] = add nsw i32 [[TMP9]], -1
85- ; CHECK-NEXT: call void @func.specialized.1 (ptr [[TMP0]], i32 [[TMP10]])
86- ; CHECK-NEXT: br label %[[BB12 ]]
87- ; CHECK: [[BB12 ]]:
85+ ; CHECK-NEXT: call void @func.specialized.3 (ptr [[TMP0]], i32 [[TMP10]])
86+ ; CHECK-NEXT: br label %[[BB11 ]]
87+ ; CHECK: [[BB11 ]]:
8888; CHECK-NEXT: ret void
8989;
9090;
@@ -108,6 +108,46 @@ define i32 @main(ptr %0, i32 %1) {
108108; CHECK-NEXT: ret void
109109;
110110;
111+ ; CHECK-LABEL: define internal void @func.specialized.3(
112+ ; CHECK-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) {
113+ ; CHECK-NEXT: [[TMP3:%.*]] = alloca i32, align 4
114+ ; CHECK-NEXT: store i32 [[TMP1]], ptr [[TMP3]], align 4
115+ ; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 4
116+ ; CHECK-NEXT: [[TMP5:%.*]] = icmp slt i32 [[TMP4]], 1
117+ ; CHECK-NEXT: br i1 [[TMP5]], label %[[BB12:.*]], label %[[BB6:.*]]
118+ ; CHECK: [[BB6]]:
119+ ; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP3]], align 4
120+ ; CHECK-NEXT: [[TMP8:%.*]] = sext i32 [[TMP7]] to i64
121+ ; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 [[TMP8]]
122+ ; CHECK-NEXT: call void @decrement(ptr [[TMP9]])
123+ ; CHECK-NEXT: [[TMP10:%.*]] = load i32, ptr [[TMP3]], align 4
124+ ; CHECK-NEXT: [[TMP11:%.*]] = add nsw i32 [[TMP10]], -1
125+ ; CHECK-NEXT: call void @func.specialized.3(ptr [[TMP0]], i32 [[TMP11]])
126+ ; CHECK-NEXT: br label %[[BB12]]
127+ ; CHECK: [[BB12]]:
128+ ; CHECK-NEXT: ret void
129+ ;
130+ ;
131+ ; ONE-ITER-LABEL: define internal void @func(
132+ ; ONE-ITER-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]], ptr nocapture [[TMP2:%.*]]) {
133+ ; ONE-ITER-NEXT: [[TMP4:%.*]] = alloca i32, align 4
134+ ; ONE-ITER-NEXT: store i32 [[TMP1]], ptr [[TMP4]], align 4
135+ ; ONE-ITER-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 4
136+ ; ONE-ITER-NEXT: [[TMP6:%.*]] = icmp slt i32 [[TMP5]], 1
137+ ; ONE-ITER-NEXT: br i1 [[TMP6]], label %[[BB13:.*]], label %[[BB7:.*]]
138+ ; ONE-ITER: [[BB7]]:
139+ ; ONE-ITER-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP4]], align 4
140+ ; ONE-ITER-NEXT: [[TMP9:%.*]] = sext i32 [[TMP8]] to i64
141+ ; ONE-ITER-NEXT: [[TMP10:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 [[TMP9]]
142+ ; ONE-ITER-NEXT: call void [[TMP2]](ptr [[TMP10]])
143+ ; ONE-ITER-NEXT: [[TMP11:%.*]] = load i32, ptr [[TMP4]], align 4
144+ ; ONE-ITER-NEXT: [[TMP12:%.*]] = add nsw i32 [[TMP11]], -1
145+ ; ONE-ITER-NEXT: call void @func(ptr [[TMP0]], i32 [[TMP12]], ptr [[TMP2]])
146+ ; ONE-ITER-NEXT: br label %[[BB13]]
147+ ; ONE-ITER: [[BB13]]:
148+ ; ONE-ITER-NEXT: ret void
149+ ;
150+ ;
111151; ONE-ITER-LABEL: define internal void @increment(
112152; ONE-ITER-SAME: ptr nocapture [[TMP0:%.*]]) {
113153; ONE-ITER-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 4
@@ -127,27 +167,27 @@ define i32 @main(ptr %0, i32 %1) {
127167; ONE-ITER-LABEL: define i32 @main(
128168; ONE-ITER-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) {
129169; ONE-ITER-NEXT: call void @func.specialized.2(ptr [[TMP0]], i32 [[TMP1]])
130- ; ONE-ITER-NEXT: call void @func.specialized.1(ptr [[TMP0]], i32 0 )
170+ ; ONE-ITER-NEXT: call void @func.specialized.1(ptr [[TMP0]])
131171; ONE-ITER-NEXT: ret i32 0
132172;
133173;
134174; ONE-ITER-LABEL: define internal void @func.specialized.1(
135- ; ONE-ITER-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]] ) {
175+ ; ONE-ITER-SAME: ptr [[TMP0:%.*]]) {
136176; ONE-ITER-NEXT: [[TMP2:%.*]] = alloca i32, align 4
137- ; ONE-ITER-NEXT: store i32 [[TMP1]] , ptr [[TMP2]], align 4
177+ ; ONE-ITER-NEXT: store i32 0 , ptr [[TMP2]], align 4
138178; ONE-ITER-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4
139179; ONE-ITER-NEXT: [[TMP4:%.*]] = icmp slt i32 [[TMP3]], 1
140- ; ONE-ITER-NEXT: br i1 [[TMP4]], label %[[BB12 :.*]], label %[[BB6 :.*]]
141- ; ONE-ITER: [[BB6 ]]:
180+ ; ONE-ITER-NEXT: br i1 [[TMP4]], label %[[BB11 :.*]], label %[[BB5 :.*]]
181+ ; ONE-ITER: [[BB5 ]]:
142182; ONE-ITER-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP2]], align 4
143183; ONE-ITER-NEXT: [[TMP7:%.*]] = sext i32 [[TMP6]] to i64
144184; ONE-ITER-NEXT: [[TMP8:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 [[TMP7]]
145185; ONE-ITER-NEXT: call void @decrement(ptr [[TMP8]])
146186; ONE-ITER-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP2]], align 4
147187; ONE-ITER-NEXT: [[TMP10:%.*]] = add nsw i32 [[TMP9]], -1
148- ; ONE-ITER-NEXT: call void @func.specialized.1 (ptr [[TMP0]], i32 [[TMP10]])
149- ; ONE-ITER-NEXT: br label %[[BB12 ]]
150- ; ONE-ITER: [[BB12 ]]:
188+ ; ONE-ITER-NEXT: call void @func(ptr [[TMP0]], i32 [[TMP10]], ptr @decrement )
189+ ; ONE-ITER-NEXT: br label %[[BB11 ]]
190+ ; ONE-ITER: [[BB11 ]]:
151191; ONE-ITER-NEXT: ret void
152192;
153193;
0 commit comments