Skip to content

Commit d5aaf83

Browse files
Pre-commit tests for fixing (ext)loads from WASM globals
1 parent 9bc4200 commit d5aaf83

File tree

1 file changed

+177
-0
lines changed

1 file changed

+177
-0
lines changed
Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc < %s | FileCheck %s
3+
4+
; Test various loads from WASM (address space 1) globals lower as intended
5+
6+
target triple = "wasm32-unknown-unknown"
7+
8+
9+
@globalI8 = local_unnamed_addr addrspace(1) global i8 undef
10+
@globalI32 = local_unnamed_addr addrspace(1) global i32 undef
11+
@globalI64 = local_unnamed_addr addrspace(1) global i64 undef
12+
13+
14+
define i32 @zext_i8_i32() {
15+
; CHECK-LABEL: zext_i8_i32:
16+
; CHECK: .functype zext_i8_i32 () -> (i32)
17+
; CHECK-NEXT: # %bb.0:
18+
; CHECK-NEXT: i32.const 0
19+
; CHECK-NEXT: i32.load8_u globalI32
20+
; CHECK-NEXT: # fallthrough-return
21+
%v = load i8, ptr addrspace(1) @globalI32
22+
%e = zext i8 %v to i32
23+
ret i32 %e
24+
}
25+
26+
define i32 @sext_i8_i32() {
27+
; CHECK-LABEL: sext_i8_i32:
28+
; CHECK: .functype sext_i8_i32 () -> (i32)
29+
; CHECK-NEXT: # %bb.0:
30+
; CHECK-NEXT: i32.const 0
31+
; CHECK-NEXT: i32.load8_s globalI32
32+
; CHECK-NEXT: # fallthrough-return
33+
%v = load i8, ptr addrspace(1) @globalI32
34+
%e = sext i8 %v to i32
35+
ret i32 %e
36+
}
37+
38+
define i32 @zext_i16_i32() {
39+
; CHECK-LABEL: zext_i16_i32:
40+
; CHECK: .functype zext_i16_i32 () -> (i32)
41+
; CHECK-NEXT: # %bb.0:
42+
; CHECK-NEXT: i32.const 0
43+
; CHECK-NEXT: i32.load16_u globalI32
44+
; CHECK-NEXT: # fallthrough-return
45+
%v = load i16, ptr addrspace(1) @globalI32
46+
%e = zext i16 %v to i32
47+
ret i32 %e
48+
}
49+
50+
define i32 @sext_i16_i32() {
51+
; CHECK-LABEL: sext_i16_i32:
52+
; CHECK: .functype sext_i16_i32 () -> (i32)
53+
; CHECK-NEXT: # %bb.0:
54+
; CHECK-NEXT: i32.const 0
55+
; CHECK-NEXT: i32.load16_s globalI32
56+
; CHECK-NEXT: # fallthrough-return
57+
%v = load i16, ptr addrspace(1) @globalI32
58+
%e = sext i16 %v to i32
59+
ret i32 %e
60+
}
61+
62+
63+
define i64 @zext_i8_i64() {
64+
; CHECK-LABEL: zext_i8_i64:
65+
; CHECK: .functype zext_i8_i64 () -> (i64)
66+
; CHECK-NEXT: # %bb.0:
67+
; CHECK-NEXT: i32.const 0
68+
; CHECK-NEXT: i64.load8_u globalI64
69+
; CHECK-NEXT: # fallthrough-return
70+
%v = load i8, ptr addrspace(1) @globalI64
71+
%e = zext i8 %v to i64
72+
ret i64 %e
73+
}
74+
75+
define i64 @sext_i8_i64() {
76+
; CHECK-LABEL: sext_i8_i64:
77+
; CHECK: .functype sext_i8_i64 () -> (i64)
78+
; CHECK-NEXT: # %bb.0:
79+
; CHECK-NEXT: i32.const 0
80+
; CHECK-NEXT: i64.load8_s globalI64
81+
; CHECK-NEXT: # fallthrough-return
82+
%v = load i8, ptr addrspace(1) @globalI64
83+
%e = sext i8 %v to i64
84+
ret i64 %e
85+
}
86+
87+
define i64 @zext_i16_i64() {
88+
; CHECK-LABEL: zext_i16_i64:
89+
; CHECK: .functype zext_i16_i64 () -> (i64)
90+
; CHECK-NEXT: # %bb.0:
91+
; CHECK-NEXT: i32.const 0
92+
; CHECK-NEXT: i64.load16_u globalI64
93+
; CHECK-NEXT: # fallthrough-return
94+
%v = load i16, ptr addrspace(1) @globalI64
95+
%e = zext i16 %v to i64
96+
ret i64 %e
97+
}
98+
99+
define i64 @sext_i16_i64() {
100+
; CHECK-LABEL: sext_i16_i64:
101+
; CHECK: .functype sext_i16_i64 () -> (i64)
102+
; CHECK-NEXT: # %bb.0:
103+
; CHECK-NEXT: i32.const 0
104+
; CHECK-NEXT: i64.load16_s globalI64
105+
; CHECK-NEXT: # fallthrough-return
106+
%v = load i16, ptr addrspace(1) @globalI64
107+
%e = sext i16 %v to i64
108+
ret i64 %e
109+
}
110+
111+
define i64 @zext_i32_i64() {
112+
; CHECK-LABEL: zext_i32_i64:
113+
; CHECK: .functype zext_i32_i64 () -> (i64)
114+
; CHECK-NEXT: # %bb.0:
115+
; CHECK-NEXT: i32.const 0
116+
; CHECK-NEXT: i64.load32_u globalI64
117+
; CHECK-NEXT: # fallthrough-return
118+
%v = load i32, ptr addrspace(1) @globalI64
119+
%e = zext i32 %v to i64
120+
ret i64 %e
121+
}
122+
123+
define i64 @sext_i32_i64() {
124+
; CHECK-LABEL: sext_i32_i64:
125+
; CHECK: .functype sext_i32_i64 () -> (i64)
126+
; CHECK-NEXT: # %bb.0:
127+
; CHECK-NEXT: i32.const 0
128+
; CHECK-NEXT: i64.load32_s globalI64
129+
; CHECK-NEXT: # fallthrough-return
130+
%v = load i32, ptr addrspace(1) @globalI64
131+
%e = sext i32 %v to i64
132+
ret i64 %e
133+
}
134+
135+
136+
define i64 @load_i64_from_i32() {
137+
; CHECK-LABEL: load_i64_from_i32:
138+
; CHECK: .functype load_i64_from_i32 () -> (i64)
139+
; CHECK-NEXT: # %bb.0:
140+
; CHECK-NEXT: global.get globalI32
141+
; CHECK-NEXT: # fallthrough-return
142+
%v = load i64, ptr addrspace(1) @globalI32
143+
ret i64 %v
144+
}
145+
146+
define i32 @load_i32_from_i64() {
147+
; CHECK-LABEL: load_i32_from_i64:
148+
; CHECK: .functype load_i32_from_i64 () -> (i32)
149+
; CHECK-NEXT: # %bb.0:
150+
; CHECK-NEXT: global.get globalI64
151+
; CHECK-NEXT: # fallthrough-return
152+
%v = load i32, ptr addrspace(1) @globalI64
153+
ret i32 %v
154+
}
155+
156+
define i8 @load_i8() {
157+
; CHECK-LABEL: load_i8:
158+
; CHECK: .functype load_i8 () -> (i32)
159+
; CHECK-NEXT: # %bb.0:
160+
; CHECK-NEXT: i32.const 0
161+
; CHECK-NEXT: i32.load8_u globalI8
162+
; CHECK-NEXT: # fallthrough-return
163+
%v = load i8, ptr addrspace(1) @globalI8
164+
ret i8 %v
165+
}
166+
167+
define i64 @load_i16_from_i8_zext_to_i64() {
168+
; CHECK-LABEL: load_i16_from_i8_zext_to_i64:
169+
; CHECK: .functype load_i16_from_i8_zext_to_i64 () -> (i64)
170+
; CHECK-NEXT: # %bb.0:
171+
; CHECK-NEXT: i32.const 0
172+
; CHECK-NEXT: i64.load16_u globalI8
173+
; CHECK-NEXT: # fallthrough-return
174+
%v = load i16, ptr addrspace(1) @globalI8
175+
%e = zext i16 %v to i64
176+
ret i64 %e
177+
}

0 commit comments

Comments
 (0)