1 ; RUN: llc -amdgpu-codegenprepare-widen-constant-loads=0 -march=amdgcn -mcpu=tahiti -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,SI %s
2 ; RUN: llc -amdgpu-codegenprepare-widen-constant-loads=0 -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,VI %s
4 ; GCN-LABEL: {{^}}widen_i16_constant_load:
5 ; GCN: s_load_dword [[VAL:s[0-9]+]]
6 ; GCN: s_addk_i32 [[VAL]], 0x3e7
7 ; GCN: s_or_b32 [[OR:s[0-9]+]], [[VAL]], 4
8 define amdgpu_kernel void @widen_i16_constant_load(i16 addrspace(4)* %arg) {
9 %load = load i16, i16 addrspace(4)* %arg, align 4
10 %add = add i16 %load, 999
12 store i16 %or, i16 addrspace(1)* null
16 ; GCN-LABEL: {{^}}widen_i16_constant_load_zext_i32:
17 ; GCN: s_load_dword [[VAL:s[0-9]+]]
18 ; GCN: s_and_b32 [[TRUNC:s[0-9]+]], [[VAL]], 0xffff{{$}}
19 ; GCN: s_addk_i32 [[TRUNC]], 0x3e7
20 ; GCN: s_or_b32 [[OR:s[0-9]+]], [[TRUNC]], 4
21 define amdgpu_kernel void @widen_i16_constant_load_zext_i32(i16 addrspace(4)* %arg) {
22 %load = load i16, i16 addrspace(4)* %arg, align 4
23 %ext = zext i16 %load to i32
24 %add = add i32 %ext, 999
26 store i32 %or, i32 addrspace(1)* null
30 ; GCN-LABEL: {{^}}widen_i16_constant_load_sext_i32:
31 ; GCN: s_load_dword [[VAL:s[0-9]+]]
32 ; GCN: s_sext_i32_i16 [[EXT:s[0-9]+]], [[VAL]]
33 ; GCN: s_addk_i32 [[EXT]], 0x3e7
34 ; GCN: s_or_b32 [[OR:s[0-9]+]], [[EXT]], 4
35 define amdgpu_kernel void @widen_i16_constant_load_sext_i32(i16 addrspace(4)* %arg) {
36 %load = load i16, i16 addrspace(4)* %arg, align 4
37 %ext = sext i16 %load to i32
38 %add = add i32 %ext, 999
40 store i32 %or, i32 addrspace(1)* null
44 ; GCN-LABEL: {{^}}widen_i17_constant_load:
45 ; GCN: s_load_dword [[VAL:s[0-9]+]]
46 ; GCN: s_add_i32 [[ADD:s[0-9]+]], [[VAL]], 34
47 ; GCN: s_or_b32 [[OR:s[0-9]+]], [[ADD]], 4
48 ; GCN: s_bfe_u32 s{{[0-9]+}}, [[OR]], 0x10010
49 define amdgpu_kernel void @widen_i17_constant_load(i17 addrspace(4)* %arg) {
50 %load = load i17, i17 addrspace(4)* %arg, align 4
51 %add = add i17 %load, 34
53 store i17 %or, i17 addrspace(1)* null
57 ; GCN-LABEL: {{^}}widen_f16_constant_load:
58 ; GCN: s_load_dword [[VAL:s[0-9]+]]
59 ; SI: v_cvt_f32_f16_e32 [[CVT:v[0-9]+]], [[VAL]]
60 ; SI: v_add_f32_e32 [[ADD:v[0-9]+]], 4.0, [[CVT]]
62 ; VI: v_add_f16_e64 [[ADD:v[0-9]+]], [[VAL]], 4.0
63 define amdgpu_kernel void @widen_f16_constant_load(half addrspace(4)* %arg) {
64 %load = load half, half addrspace(4)* %arg, align 4
65 %add = fadd half %load, 4.0
66 store half %add, half addrspace(1)* null
70 ; FIXME: valu usage on VI
71 ; GCN-LABEL: {{^}}widen_v2i8_constant_load:
72 ; GCN: s_load_dword [[VAL:s[0-9]+]]
85 define amdgpu_kernel void @widen_v2i8_constant_load(<2 x i8> addrspace(4)* %arg) {
86 %load = load <2 x i8>, <2 x i8> addrspace(4)* %arg, align 4
87 %add = add <2 x i8> %load, <i8 12, i8 44>
88 %or = or <2 x i8> %add, <i8 4, i8 3>
89 store <2 x i8> %or, <2 x i8> addrspace(1)* null
93 ; GCN-LABEL: {{^}}no_widen_i16_constant_divergent_load:
94 ; GCN: {{buffer|flat}}_load_ushort
95 define amdgpu_kernel void @no_widen_i16_constant_divergent_load(i16 addrspace(4)* %arg) {
96 %tid = call i32 @llvm.amdgcn.workitem.id.x()
97 %tid.ext = zext i32 %tid to i64
98 %gep.arg = getelementptr inbounds i16, i16 addrspace(4)* %arg, i64 %tid.ext
99 %load = load i16, i16 addrspace(4)* %gep.arg, align 4
100 %add = add i16 %load, 999
102 store i16 %or, i16 addrspace(1)* null
106 ; GCN-LABEL: {{^}}widen_i1_constant_load:
107 ; GCN: s_load_dword [[VAL:s[0-9]+]]
108 ; GCN: s_and_b32 {{s[0-9]+}}, [[VAL]], 1{{$}}
109 define amdgpu_kernel void @widen_i1_constant_load(i1 addrspace(4)* %arg) {
110 %load = load i1, i1 addrspace(4)* %arg, align 4
111 %and = and i1 %load, true
112 store i1 %and, i1 addrspace(1)* null
116 ; GCN-LABEL: {{^}}widen_i16_zextload_i64_constant_load:
117 ; GCN: s_load_dword [[VAL:s[0-9]+]]
118 ; GCN: s_and_b32 [[TRUNC:s[0-9]+]], [[VAL]], 0xffff{{$}}
119 ; GCN: s_addk_i32 [[TRUNC]], 0x3e7
120 ; GCN: s_or_b32 [[OR:s[0-9]+]], [[TRUNC]], 4
121 define amdgpu_kernel void @widen_i16_zextload_i64_constant_load(i16 addrspace(4)* %arg) {
122 %load = load i16, i16 addrspace(4)* %arg, align 4
123 %zext = zext i16 %load to i32
124 %add = add i32 %zext, 999
126 store i32 %or, i32 addrspace(1)* null
130 ; GCN-LABEL: {{^}}widen_i1_zext_to_i64_constant_load:
131 ; GCN: s_load_dword [[VAL:s[0-9]+]]
132 ; GCN: s_and_b32 [[AND:s[0-9]+]], [[VAL]], 1
133 ; GCN: s_add_u32 [[ADD:s[0-9]+]], [[AND]], 0x3e7
134 ; GCN: s_addc_u32 s{{[0-9]+}}, 0, 0
135 define amdgpu_kernel void @widen_i1_zext_to_i64_constant_load(i1 addrspace(4)* %arg) {
136 %load = load i1, i1 addrspace(4)* %arg, align 4
137 %zext = zext i1 %load to i64
138 %add = add i64 %zext, 999
139 store i64 %add, i64 addrspace(1)* null
143 ; GCN-LABEL: {{^}}widen_i16_constant32_load:
144 ; GCN: s_load_dword [[VAL:s[0-9]+]]
145 ; GCN: s_addk_i32 [[VAL]], 0x3e7
146 ; GCN: s_or_b32 [[OR:s[0-9]+]], [[VAL]], 4
147 define amdgpu_kernel void @widen_i16_constant32_load(i16 addrspace(6)* %arg) {
148 %load = load i16, i16 addrspace(6)* %arg, align 4
149 %add = add i16 %load, 999
151 store i16 %or, i16 addrspace(1)* null
155 ; GCN-LABEL: {{^}}widen_i16_global_invariant_load:
156 ; GCN: s_load_dword [[VAL:s[0-9]+]]
157 ; GCN: s_addk_i32 [[VAL]], 0x3e7
158 ; GCN: s_or_b32 [[OR:s[0-9]+]], [[VAL]], 1
159 define amdgpu_kernel void @widen_i16_global_invariant_load(i16 addrspace(1)* %arg) {
160 %load = load i16, i16 addrspace(1)* %arg, align 4, !invariant.load !0
161 %add = add i16 %load, 999
163 store i16 %or, i16 addrspace(1)* null
167 declare i32 @llvm.amdgcn.workitem.id.x()