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
5 @low = internal constant i32 0, align 4
6 @high = internal constant i32 6, align 4
8 define 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
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)
29 ; ITERS2: @funcspec.arg.4 = internal constant i32 2
30 ; ITERS2: @funcspec.arg.5 = internal constant i32 4
32 ; ITERS3: @funcspec.arg.7 = internal constant i32 3
33 ; ITERS3: @funcspec.arg.8 = internal constant i32 3
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
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
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
55 call void @recursiveFunc(i32* nonnull @low, i32 1, i32* nonnull @high)
59 declare dso_local void @print_val(i32, i32)