File: unreachable.ll

package info (click to toggle)
llvm-toolchain-14 1%3A14.0.6-12
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,496,180 kB
  • sloc: cpp: 5,593,972; ansic: 986,872; asm: 585,869; python: 184,223; objc: 72,530; lisp: 31,119; f90: 27,793; javascript: 9,780; pascal: 9,762; sh: 9,482; perl: 7,468; ml: 5,432; awk: 3,523; makefile: 2,538; xml: 953; cs: 573; fortran: 567
file content (153 lines) | stat: -rw-r--r-- 4,539 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
; RUN: opt < %s -passes='print<branch-prob>' -disable-output 2>&1 | FileCheck %s

declare void @bar() cold

; Both 'l1' and 'r1' has one edge leading to 'cold' and another one to
; 'unreachable' blocks. Check that 'cold' paths are preferred. Also ensure both
; paths from 'entry' block are equal.
define void @test1(i32 %0) {
;CHECK: edge entry -> l1 probability is 0x40000000 / 0x80000000 = 50.00%
;CHECK: edge entry -> r1 probability is 0x40000000 / 0x80000000 = 50.00%
;CHECK: edge l1 -> cold probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
;CHECK: edge l1 -> unreached probability is 0x00000000 / 0x80000000 = 0.00%
;CHECK: edge r1 -> unreached probability is 0x00000000 / 0x80000000 = 0.00%
;CHECK: edge r1 -> cold probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]

entry:
  br i1 undef, label %l1, label %r1

l1:
  br i1 undef, label %cold, label %unreached

r1:
  br i1 undef, label %unreached, label %cold

unreached:
  unreachable

cold:
  call void @bar()
  ret void
}

; Both edges of 'l1' leads to 'cold' blocks while one edge of 'r1' leads to
; 'unreachable' block. Check that 'l1' has 50/50 while 'r1' has 0/100
; distributuion. Also ensure both paths from 'entry' block are equal.
define void @test2(i32 %0) {
;CHECK: edge entry -> l1 probability is 0x40000000 / 0x80000000 = 50.00%
;CHECK: edge entry -> r1 probability is 0x40000000 / 0x80000000 = 50.00%
;CHECK: edge l1 -> cold probability is 0x40000000 / 0x80000000 = 50.00%
;CHECK: edge l1 -> cold2 probability is 0x40000000 / 0x80000000 = 50.00%
;CHECK: edge r1 -> unreached probability is 0x00000000 / 0x80000000 = 0.00%
;CHECK: edge r1 -> cold probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]

entry:
  br i1 undef, label %l1, label %r1

l1:
  br i1 undef, label %cold, label %cold2

r1:
  br i1 undef, label %unreached, label %cold

unreached:
  unreachable

cold:
  call void @bar()
  ret void

cold2:
  call void @bar()
  ret void
}

; Both edges of 'r1' leads to 'unreachable' blocks while one edge of 'l1' leads to
; 'cold' block. Ensure that path leading to 'cold' block is preferred.
define void @test3(i32 %0) {
;CHECK: edge entry -> l1 probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
;CHECK: edge entry -> r1 probability is 0x00000000 / 0x80000000 = 0.00%
;CHECK: edge l1 -> cold probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
;CHECK: edge l1 -> unreached probability is 0x00000000 / 0x80000000 = 0.00%
;CHECK: edge r1 -> unreached probability is 0x40000000 / 0x80000000 = 50.00%
;CHECK: edge r1 -> unreached2 probability is 0x40000000 / 0x80000000 = 50.00%

entry:
  br i1 undef, label %l1, label %r1

l1:
  br i1 undef, label %cold, label %unreached

r1:
  br i1 undef, label %unreached, label %unreached2

unreached:
  unreachable

unreached2:
  unreachable

cold:
  call void @bar()
  ret void
}

; Left edge of 'entry' leads to 'cold' block while right edge is 'normal' continuation.
; Check that we able to propagate 'cold' weight to 'entry' block. Also ensure
; both edges from 'l1' are equally likely.
define void @test4(i32 %0) {
;CHECK: edge entry -> l1 probability is 0x078780e3 / 0x80000000 = 5.88%
;CHECK: edge entry -> r1 probability is 0x78787f1d / 0x80000000 = 94.12% [HOT edge]
;CHECK: edge l1 -> l2 probability is 0x40000000 / 0x80000000 = 50.00%
;CHECK: edge l1 -> r2 probability is 0x40000000 / 0x80000000 = 50.00%
;CHECK: edge l2 -> to.cold probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
;CHECK: edge r2 -> to.cold probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
;CHECK: edge to.cold -> cold probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]

entry:
  br i1 undef, label %l1, label %r1

l1:
  br i1 undef, label %l2, label %r2

l2:
  br label %to.cold

r2:
  br label %to.cold

to.cold:
 br label %cold

r1:
 ret void

cold:
  call void @bar()
  ret void
}

; Check that most likely path from 'entry' to 'l2' through 'r1' is preferred.
define void @test5(i32 %0) {
;CHECK: edge entry -> cold probability is 0x078780e3 / 0x80000000 = 5.88%
;CHECK: edge entry -> r1 probability is 0x78787f1d / 0x80000000 = 94.12% [HOT edge]
;CHECK: edge cold -> l2 probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
;CHECK: edge r1 -> l2 probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
;CHECK: edge r1 -> unreached probability is 0x00000000 / 0x80000000 = 0.00%

entry:
  br i1 undef, label %cold, label %r1

cold:
  call void @bar()
  br label %l2

r1:
  br i1 undef, label %l2, label %unreached

l2:
  ret void

unreached:
  unreachable
}