| ; Test that sramecc settings are controlled by the amdgpu.sramecc | |
| ; module flag. | |
| ; RUN: split-file %s %t | |
| ; RUN: llc -mtriple=amdgpu9.06-amd-amdhsa < %t/on.ll | FileCheck --check-prefix=SRAMECC-ON %s | |
| ; RUN: llc -mtriple=amdgpu9.06-amd-amdhsa < %t/off.ll | FileCheck --check-prefix=SRAMECC-OFF %s | |
| ; RUN: llc -mtriple=amdgpu9.06-amd-amdhsa < %t/absent.ll | FileCheck --check-prefix=SRAMECC-ANY %s | |
| ; Test that the is ignored on targets that don't support it. gfx906 supports sramecc, gfx900 does not. | |
| ; RUN: llc -mtriple=amdgpu9.00-amd-amdhsa < %t/on.ll | FileCheck --check-prefix=GFX900 %s | |
| ; Target directives for supported target | |
| ; SRAMECC-ON: .amdgcn_target "amdgpu9.06-amd-amdhsa-unknown-gfx906:sramecc+" | |
| ; SRAMECC-OFF: .amdgcn_target "amdgpu9.06-amd-amdhsa-unknown-gfx906:sramecc-" | |
| ; SRAMECC-ANY: .amdgcn_target "amdgpu9.06-amd-amdhsa-unknown-gfx906" | |
| ; Unsupported target ignores the flag | |
| ; GFX900: .amdgcn_target "amdgpu9.00-amd-amdhsa-unknown-gfx900" | |
| ; When sramecc is on, avoid _d16_hi | |
| ; SRAMECC-ON-LABEL: {{^}}load_d16: | |
| ; SRAMECC-ON: s_waitcnt | |
| ; SRAMECC-ON: flat_load_ushort v{{[0-9]+}}, v[{{[0-9:]+}}] | |
| ; SRAMECC-ON: s_setpc_b64 | |
| ; When sramecc is off, use _d16_hi instructions | |
| ; SRAMECC-OFF-LABEL: {{^}}load_d16: | |
| ; SRAMECC-OFF: s_waitcnt | |
| ; SRAMECC-OFF: flat_load_short_d16_hi v0, v[{{[0-9:]+}}] | |
| ; SRAMECC-OFF: s_setpc_b64 | |
| ; SRAMECC-ANY-LABEL: {{^}}load_d16: | |
| ; SRAMECC-ANY: s_waitcnt | |
| ; SRAMECC-ANY: flat_load_ushort v{{[0-9]+}}, v[{{[0-9:]+}}] | |
| ; SRAMECC-ANY: s_setpc_b64 | |
| ; Unsupported target (gfx900) ignores sramecc flag and uses _d16_hi | |
| ; GFX900-LABEL: {{^}}load_d16: | |
| ; GFX900: s_waitcnt | |
| ; GFX900: flat_load_short_d16_hi v0, v[{{[0-9:]+}}] | |
| ; GFX900: s_setpc_b64 | |
| ;--- on.ll | |
| define <2 x i16> @load_d16(<2 x i16> %vec, ptr %ptr) { | |
| %val = load i16, ptr %ptr | |
| %result = insertelement <2 x i16> %vec, i16 %val, i32 1 | |
| ret <2 x i16> %result | |
| } | |
| !llvm.module.flags = !{!0} | |
| !0 = !{i32 1, !"amdgpu.sramecc", i32 1} | |
| ;--- off.ll | |
| define <2 x i16> @load_d16(<2 x i16> %vec, ptr %ptr) { | |
| %val = load i16, ptr %ptr | |
| %result = insertelement <2 x i16> %vec, i16 %val, i32 1 | |
| ret <2 x i16> %result | |
| } | |
| !llvm.module.flags = !{!0} | |
| !0 = !{i32 1, !"amdgpu.sramecc", i32 0} | |
| ;--- absent.ll | |
| define <2 x i16> @load_d16(<2 x i16> %vec, ptr %ptr) { | |
| %val = load i16, ptr %ptr | |
| %result = insertelement <2 x i16> %vec, i16 %val, i32 1 | |
| ret <2 x i16> %result | |
| } |