1; RUN: opt -hotcoldsplit -hotcoldsplit-threshold=0 -S < %s | FileCheck %s
2
3target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
4target triple = "x86_64-apple-macosx10.14.0"
5
6%struct.__jmp_buf_tag = type { [8 x i64], i32, %struct.__sigset_t }
7%struct.__sigset_t = type { [16 x i64] }
8
9; Don't outline noreturn calls which aren't explicitly marked cold.
10
11; CHECK-LABEL: define {{.*}}@foo(
12; CHECK-NOT: foo.cold.1
13define void @foo(i32, %struct.__jmp_buf_tag*) {
14  %3 = icmp eq i32 %0, 0
15  tail call void @_Z10sideeffectv()
16  br i1 %3, label %5, label %4
17
18; <label>:4:                                      ; preds = %2
19  tail call void @longjmp(%struct.__jmp_buf_tag* %1, i32 0)
20  unreachable
21
22; <label>:5:                                      ; preds = %2
23  ret void
24}
25
26; Don't outline within a noreturn function.
27
28; CHECK: define {{.*}}@xpc_objc_main(i32 {{.*}}) [[XPC_OBJC_MAIN_ATTRS:#[0-9]+]]
29; CHECK-NOT: xpc_objc_main.cold.1
30define void @xpc_objc_main(i32) noreturn {
31  %2 = icmp eq i32 %0, 0
32  tail call void @_Z10sideeffectv()
33  br i1 %2, label %4, label %3
34
35; <label>:3:                                      ; preds = %2
36  call void @_Z10sideeffectv()
37  unreachable
38
39; <label>:4:                                      ; preds = %2
40  ; Crash with an error message, "not supposed to return".
41  unreachable
42}
43
44; Do outline noreturn calls marked cold.
45
46; CHECK-LABEL: define {{.*}}@bar(
47; CHECK: call {{.*}}@bar.cold.1(
48define void @bar(i32) {
49  %2 = icmp eq i32 %0, 0
50  tail call void @_Z10sideeffectv()
51  br i1 %2, label %sink, label %exit
52
53sink:
54  tail call void @_Z10sideeffectv()
55  call void @llvm.trap()
56  unreachable
57
58exit:
59  ret void
60}
61
62; Do outline noreturn calls preceded by a cold call.
63
64; CHECK-LABEL: define {{.*}}@baz(
65; CHECK: call {{.*}}@baz.cold.1(
66define void @baz(i32, %struct.__jmp_buf_tag*) {
67  %3 = icmp eq i32 %0, 0
68  tail call void @_Z10sideeffectv()
69  br i1 %3, label %5, label %4
70
71; <label>:4:                                      ; preds = %2
72  call void @sink()
73  tail call void @longjmp(%struct.__jmp_buf_tag* %1, i32 0)
74  unreachable
75
76; <label>:5:                                      ; preds = %2
77  ret void
78}
79
80; CHECK-LABEL: define {{.*}}@bar.cold.1(
81; CHECK: call {{.*}}@llvm.trap(
82
83; CHECK: attributes [[XPC_OBJC_MAIN_ATTRS]] = { noreturn }
84
85declare void @sink() cold
86
87declare void @llvm.trap() noreturn cold
88
89declare void @_Z10sideeffectv()
90
91declare void @longjmp(%struct.__jmp_buf_tag*, i32) noreturn nounwind
92