1; RUN: opt -function-specialization -force-function-specialization -func-specialization-max-iters=2 -inline -instcombine -S < %s | FileCheck %s --check-prefix=ITERS2
2; RUN: opt -function-specialization -force-function-specialization -func-specialization-max-iters=3 -inline -instcombine -S < %s | FileCheck %s --check-prefix=ITERS3
3; RUN: opt -function-specialization -force-function-specialization -func-specialization-max-iters=4 -inline -instcombine -S < %s | FileCheck %s --check-prefix=ITERS4
4
5@low = internal constant i32 0, align 4
6@high = internal constant i32 6, align 4
7
8define internal void @recursiveFunc(i32* nocapture readonly %lo, i32 %step, i32* nocapture readonly %hi) {
9  %lo.temp = alloca i32, align 4
10  %hi.temp = alloca i32, align 4
11  %lo.load = load i32, i32* %lo, align 4
12  %hi.load = load i32, i32* %hi, align 4
13  %cmp = icmp ne i32 %lo.load, %hi.load
14  br i1 %cmp, label %block6, label %ret.block
15
16block6:
17  call void @print_val(i32 %lo.load, i32 %hi.load)
18  %add = add nsw i32 %lo.load, %step
19  %sub = sub nsw i32 %hi.load, %step
20  store i32 %add, i32* %lo.temp, align 4
21  store i32 %sub, i32* %hi.temp, align 4
22  call void @recursiveFunc(i32* nonnull %lo.temp, i32 %step, i32* nonnull %hi.temp)
23  br label %ret.block
24
25ret.block:
26  ret void
27}
28
29; ITERS2:  @funcspec.arg.4 = internal constant i32 2
30; ITERS2:  @funcspec.arg.5 = internal constant i32 4
31
32; ITERS3:  @funcspec.arg.7 = internal constant i32 3
33; ITERS3:  @funcspec.arg.8 = internal constant i32 3
34
35define i32 @main() {
36; ITERS2-LABEL: @main(
37; ITERS2-NEXT:    call void @print_val(i32 0, i32 6)
38; ITERS2-NEXT:    call void @print_val(i32 1, i32 5)
39; ITERS2-NEXT:    call void @recursiveFunc(i32* nonnull @funcspec.arg.4, i32 1, i32* nonnull @funcspec.arg.5)
40; ITERS2-NEXT:    ret i32 0
41;
42; ITERS3-LABEL: @main(
43; ITERS3-NEXT:    call void @print_val(i32 0, i32 6)
44; ITERS3-NEXT:    call void @print_val(i32 1, i32 5)
45; ITERS3-NEXT:    call void @print_val(i32 2, i32 4)
46; ITERS3-NEXT:    call void @recursiveFunc(i32* nonnull @funcspec.arg.7, i32 1, i32* nonnull @funcspec.arg.8)
47; ITERS3-NEXT:    ret i32 0
48;
49; ITERS4-LABEL: @main(
50; ITERS4-NEXT:    call void @print_val(i32 0, i32 6)
51; ITERS4-NEXT:    call void @print_val(i32 1, i32 5)
52; ITERS4-NEXT:    call void @print_val(i32 2, i32 4)
53; ITERS4-NEXT:    ret i32 0
54;
55  call void @recursiveFunc(i32* nonnull @low, i32 1, i32* nonnull @high)
56  ret i32 0
57}
58
59declare dso_local void @print_val(i32, i32)
60