[SLP] Add cost model for `llvm.powi.*` intrinsics
[llvm-project.git] / llvm / test / Transforms / FunctionSpecialization / function-specialization-recursive.ll
blob82020edec442fc4a944315102ab2a4f4928dedab
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
16 block6:
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
25 ret.block:
26   ret void
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
35 define 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
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)
56   ret i32 0
59 declare dso_local void @print_val(i32, i32)