xref: /llvm-project/llvm/test/Transforms/FunctionSpecialization/function-specialization-recursive2.ll (revision e15d72adac66790a78a51a3087b56b2bde6b778a)
1; RUN: opt -passes="ipsccp<func-spec>" -force-specialization -funcspec-max-iters=2 -S < %s | FileCheck %s
2
3; Volatile store preventing recursive specialisation:
4;
5; CHECK:     @recursiveFunc.specialized.1
6; CHECK-NOT: @recursiveFunc.specialized.2
7
8@Global = internal constant i32 1, align 4
9
10define internal void @recursiveFunc(ptr nocapture readonly %arg) {
11  %temp = alloca i32, align 4
12  %arg.load = load i32, ptr %arg, align 4
13  %arg.cmp = icmp slt i32 %arg.load, 4
14  br i1 %arg.cmp, label %block6, label %ret.block
15
16block6:
17  call void @print_val(i32 %arg.load)
18  %arg.add = add nsw i32 %arg.load, 1
19  store volatile i32 %arg.add, ptr %temp, align 4
20  call void @recursiveFunc(ptr nonnull %temp)
21  br label %ret.block
22
23ret.block:
24  ret void
25}
26
27define i32 @main() {
28  call void @recursiveFunc(ptr nonnull @Global)
29  ret i32 0
30}
31
32declare dso_local void @print_val(i32)
33