; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 ; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes='require,atomic-expand' %s | FileCheck %s ; Make sure atomic loads are not bitcasted and lose metadata define float @load_atomic_f32_global_system(ptr addrspace(1) %ptr) { ; CHECK-LABEL: define float @load_atomic_f32_global_system( ; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) { ; CHECK-NEXT: [[TMP2:%.*]] = load atomic float, ptr addrspace(1) [[PTR]] seq_cst, align 4, !some.unknown.md [[META0:![0-9]+]] ; CHECK-NEXT: ret float [[TMP2]] ; %ld = load atomic float, ptr addrspace(1) %ptr seq_cst, align 4, !some.unknown.md !0 ret float %ld } define float @load_atomic_f32_global_agent(ptr addrspace(1) %ptr) { ; CHECK-LABEL: define float @load_atomic_f32_global_agent( ; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) { ; CHECK-NEXT: [[TMP2:%.*]] = load atomic float, ptr addrspace(1) [[PTR]] syncscope("agent") seq_cst, align 4, !some.unknown.md [[META0]] ; CHECK-NEXT: ret float [[TMP2]] ; %ld = load atomic float, ptr addrspace(1) %ptr syncscope("agent") seq_cst, align 4, !some.unknown.md !0 ret float %ld } define float @load_atomic_f32_local(ptr addrspace(3) %ptr) { ; CHECK-LABEL: define float @load_atomic_f32_local( ; CHECK-SAME: ptr addrspace(3) [[PTR:%.*]]) { ; CHECK-NEXT: [[TMP2:%.*]] = load atomic float, ptr addrspace(3) [[PTR]] seq_cst, align 4, !some.unknown.md [[META0]] ; CHECK-NEXT: ret float [[TMP2]] ; %ld = load atomic float, ptr addrspace(3) %ptr seq_cst, align 4, !some.unknown.md !0 ret float %ld } define float @load_atomic_f32_flat_system(ptr %ptr) { ; CHECK-LABEL: define float @load_atomic_f32_flat_system( ; CHECK-SAME: ptr [[PTR:%.*]]) { ; CHECK-NEXT: [[TMP2:%.*]] = load atomic float, ptr [[PTR]] seq_cst, align 4, !some.unknown.md [[META0]] ; CHECK-NEXT: ret float [[TMP2]] ; %ld = load atomic float, ptr %ptr seq_cst, align 4, !some.unknown.md !0 ret float %ld } define float @load_atomic_f32_flat_agent(ptr %ptr) { ; CHECK-LABEL: define float @load_atomic_f32_flat_agent( ; CHECK-SAME: ptr [[PTR:%.*]]) { ; CHECK-NEXT: [[TMP2:%.*]] = load atomic float, ptr [[PTR]] syncscope("agent") seq_cst, align 4, !some.unknown.md [[META0]] ; CHECK-NEXT: ret float [[TMP2]] ; %ld = load atomic float, ptr %ptr syncscope("agent") seq_cst, align 4, !some.unknown.md !0 ret float %ld } define half @load_atomic_f16_global_system(ptr addrspace(1) %ptr) { ; CHECK-LABEL: define half @load_atomic_f16_global_system( ; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) { ; CHECK-NEXT: [[TMP2:%.*]] = load atomic half, ptr addrspace(1) [[PTR]] seq_cst, align 4, !some.unknown.md [[META0]] ; CHECK-NEXT: ret half [[TMP2]] ; %ld = load atomic half, ptr addrspace(1) %ptr seq_cst, align 4, !some.unknown.md !0 ret half %ld } define half @load_atomic_f16_global_agent(ptr addrspace(1) %ptr) { ; CHECK-LABEL: define half @load_atomic_f16_global_agent( ; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) { ; CHECK-NEXT: [[TMP2:%.*]] = load atomic half, ptr addrspace(1) [[PTR]] syncscope("agent") seq_cst, align 4, !some.unknown.md [[META0]] ; CHECK-NEXT: ret half [[TMP2]] ; %ld = load atomic half, ptr addrspace(1) %ptr syncscope("agent") seq_cst, align 4, !some.unknown.md !0 ret half %ld } define half @load_atomic_f16_local(ptr addrspace(3) %ptr) { ; CHECK-LABEL: define half @load_atomic_f16_local( ; CHECK-SAME: ptr addrspace(3) [[PTR:%.*]]) { ; CHECK-NEXT: [[TMP2:%.*]] = load atomic half, ptr addrspace(3) [[PTR]] seq_cst, align 2, !some.unknown.md [[META0]] ; CHECK-NEXT: ret half [[TMP2]] ; %ld = load atomic half, ptr addrspace(3) %ptr seq_cst, align 2, !some.unknown.md !0 ret half %ld } define bfloat @load_atomic_bf16_global_system(ptr addrspace(1) %ptr) { ; CHECK-LABEL: define bfloat @load_atomic_bf16_global_system( ; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) { ; CHECK-NEXT: [[TMP2:%.*]] = load atomic bfloat, ptr addrspace(1) [[PTR]] seq_cst, align 2, !some.unknown.md [[META0]] ; CHECK-NEXT: ret bfloat [[TMP2]] ; %ld = load atomic bfloat, ptr addrspace(1) %ptr seq_cst, align 2, !some.unknown.md !0 ret bfloat %ld } define bfloat @load_atomic_bf16_global_agent(ptr addrspace(1) %ptr) { ; CHECK-LABEL: define bfloat @load_atomic_bf16_global_agent( ; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) { ; CHECK-NEXT: [[TMP2:%.*]] = load atomic bfloat, ptr addrspace(1) [[PTR]] syncscope("agent") seq_cst, align 2, !some.unknown.md [[META0]] ; CHECK-NEXT: ret bfloat [[TMP2]] ; %ld = load atomic bfloat, ptr addrspace(1) %ptr syncscope("agent") seq_cst, align 2, !some.unknown.md !0 ret bfloat %ld } define bfloat @load_atomic_bf16_local(ptr addrspace(3) %ptr) { ; CHECK-LABEL: define bfloat @load_atomic_bf16_local( ; CHECK-SAME: ptr addrspace(3) [[PTR:%.*]]) { ; CHECK-NEXT: [[TMP2:%.*]] = load atomic bfloat, ptr addrspace(3) [[PTR]] seq_cst, align 2, !some.unknown.md [[META0]] ; CHECK-NEXT: ret bfloat [[TMP2]] ; %ld = load atomic bfloat, ptr addrspace(3) %ptr seq_cst, align 2, !some.unknown.md !0 ret bfloat %ld } define bfloat @load_atomic_bf16_flat(ptr %ptr) { ; CHECK-LABEL: define bfloat @load_atomic_bf16_flat( ; CHECK-SAME: ptr [[PTR:%.*]]) { ; CHECK-NEXT: [[TMP2:%.*]] = load atomic bfloat, ptr [[PTR]] seq_cst, align 2, !some.unknown.md [[META0]] ; CHECK-NEXT: ret bfloat [[TMP2]] ; %ld = load atomic bfloat, ptr %ptr seq_cst, align 2, !some.unknown.md !0 ret bfloat %ld } define double @load_atomic_f64_global_system(ptr addrspace(1) %ptr) { ; CHECK-LABEL: define double @load_atomic_f64_global_system( ; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) { ; CHECK-NEXT: [[TMP2:%.*]] = load atomic double, ptr addrspace(1) [[PTR]] seq_cst, align 8, !some.unknown.md [[META0]] ; CHECK-NEXT: ret double [[TMP2]] ; %ld = load atomic double, ptr addrspace(1) %ptr seq_cst, align 8, !some.unknown.md !0 ret double %ld } define double @load_atomic_f64_global_agent(ptr addrspace(1) %ptr) { ; CHECK-LABEL: define double @load_atomic_f64_global_agent( ; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) { ; CHECK-NEXT: [[TMP2:%.*]] = load atomic double, ptr addrspace(1) [[PTR]] syncscope("agent") seq_cst, align 8, !some.unknown.md [[META0]] ; CHECK-NEXT: ret double [[TMP2]] ; %ld = load atomic double, ptr addrspace(1) %ptr syncscope("agent") seq_cst, align 8, !some.unknown.md !0 ret double %ld } define double @load_atomic_f64_local(ptr addrspace(3) %ptr) { ; CHECK-LABEL: define double @load_atomic_f64_local( ; CHECK-SAME: ptr addrspace(3) [[PTR:%.*]]) { ; CHECK-NEXT: [[TMP2:%.*]] = load atomic double, ptr addrspace(3) [[PTR]] seq_cst, align 8, !some.unknown.md [[META0]] ; CHECK-NEXT: ret double [[TMP2]] ; %ld = load atomic double, ptr addrspace(3) %ptr seq_cst, align 8, !some.unknown.md !0 ret double %ld } define double @load_atomic_f64_flat_system(ptr %ptr) { ; CHECK-LABEL: define double @load_atomic_f64_flat_system( ; CHECK-SAME: ptr [[PTR:%.*]]) { ; CHECK-NEXT: [[TMP2:%.*]] = load atomic double, ptr [[PTR]] seq_cst, align 8, !some.unknown.md [[META0]] ; CHECK-NEXT: ret double [[TMP2]] ; %ld = load atomic double, ptr %ptr seq_cst, align 8, !some.unknown.md !0 ret double %ld } define double @load_atomic_f64_flat_agent(ptr %ptr) { ; CHECK-LABEL: define double @load_atomic_f64_flat_agent( ; CHECK-SAME: ptr [[PTR:%.*]]) { ; CHECK-NEXT: [[TMP2:%.*]] = load atomic double, ptr [[PTR]] syncscope("agent") seq_cst, align 8, !some.unknown.md [[META0]] ; CHECK-NEXT: ret double [[TMP2]] ; %ld = load atomic double, ptr %ptr syncscope("agent") seq_cst, align 8, !some.unknown.md !0 ret double %ld } !0 = !{} ;. ; CHECK: [[META0]] = !{} ;.