blob: ecb3266160441031f04965a0834a327e5e10ea1b [file] [edit]
; 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
}