130fbb069SSjoerd Meijer; RUN: opt -function-specialization -force-function-specialization -func-specialization-max-iters=2 -inline -instcombine -S < %s | FileCheck %s --check-prefix=ITERS2
230fbb069SSjoerd Meijer; RUN: opt -function-specialization -force-function-specialization -func-specialization-max-iters=3 -inline -instcombine -S < %s | FileCheck %s --check-prefix=ITERS3
330fbb069SSjoerd Meijer; RUN: opt -function-specialization -force-function-specialization -func-specialization-max-iters=4 -inline -instcombine -S < %s | FileCheck %s --check-prefix=ITERS4
4c4a0969bSSjoerd Meijer
5*b4417075SAlexandros Lamprineas@low = internal constant i32 0, align 4
6*b4417075SAlexandros Lamprineas@high = internal constant i32 6, align 4
7c4a0969bSSjoerd Meijer
8*b4417075SAlexandros Lamprineasdefine internal void @recursiveFunc(i32* nocapture readonly %lo, i32 %step, i32* nocapture readonly %hi) {
9*b4417075SAlexandros Lamprineas  %lo.temp = alloca i32, align 4
10*b4417075SAlexandros Lamprineas  %hi.temp = alloca i32, align 4
11*b4417075SAlexandros Lamprineas  %lo.load = load i32, i32* %lo, align 4
12*b4417075SAlexandros Lamprineas  %hi.load = load i32, i32* %hi, align 4
13*b4417075SAlexandros Lamprineas  %cmp = icmp ne i32 %lo.load, %hi.load
14*b4417075SAlexandros Lamprineas  br i1 %cmp, label %block6, label %ret.block
15c4a0969bSSjoerd Meijer
16c4a0969bSSjoerd Meijerblock6:
17*b4417075SAlexandros Lamprineas  call void @print_val(i32 %lo.load, i32 %hi.load)
18*b4417075SAlexandros Lamprineas  %add = add nsw i32 %lo.load, %step
19*b4417075SAlexandros Lamprineas  %sub = sub nsw i32 %hi.load, %step
20*b4417075SAlexandros Lamprineas  store i32 %add, i32* %lo.temp, align 4
21*b4417075SAlexandros Lamprineas  store i32 %sub, i32* %hi.temp, align 4
22*b4417075SAlexandros Lamprineas  call void @recursiveFunc(i32* nonnull %lo.temp, i32 %step, i32* nonnull %hi.temp)
23c4a0969bSSjoerd Meijer  br label %ret.block
24c4a0969bSSjoerd Meijer
25c4a0969bSSjoerd Meijerret.block:
26c4a0969bSSjoerd Meijer  ret void
27c4a0969bSSjoerd Meijer}
28c4a0969bSSjoerd Meijer
29*b4417075SAlexandros Lamprineas; ITERS2:  @funcspec.arg.4 = internal constant i32 2
30*b4417075SAlexandros Lamprineas; ITERS2:  @funcspec.arg.5 = internal constant i32 4
31*b4417075SAlexandros Lamprineas
32*b4417075SAlexandros Lamprineas; ITERS3:  @funcspec.arg.7 = internal constant i32 3
33*b4417075SAlexandros Lamprineas; ITERS3:  @funcspec.arg.8 = internal constant i32 3
3430fbb069SSjoerd Meijer
35c4a0969bSSjoerd Meijerdefine i32 @main() {
3630fbb069SSjoerd Meijer; ITERS2-LABEL: @main(
37*b4417075SAlexandros Lamprineas; ITERS2-NEXT:    call void @print_val(i32 0, i32 6)
38*b4417075SAlexandros Lamprineas; ITERS2-NEXT:    call void @print_val(i32 1, i32 5)
39*b4417075SAlexandros Lamprineas; ITERS2-NEXT:    call void @recursiveFunc(i32* nonnull @funcspec.arg.4, i32 1, i32* nonnull @funcspec.arg.5)
4030fbb069SSjoerd Meijer; ITERS2-NEXT:    ret i32 0
4130fbb069SSjoerd Meijer;
4230fbb069SSjoerd Meijer; ITERS3-LABEL: @main(
43*b4417075SAlexandros Lamprineas; ITERS3-NEXT:    call void @print_val(i32 0, i32 6)
44*b4417075SAlexandros Lamprineas; ITERS3-NEXT:    call void @print_val(i32 1, i32 5)
45*b4417075SAlexandros Lamprineas; ITERS3-NEXT:    call void @print_val(i32 2, i32 4)
46*b4417075SAlexandros Lamprineas; ITERS3-NEXT:    call void @recursiveFunc(i32* nonnull @funcspec.arg.7, i32 1, i32* nonnull @funcspec.arg.8)
4730fbb069SSjoerd Meijer; ITERS3-NEXT:    ret i32 0
4830fbb069SSjoerd Meijer;
4930fbb069SSjoerd Meijer; ITERS4-LABEL: @main(
50*b4417075SAlexandros Lamprineas; ITERS4-NEXT:    call void @print_val(i32 0, i32 6)
51*b4417075SAlexandros Lamprineas; ITERS4-NEXT:    call void @print_val(i32 1, i32 5)
52*b4417075SAlexandros Lamprineas; ITERS4-NEXT:    call void @print_val(i32 2, i32 4)
5330fbb069SSjoerd Meijer; ITERS4-NEXT:    ret i32 0
54c4a0969bSSjoerd Meijer;
55*b4417075SAlexandros Lamprineas  call void @recursiveFunc(i32* nonnull @low, i32 1, i32* nonnull @high)
56c4a0969bSSjoerd Meijer  ret i32 0
57c4a0969bSSjoerd Meijer}
58c4a0969bSSjoerd Meijer
59*b4417075SAlexandros Lamprineasdeclare dso_local void @print_val(i32, i32)
60