xref: /llvm-project/llvm/test/Transforms/FunctionSpecialization/function-specialization2.ll (revision 29441e4f5fa5f5c7709f7cf180815ba97f611297)
1d68083feSHari Limaye; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --include-generated-funcs --version 5
206664fdcSHari Limaye; RUN: opt -passes="ipsccp<func-spec>,deadargelim" -funcspec-for-literal-constant=false -force-specialization -S < %s | FileCheck %s
306664fdcSHari Limaye; RUN: opt -passes="ipsccp<func-spec>,deadargelim" -funcspec-for-literal-constant=false -funcspec-max-iters=1 -force-specialization -S < %s | FileCheck %s --check-prefix=ONE-ITER
406664fdcSHari Limaye; RUN: opt -passes="ipsccp<func-spec>,deadargelim" -funcspec-for-literal-constant=false -funcspec-max-iters=0 -force-specialization -S < %s | FileCheck %s --check-prefix=DISABLED
596a14f38SNikita Popov
696a14f38SNikita Popov
796a14f38SNikita Popovdefine internal i32 @func(ptr %0, i32 %1, ptr nocapture %2) {
896a14f38SNikita Popov  %4 = alloca i32, align 4
996a14f38SNikita Popov  store i32 %1, ptr %4, align 4
1096a14f38SNikita Popov  %5 = load i32, ptr %4, align 4
1196a14f38SNikita Popov  %6 = icmp slt i32 %5, 1
1296a14f38SNikita Popov  br i1 %6, label %14, label %7
1396a14f38SNikita Popov
1496a14f38SNikita Popov7:                                                ; preds = %3
1596a14f38SNikita Popov  %8 = load i32, ptr %4, align 4
1696a14f38SNikita Popov  %9 = sext i32 %8 to i64
1796a14f38SNikita Popov  %10 = getelementptr inbounds i32, ptr %0, i64 %9
1896a14f38SNikita Popov  call void %2(ptr %10)
1996a14f38SNikita Popov  %11 = load i32, ptr %4, align 4
2096a14f38SNikita Popov  %12 = add nsw i32 %11, -1
2196a14f38SNikita Popov  %13 = call i32 @func(ptr %0, i32 %12, ptr %2)
2296a14f38SNikita Popov  br label %14
2396a14f38SNikita Popov
2496a14f38SNikita Popov14:                                               ; preds = %3, %7
2596a14f38SNikita Popov  ret i32 0
2696a14f38SNikita Popov}
2796a14f38SNikita Popov
2896a14f38SNikita Popovdefine internal void @increment(ptr nocapture %0) {
2996a14f38SNikita Popov  %2 = load i32, ptr %0, align 4
3096a14f38SNikita Popov  %3 = add nsw i32 %2, 1
3196a14f38SNikita Popov  store i32 %3, ptr %0, align 4
3296a14f38SNikita Popov  ret void
3396a14f38SNikita Popov}
3496a14f38SNikita Popov
3596a14f38SNikita Popovdefine internal void @decrement(ptr nocapture %0) {
3696a14f38SNikita Popov  %2 = load i32, ptr %0, align 4
3796a14f38SNikita Popov  %3 = add nsw i32 %2, -1
3896a14f38SNikita Popov  store i32 %3, ptr %0, align 4
3996a14f38SNikita Popov  ret void
4096a14f38SNikita Popov}
4196a14f38SNikita Popov
4296a14f38SNikita Popovdefine i32 @main(ptr %0, i32 %1) {
4396a14f38SNikita Popov  %3 = call i32 @func(ptr %0, i32 %1, ptr nonnull @increment)
4496a14f38SNikita Popov  %4 = call i32 @func(ptr %0, i32 %3, ptr nonnull @decrement)
4596a14f38SNikita Popov  ret i32 %4
4696a14f38SNikita Popov}
4796a14f38SNikita Popov
48d68083feSHari Limaye; CHECK-LABEL: define internal void @increment(
49*29441e4fSNikita Popov; CHECK-SAME: ptr captures(none) [[TMP0:%.*]]) {
50d68083feSHari Limaye; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 4
51d68083feSHari Limaye; CHECK-NEXT:    [[TMP3:%.*]] = add nsw i32 [[TMP2]], 1
52d68083feSHari Limaye; CHECK-NEXT:    store i32 [[TMP3]], ptr [[TMP0]], align 4
53d68083feSHari Limaye; CHECK-NEXT:    ret void
5496a14f38SNikita Popov;
5596a14f38SNikita Popov;
56d68083feSHari Limaye; CHECK-LABEL: define internal void @decrement(
57*29441e4fSNikita Popov; CHECK-SAME: ptr captures(none) [[TMP0:%.*]]) {
58d68083feSHari Limaye; CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 4
59d68083feSHari Limaye; CHECK-NEXT:    [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1
60d68083feSHari Limaye; CHECK-NEXT:    store i32 [[TMP3]], ptr [[TMP0]], align 4
61d68083feSHari Limaye; CHECK-NEXT:    ret void
62d68083feSHari Limaye;
63d68083feSHari Limaye;
64d68083feSHari Limaye; CHECK-LABEL: define i32 @main(
65d68083feSHari Limaye; CHECK-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) {
66d68083feSHari Limaye; CHECK-NEXT:    call void @func.specialized.2(ptr [[TMP0]], i32 [[TMP1]])
67d68083feSHari Limaye; CHECK-NEXT:    call void @func.specialized.1(ptr [[TMP0]], i32 0)
68d68083feSHari Limaye; CHECK-NEXT:    ret i32 0
69d68083feSHari Limaye;
70d68083feSHari Limaye;
71d68083feSHari Limaye; CHECK-LABEL: define internal void @func.specialized.1(
72d68083feSHari Limaye; CHECK-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) {
73d68083feSHari Limaye; CHECK-NEXT:    [[TMP2:%.*]] = alloca i32, align 4
74d68083feSHari Limaye; CHECK-NEXT:    store i32 [[TMP1]], ptr [[TMP2]], align 4
75d68083feSHari Limaye; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4
76d68083feSHari Limaye; CHECK-NEXT:    [[TMP4:%.*]] = icmp slt i32 [[TMP3]], 1
77d68083feSHari Limaye; CHECK-NEXT:    br i1 [[TMP4]], label %[[BB12:.*]], label %[[BB6:.*]]
78d68083feSHari Limaye; CHECK:       [[BB6]]:
79d68083feSHari Limaye; CHECK-NEXT:    [[TMP6:%.*]] = load i32, ptr [[TMP2]], align 4
80d68083feSHari Limaye; CHECK-NEXT:    [[TMP7:%.*]] = sext i32 [[TMP6]] to i64
81d68083feSHari Limaye; CHECK-NEXT:    [[TMP8:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 [[TMP7]]
82d68083feSHari Limaye; CHECK-NEXT:    call void @decrement(ptr [[TMP8]])
83d68083feSHari Limaye; CHECK-NEXT:    [[TMP9:%.*]] = load i32, ptr [[TMP2]], align 4
84d68083feSHari Limaye; CHECK-NEXT:    [[TMP10:%.*]] = add nsw i32 [[TMP9]], -1
85d68083feSHari Limaye; CHECK-NEXT:    call void @func.specialized.1(ptr [[TMP0]], i32 [[TMP10]])
86d68083feSHari Limaye; CHECK-NEXT:    br label %[[BB12]]
87d68083feSHari Limaye; CHECK:       [[BB12]]:
88d68083feSHari Limaye; CHECK-NEXT:    ret void
89d68083feSHari Limaye;
90d68083feSHari Limaye;
91d68083feSHari Limaye; CHECK-LABEL: define internal void @func.specialized.2(
92d68083feSHari Limaye; CHECK-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) {
93d68083feSHari Limaye; CHECK-NEXT:    [[TMP3:%.*]] = alloca i32, align 4
94d68083feSHari Limaye; CHECK-NEXT:    store i32 [[TMP1]], ptr [[TMP3]], align 4
95d68083feSHari Limaye; CHECK-NEXT:    [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 4
96d68083feSHari Limaye; CHECK-NEXT:    [[TMP5:%.*]] = icmp slt i32 [[TMP4]], 1
97d68083feSHari Limaye; CHECK-NEXT:    br i1 [[TMP5]], label %[[BB12:.*]], label %[[BB6:.*]]
98d68083feSHari Limaye; CHECK:       [[BB6]]:
99d68083feSHari Limaye; CHECK-NEXT:    [[TMP7:%.*]] = load i32, ptr [[TMP3]], align 4
100d68083feSHari Limaye; CHECK-NEXT:    [[TMP8:%.*]] = sext i32 [[TMP7]] to i64
101d68083feSHari Limaye; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 [[TMP8]]
102d68083feSHari Limaye; CHECK-NEXT:    call void @increment(ptr [[TMP9]])
103d68083feSHari Limaye; CHECK-NEXT:    [[TMP10:%.*]] = load i32, ptr [[TMP3]], align 4
104d68083feSHari Limaye; CHECK-NEXT:    [[TMP11:%.*]] = add nsw i32 [[TMP10]], -1
105d68083feSHari Limaye; CHECK-NEXT:    call void @func.specialized.2(ptr [[TMP0]], i32 [[TMP11]])
106d68083feSHari Limaye; CHECK-NEXT:    br label %[[BB12]]
107d68083feSHari Limaye; CHECK:       [[BB12]]:
108d68083feSHari Limaye; CHECK-NEXT:    ret void
109d68083feSHari Limaye;
110d68083feSHari Limaye;
111d68083feSHari Limaye; ONE-ITER-LABEL: define internal void @increment(
112*29441e4fSNikita Popov; ONE-ITER-SAME: ptr captures(none) [[TMP0:%.*]]) {
113d68083feSHari Limaye; ONE-ITER-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 4
114d68083feSHari Limaye; ONE-ITER-NEXT:    [[TMP3:%.*]] = add nsw i32 [[TMP2]], 1
115d68083feSHari Limaye; ONE-ITER-NEXT:    store i32 [[TMP3]], ptr [[TMP0]], align 4
116d68083feSHari Limaye; ONE-ITER-NEXT:    ret void
117d68083feSHari Limaye;
118d68083feSHari Limaye;
119d68083feSHari Limaye; ONE-ITER-LABEL: define internal void @decrement(
120*29441e4fSNikita Popov; ONE-ITER-SAME: ptr captures(none) [[TMP0:%.*]]) {
121d68083feSHari Limaye; ONE-ITER-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 4
122d68083feSHari Limaye; ONE-ITER-NEXT:    [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1
123d68083feSHari Limaye; ONE-ITER-NEXT:    store i32 [[TMP3]], ptr [[TMP0]], align 4
124d68083feSHari Limaye; ONE-ITER-NEXT:    ret void
125d68083feSHari Limaye;
126d68083feSHari Limaye;
127d68083feSHari Limaye; ONE-ITER-LABEL: define i32 @main(
128d68083feSHari Limaye; ONE-ITER-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) {
129d68083feSHari Limaye; ONE-ITER-NEXT:    call void @func.specialized.2(ptr [[TMP0]], i32 [[TMP1]])
130d68083feSHari Limaye; ONE-ITER-NEXT:    call void @func.specialized.1(ptr [[TMP0]], i32 0)
131d68083feSHari Limaye; ONE-ITER-NEXT:    ret i32 0
132d68083feSHari Limaye;
133d68083feSHari Limaye;
134d68083feSHari Limaye; ONE-ITER-LABEL: define internal void @func.specialized.1(
135d68083feSHari Limaye; ONE-ITER-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) {
136d68083feSHari Limaye; ONE-ITER-NEXT:    [[TMP2:%.*]] = alloca i32, align 4
137d68083feSHari Limaye; ONE-ITER-NEXT:    store i32 [[TMP1]], ptr [[TMP2]], align 4
138d68083feSHari Limaye; ONE-ITER-NEXT:    [[TMP3:%.*]] = load i32, ptr [[TMP2]], align 4
139d68083feSHari Limaye; ONE-ITER-NEXT:    [[TMP4:%.*]] = icmp slt i32 [[TMP3]], 1
140d68083feSHari Limaye; ONE-ITER-NEXT:    br i1 [[TMP4]], label %[[BB12:.*]], label %[[BB6:.*]]
141d68083feSHari Limaye; ONE-ITER:       [[BB6]]:
142d68083feSHari Limaye; ONE-ITER-NEXT:    [[TMP6:%.*]] = load i32, ptr [[TMP2]], align 4
143d68083feSHari Limaye; ONE-ITER-NEXT:    [[TMP7:%.*]] = sext i32 [[TMP6]] to i64
144d68083feSHari Limaye; ONE-ITER-NEXT:    [[TMP8:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 [[TMP7]]
145d68083feSHari Limaye; ONE-ITER-NEXT:    call void @decrement(ptr [[TMP8]])
146d68083feSHari Limaye; ONE-ITER-NEXT:    [[TMP9:%.*]] = load i32, ptr [[TMP2]], align 4
147d68083feSHari Limaye; ONE-ITER-NEXT:    [[TMP10:%.*]] = add nsw i32 [[TMP9]], -1
148d68083feSHari Limaye; ONE-ITER-NEXT:    call void @func.specialized.1(ptr [[TMP0]], i32 [[TMP10]])
149d68083feSHari Limaye; ONE-ITER-NEXT:    br label %[[BB12]]
150d68083feSHari Limaye; ONE-ITER:       [[BB12]]:
151d68083feSHari Limaye; ONE-ITER-NEXT:    ret void
152d68083feSHari Limaye;
153d68083feSHari Limaye;
154d68083feSHari Limaye; ONE-ITER-LABEL: define internal void @func.specialized.2(
155d68083feSHari Limaye; ONE-ITER-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) {
156d68083feSHari Limaye; ONE-ITER-NEXT:    [[TMP3:%.*]] = alloca i32, align 4
157d68083feSHari Limaye; ONE-ITER-NEXT:    store i32 [[TMP1]], ptr [[TMP3]], align 4
158d68083feSHari Limaye; ONE-ITER-NEXT:    [[TMP4:%.*]] = load i32, ptr [[TMP3]], align 4
159d68083feSHari Limaye; ONE-ITER-NEXT:    [[TMP5:%.*]] = icmp slt i32 [[TMP4]], 1
160d68083feSHari Limaye; ONE-ITER-NEXT:    br i1 [[TMP5]], label %[[BB12:.*]], label %[[BB6:.*]]
161d68083feSHari Limaye; ONE-ITER:       [[BB6]]:
162d68083feSHari Limaye; ONE-ITER-NEXT:    [[TMP7:%.*]] = load i32, ptr [[TMP3]], align 4
163d68083feSHari Limaye; ONE-ITER-NEXT:    [[TMP8:%.*]] = sext i32 [[TMP7]] to i64
164d68083feSHari Limaye; ONE-ITER-NEXT:    [[TMP9:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 [[TMP8]]
165d68083feSHari Limaye; ONE-ITER-NEXT:    call void @increment(ptr [[TMP9]])
166d68083feSHari Limaye; ONE-ITER-NEXT:    [[TMP10:%.*]] = load i32, ptr [[TMP3]], align 4
167d68083feSHari Limaye; ONE-ITER-NEXT:    [[TMP11:%.*]] = add nsw i32 [[TMP10]], -1
168d68083feSHari Limaye; ONE-ITER-NEXT:    call void @func.specialized.2(ptr [[TMP0]], i32 [[TMP11]])
169d68083feSHari Limaye; ONE-ITER-NEXT:    br label %[[BB12]]
170d68083feSHari Limaye; ONE-ITER:       [[BB12]]:
171d68083feSHari Limaye; ONE-ITER-NEXT:    ret void
172d68083feSHari Limaye;
173d68083feSHari Limaye;
174d68083feSHari Limaye; DISABLED-LABEL: define internal void @func(
175*29441e4fSNikita Popov; DISABLED-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]], ptr captures(none) [[TMP2:%.*]]) {
176d68083feSHari Limaye; DISABLED-NEXT:    [[TMP4:%.*]] = alloca i32, align 4
177d68083feSHari Limaye; DISABLED-NEXT:    store i32 [[TMP1]], ptr [[TMP4]], align 4
178d68083feSHari Limaye; DISABLED-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 4
179d68083feSHari Limaye; DISABLED-NEXT:    [[TMP6:%.*]] = icmp slt i32 [[TMP5]], 1
180d68083feSHari Limaye; DISABLED-NEXT:    br i1 [[TMP6]], label %[[BB13:.*]], label %[[BB7:.*]]
181d68083feSHari Limaye; DISABLED:       [[BB7]]:
182d68083feSHari Limaye; DISABLED-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP4]], align 4
183d68083feSHari Limaye; DISABLED-NEXT:    [[TMP9:%.*]] = sext i32 [[TMP8]] to i64
184d68083feSHari Limaye; DISABLED-NEXT:    [[TMP10:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 [[TMP9]]
185d68083feSHari Limaye; DISABLED-NEXT:    call void [[TMP2]](ptr [[TMP10]])
186d68083feSHari Limaye; DISABLED-NEXT:    [[TMP11:%.*]] = load i32, ptr [[TMP4]], align 4
187d68083feSHari Limaye; DISABLED-NEXT:    [[TMP12:%.*]] = add nsw i32 [[TMP11]], -1
188d68083feSHari Limaye; DISABLED-NEXT:    call void @func(ptr [[TMP0]], i32 [[TMP12]], ptr [[TMP2]])
189d68083feSHari Limaye; DISABLED-NEXT:    br label %[[BB13]]
190d68083feSHari Limaye; DISABLED:       [[BB13]]:
191d68083feSHari Limaye; DISABLED-NEXT:    ret void
192d68083feSHari Limaye;
193d68083feSHari Limaye;
194d68083feSHari Limaye; DISABLED-LABEL: define internal void @increment(
195*29441e4fSNikita Popov; DISABLED-SAME: ptr captures(none) [[TMP0:%.*]]) {
196d68083feSHari Limaye; DISABLED-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 4
197d68083feSHari Limaye; DISABLED-NEXT:    [[TMP3:%.*]] = add nsw i32 [[TMP2]], 1
198d68083feSHari Limaye; DISABLED-NEXT:    store i32 [[TMP3]], ptr [[TMP0]], align 4
199d68083feSHari Limaye; DISABLED-NEXT:    ret void
200d68083feSHari Limaye;
201d68083feSHari Limaye;
202d68083feSHari Limaye; DISABLED-LABEL: define internal void @decrement(
203*29441e4fSNikita Popov; DISABLED-SAME: ptr captures(none) [[TMP0:%.*]]) {
204d68083feSHari Limaye; DISABLED-NEXT:    [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 4
205d68083feSHari Limaye; DISABLED-NEXT:    [[TMP3:%.*]] = add nsw i32 [[TMP2]], -1
206d68083feSHari Limaye; DISABLED-NEXT:    store i32 [[TMP3]], ptr [[TMP0]], align 4
207d68083feSHari Limaye; DISABLED-NEXT:    ret void
208d68083feSHari Limaye;
209d68083feSHari Limaye;
210d68083feSHari Limaye; DISABLED-LABEL: define i32 @main(
211d68083feSHari Limaye; DISABLED-SAME: ptr [[TMP0:%.*]], i32 [[TMP1:%.*]]) {
212d68083feSHari Limaye; DISABLED-NEXT:    call void @func(ptr [[TMP0]], i32 [[TMP1]], ptr nonnull @increment)
213d68083feSHari Limaye; DISABLED-NEXT:    call void @func(ptr [[TMP0]], i32 0, ptr nonnull @decrement)
214d68083feSHari Limaye; DISABLED-NEXT:    ret i32 0
215d68083feSHari Limaye;
216