xref: /llvm-project/llvm/test/Transforms/FunctionSpecialization/function-specialization-recursive2.ll (revision e15d72adac66790a78a51a3087b56b2bde6b778a)
19627bcdeSAlexandros Lamprineas; RUN: opt -passes="ipsccp<func-spec>" -force-specialization -funcspec-max-iters=2 -S < %s | FileCheck %s
230fbb069SSjoerd Meijer
330fbb069SSjoerd Meijer; Volatile store preventing recursive specialisation:
430fbb069SSjoerd Meijer;
5*e15d72adSAlexandros Lamprineas; CHECK:     @recursiveFunc.specialized.1
6*e15d72adSAlexandros Lamprineas; CHECK-NOT: @recursiveFunc.specialized.2
730fbb069SSjoerd Meijer
830fbb069SSjoerd Meijer@Global = internal constant i32 1, align 4
930fbb069SSjoerd Meijer
10ebdf5aefSMatt Arsenaultdefine internal void @recursiveFunc(ptr nocapture readonly %arg) {
1130fbb069SSjoerd Meijer  %temp = alloca i32, align 4
12ebdf5aefSMatt Arsenault  %arg.load = load i32, ptr %arg, align 4
1330fbb069SSjoerd Meijer  %arg.cmp = icmp slt i32 %arg.load, 4
1430fbb069SSjoerd Meijer  br i1 %arg.cmp, label %block6, label %ret.block
1530fbb069SSjoerd Meijer
1630fbb069SSjoerd Meijerblock6:
1730fbb069SSjoerd Meijer  call void @print_val(i32 %arg.load)
1830fbb069SSjoerd Meijer  %arg.add = add nsw i32 %arg.load, 1
19ebdf5aefSMatt Arsenault  store volatile i32 %arg.add, ptr %temp, align 4
20ebdf5aefSMatt Arsenault  call void @recursiveFunc(ptr nonnull %temp)
2130fbb069SSjoerd Meijer  br label %ret.block
2230fbb069SSjoerd Meijer
2330fbb069SSjoerd Meijerret.block:
2430fbb069SSjoerd Meijer  ret void
2530fbb069SSjoerd Meijer}
2630fbb069SSjoerd Meijer
2730fbb069SSjoerd Meijerdefine i32 @main() {
28ebdf5aefSMatt Arsenault  call void @recursiveFunc(ptr nonnull @Global)
2930fbb069SSjoerd Meijer  ret i32 0
3030fbb069SSjoerd Meijer}
3130fbb069SSjoerd Meijer
3230fbb069SSjoerd Meijerdeclare dso_local void @print_val(i32)
33