Skip to content

Commit d68083f

Browse files
committed
[FuncSpec] Update tests to use --include-generated-funcs (NFC)
1 parent 2f24587 commit d68083f

File tree

2 files changed

+242
-75
lines changed

2 files changed

+242
-75
lines changed
Lines changed: 170 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --include-generated-funcs --version 5
22
; RUN: opt -passes="ipsccp<func-spec>,deadargelim" -force-specialization -S < %s | FileCheck %s
3-
; RUN: opt -passes="ipsccp<func-spec>,deadargelim" -funcspec-max-iters=1 -force-specialization -S < %s | FileCheck %s
3+
; RUN: opt -passes="ipsccp<func-spec>,deadargelim" -funcspec-max-iters=1 -force-specialization -S < %s | FileCheck %s --check-prefix=ONE-ITER
44
; RUN: opt -passes="ipsccp<func-spec>,deadargelim" -funcspec-max-iters=0 -force-specialization -S < %s | FileCheck %s --check-prefix=DISABLED
55

6-
; DISABLED-NOT: @func.specialized.1(
7-
; DISABLED-NOT: @func.specialized.2(
86

97
define internal i32 @func(ptr %0, i32 %1, ptr nocapture %2) {
108
%4 = alloca i32, align 4
@@ -42,47 +40,176 @@ define internal void @decrement(ptr nocapture %0) {
4240
}
4341

4442
define i32 @main(ptr %0, i32 %1) {
45-
; CHECK: call void @func.specialized.2(ptr [[TMP0:%.*]], i32 [[TMP1:%.*]])
4643
%3 = call i32 @func(ptr %0, i32 %1, ptr nonnull @increment)
47-
; CHECK: call void @func.specialized.1(ptr [[TMP0]], i32 0)
4844
%4 = call i32 @func(ptr %0, i32 %3, ptr nonnull @decrement)
49-
; CHECK: ret i32 0
5045
ret i32 %4
5146
}
5247

53-
; CHECK: @func.specialized.1(
54-
; CHECK: [[TMP3:%.*]] = alloca i32, align 4
55-
; CHECK: store i32 [[TMP1:%.*]], ptr [[TMP3]], align 4
56-
; CHECK: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 4
57-
; CHECK: [[TMP5:%.*]] = icmp slt i32 [[TMP4]], 1
58-
; CHECK: br i1 [[TMP5]], label [[TMP13:%.*]], label [[TMP6:%.*]]
59-
; CHECK: 6:
60-
; CHECK: [[TMP7:%.*]] = load i32, ptr [[TMP3]], align 4
61-
; CHECK: [[TMP8:%.*]] = sext i32 [[TMP7]] to i64
62-
; CHECK: [[TMP9:%.*]] = getelementptr inbounds i32, ptr [[TMP0:%.*]], i64 [[TMP8]]
63-
; CHECK: call void @decrement(ptr [[TMP9]])
64-
; CHECK: [[TMP10:%.*]] = load i32, ptr [[TMP3]], align 4
65-
; CHECK: [[TMP11:%.*]] = add nsw i32 [[TMP10]], -1
66-
; CHECK: call void @func.specialized.1(ptr [[TMP0]], i32 [[TMP11]])
67-
; CHECK: br label [[TMP12:%.*]]
68-
; CHECK: 12:
69-
; CHECK: ret void
70-
;
71-
;
72-
; CHECK: @func.specialized.2(
73-
; CHECK: [[TMP3:%.*]] = alloca i32, align 4
74-
; CHECK: store i32 [[TMP1:%.*]], ptr [[TMP3]], align 4
75-
; CHECK: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 4
76-
; CHECK: [[TMP5:%.*]] = icmp slt i32 [[TMP4]], 1
77-
; CHECK: br i1 [[TMP5]], label [[TMP13:%.*]], label [[TMP6:%.*]]
78-
; CHECK: 6:
79-
; CHECK: [[TMP7:%.*]] = load i32, ptr [[TMP3]], align 4
80-
; CHECK: [[TMP8:%.*]] = sext i32 [[TMP7]] to i64
81-
; CHECK: [[TMP9:%.*]] = getelementptr inbounds i32, ptr [[TMP0:%.*]], i64 [[TMP8]]
82-
; CHECK: call void @increment(ptr [[TMP9]])
83-
; CHECK: [[TMP10:%.*]] = load i32, ptr [[TMP3]], align 4
84-
; CHECK: [[TMP11:%.*]] = add nsw i32 [[TMP10]], -1
85-
; CHECK: call void @func.specialized.2(ptr [[TMP0]], i32 [[TMP11]])
86-
; CHECK: br label [[TMP12:%.*]]
87-
; CHECK: 12:
88-
; CHECK: ret void
48+
; CHECK-LABEL: define internal void @increment(
49+
; CHECK-SAME: ptr nocapture [[TMP0:%.*]]) {
50+
; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 4
51+
; CHECK-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], 1
52+
; CHECK-NEXT: store i32 [[TMP3]], ptr [[TMP0]], align 4
53+
; CHECK-NEXT: ret void
54+
;
55+
;
56+
; CHECK-LABEL: define internal void @decrement(
57+
; CHECK-SAME: ptr nocapture [[TMP0:%.*]]) {
58+
; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 4
59+
; CHECK-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1
60+
; CHECK-NEXT: store i32 [[TMP3]], ptr [[TMP0]], align 4
61+
; CHECK-NEXT: ret void
62+
;
63+
;
64+
; CHECK-LABEL: define i32 @main(
65+
; CHECK-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) {
66+
; CHECK-NEXT: call void @func.specialized.2(ptr [[TMP0]], i32 [[TMP1]])
67+
; CHECK-NEXT: call void @func.specialized.1(ptr [[TMP0]], i32 0)
68+
; CHECK-NEXT: ret i32 0
69+
;
70+
;
71+
; CHECK-LABEL: define internal void @func.specialized.1(
72+
; CHECK-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) {
73+
; CHECK-NEXT: [[TMP2:%.*]] = alloca i32, align 4
74+
; CHECK-NEXT: store i32 [[TMP1]], ptr [[TMP2]], align 4
75+
; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4
76+
; CHECK-NEXT: [[TMP4:%.*]] = icmp slt i32 [[TMP3]], 1
77+
; CHECK-NEXT: br i1 [[TMP4]], label %[[BB12:.*]], label %[[BB6:.*]]
78+
; CHECK: [[BB6]]:
79+
; CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP2]], align 4
80+
; CHECK-NEXT: [[TMP7:%.*]] = sext i32 [[TMP6]] to i64
81+
; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 [[TMP7]]
82+
; CHECK-NEXT: call void @decrement(ptr [[TMP8]])
83+
; CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP2]], align 4
84+
; 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]]:
88+
; CHECK-NEXT: ret void
89+
;
90+
;
91+
; CHECK-LABEL: define internal void @func.specialized.2(
92+
; CHECK-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) {
93+
; CHECK-NEXT: [[TMP3:%.*]] = alloca i32, align 4
94+
; CHECK-NEXT: store i32 [[TMP1]], ptr [[TMP3]], align 4
95+
; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 4
96+
; CHECK-NEXT: [[TMP5:%.*]] = icmp slt i32 [[TMP4]], 1
97+
; CHECK-NEXT: br i1 [[TMP5]], label %[[BB12:.*]], label %[[BB6:.*]]
98+
; CHECK: [[BB6]]:
99+
; CHECK-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP3]], align 4
100+
; CHECK-NEXT: [[TMP8:%.*]] = sext i32 [[TMP7]] to i64
101+
; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 [[TMP8]]
102+
; CHECK-NEXT: call void @increment(ptr [[TMP9]])
103+
; CHECK-NEXT: [[TMP10:%.*]] = load i32, ptr [[TMP3]], align 4
104+
; CHECK-NEXT: [[TMP11:%.*]] = add nsw i32 [[TMP10]], -1
105+
; CHECK-NEXT: call void @func.specialized.2(ptr [[TMP0]], i32 [[TMP11]])
106+
; CHECK-NEXT: br label %[[BB12]]
107+
; CHECK: [[BB12]]:
108+
; CHECK-NEXT: ret void
109+
;
110+
;
111+
; ONE-ITER-LABEL: define internal void @increment(
112+
; ONE-ITER-SAME: ptr nocapture [[TMP0:%.*]]) {
113+
; ONE-ITER-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 4
114+
; ONE-ITER-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], 1
115+
; ONE-ITER-NEXT: store i32 [[TMP3]], ptr [[TMP0]], align 4
116+
; ONE-ITER-NEXT: ret void
117+
;
118+
;
119+
; ONE-ITER-LABEL: define internal void @decrement(
120+
; ONE-ITER-SAME: ptr nocapture [[TMP0:%.*]]) {
121+
; ONE-ITER-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 4
122+
; ONE-ITER-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1
123+
; ONE-ITER-NEXT: store i32 [[TMP3]], ptr [[TMP0]], align 4
124+
; ONE-ITER-NEXT: ret void
125+
;
126+
;
127+
; ONE-ITER-LABEL: define i32 @main(
128+
; ONE-ITER-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) {
129+
; 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)
131+
; ONE-ITER-NEXT: ret i32 0
132+
;
133+
;
134+
; ONE-ITER-LABEL: define internal void @func.specialized.1(
135+
; ONE-ITER-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) {
136+
; ONE-ITER-NEXT: [[TMP2:%.*]] = alloca i32, align 4
137+
; ONE-ITER-NEXT: store i32 [[TMP1]], ptr [[TMP2]], align 4
138+
; ONE-ITER-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4
139+
; ONE-ITER-NEXT: [[TMP4:%.*]] = icmp slt i32 [[TMP3]], 1
140+
; ONE-ITER-NEXT: br i1 [[TMP4]], label %[[BB12:.*]], label %[[BB6:.*]]
141+
; ONE-ITER: [[BB6]]:
142+
; ONE-ITER-NEXT: [[TMP6:%.*]] = load i32, ptr [[TMP2]], align 4
143+
; ONE-ITER-NEXT: [[TMP7:%.*]] = sext i32 [[TMP6]] to i64
144+
; ONE-ITER-NEXT: [[TMP8:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 [[TMP7]]
145+
; ONE-ITER-NEXT: call void @decrement(ptr [[TMP8]])
146+
; ONE-ITER-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP2]], align 4
147+
; 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]]:
151+
; ONE-ITER-NEXT: ret void
152+
;
153+
;
154+
; ONE-ITER-LABEL: define internal void @func.specialized.2(
155+
; ONE-ITER-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) {
156+
; ONE-ITER-NEXT: [[TMP3:%.*]] = alloca i32, align 4
157+
; ONE-ITER-NEXT: store i32 [[TMP1]], ptr [[TMP3]], align 4
158+
; ONE-ITER-NEXT: [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 4
159+
; ONE-ITER-NEXT: [[TMP5:%.*]] = icmp slt i32 [[TMP4]], 1
160+
; ONE-ITER-NEXT: br i1 [[TMP5]], label %[[BB12:.*]], label %[[BB6:.*]]
161+
; ONE-ITER: [[BB6]]:
162+
; ONE-ITER-NEXT: [[TMP7:%.*]] = load i32, ptr [[TMP3]], align 4
163+
; ONE-ITER-NEXT: [[TMP8:%.*]] = sext i32 [[TMP7]] to i64
164+
; ONE-ITER-NEXT: [[TMP9:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 [[TMP8]]
165+
; ONE-ITER-NEXT: call void @increment(ptr [[TMP9]])
166+
; ONE-ITER-NEXT: [[TMP10:%.*]] = load i32, ptr [[TMP3]], align 4
167+
; ONE-ITER-NEXT: [[TMP11:%.*]] = add nsw i32 [[TMP10]], -1
168+
; ONE-ITER-NEXT: call void @func.specialized.2(ptr [[TMP0]], i32 [[TMP11]])
169+
; ONE-ITER-NEXT: br label %[[BB12]]
170+
; ONE-ITER: [[BB12]]:
171+
; ONE-ITER-NEXT: ret void
172+
;
173+
;
174+
; DISABLED-LABEL: define internal void @func(
175+
; DISABLED-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]], ptr nocapture [[TMP2:%.*]]) {
176+
; DISABLED-NEXT: [[TMP4:%.*]] = alloca i32, align 4
177+
; DISABLED-NEXT: store i32 [[TMP1]], ptr [[TMP4]], align 4
178+
; DISABLED-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 4
179+
; DISABLED-NEXT: [[TMP6:%.*]] = icmp slt i32 [[TMP5]], 1
180+
; DISABLED-NEXT: br i1 [[TMP6]], label %[[BB13:.*]], label %[[BB7:.*]]
181+
; DISABLED: [[BB7]]:
182+
; DISABLED-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP4]], align 4
183+
; DISABLED-NEXT: [[TMP9:%.*]] = sext i32 [[TMP8]] to i64
184+
; DISABLED-NEXT: [[TMP10:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 [[TMP9]]
185+
; DISABLED-NEXT: call void [[TMP2]](ptr [[TMP10]])
186+
; DISABLED-NEXT: [[TMP11:%.*]] = load i32, ptr [[TMP4]], align 4
187+
; DISABLED-NEXT: [[TMP12:%.*]] = add nsw i32 [[TMP11]], -1
188+
; DISABLED-NEXT: call void @func(ptr [[TMP0]], i32 [[TMP12]], ptr [[TMP2]])
189+
; DISABLED-NEXT: br label %[[BB13]]
190+
; DISABLED: [[BB13]]:
191+
; DISABLED-NEXT: ret void
192+
;
193+
;
194+
; DISABLED-LABEL: define internal void @increment(
195+
; DISABLED-SAME: ptr nocapture [[TMP0:%.*]]) {
196+
; DISABLED-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 4
197+
; DISABLED-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], 1
198+
; DISABLED-NEXT: store i32 [[TMP3]], ptr [[TMP0]], align 4
199+
; DISABLED-NEXT: ret void
200+
;
201+
;
202+
; DISABLED-LABEL: define internal void @decrement(
203+
; DISABLED-SAME: ptr nocapture [[TMP0:%.*]]) {
204+
; DISABLED-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 4
205+
; DISABLED-NEXT: [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1
206+
; DISABLED-NEXT: store i32 [[TMP3]], ptr [[TMP0]], align 4
207+
; DISABLED-NEXT: ret void
208+
;
209+
;
210+
; DISABLED-LABEL: define i32 @main(
211+
; DISABLED-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) {
212+
; DISABLED-NEXT: call void @func(ptr [[TMP0]], i32 [[TMP1]], ptr nonnull @increment)
213+
; DISABLED-NEXT: call void @func(ptr [[TMP0]], i32 0, ptr nonnull @decrement)
214+
; DISABLED-NEXT: ret i32 0
215+
;
Lines changed: 72 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,7 @@
1-
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --include-generated-funcs --version 5
22
; RUN: opt -passes="ipsccp<func-spec>" -force-specialization -S < %s | FileCheck %s
33

44
define i64 @main(i64 %x, i64 %y, i1 %flag) {
5-
; CHECK-LABEL: @main(
6-
; CHECK-NEXT: entry:
7-
; CHECK-NEXT: br i1 [[FLAG:%.*]], label [[PLUS:%.*]], label [[MINUS:%.*]]
8-
; CHECK: plus:
9-
; CHECK-NEXT: [[CMP0:%.*]] = call i64 @compute.specialized.2(i64 [[X:%.*]], i64 [[Y:%.*]], ptr @plus, ptr @minus)
10-
; CHECK-NEXT: br label [[MERGE:%.*]]
11-
; CHECK: minus:
12-
; CHECK-NEXT: [[CMP1:%.*]] = call i64 @compute.specialized.3(i64 [[X]], i64 [[Y]], ptr @minus, ptr @plus)
13-
; CHECK-NEXT: br label [[MERGE]]
14-
; CHECK: merge:
15-
; CHECK-NEXT: [[PH:%.*]] = phi i64 [ [[CMP0]], [[PLUS]] ], [ [[CMP1]], [[MINUS]] ]
16-
; CHECK-NEXT: [[CMP2:%.*]] = call i64 @compute.specialized.2(i64 [[PH]], i64 42, ptr @plus, ptr @minus)
17-
; CHECK-NEXT: ret i64 [[CMP2]]
18-
;
195
entry:
206
br i1 %flag, label %plus, label %minus
217

@@ -47,33 +33,87 @@ entry:
4733
}
4834

4935
define internal i64 @plus(i64 %x, i64 %y) {
50-
; CHECK-LABEL: @plus(
5136
entry:
5237
%add = add i64 %x, %y
5338
ret i64 %add
5439
}
5540

5641
define internal i64 @minus(i64 %x, i64 %y) {
57-
; CHECK-LABEL: @minus(
5842
entry:
5943
%sub = sub i64 %x, %y
6044
ret i64 %sub
6145
}
6246

63-
; CHECK-LABEL: @compute.specialized.1
64-
; CHECK-NEXT: entry:
65-
; CHECK-NEXT: [[CMP0:%.*]] = call i64 %binop1(i64 [[X:%.*]], i64 [[Y:%.*]])
66-
; CHECK-NEXT: [[CMP1:%.*]] = call i64 @plus(i64 [[X]], i64 [[Y]])
67-
; CHECK-NEXT: [[CMP2:%.*]] = call i64 @compute.specialized.1(i64 [[X]], i64 [[Y]], ptr %binop1, ptr @plus)
6847

69-
; CHECK-LABEL: @compute.specialized.2
70-
; CHECK-NEXT: entry:
71-
; CHECK-NEXT: [[CMP0:%.*]] = call i64 @plus(i64 [[X:%.*]], i64 [[Y:%.*]])
72-
; CHECK-NEXT: [[CMP1:%.*]] = call i64 @minus(i64 [[X]], i64 [[Y]])
73-
; CHECK-NEXT: [[CMP2:%.*]] = call i64 @compute.specialized.1(i64 [[X]], i64 [[Y]], ptr @plus, ptr @plus)
7448

75-
; CHECK-LABEL: @compute.specialized.3
76-
; CHECK-NEXT: entry:
77-
; CHECK-NEXT: [[CMP0:%.*]] = call i64 @minus(i64 [[X:%.*]], i64 [[Y:%.*]])
78-
; CHECK-NEXT: [[CMP1:%.*]] = call i64 @plus(i64 [[X]], i64 [[Y]])
79-
; CHECK-NEXT: [[CMP2:%.*]] = call i64 @compute.specialized.3(i64 [[X]], i64 [[Y]], ptr @minus, ptr @plus)
49+
; CHECK-LABEL: define i64 @main(
50+
; CHECK-SAME: i64 [[X:%.*]], i64 [[Y:%.*]], i1 [[FLAG:%.*]]) {
51+
; CHECK-NEXT: [[ENTRY:.*:]]
52+
; CHECK-NEXT: br i1 [[FLAG]], label %[[PLUS:.*]], label %[[MINUS:.*]]
53+
; CHECK: [[PLUS]]:
54+
; CHECK-NEXT: [[CMP0:%.*]] = call i64 @compute.specialized.2(i64 [[X]], i64 [[Y]], ptr @plus, ptr @minus)
55+
; CHECK-NEXT: br label %[[MERGE:.*]]
56+
; CHECK: [[MINUS]]:
57+
; CHECK-NEXT: [[CMP1:%.*]] = call i64 @compute.specialized.3(i64 [[X]], i64 [[Y]], ptr @minus, ptr @plus)
58+
; CHECK-NEXT: br label %[[MERGE]]
59+
; CHECK: [[MERGE]]:
60+
; CHECK-NEXT: [[PH:%.*]] = phi i64 [ [[CMP0]], %[[PLUS]] ], [ [[CMP1]], %[[MINUS]] ]
61+
; CHECK-NEXT: [[CMP2:%.*]] = call i64 @compute.specialized.2(i64 [[PH]], i64 42, ptr @plus, ptr @minus)
62+
; CHECK-NEXT: ret i64 [[CMP2]]
63+
;
64+
;
65+
; CHECK-LABEL: define internal i64 @plus(
66+
; CHECK-SAME: i64 [[X:%.*]], i64 [[Y:%.*]]) {
67+
; CHECK-NEXT: [[ENTRY:.*:]]
68+
; CHECK-NEXT: [[ADD:%.*]] = add i64 [[X]], [[Y]]
69+
; CHECK-NEXT: ret i64 [[ADD]]
70+
;
71+
;
72+
; CHECK-LABEL: define internal i64 @minus(
73+
; CHECK-SAME: i64 [[X:%.*]], i64 [[Y:%.*]]) {
74+
; CHECK-NEXT: [[ENTRY:.*:]]
75+
; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[X]], [[Y]]
76+
; CHECK-NEXT: ret i64 [[SUB]]
77+
;
78+
;
79+
; CHECK-LABEL: define internal i64 @compute.specialized.1(
80+
; CHECK-SAME: i64 [[X:%.*]], i64 [[Y:%.*]], ptr [[BINOP1:%.*]], ptr [[BINOP2:%.*]]) {
81+
; CHECK-NEXT: [[ENTRY:.*:]]
82+
; CHECK-NEXT: [[OP1:%.*]] = call i64 [[BINOP1]](i64 [[X]], i64 [[Y]])
83+
; CHECK-NEXT: [[OP0:%.*]] = call i64 @plus(i64 [[X]], i64 [[Y]])
84+
; CHECK-NEXT: [[OP2:%.*]] = call i64 @compute.specialized.1(i64 [[X]], i64 [[Y]], ptr [[BINOP1]], ptr @plus)
85+
; CHECK-NEXT: [[ADD0:%.*]] = add i64 [[OP1]], [[OP0]]
86+
; CHECK-NEXT: [[ADD1:%.*]] = add i64 [[ADD0]], [[OP2]]
87+
; CHECK-NEXT: [[DIV:%.*]] = sdiv i64 [[ADD1]], [[X]]
88+
; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[DIV]], [[Y]]
89+
; CHECK-NEXT: [[MUL:%.*]] = mul i64 [[SUB]], 2
90+
; CHECK-NEXT: ret i64 [[MUL]]
91+
;
92+
;
93+
; CHECK-LABEL: define internal i64 @compute.specialized.2(
94+
; CHECK-SAME: i64 [[X:%.*]], i64 [[Y:%.*]], ptr [[BINOP1:%.*]], ptr [[BINOP2:%.*]]) {
95+
; CHECK-NEXT: [[ENTRY:.*:]]
96+
; CHECK-NEXT: [[OP0:%.*]] = call i64 @plus(i64 [[X]], i64 [[Y]])
97+
; CHECK-NEXT: [[OP1:%.*]] = call i64 @minus(i64 [[X]], i64 [[Y]])
98+
; CHECK-NEXT: [[OP2:%.*]] = call i64 @compute.specialized.1(i64 [[X]], i64 [[Y]], ptr @plus, ptr @plus)
99+
; CHECK-NEXT: [[ADD0:%.*]] = add i64 [[OP0]], [[OP1]]
100+
; CHECK-NEXT: [[ADD1:%.*]] = add i64 [[ADD0]], [[OP2]]
101+
; CHECK-NEXT: [[DIV:%.*]] = sdiv i64 [[ADD1]], [[X]]
102+
; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[DIV]], [[Y]]
103+
; CHECK-NEXT: [[MUL:%.*]] = mul i64 [[SUB]], 2
104+
; CHECK-NEXT: ret i64 [[MUL]]
105+
;
106+
;
107+
; CHECK-LABEL: define internal i64 @compute.specialized.3(
108+
; CHECK-SAME: i64 [[X:%.*]], i64 [[Y:%.*]], ptr [[BINOP1:%.*]], ptr [[BINOP2:%.*]]) {
109+
; CHECK-NEXT: [[ENTRY:.*:]]
110+
; CHECK-NEXT: [[OP0:%.*]] = call i64 @minus(i64 [[X]], i64 [[Y]])
111+
; CHECK-NEXT: [[OP1:%.*]] = call i64 @plus(i64 [[X]], i64 [[Y]])
112+
; CHECK-NEXT: [[OP2:%.*]] = call i64 @compute.specialized.3(i64 [[X]], i64 [[Y]], ptr @minus, ptr @plus)
113+
; CHECK-NEXT: [[ADD0:%.*]] = add i64 [[OP0]], [[OP1]]
114+
; CHECK-NEXT: [[ADD1:%.*]] = add i64 [[ADD0]], [[OP2]]
115+
; CHECK-NEXT: [[DIV:%.*]] = sdiv i64 [[ADD1]], [[X]]
116+
; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[DIV]], [[Y]]
117+
; CHECK-NEXT: [[MUL:%.*]] = mul i64 [[SUB]], 2
118+
; CHECK-NEXT: ret i64 [[MUL]]
119+
;

0 commit comments

Comments
 (0)