blob: 44f2645c145691ae5ad4e4a4158697a68cdab974 [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --filter "^\s*(?:mov\.b64|ld(?:\.[A-Za-z0-9_:]+)*\.global|st(?:\.[A-Za-z0-9_:]+)*\.global|atom(?:\.[A-Za-z0-9_:]+)*(?:\.global|\.shared)|\.reg \.b128)" --version 6
; RUN: llc < %s -mtriple=nvptx64 -mcpu=sm_100 -mattr=+ptx88 | FileCheck %s
; RUN: %if ptxas-sm_100 && ptxas-isa-8.8 %{ llc < %s -mtriple=nvptx64 -mcpu=sm_100 -mattr=+ptx88 | %ptxas-verify -arch=sm_100 %}
define i32 @atomic_load_l1_hint(ptr addrspace(1) %p) {
; CHECK-LABEL: atomic_load_l1_hint(
; CHECK: ld.acquire.sys.global.L1::evict_first.b32 %r1, [%rd1];
%v = load atomic i32, ptr addrspace(1) %p acquire, align 4, !mem.cache_hint !0
ret i32 %v
}
define void @atomic_store_l2_cache_policy(ptr addrspace(1) %p, i32 %v) {
; CHECK-LABEL: atomic_store_l2_cache_policy(
; CHECK: mov.b64 %rd2, 12345;
; CHECK: st.release.sys.global.L2::cache_hint.b32 [%rd1], %r1, %rd2;
store atomic i32 %v, ptr addrspace(1) %p release, align 4, !mem.cache_hint !2
ret void
}
define i32 @atomicrmw_add_l2_cache_policy(ptr addrspace(1) %p, i32 %v) {
; CHECK-LABEL: atomicrmw_add_l2_cache_policy(
; CHECK: mov.b64 %rd2, 12345;
; CHECK: atom.relaxed.sys.global.add.L2::cache_hint.u32 %r2, [%rd1], %r1, %rd2;
%old = atomicrmw add ptr addrspace(1) %p, i32 %v monotonic, align 4, !mem.cache_hint !1
ret i32 %old
}
; PTX atom only supports L2::cache_hint. Other cache hints must be dropped.
define i32 @atomicrmw_add_drops_unsupported_hints(ptr addrspace(1) %p, i32 %v) {
; CHECK-LABEL: atomicrmw_add_drops_unsupported_hints(
; CHECK: mov.b64 %rd2, 12345;
; CHECK: atom.relaxed.sys.global.add.L2::cache_hint.u32 %r2, [%rd1], %r1, %rd2;
%old = atomicrmw add ptr addrspace(1) %p, i32 %v monotonic, align 4, !mem.cache_hint !3
ret i32 %old
}
; PTX atom.cas does not have a .level::cache_hint operand.
define i32 @atomicrmw_xchg_l2_cache_policy(ptr addrspace(1) %p) {
; CHECK-LABEL: atomicrmw_xchg_l2_cache_policy(
; CHECK: mov.b64 %rd2, 12345;
; CHECK: atom.relaxed.sys.global.exch.L2::cache_hint.b32 %r1, [%rd1], 42, %rd2;
%old = atomicrmw xchg ptr addrspace(1) %p, i32 42 monotonic, align 4, !mem.cache_hint !1
ret i32 %old
}
define i32 @cmpxchg_l2_cache_policy(ptr addrspace(1) %p, i32 %cmp, i32 %new) {
; CHECK-LABEL: cmpxchg_l2_cache_policy(
; CHECK: atom.relaxed.sys.global.cas.b32 %r3, [%rd1], %r1, %r2;
%pair = cmpxchg ptr addrspace(1) %p, i32 %cmp, i32 %new monotonic monotonic, align 4, !mem.cache_hint !3
%old = extractvalue { i32, i1 } %pair, 0
ret i32 %old
}
; L2::cache_hint is not supported on shared memory.
define i32 @atomicrmw_shared_l2_cache_policy(ptr addrspace(3) %p, i32 %v) {
; CHECK-LABEL: atomicrmw_shared_l2_cache_policy(
; CHECK: atom.relaxed.sys.shared.add.u32 %r2, [%rd1], %r1;
%old = atomicrmw add ptr addrspace(3) %p, i32 %v monotonic, align 4, !mem.cache_hint !1
ret i32 %old
}
define i128 @atomicrmw_xchg_l2_cache_policy_b128(ptr addrspace(1) %p, i128 %v) {
; CHECK-LABEL: atomicrmw_xchg_l2_cache_policy_b128(
; CHECK: mov.b64 %rd2, 12345;
; CHECK: .reg .b128 amt, dst;
; CHECK: atom.relaxed.sys.global.exch.L2::cache_hint.b128 dst, [%rd1], amt, %rd2;
%old = atomicrmw xchg ptr addrspace(1) %p, i128 %v monotonic, align 16, !mem.cache_hint !1
ret i128 %old
}
!0 = !{i32 0, !10}
!1 = !{i32 0, !11}
!2 = !{i32 1, !11}
!3 = !{i32 0, !12}
!10 = !{!"nvvm.l1_eviction", !"first"}
!11 = !{!"nvvm.l2_cache_hint", i64 12345}
!12 = !{!"nvvm.l1_eviction", !"first", !"nvvm.l2_eviction", !"last", !"nvvm.l2_prefetch_size", !"128B", !"nvvm.l2_cache_hint", i64 12345}