xref: /llvm-project/llvm/test/Transforms/PlaceSafepoints/libcall.ll (revision cdb41e416adcd49a783f0d3d28d1e3fafb6f5429)
1; RUN: opt -S -passes=place-safepoints < %s | FileCheck -check-prefixes=CHECK,WITHLDEXPF %s
2; RUN: opt -S -passes=place-safepoints -disable-builtin=ldexp < %s | FileCheck %s
3
4
5; Libcalls will not contain a safepoint poll, so check that we insert
6; a safepoint in a loop containing a libcall.
7declare double @ldexp(double %x, i32 %n) nounwind readnone
8define double @test_libcall(double %x) gc "statepoint-example" {
9; CHECK-LABEL: test_libcall
10
11entry:
12; CHECK: entry
13; CHECK-NEXT: call void @do_safepoint
14; CHECK-NEXT: br label %loop
15  br label %loop
16
17loop:
18; CHECK: loop
19; CHECK-NEXT: %x_loop = phi double [ %x, %entry ], [ %x_exp, %loop ]
20; CHECK-NEXT: %x_exp = call double @ldexp(double %x_loop, i32 5)
21; CHECK-NEXT: %done = fcmp ogt double %x_exp, 1.5
22; WITHLDEXPF-NEXT: call void @do_safepoint
23; CHECK-NEXT: br
24  %x_loop = phi double [ %x, %entry ], [ %x_exp, %loop ]
25  %x_exp = call double @ldexp(double %x_loop, i32 5) nounwind readnone
26  %done = fcmp ogt double %x_exp, 1.5
27  br i1 %done, label %end, label %loop
28end:
29  %x_end = phi double [%x_exp, %loop]
30  ret double %x_end
31}
32
33; This function is inlined when inserting a poll.
34declare void @do_safepoint()
35define void @gc.safepoint_poll() {
36; CHECK-LABEL: gc.safepoint_poll
37entry:
38  call void @do_safepoint()
39  ret void
40}
41