1*30fbb069SSjoerd Meijer; RUN: opt -function-specialization -force-function-specialization -func-specialization-max-iters=2 -S < %s | FileCheck %s
2*30fbb069SSjoerd Meijer
3*30fbb069SSjoerd Meijer; Volatile store preventing recursive specialisation:
4*30fbb069SSjoerd Meijer;
5*30fbb069SSjoerd Meijer; CHECK:     @recursiveFunc.1
6*30fbb069SSjoerd Meijer; CHECK-NOT: @recursiveFunc.2
7*30fbb069SSjoerd Meijer
8*30fbb069SSjoerd Meijer@Global = internal constant i32 1, align 4
9*30fbb069SSjoerd Meijer
10*30fbb069SSjoerd Meijerdefine internal void @recursiveFunc(i32* nocapture readonly %arg) {
11*30fbb069SSjoerd Meijer  %temp = alloca i32, align 4
12*30fbb069SSjoerd Meijer  %arg.load = load i32, i32* %arg, align 4
13*30fbb069SSjoerd Meijer  %arg.cmp = icmp slt i32 %arg.load, 4
14*30fbb069SSjoerd Meijer  br i1 %arg.cmp, label %block6, label %ret.block
15*30fbb069SSjoerd Meijer
16*30fbb069SSjoerd Meijerblock6:
17*30fbb069SSjoerd Meijer  call void @print_val(i32 %arg.load)
18*30fbb069SSjoerd Meijer  %arg.add = add nsw i32 %arg.load, 1
19*30fbb069SSjoerd Meijer  store volatile i32 %arg.add, i32* %temp, align 4
20*30fbb069SSjoerd Meijer  call void @recursiveFunc(i32* nonnull %temp)
21*30fbb069SSjoerd Meijer  br label %ret.block
22*30fbb069SSjoerd Meijer
23*30fbb069SSjoerd Meijerret.block:
24*30fbb069SSjoerd Meijer  ret void
25*30fbb069SSjoerd Meijer}
26*30fbb069SSjoerd Meijer
27*30fbb069SSjoerd Meijerdefine i32 @main() {
28*30fbb069SSjoerd Meijer  call void @recursiveFunc(i32* nonnull @Global)
29*30fbb069SSjoerd Meijer  ret i32 0
30*30fbb069SSjoerd Meijer}
31*30fbb069SSjoerd Meijer
32*30fbb069SSjoerd Meijerdeclare dso_local void @print_val(i32)
33