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
34
45; Zero extension instructions should be eliminated at instruction
56; selection phase for all test cases below.
910; generated code (<<= remains because %c is used by both call and
1011; lshr in a few test cases).
1112
12- ; CHECK-NOT: &=
13- ; CHECK-NOT: >>=
14-
1513define 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
1643entry:
1744 %a = load i8 , ptr %p , align 1
1845 %b = zext i8 %a to i64
@@ -26,6 +53,35 @@ entry:
2653}
2754
2855define 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
2985entry:
3086 %a = load i16 , ptr %p , align 2
3187 %b = zext i16 %a to i64
@@ -45,6 +101,27 @@ next:
45101}
46102
47103define 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
48125entry:
49126 %a = load i8 , ptr %p , align 1
50127 ; zext is implicit in this context
@@ -54,6 +131,27 @@ entry:
54131}
55132
56133define 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
57155entry:
58156 %a = load i8 , ptr %p , align 1
59157 br label %next
@@ -65,6 +163,27 @@ next:
65163}
66164
67165define 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
68187entry:
69188 %a = load i32 , ptr %p , align 4
70189 br label %next
0 commit comments