1
- ; RUN: llc -mcpu=v2 -mtriple=bpf < %s | FileCheck %s
2
- ; RUN: llc -mcpu=v4 -mtriple=bpf < %s | FileCheck %s
1
+ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2
+ ; RUN: llc -mcpu=v2 -mtriple=bpf < %s | FileCheck %s --check-prefixes=CHECK-V2
3
+ ; RUN: llc -mcpu=v4 -mtriple=bpf < %s | FileCheck %s --check-prefixes=CHECK-V4
3
4
4
5
; Zero extension instructions should be eliminated at instruction
5
6
; selection phase for all test cases below.
9
10
; generated code (<<= remains because %c is used by both call and
10
11
; lshr in a few test cases).
11
12
12
- ; CHECK-NOT: &=
13
- ; CHECK-NOT: >>=
14
-
15
13
define void @shl_lshr_same_bb (ptr %p ) {
14
+ ; CHECK-V2-LABEL: shl_lshr_same_bb:
15
+ ; CHECK-V2: # %bb.0: # %entry
16
+ ; CHECK-V2-NEXT: r1 = *(u8 *)(r1 + 0)
17
+ ; CHECK-V2-NEXT: r5 = 1
18
+ ; CHECK-V2-NEXT: if r1 == 0 goto LBB0_2
19
+ ; CHECK-V2-NEXT: # %bb.1: # %entry
20
+ ; CHECK-V2-NEXT: r5 = 0
21
+ ; CHECK-V2-NEXT: LBB0_2: # %entry
22
+ ; CHECK-V2-NEXT: r3 = r1
23
+ ; CHECK-V2-NEXT: r3 <<= 56
24
+ ; CHECK-V2-NEXT: r2 = r1
25
+ ; CHECK-V2-NEXT: r4 = r1
26
+ ; CHECK-V2-NEXT: call sink1
27
+ ; CHECK-V2-NEXT: exit
28
+ ;
29
+ ; CHECK-V4-LABEL: shl_lshr_same_bb:
30
+ ; CHECK-V4: # %bb.0: # %entry
31
+ ; CHECK-V4-NEXT: w1 = *(u8 *)(r1 + 0)
32
+ ; CHECK-V4-NEXT: w5 = 1
33
+ ; CHECK-V4-NEXT: if w1 == 0 goto LBB0_2
34
+ ; CHECK-V4-NEXT: # %bb.1: # %entry
35
+ ; CHECK-V4-NEXT: w5 = 0
36
+ ; CHECK-V4-NEXT: LBB0_2: # %entry
37
+ ; CHECK-V4-NEXT: r3 = r1
38
+ ; CHECK-V4-NEXT: r3 <<= 56
39
+ ; CHECK-V4-NEXT: r2 = r1
40
+ ; CHECK-V4-NEXT: r4 = r1
41
+ ; CHECK-V4-NEXT: call sink1
42
+ ; CHECK-V4-NEXT: exit
16
43
entry:
17
44
%a = load i8 , ptr %p , align 1
18
45
%b = zext i8 %a to i64
@@ -26,6 +53,35 @@ entry:
26
53
}
27
54
28
55
define void @shl_lshr_diff_bb (ptr %p ) {
56
+ ; CHECK-V2-LABEL: shl_lshr_diff_bb:
57
+ ; CHECK-V2: # %bb.0: # %entry
58
+ ; CHECK-V2-NEXT: r1 = *(u16 *)(r1 + 0)
59
+ ; CHECK-V2-NEXT: r5 = 1
60
+ ; CHECK-V2-NEXT: if r1 == 0 goto LBB1_2
61
+ ; CHECK-V2-NEXT: # %bb.1: # %entry
62
+ ; CHECK-V2-NEXT: r5 = 0
63
+ ; CHECK-V2-NEXT: LBB1_2: # %entry
64
+ ; CHECK-V2-NEXT: r3 = r1
65
+ ; CHECK-V2-NEXT: r3 <<= 48
66
+ ; CHECK-V2-NEXT: r2 = r1
67
+ ; CHECK-V2-NEXT: r4 = r1
68
+ ; CHECK-V2-NEXT: call sink2
69
+ ; CHECK-V2-NEXT: exit
70
+ ;
71
+ ; CHECK-V4-LABEL: shl_lshr_diff_bb:
72
+ ; CHECK-V4: # %bb.0: # %entry
73
+ ; CHECK-V4-NEXT: w1 = *(u16 *)(r1 + 0)
74
+ ; CHECK-V4-NEXT: w5 = 1
75
+ ; CHECK-V4-NEXT: if w1 == 0 goto LBB1_2
76
+ ; CHECK-V4-NEXT: # %bb.1: # %entry
77
+ ; CHECK-V4-NEXT: w5 = 0
78
+ ; CHECK-V4-NEXT: LBB1_2: # %entry
79
+ ; CHECK-V4-NEXT: r3 = r1
80
+ ; CHECK-V4-NEXT: r3 <<= 48
81
+ ; CHECK-V4-NEXT: r2 = r1
82
+ ; CHECK-V4-NEXT: r4 = r1
83
+ ; CHECK-V4-NEXT: call sink2
84
+ ; CHECK-V4-NEXT: exit
29
85
entry:
30
86
%a = load i16 , ptr %p , align 2
31
87
%b = zext i16 %a to i64
@@ -45,6 +101,27 @@ next:
45
101
}
46
102
47
103
define void @load_zext_same_bb (ptr %p ) {
104
+ ; CHECK-V2-LABEL: load_zext_same_bb:
105
+ ; CHECK-V2: # %bb.0: # %entry
106
+ ; CHECK-V2-NEXT: r1 = *(u8 *)(r1 + 0)
107
+ ; CHECK-V2-NEXT: r2 = 1
108
+ ; CHECK-V2-NEXT: if r1 == 0 goto LBB2_2
109
+ ; CHECK-V2-NEXT: # %bb.1: # %entry
110
+ ; CHECK-V2-NEXT: r2 = 0
111
+ ; CHECK-V2-NEXT: LBB2_2: # %entry
112
+ ; CHECK-V2-NEXT: call sink3
113
+ ; CHECK-V2-NEXT: exit
114
+ ;
115
+ ; CHECK-V4-LABEL: load_zext_same_bb:
116
+ ; CHECK-V4: # %bb.0: # %entry
117
+ ; CHECK-V4-NEXT: w1 = *(u8 *)(r1 + 0)
118
+ ; CHECK-V4-NEXT: w2 = 1
119
+ ; CHECK-V4-NEXT: if w1 == 0 goto LBB2_2
120
+ ; CHECK-V4-NEXT: # %bb.1: # %entry
121
+ ; CHECK-V4-NEXT: w2 = 0
122
+ ; CHECK-V4-NEXT: LBB2_2: # %entry
123
+ ; CHECK-V4-NEXT: call sink3
124
+ ; CHECK-V4-NEXT: exit
48
125
entry:
49
126
%a = load i8 , ptr %p , align 1
50
127
; zext is implicit in this context
@@ -54,6 +131,27 @@ entry:
54
131
}
55
132
56
133
define void @load_zext_diff_bb (ptr %p ) {
134
+ ; CHECK-V2-LABEL: load_zext_diff_bb:
135
+ ; CHECK-V2: # %bb.0: # %entry
136
+ ; CHECK-V2-NEXT: r1 = *(u8 *)(r1 + 0)
137
+ ; CHECK-V2-NEXT: r2 = 1
138
+ ; CHECK-V2-NEXT: if r1 == 0 goto LBB3_2
139
+ ; CHECK-V2-NEXT: # %bb.1: # %next
140
+ ; CHECK-V2-NEXT: r2 = 0
141
+ ; CHECK-V2-NEXT: LBB3_2: # %next
142
+ ; CHECK-V2-NEXT: call sink3
143
+ ; CHECK-V2-NEXT: exit
144
+ ;
145
+ ; CHECK-V4-LABEL: load_zext_diff_bb:
146
+ ; CHECK-V4: # %bb.0: # %entry
147
+ ; CHECK-V4-NEXT: w1 = *(u8 *)(r1 + 0)
148
+ ; CHECK-V4-NEXT: w2 = 1
149
+ ; CHECK-V4-NEXT: if w1 == 0 goto LBB3_2
150
+ ; CHECK-V4-NEXT: # %bb.1: # %next
151
+ ; CHECK-V4-NEXT: w2 = 0
152
+ ; CHECK-V4-NEXT: LBB3_2: # %next
153
+ ; CHECK-V4-NEXT: call sink3
154
+ ; CHECK-V4-NEXT: exit
57
155
entry:
58
156
%a = load i8 , ptr %p , align 1
59
157
br label %next
@@ -65,6 +163,27 @@ next:
65
163
}
66
164
67
165
define void @load_zext_diff_bb_2 (ptr %p ) {
166
+ ; CHECK-V2-LABEL: load_zext_diff_bb_2:
167
+ ; CHECK-V2: # %bb.0: # %entry
168
+ ; CHECK-V2-NEXT: r1 = *(u32 *)(r1 + 0)
169
+ ; CHECK-V2-NEXT: r2 = 1
170
+ ; CHECK-V2-NEXT: if r1 == 0 goto LBB4_2
171
+ ; CHECK-V2-NEXT: # %bb.1: # %next
172
+ ; CHECK-V2-NEXT: r2 = 0
173
+ ; CHECK-V2-NEXT: LBB4_2: # %next
174
+ ; CHECK-V2-NEXT: call sink4
175
+ ; CHECK-V2-NEXT: exit
176
+ ;
177
+ ; CHECK-V4-LABEL: load_zext_diff_bb_2:
178
+ ; CHECK-V4: # %bb.0: # %entry
179
+ ; CHECK-V4-NEXT: w1 = *(u32 *)(r1 + 0)
180
+ ; CHECK-V4-NEXT: w2 = 1
181
+ ; CHECK-V4-NEXT: if w1 == 0 goto LBB4_2
182
+ ; CHECK-V4-NEXT: # %bb.1: # %next
183
+ ; CHECK-V4-NEXT: w2 = 0
184
+ ; CHECK-V4-NEXT: LBB4_2: # %next
185
+ ; CHECK-V4-NEXT: call sink4
186
+ ; CHECK-V4-NEXT: exit
68
187
entry:
69
188
%a = load i32 , ptr %p , align 4
70
189
br label %next
0 commit comments