[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / Analysis / BranchProbabilityInfo / deopt-invoke.ll
blob0a552c6dc4d799fbd24bcf323c8e873eb374b12a
1 ; RUN: opt -analyze -branch-prob < %s -enable-new-pm=0 | FileCheck %s
2 ; RUN: opt < %s -passes='print<branch-prob>' -disable-output 2>&1 | FileCheck %s
4 declare i32* @"personality_function"() #1
5 declare void @foo(i32)
6 declare void @bar() 
7 declare void @llvm.experimental.deoptimize.isVoid(...)
8 declare void @cold() cold
10 ; Even though the likeliness of 'invoke' to throw an exception is assessed as low
11 ; all other paths are even less likely. Check that hot paths leads to excepion handler.
12 define void @test1(i32 %0) personality i32* ()* @"personality_function"  !prof !1 {
13 ;CHECK: edge entry -> unreached probability is 0x00000001 / 0x80000000 = 0.00%
14 ;CHECK: edge entry -> invoke probability is 0x7fffffff / 0x80000000 = 100.00% [HOT edge]
15 ;CHECK: edge invoke -> invoke.cont.unreached probability is 0x00000000 / 0x80000000 = 0.00%
16 ;CHECK: edge invoke -> land.pad probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
17 ;CHECK: edge land.pad -> exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
19 entry:
20   br i1 undef, label %unreached, label %invoke, !prof !2
21 invoke:
22   invoke void @foo(i32 %0)
23           to label %invoke.cont.unreached unwind label %land.pad
24 invoke.cont.unreached:
25   call void (...) @llvm.experimental.deoptimize.isVoid(i32 10) [ "deopt"() ]
26   ret void
28 unreached:
29   unreachable
31 land.pad:
32   %v20 = landingpad { i8*, i32 }
33           cleanup
34   %v21 = load i8 addrspace(1)*, i8 addrspace(1)* addrspace(256)* inttoptr (i64 8 to i8 addrspace(1)* addrspace(256)*), align 8
35   br label %exit
37 exit:
38   call void @bar()
39   ret void
42 define void @test2(i32 %0) personality i32* ()* @"personality_function" {
43 ;CHECK: edge entry -> unreached probability is 0x00000000 / 0x80000000 = 0.00%
44 ;CHECK: edge entry -> invoke probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
45 ;CHECK: edge invoke -> invoke.cont.cold probability is 0x7fff8000 / 0x80000000 = 100.00% [HOT edge]
46 ;CHECK: edge invoke -> land.pad probability is 0x00008000 / 0x80000000 = 0.00%
47 ;CHECK: edge land.pad -> exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
49 entry:
50   br i1 undef, label %unreached, label %invoke
51 invoke:
52   invoke void @foo(i32 %0)
53           to label %invoke.cont.cold unwind label %land.pad
54 invoke.cont.cold:
55   call void @cold()
56   ret void
58 unreached:
59   unreachable
61 land.pad:
62   %v20 = landingpad { i8*, i32 }
63           cleanup
64   %v21 = load i8 addrspace(1)*, i8 addrspace(1)* addrspace(256)* inttoptr (i64 8 to i8 addrspace(1)* addrspace(256)*), align 8
65   br label %exit
67 exit:
68   call void @bar()
69   ret void
72 define void @test3(i32 %0) personality i32* ()* @"personality_function" {
73 ;CHECK: edge entry -> unreached probability is 0x00000000 / 0x80000000 = 0.00%
74 ;CHECK: edge entry -> invoke probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
75 ;CHECK: edge invoke -> invoke.cont.cold probability is 0x7fff8000 / 0x80000000 = 100.00% [HOT edge]
76 ;CHECK: edge invoke -> land.pad probability is 0x00008000 / 0x80000000 = 0.00%
77 ;CHECK: edge land.pad -> exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
78 entry:
79   br i1 undef, label %unreached, label %invoke
80 invoke:
81   invoke void @foo(i32 %0)
82           to label %invoke.cont.cold unwind label %land.pad
83 invoke.cont.cold:
84   call void @cold()
85   ret void
87 unreached:
88   unreachable
90 land.pad:
91   %v20 = landingpad { i8*, i32 }
92           cleanup
93   %v21 = load i8 addrspace(1)*, i8 addrspace(1)* addrspace(256)* inttoptr (i64 8 to i8 addrspace(1)* addrspace(256)*), align 8
94   call void @cold()
95   br label %exit
97 exit:
98   call void @bar()
99   ret void
103 attributes #1 = { nounwind }
105 !1 = !{!"function_entry_count", i64 32768}
106 !2 = !{!"branch_weights", i32 1, i32 983040}