xref: /llvm-project/llvm/test/CodeGen/WebAssembly/simd-load-zero-offset.ll (revision 73856247eef35f5336e485dc009842a5b991c421)
1cb327922SThomas Lively; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2cb327922SThomas Lively; RUN: llc < %s -verify-machineinstrs -mattr=+simd128 | FileCheck %s
3cb327922SThomas Lively
4cb327922SThomas Lively; Test SIMD v128.load{32,64}_zero instructions
5cb327922SThomas Lively
6cb327922SThomas Livelytarget triple = "wasm32-unknown-unknown"
7cb327922SThomas Lively
8cb327922SThomas Lively;===----------------------------------------------------------------------------
9cb327922SThomas Lively; v128.load32_zero
10cb327922SThomas Lively;===----------------------------------------------------------------------------
11cb327922SThomas Lively
12*73856247SNikita Popovdefine <4 x i32> @load_zero_i32_no_offset(ptr %p) {
13cb327922SThomas Lively; CHECK-LABEL: load_zero_i32_no_offset:
14cb327922SThomas Lively; CHECK:         .functype load_zero_i32_no_offset (i32) -> (v128)
15cb327922SThomas Lively; CHECK-NEXT:  # %bb.0:
16cb327922SThomas Lively; CHECK-NEXT:    local.get 0
171a57ee12SThomas Lively; CHECK-NEXT:    v128.load32_zero 0
18cb327922SThomas Lively; CHECK-NEXT:    # fallthrough-return
19*73856247SNikita Popov  %x = load i32, ptr %p
201a57ee12SThomas Lively  %v = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0
21cb327922SThomas Lively  ret <4 x i32> %v
22cb327922SThomas Lively}
23cb327922SThomas Lively
24*73856247SNikita Popovdefine <4 x i32> @load_zero_i32_with_folded_offset(ptr %p) {
25cb327922SThomas Lively; CHECK-LABEL: load_zero_i32_with_folded_offset:
26cb327922SThomas Lively; CHECK:         .functype load_zero_i32_with_folded_offset (i32) -> (v128)
27cb327922SThomas Lively; CHECK-NEXT:  # %bb.0:
28cb327922SThomas Lively; CHECK-NEXT:    local.get 0
291a57ee12SThomas Lively; CHECK-NEXT:    v128.load32_zero 24
30cb327922SThomas Lively; CHECK-NEXT:    # fallthrough-return
31*73856247SNikita Popov  %q = ptrtoint ptr %p to i32
32cb327922SThomas Lively  %r = add nuw i32 %q, 24
33*73856247SNikita Popov  %s = inttoptr i32 %r to ptr
34*73856247SNikita Popov  %x = load i32, ptr %s
351a57ee12SThomas Lively  %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0
36cb327922SThomas Lively  ret <4 x i32> %t
37cb327922SThomas Lively}
38cb327922SThomas Lively
39*73856247SNikita Popovdefine <4 x i32> @load_zero_i32_with_folded_gep_offset(ptr %p) {
40cb327922SThomas Lively; CHECK-LABEL: load_zero_i32_with_folded_gep_offset:
41cb327922SThomas Lively; CHECK:         .functype load_zero_i32_with_folded_gep_offset (i32) -> (v128)
42cb327922SThomas Lively; CHECK-NEXT:  # %bb.0:
43cb327922SThomas Lively; CHECK-NEXT:    local.get 0
441a57ee12SThomas Lively; CHECK-NEXT:    v128.load32_zero 24
45cb327922SThomas Lively; CHECK-NEXT:    # fallthrough-return
46*73856247SNikita Popov  %s = getelementptr inbounds i32, ptr %p, i32 6
47*73856247SNikita Popov  %x = load i32, ptr %s
481a57ee12SThomas Lively  %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0
49cb327922SThomas Lively  ret <4 x i32> %t
50cb327922SThomas Lively}
51cb327922SThomas Lively
52*73856247SNikita Popovdefine <4 x i32> @load_zero_i32_with_unfolded_gep_negative_offset(ptr %p) {
53cb327922SThomas Lively; CHECK-LABEL: load_zero_i32_with_unfolded_gep_negative_offset:
54cb327922SThomas Lively; CHECK:         .functype load_zero_i32_with_unfolded_gep_negative_offset (i32) -> (v128)
55cb327922SThomas Lively; CHECK-NEXT:  # %bb.0:
56cb327922SThomas Lively; CHECK-NEXT:    local.get 0
57cb327922SThomas Lively; CHECK-NEXT:    i32.const -24
58cb327922SThomas Lively; CHECK-NEXT:    i32.add
591a57ee12SThomas Lively; CHECK-NEXT:    v128.load32_zero 0
60cb327922SThomas Lively; CHECK-NEXT:    # fallthrough-return
61*73856247SNikita Popov  %s = getelementptr inbounds i32, ptr %p, i32 -6
62*73856247SNikita Popov  %x = load i32, ptr %s
631a57ee12SThomas Lively  %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0
64cb327922SThomas Lively  ret <4 x i32> %t
65cb327922SThomas Lively}
66cb327922SThomas Lively
67*73856247SNikita Popovdefine <4 x i32> @load_zero_i32_with_unfolded_offset(ptr %p) {
68cb327922SThomas Lively; CHECK-LABEL: load_zero_i32_with_unfolded_offset:
69cb327922SThomas Lively; CHECK:         .functype load_zero_i32_with_unfolded_offset (i32) -> (v128)
70cb327922SThomas Lively; CHECK-NEXT:  # %bb.0:
71cb327922SThomas Lively; CHECK-NEXT:    local.get 0
72cb327922SThomas Lively; CHECK-NEXT:    i32.const 24
73cb327922SThomas Lively; CHECK-NEXT:    i32.add
741a57ee12SThomas Lively; CHECK-NEXT:    v128.load32_zero 0
75cb327922SThomas Lively; CHECK-NEXT:    # fallthrough-return
76*73856247SNikita Popov  %q = ptrtoint ptr %p to i32
77cb327922SThomas Lively  %r = add nsw i32 %q, 24
78*73856247SNikita Popov  %s = inttoptr i32 %r to ptr
79*73856247SNikita Popov  %x = load i32, ptr %s
801a57ee12SThomas Lively  %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0
81cb327922SThomas Lively  ret <4 x i32> %t
82cb327922SThomas Lively}
83cb327922SThomas Lively
84*73856247SNikita Popovdefine <4 x i32> @load_zero_i32_with_unfolded_gep_offset(ptr %p) {
85cb327922SThomas Lively; CHECK-LABEL: load_zero_i32_with_unfolded_gep_offset:
86cb327922SThomas Lively; CHECK:         .functype load_zero_i32_with_unfolded_gep_offset (i32) -> (v128)
87cb327922SThomas Lively; CHECK-NEXT:  # %bb.0:
88cb327922SThomas Lively; CHECK-NEXT:    local.get 0
89cb327922SThomas Lively; CHECK-NEXT:    i32.const 24
90cb327922SThomas Lively; CHECK-NEXT:    i32.add
911a57ee12SThomas Lively; CHECK-NEXT:    v128.load32_zero 0
92cb327922SThomas Lively; CHECK-NEXT:    # fallthrough-return
93*73856247SNikita Popov  %s = getelementptr i32, ptr %p, i32 6
94*73856247SNikita Popov  %x = load i32, ptr %s
951a57ee12SThomas Lively  %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0
96cb327922SThomas Lively  ret <4 x i32> %t
97cb327922SThomas Lively}
98cb327922SThomas Lively
99cb327922SThomas Livelydefine <4 x i32> @load_zero_i32_from_numeric_address() {
100cb327922SThomas Lively; CHECK-LABEL: load_zero_i32_from_numeric_address:
101cb327922SThomas Lively; CHECK:         .functype load_zero_i32_from_numeric_address () -> (v128)
102cb327922SThomas Lively; CHECK-NEXT:  # %bb.0:
103cb327922SThomas Lively; CHECK-NEXT:    i32.const 0
1041a57ee12SThomas Lively; CHECK-NEXT:    v128.load32_zero 42
105cb327922SThomas Lively; CHECK-NEXT:    # fallthrough-return
106*73856247SNikita Popov  %s = inttoptr i32 42 to ptr
107*73856247SNikita Popov  %x = load i32, ptr %s
1081a57ee12SThomas Lively  %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0
109cb327922SThomas Lively  ret <4 x i32> %t
110cb327922SThomas Lively}
111cb327922SThomas Lively
112cb327922SThomas Lively@gv_i32 = global i32 0
113cb327922SThomas Livelydefine <4 x i32> @load_zero_i32_from_global_address() {
114cb327922SThomas Lively; CHECK-LABEL: load_zero_i32_from_global_address:
115cb327922SThomas Lively; CHECK:         .functype load_zero_i32_from_global_address () -> (v128)
116cb327922SThomas Lively; CHECK-NEXT:  # %bb.0:
117cb327922SThomas Lively; CHECK-NEXT:    i32.const 0
1181a57ee12SThomas Lively; CHECK-NEXT:    v128.load32_zero gv_i32
119cb327922SThomas Lively; CHECK-NEXT:    # fallthrough-return
120*73856247SNikita Popov  %x = load i32, ptr @gv_i32
1211a57ee12SThomas Lively  %t = insertelement <4 x i32> zeroinitializer, i32 %x, i32 0
122cb327922SThomas Lively  ret <4 x i32> %t
123cb327922SThomas Lively}
124cb327922SThomas Lively
125cb327922SThomas Lively;===----------------------------------------------------------------------------
126cb327922SThomas Lively; v128.load64_zero
127cb327922SThomas Lively;===----------------------------------------------------------------------------
128cb327922SThomas Lively
129*73856247SNikita Popovdefine <2 x i64> @load_zero_i64_no_offset(ptr %p) {
130cb327922SThomas Lively; CHECK-LABEL: load_zero_i64_no_offset:
131cb327922SThomas Lively; CHECK:         .functype load_zero_i64_no_offset (i32) -> (v128)
132cb327922SThomas Lively; CHECK-NEXT:  # %bb.0:
133cb327922SThomas Lively; CHECK-NEXT:    local.get 0
1341a57ee12SThomas Lively; CHECK-NEXT:    v128.load64_zero 0
135cb327922SThomas Lively; CHECK-NEXT:    # fallthrough-return
136*73856247SNikita Popov  %x = load i64, ptr %p
1371a57ee12SThomas Lively  %v = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0
138cb327922SThomas Lively  ret <2 x i64> %v
139cb327922SThomas Lively}
140cb327922SThomas Lively
141*73856247SNikita Popovdefine <2 x i64> @load_zero_i64_with_folded_offset(ptr %p) {
142cb327922SThomas Lively; CHECK-LABEL: load_zero_i64_with_folded_offset:
143cb327922SThomas Lively; CHECK:         .functype load_zero_i64_with_folded_offset (i32) -> (v128)
144cb327922SThomas Lively; CHECK-NEXT:  # %bb.0:
145cb327922SThomas Lively; CHECK-NEXT:    local.get 0
1461a57ee12SThomas Lively; CHECK-NEXT:    v128.load64_zero 24
147cb327922SThomas Lively; CHECK-NEXT:    # fallthrough-return
148*73856247SNikita Popov  %q = ptrtoint ptr %p to i32
149cb327922SThomas Lively  %r = add nuw i32 %q, 24
150*73856247SNikita Popov  %s = inttoptr i32 %r to ptr
151*73856247SNikita Popov  %x = load i64, ptr %s
1521a57ee12SThomas Lively  %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0
153cb327922SThomas Lively  ret <2 x i64> %t
154cb327922SThomas Lively}
155cb327922SThomas Lively
156*73856247SNikita Popovdefine <2 x i64> @load_zero_i64_with_folded_gep_offset(ptr %p) {
157cb327922SThomas Lively; CHECK-LABEL: load_zero_i64_with_folded_gep_offset:
158cb327922SThomas Lively; CHECK:         .functype load_zero_i64_with_folded_gep_offset (i32) -> (v128)
159cb327922SThomas Lively; CHECK-NEXT:  # %bb.0:
160cb327922SThomas Lively; CHECK-NEXT:    local.get 0
1611a57ee12SThomas Lively; CHECK-NEXT:    v128.load64_zero 48
162cb327922SThomas Lively; CHECK-NEXT:    # fallthrough-return
163*73856247SNikita Popov  %s = getelementptr inbounds i64, ptr %p, i64 6
164*73856247SNikita Popov  %x = load i64, ptr %s
1651a57ee12SThomas Lively  %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0
166cb327922SThomas Lively  ret <2 x i64> %t
167cb327922SThomas Lively}
168cb327922SThomas Lively
169*73856247SNikita Popovdefine <2 x i64> @load_zero_i64_with_unfolded_gep_negative_offset(ptr %p) {
170cb327922SThomas Lively; CHECK-LABEL: load_zero_i64_with_unfolded_gep_negative_offset:
171cb327922SThomas Lively; CHECK:         .functype load_zero_i64_with_unfolded_gep_negative_offset (i32) -> (v128)
172cb327922SThomas Lively; CHECK-NEXT:  # %bb.0:
173cb327922SThomas Lively; CHECK-NEXT:    local.get 0
174cb327922SThomas Lively; CHECK-NEXT:    i32.const -48
175cb327922SThomas Lively; CHECK-NEXT:    i32.add
1761a57ee12SThomas Lively; CHECK-NEXT:    v128.load64_zero 0
177cb327922SThomas Lively; CHECK-NEXT:    # fallthrough-return
178*73856247SNikita Popov  %s = getelementptr inbounds i64, ptr %p, i64 -6
179*73856247SNikita Popov  %x = load i64, ptr %s
1801a57ee12SThomas Lively  %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0
181cb327922SThomas Lively  ret <2 x i64> %t
182cb327922SThomas Lively}
183cb327922SThomas Lively
184*73856247SNikita Popovdefine <2 x i64> @load_zero_i64_with_unfolded_offset(ptr %p) {
185cb327922SThomas Lively; CHECK-LABEL: load_zero_i64_with_unfolded_offset:
186cb327922SThomas Lively; CHECK:         .functype load_zero_i64_with_unfolded_offset (i32) -> (v128)
187cb327922SThomas Lively; CHECK-NEXT:  # %bb.0:
188cb327922SThomas Lively; CHECK-NEXT:    local.get 0
189cb327922SThomas Lively; CHECK-NEXT:    i32.const 24
190cb327922SThomas Lively; CHECK-NEXT:    i32.add
1911a57ee12SThomas Lively; CHECK-NEXT:    v128.load64_zero 0
192cb327922SThomas Lively; CHECK-NEXT:    # fallthrough-return
193*73856247SNikita Popov  %q = ptrtoint ptr %p to i32
194cb327922SThomas Lively  %r = add nsw i32 %q, 24
195*73856247SNikita Popov  %s = inttoptr i32 %r to ptr
196*73856247SNikita Popov  %x = load i64, ptr %s
1971a57ee12SThomas Lively  %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0
198cb327922SThomas Lively  ret <2 x i64> %t
199cb327922SThomas Lively}
200cb327922SThomas Lively
201*73856247SNikita Popovdefine <2 x i64> @load_zero_i64_with_unfolded_gep_offset(ptr %p) {
202cb327922SThomas Lively; CHECK-LABEL: load_zero_i64_with_unfolded_gep_offset:
203cb327922SThomas Lively; CHECK:         .functype load_zero_i64_with_unfolded_gep_offset (i32) -> (v128)
204cb327922SThomas Lively; CHECK-NEXT:  # %bb.0:
205cb327922SThomas Lively; CHECK-NEXT:    local.get 0
206cb327922SThomas Lively; CHECK-NEXT:    i32.const 48
207cb327922SThomas Lively; CHECK-NEXT:    i32.add
2081a57ee12SThomas Lively; CHECK-NEXT:    v128.load64_zero 0
209cb327922SThomas Lively; CHECK-NEXT:    # fallthrough-return
210*73856247SNikita Popov  %s = getelementptr i64, ptr %p, i64 6
211*73856247SNikita Popov  %x = load i64, ptr %s
2121a57ee12SThomas Lively  %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0
213cb327922SThomas Lively  ret <2 x i64> %t
214cb327922SThomas Lively}
215cb327922SThomas Lively
216cb327922SThomas Livelydefine <2 x i64> @load_zero_i64_from_numeric_address() {
217cb327922SThomas Lively; CHECK-LABEL: load_zero_i64_from_numeric_address:
218cb327922SThomas Lively; CHECK:         .functype load_zero_i64_from_numeric_address () -> (v128)
219cb327922SThomas Lively; CHECK-NEXT:  # %bb.0:
220cb327922SThomas Lively; CHECK-NEXT:    i32.const 0
2211a57ee12SThomas Lively; CHECK-NEXT:    v128.load64_zero 42
222cb327922SThomas Lively; CHECK-NEXT:    # fallthrough-return
223*73856247SNikita Popov  %s = inttoptr i32 42 to ptr
224*73856247SNikita Popov  %x = load i64, ptr %s
2251a57ee12SThomas Lively  %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0
226cb327922SThomas Lively  ret <2 x i64> %t
227cb327922SThomas Lively}
228cb327922SThomas Lively
229cb327922SThomas Lively@gv_i64 = global i64 0
230cb327922SThomas Livelydefine <2 x i64> @load_zero_i64_from_global_address() {
231cb327922SThomas Lively; CHECK-LABEL: load_zero_i64_from_global_address:
232cb327922SThomas Lively; CHECK:         .functype load_zero_i64_from_global_address () -> (v128)
233cb327922SThomas Lively; CHECK-NEXT:  # %bb.0:
234cb327922SThomas Lively; CHECK-NEXT:    i32.const 0
2351a57ee12SThomas Lively; CHECK-NEXT:    v128.load64_zero gv_i64
236cb327922SThomas Lively; CHECK-NEXT:    # fallthrough-return
237*73856247SNikita Popov  %x = load i64, ptr @gv_i64
2381a57ee12SThomas Lively  %t = insertelement <2 x i64> zeroinitializer, i64 %x, i32 0
239cb327922SThomas Lively  ret <2 x i64> %t
240cb327922SThomas Lively}
241