1; RUN: llc -mtriple=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,SI %s 2; RUN: llc -mtriple=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,VI %s 3; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 < %s | FileCheck -check-prefix=GFX11 %s 4 5; Test that materialization constants that are the bit reversed of 6; inline immediates are replaced with bfrev of the inline immediate to 7; save code size. 8 9; GCN-LABEL: {{^}}materialize_0_i32: 10; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 0{{$}} 11; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]] 12define amdgpu_kernel void @materialize_0_i32(ptr addrspace(1) %out) { 13 store i32 0, ptr addrspace(1) %out 14 ret void 15} 16 17; GCN-LABEL: {{^}}materialize_0_i64: 18; GCN: v_mov_b32_e32 v[[LOK:[0-9]+]], 0{{$}} 19; GCN: v_mov_b32_e32 v[[HIK:[0-9]+]], v[[LOK]]{{$}} 20; GCN: {{buffer|flat}}_store_dwordx2 {{.*}}v[[[LOK]]:[[HIK]]] 21define amdgpu_kernel void @materialize_0_i64(ptr addrspace(1) %out) { 22 store i64 0, ptr addrspace(1) %out 23 ret void 24} 25 26; GCN-LABEL: {{^}}materialize_neg1_i32: 27; GCN: v_mov_b32_e32 [[K:v[0-9]+]], -1{{$}} 28; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]] 29define amdgpu_kernel void @materialize_neg1_i32(ptr addrspace(1) %out) { 30 store i32 -1, ptr addrspace(1) %out 31 ret void 32} 33 34; GCN-LABEL: {{^}}materialize_neg1_i64: 35; GCN: v_mov_b32_e32 v[[LOK:[0-9]+]], -1{{$}} 36; GCN: v_mov_b32_e32 v[[HIK:[0-9]+]], v[[LOK]]{{$}} 37; GCN: {{buffer|flat}}_store_dwordx2 {{.*}}v[[[LOK]]:[[HIK]]] 38define amdgpu_kernel void @materialize_neg1_i64(ptr addrspace(1) %out) { 39 store i64 -1, ptr addrspace(1) %out 40 ret void 41} 42 43; GCN-LABEL: {{^}}materialize_signbit_i32: 44; GCN: v_bfrev_b32_e32 [[K:v[0-9]+]], 1{{$}} 45; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]] 46define amdgpu_kernel void @materialize_signbit_i32(ptr addrspace(1) %out) { 47 store i32 -2147483648, ptr addrspace(1) %out 48 ret void 49} 50 51; GCN-LABEL: {{^}}materialize_signbit_i64: 52; GCN-DAG: v_mov_b32_e32 v[[LOK:[0-9]+]], 0{{$}} 53; GCN-DAG: v_bfrev_b32_e32 v[[HIK:[0-9]+]], 1{{$}} 54; GCN: {{buffer|flat}}_store_dwordx2 {{.*}}v[[[LOK]]:[[HIK]]] 55define amdgpu_kernel void @materialize_signbit_i64(ptr addrspace(1) %out) { 56 store i64 -9223372036854775808, ptr addrspace(1) %out 57 ret void 58} 59 60; GCN-LABEL: {{^}}materialize_rev_neg16_i32: 61; GCN: v_bfrev_b32_e32 [[K:v[0-9]+]], -16{{$}} 62; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]] 63define amdgpu_kernel void @materialize_rev_neg16_i32(ptr addrspace(1) %out) { 64 store i32 268435455, ptr addrspace(1) %out 65 ret void 66} 67 68; GCN-LABEL: {{^}}materialize_rev_neg16_i64: 69; GCN-DAG: v_mov_b32_e32 v[[LOK:[0-9]+]], -1{{$}} 70; GCN-DAG: v_bfrev_b32_e32 v[[HIK:[0-9]+]], -16{{$}} 71; GCN: {{buffer|flat}}_store_dwordx2 {{.*}}v[[[LOK]]:[[HIK]]] 72define amdgpu_kernel void @materialize_rev_neg16_i64(ptr addrspace(1) %out) { 73 store i64 1152921504606846975, ptr addrspace(1) %out 74 ret void 75} 76 77; GCN-LABEL: {{^}}materialize_rev_neg17_i32: 78; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 0xf7ffffff{{$}} 79; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]] 80define amdgpu_kernel void @materialize_rev_neg17_i32(ptr addrspace(1) %out) { 81 store i32 -134217729, ptr addrspace(1) %out 82 ret void 83} 84 85; GCN-LABEL: {{^}}materialize_rev_neg17_i64: 86; GCN-DAG: v_mov_b32_e32 v[[LOK:[0-9]+]], -1{{$}} 87; GCN-DAG: v_mov_b32_e32 v[[HIK:[0-9]+]], 0xf7ffffff{{$}} 88; GCN: {{buffer|flat}}_store_dwordx2 {{.*}}v[[[LOK]]:[[HIK]]] 89define amdgpu_kernel void @materialize_rev_neg17_i64(ptr addrspace(1) %out) { 90 store i64 -576460752303423489, ptr addrspace(1) %out 91 ret void 92} 93 94; GCN-LABEL: {{^}}materialize_rev_64_i32: 95; GCN: v_bfrev_b32_e32 [[K:v[0-9]+]], 64{{$}} 96; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]] 97define amdgpu_kernel void @materialize_rev_64_i32(ptr addrspace(1) %out) { 98 store i32 33554432, ptr addrspace(1) %out 99 ret void 100} 101 102; GCN-LABEL: {{^}}materialize_rev_64_i64: 103; GCN-DAG: v_mov_b32_e32 v[[LOK:[0-9]+]], 0{{$}} 104; GCN-DAG: v_bfrev_b32_e32 v[[HIK:[0-9]+]], 64{{$}} 105; GCN: {{buffer|flat}}_store_dwordx2 {{.*}}v[[[LOK]]:[[HIK]]] 106define amdgpu_kernel void @materialize_rev_64_i64(ptr addrspace(1) %out) { 107 store i64 144115188075855872, ptr addrspace(1) %out 108 ret void 109} 110 111; GCN-LABEL: {{^}}materialize_rev_65_i32: 112; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 0x82000000{{$}} 113; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]] 114define amdgpu_kernel void @materialize_rev_65_i32(ptr addrspace(1) %out) { 115 store i32 -2113929216, ptr addrspace(1) %out 116 ret void 117} 118 119; GCN-LABEL: {{^}}materialize_rev_65_i64: 120; GCN-DAG: v_mov_b32_e32 v[[LOK:[0-9]+]], 0{{$}} 121; GCN-DAG: v_mov_b32_e32 v[[HIK:[0-9]+]], 0x82000000{{$}} 122; GCN: {{buffer|flat}}_store_dwordx2 {{.*}}v[[[LOK]]:[[HIK]]] 123define amdgpu_kernel void @materialize_rev_65_i64(ptr addrspace(1) %out) { 124 store i64 -9079256848778919936, ptr addrspace(1) %out 125 ret void 126} 127 128; GCN-LABEL: {{^}}materialize_rev_3_i32: 129; GCN: v_mov_b32_e32 [[K:v[0-9]+]], -2.0{{$}} 130; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]] 131define amdgpu_kernel void @materialize_rev_3_i32(ptr addrspace(1) %out) { 132 store i32 -1073741824, ptr addrspace(1) %out 133 ret void 134} 135 136; GCN-LABEL: {{^}}materialize_rev_3_i64: 137; GCN-DAG: v_mov_b32_e32 v[[LOK:[0-9]+]], 0{{$}} 138; GCN-DAG: v_mov_b32_e32 v[[HIK:[0-9]+]], -2.0{{$}} 139; GCN: {{buffer|flat}}_store_dwordx2 {{.*}}v[[[LOK]]:[[HIK]]] 140define amdgpu_kernel void @materialize_rev_3_i64(ptr addrspace(1) %out) { 141 store i64 -4611686018427387904, ptr addrspace(1) %out 142 ret void 143} 144 145; GCN-LABEL: {{^}}materialize_rev_0.5_i32: 146; GCN: v_bfrev_b32_e32 [[K:v[0-9]+]], 0.5{{$}} 147; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]] 148define amdgpu_kernel void @materialize_rev_0.5_i32(ptr addrspace(1) %out) { 149 store i32 252, ptr addrspace(1) %out 150 ret void 151} 152 153; GCN-LABEL: {{^}}materialize_rev_1.0_i32: 154; GCN: v_bfrev_b32_e32 [[K:v[0-9]+]], 1.0{{$}} 155; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]] 156define amdgpu_kernel void @materialize_rev_1.0_i32(ptr addrspace(1) %out) { 157 store i32 508, ptr addrspace(1) %out 158 ret void 159} 160 161; GCN-LABEL: {{^}}materialize_rev_2.0_i32: 162; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 2{{$}} 163; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]] 164define amdgpu_kernel void @materialize_rev_2.0_i32(ptr addrspace(1) %out) { 165 store i32 2, ptr addrspace(1) %out 166 ret void 167} 168 169; GCN-LABEL: {{^}}materialize_rev_4.0_i32: 170; GCN: v_bfrev_b32_e32 [[K:v[0-9]+]], 4.0{{$}} 171; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]] 172define amdgpu_kernel void @materialize_rev_4.0_i32(ptr addrspace(1) %out) { 173 store i32 258, ptr addrspace(1) %out 174 ret void 175} 176 177; GCN-LABEL: {{^}}materialize_rev_neg0.5_i32: 178; GCN: v_bfrev_b32_e32 [[K:v[0-9]+]], -0.5{{$}} 179; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]] 180define amdgpu_kernel void @materialize_rev_neg0.5_i32(ptr addrspace(1) %out) { 181 store i32 253, ptr addrspace(1) %out 182 ret void 183} 184 185; GCN-LABEL: {{^}}materialize_rev_neg1.0_i32: 186; GCN: v_bfrev_b32_e32 [[K:v[0-9]+]], -1.0{{$}} 187; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]] 188define amdgpu_kernel void @materialize_rev_neg1.0_i32(ptr addrspace(1) %out) { 189 store i32 509, ptr addrspace(1) %out 190 ret void 191} 192 193; GCN-LABEL: {{^}}materialize_rev_neg2.0_i32: 194; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 3{{$}} 195; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]] 196define amdgpu_kernel void @materialize_rev_neg2.0_i32(ptr addrspace(1) %out) { 197 store i32 3, ptr addrspace(1) %out 198 ret void 199} 200 201; GCN-LABEL: {{^}}materialize_rev_neg4.0_i32: 202; GCN: v_bfrev_b32_e32 [[K:v[0-9]+]], -4.0{{$}} 203; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]] 204define amdgpu_kernel void @materialize_rev_neg4.0_i32(ptr addrspace(1) %out) { 205 store i32 259, ptr addrspace(1) %out 206 ret void 207} 208 209; GCN-LABEL: {{^}}materialize_rev_1.0_i64: 210; GCN-DAG: v_bfrev_b32_e32 v[[LOK:[0-9]+]], 1.0{{$}} 211; GCN-DAG: v_mov_b32_e32 v[[HIK:[0-9]+]], 0{{$}} 212; GCN: {{buffer|flat}}_store_dwordx2 {{.*}}v[[[LOK]]:[[HIK]]] 213define amdgpu_kernel void @materialize_rev_1.0_i64(ptr addrspace(1) %out) { 214 store i64 508, ptr addrspace(1) %out 215 ret void 216} 217 218; GCN-LABEL: {{^}}s_materialize_0_i32: 219; GCN: s_mov_b32 s{{[0-9]+}}, 0{{$}} 220define amdgpu_kernel void @s_materialize_0_i32() { 221 call void asm sideeffect "; use $0", "s"(i32 0) 222 ret void 223} 224 225; GCN-LABEL: {{^}}s_materialize_1_i32: 226; GCN: s_mov_b32 s{{[0-9]+}}, 1{{$}} 227define amdgpu_kernel void @s_materialize_1_i32() { 228 call void asm sideeffect "; use $0", "s"(i32 1) 229 ret void 230} 231 232; GCN-LABEL: {{^}}s_materialize_neg1_i32: 233; GCN: s_mov_b32 s{{[0-9]+}}, -1{{$}} 234define amdgpu_kernel void @s_materialize_neg1_i32() { 235 call void asm sideeffect "; use $0", "s"(i32 -1) 236 ret void 237} 238 239; GCN-LABEL: {{^}}s_materialize_signbit_i32: 240; GCN: s_brev_b32 s{{[0-9]+}}, 1{{$}} 241define amdgpu_kernel void @s_materialize_signbit_i32() { 242 call void asm sideeffect "; use $0", "s"(i32 -2147483648) 243 ret void 244} 245 246; GCN-LABEL: {{^}}s_materialize_rev_64_i32: 247; GCN: s_brev_b32 s{{[0-9]+}}, 64{{$}} 248define amdgpu_kernel void @s_materialize_rev_64_i32() { 249 call void asm sideeffect "; use $0", "s"(i32 33554432) 250 ret void 251} 252 253; GCN-LABEL: {{^}}s_materialize_rev_65_i32: 254; GCN: s_mov_b32 s{{[0-9]+}}, 0x82000000{{$}} 255define amdgpu_kernel void @s_materialize_rev_65_i32() { 256 call void asm sideeffect "; use $0", "s"(i32 -2113929216) 257 ret void 258} 259 260; GCN-LABEL: {{^}}s_materialize_rev_neg16_i32: 261; GCN: s_brev_b32 s{{[0-9]+}}, -16{{$}} 262define amdgpu_kernel void @s_materialize_rev_neg16_i32() { 263 call void asm sideeffect "; use $0", "s"(i32 268435455) 264 ret void 265} 266 267; GCN-LABEL: {{^}}s_materialize_rev_neg17_i32: 268; GCN: s_mov_b32 s{{[0-9]+}}, 0xf7ffffff{{$}} 269define amdgpu_kernel void @s_materialize_rev_neg17_i32() { 270 call void asm sideeffect "; use $0", "s"(i32 -134217729) 271 ret void 272} 273 274; GCN-LABEL: {{^}}s_materialize_rev_1.0_i32: 275; GCN: s_movk_i32 s{{[0-9]+}}, 0x1fc{{$}} 276define amdgpu_kernel void @s_materialize_rev_1.0_i32() { 277 call void asm sideeffect "; use $0", "s"(i32 508) 278 ret void 279} 280 281; GCN-LABEL: {{^}}s_materialize_not_1.0_i32: 282; GCN: s_mov_b32 s{{[0-9]+}}, 0xc07fffff 283define void @s_materialize_not_1.0_i32() { 284 call void asm sideeffect "; use $0", "s"(i32 -1065353217) 285 ret void 286} 287 288; GCN-LABEL: {{^}}s_materialize_not_neg_1.0_i32: 289; GCN: s_mov_b32 s{{[0-9]+}}, 0x407fffff 290define void @s_materialize_not_neg_1.0_i32() { 291 call void asm sideeffect "; use $0", "s"(i32 1082130431) 292 ret void 293} 294 295; GCN-LABEL: {{^}}s_materialize_not_inv2pi_i32: 296; GCN: s_mov_b32 s{{[0-9]+}}, 0xc1dd067c 297define void @s_materialize_not_inv2pi_i32() { 298 call void asm sideeffect "; use $0", "s"(i32 -1042479492) 299 ret void 300} 301 302; GCN-LABEL: {{^}}s_materialize_not_neg_inv2pi_i32: 303; GCN: s_mov_b32 s{{[0-9]+}}, 0x41dd067c 304define void @s_materialize_not_neg_inv2pi_i32() { 305 call void asm sideeffect "; use $0", "s"(i32 1105004156) 306 ret void 307} 308 309; GCN-LABEL: {{^}}materialize_not_0.5_i32: 310; GCN: v_not_b32_e32 v{{[0-9]+}}, 0.5 311define void @materialize_not_0.5_i32(ptr addrspace(1) %out) { 312 store i32 -1056964609, ptr addrspace(1) %out 313 ret void 314} 315 316; GCN-LABEL: {{^}}materialize_not_1.0_i32: 317; GCN: v_not_b32_e32 v{{[0-9]+}}, 1.0 318define void @materialize_not_1.0_i32(ptr addrspace(1) %out) { 319 store i32 -1065353217, ptr addrspace(1) %out 320 ret void 321} 322 323; GCN-LABEL: {{^}}materialize_not_2.0_i32: 324; GCN: v_not_b32_e32 v{{[0-9]+}}, 2.0 325define void @materialize_not_2.0_i32(ptr addrspace(1) %out) { 326 store i32 -1073741825, ptr addrspace(1) %out 327 ret void 328} 329 330; GCN-LABEL: {{^}}materialize_not_4.0_i32: 331; GCN: v_not_b32_e32 v{{[0-9]+}}, 4.0 332define void @materialize_not_4.0_i32(ptr addrspace(1) %out) { 333 store i32 -1082130433, ptr addrspace(1) %out 334 ret void 335} 336 337; GCN-LABEL: {{^}}materialize_not_neg_0.5_i32: 338; GCN: v_not_b32_e32 v{{[0-9]+}}, -0.5 339define void @materialize_not_neg_0.5_i32(ptr addrspace(1) %out) { 340 store i32 1090519039, ptr addrspace(1) %out 341 ret void 342} 343 344; GCN-LABEL: {{^}}materialize_not_neg_1.0_i32: 345; GCN: v_not_b32_e32 v{{[0-9]+}}, -1.0 346define void @materialize_not_neg_1.0_i32(ptr addrspace(1) %out) { 347 store i32 1082130431, ptr addrspace(1) %out 348 ret void 349} 350 351; GCN-LABEL: {{^}}materialize_not_neg2.0_i32: 352; GCN: v_not_b32_e32 v{{[0-9]+}}, -2.0 353define void @materialize_not_neg2.0_i32(ptr addrspace(1) %out) { 354 store i32 1073741823, ptr addrspace(1) %out 355 ret void 356} 357 358; GCN-LABEL: {{^}}materialize_not_neg4.0_i32: 359; GCN: v_not_b32_e32 v{{[0-9]+}}, -4.0 360define void @materialize_not_neg4.0_i32(ptr addrspace(1) %out) { 361 store i32 1065353215, ptr addrspace(1) %out 362 ret void 363} 364 365; GCN-LABEL: {{^}}materialize_not_inv2pi_i32: 366; SI: v_mov_b32_e32 v{{[0-9]+}}, 0xc1dd067c 367; VI: v_not_b32_e32 v{{[0-9]+}}, 0.15915494 368define void @materialize_not_inv2pi_i32(ptr addrspace(1) %out) { 369 store i32 -1042479492, ptr addrspace(1) %out 370 ret void 371} 372 373; GCN-LABEL: {{^}}materialize_not_neg_inv2pi_i32: 374; GCN: v_mov_b32_e32 v{{[0-9]+}}, 0x41dd067c 375define void @materialize_not_neg_inv2pi_i32(ptr addrspace(1) %out) { 376 store i32 1105004156, ptr addrspace(1) %out 377 ret void 378} 379 380; One constant is reversible, the other is not. We shouldn't break 381; vopd packing for this. 382; GFX11-LABEL: {{^}}vopd_materialize: 383; FIXME-GFX11: v_dual_mov_b32 v0, 0x102 :: v_dual_mov_b32 v1, 1.0 384; GFX11: v_bfrev_b32_e32 v0, 4.0 385; GFX11: v_mov_b32_e32 v1, 1.0 386define <2 x i32> @vopd_materialize() { 387 %insert0 = insertelement <2 x i32> poison, i32 258, i32 0 388 %insert1 = insertelement <2 x i32> %insert0, i32 1065353216, i32 1 389 ret <2 x i32> %insert1 390} 391