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