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