391 lines · plain
1; RUN: llc -mtriple=amdgcn < %s | FileCheck -check-prefixes=GCN,SI %s2; RUN: llc -mtriple=amdgcn -mcpu=tonga < %s | FileCheck -check-prefixes=GCN,VI %s3; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 < %s | FileCheck -check-prefix=GFX11 %s4 5; Test that materialization constants that are the bit reversed of6; inline immediates are replaced with bfrev of the inline immediate to7; 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) %out14 ret void15}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) %out23 ret void24}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) %out31 ret void32}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) %out40 ret void41}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) %out48 ret void49}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) %out57 ret void58}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) %out65 ret void66}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) %out74 ret void75}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) %out82 ret void83}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) %out91 ret void92}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) %out99 ret void100}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) %out108 ret void109}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) %out116 ret void117}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) %out125 ret void126}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) %out133 ret void134}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) %out142 ret void143}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) %out150 ret void151}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) %out158 ret void159}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) %out166 ret void167}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) %out174 ret void175}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) %out182 ret void183}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) %out190 ret void191}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) %out198 ret void199}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) %out206 ret void207}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) %out215 ret void216}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 void223}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 void230}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 void237}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 void244}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 void251}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 void258}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 void265}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 void272}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 void279}280 281; GCN-LABEL: {{^}}s_materialize_not_1.0_i32:282; GCN: s_mov_b32 s{{[0-9]+}}, 0xc07fffff283define void @s_materialize_not_1.0_i32() {284 call void asm sideeffect "; use $0", "s"(i32 -1065353217)285 ret void286}287 288; GCN-LABEL: {{^}}s_materialize_not_neg_1.0_i32:289; GCN: s_mov_b32 s{{[0-9]+}}, 0x407fffff290define void @s_materialize_not_neg_1.0_i32() {291 call void asm sideeffect "; use $0", "s"(i32 1082130431)292 ret void293}294 295; GCN-LABEL: {{^}}s_materialize_not_inv2pi_i32:296; GCN: s_mov_b32 s{{[0-9]+}}, 0xc1dd067c297define void @s_materialize_not_inv2pi_i32() {298 call void asm sideeffect "; use $0", "s"(i32 -1042479492)299 ret void300}301 302; GCN-LABEL: {{^}}s_materialize_not_neg_inv2pi_i32:303; GCN: s_mov_b32 s{{[0-9]+}}, 0x41dd067c304define void @s_materialize_not_neg_inv2pi_i32() {305 call void asm sideeffect "; use $0", "s"(i32 1105004156)306 ret void307}308 309; GCN-LABEL: {{^}}materialize_not_0.5_i32:310; GCN: v_not_b32_e32 v{{[0-9]+}}, 0.5311define void @materialize_not_0.5_i32(ptr addrspace(1) %out) {312 store i32 -1056964609, ptr addrspace(1) %out313 ret void314}315 316; GCN-LABEL: {{^}}materialize_not_1.0_i32:317; GCN: v_not_b32_e32 v{{[0-9]+}}, 1.0318define void @materialize_not_1.0_i32(ptr addrspace(1) %out) {319 store i32 -1065353217, ptr addrspace(1) %out320 ret void321}322 323; GCN-LABEL: {{^}}materialize_not_2.0_i32:324; GCN: v_not_b32_e32 v{{[0-9]+}}, 2.0325define void @materialize_not_2.0_i32(ptr addrspace(1) %out) {326 store i32 -1073741825, ptr addrspace(1) %out327 ret void328}329 330; GCN-LABEL: {{^}}materialize_not_4.0_i32:331; GCN: v_not_b32_e32 v{{[0-9]+}}, 4.0332define void @materialize_not_4.0_i32(ptr addrspace(1) %out) {333 store i32 -1082130433, ptr addrspace(1) %out334 ret void335}336 337; GCN-LABEL: {{^}}materialize_not_neg_0.5_i32:338; GCN: v_not_b32_e32 v{{[0-9]+}}, -0.5339define void @materialize_not_neg_0.5_i32(ptr addrspace(1) %out) {340 store i32 1090519039, ptr addrspace(1) %out341 ret void342}343 344; GCN-LABEL: {{^}}materialize_not_neg_1.0_i32:345; GCN: v_not_b32_e32 v{{[0-9]+}}, -1.0346define void @materialize_not_neg_1.0_i32(ptr addrspace(1) %out) {347 store i32 1082130431, ptr addrspace(1) %out348 ret void349}350 351; GCN-LABEL: {{^}}materialize_not_neg2.0_i32:352; GCN: v_not_b32_e32 v{{[0-9]+}}, -2.0353define void @materialize_not_neg2.0_i32(ptr addrspace(1) %out) {354 store i32 1073741823, ptr addrspace(1) %out355 ret void356}357 358; GCN-LABEL: {{^}}materialize_not_neg4.0_i32:359; GCN: v_not_b32_e32 v{{[0-9]+}}, -4.0360define void @materialize_not_neg4.0_i32(ptr addrspace(1) %out) {361 store i32 1065353215, ptr addrspace(1) %out362 ret void363}364 365; GCN-LABEL: {{^}}materialize_not_inv2pi_i32:366; SI: v_mov_b32_e32 v{{[0-9]+}}, 0xc1dd067c367; VI: v_not_b32_e32 v{{[0-9]+}}, 0.15915494368define void @materialize_not_inv2pi_i32(ptr addrspace(1) %out) {369 store i32 -1042479492, ptr addrspace(1) %out370 ret void371}372 373; GCN-LABEL: {{^}}materialize_not_neg_inv2pi_i32:374; GCN: v_mov_b32_e32 v{{[0-9]+}}, 0x41dd067c375define void @materialize_not_neg_inv2pi_i32(ptr addrspace(1) %out) {376 store i32 1105004156, ptr addrspace(1) %out377 ret void378}379 380; One constant is reversible, the other is not. We shouldn't break381; vopd packing for this.382; GFX11-LABEL: {{^}}vopd_materialize:383; FIXME-GFX11: v_dual_mov_b32 v0, 0x102 :: v_dual_mov_b32 v1, 1.0384; GFX11: v_bfrev_b32_e32 v0, 4.0385; GFX11: v_mov_b32_e32 v1, 1.0386define <2 x i32> @vopd_materialize() {387 %insert0 = insertelement <2 x i32> poison, i32 258, i32 0388 %insert1 = insertelement <2 x i32> %insert0, i32 1065353216, i32 1389 ret <2 x i32> %insert1390}391