| ; RUN: llc -mtriple=amdgpu6.00 < %s | FileCheck -enable-var-scope -check-prefixes=SI,GCN,FUNC %s | |
| ; RUN: llc -mtriple=amdgpu8.03 < %s | FileCheck -enable-var-scope -check-prefixes=VI,GCN,FUNC %s | |
| ; RUN: llc -mtriple=r600 -mcpu=redwood < %s | FileCheck -enable-var-scope --check-prefixes=EG,FUNC %s | |
| declare i32 @llvm.amdgcn.workitem.id.x() #1 | |
| ; The two inputs to the instruction are different SGPRs from the same | |
| ; super register, so we can't fold both SGPR operands even though they | |
| ; are both the same register. | |
| ; FUNC-LABEL: {{^}}s_test_fmin_legacy_subreg_inputs_f32: | |
| ; EG: MIN * | |
| ; SI: v_min_legacy_f32_e32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}} | |
| ; VI: v_cmp_nlt_f32_e32 vcc, s{{[0-9]+}}, v{{[0-9]+}} | |
| define amdgpu_kernel void @s_test_fmin_legacy_subreg_inputs_f32(ptr addrspace(1) %out, <4 x float> %reg0) #0 { | |
| %r0 = extractelement <4 x float> %reg0, i32 0 | |
| %r1 = extractelement <4 x float> %reg0, i32 1 | |
| %r2 = fcmp uge float %r0, %r1 | |
| %r3 = select i1 %r2, float %r1, float %r0 | |
| store float %r3, ptr addrspace(1) %out | |
| ret void | |
| } | |
| ; FUNC-LABEL: {{^}}s_test_fmin_legacy_subreg_inputs_f32_fast: | |
| ; SI: v_min_f32_e32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}} | |
| ; VI: v_min_f32_e32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}} | |
| define amdgpu_kernel void @s_test_fmin_legacy_subreg_inputs_f32_fast(ptr addrspace(1) %out, <4 x float> %reg0) #0 { | |
| %r0 = extractelement <4 x float> %reg0, i32 0 | |
| %r1 = extractelement <4 x float> %reg0, i32 1 | |
| %r2 = fcmp nnan nsz uge float %r0, %r1 | |
| %r3 = select nnan nsz i1 %r2, float %r1, float %r0 | |
| store float %r3, ptr addrspace(1) %out | |
| ret void | |
| } | |
| ; FUNC-LABEL: {{^}}s_test_fmin_legacy_ule_f32: | |
| ; GCN-DAG: s_load_dwordx4 s[[[#LOAD:]]:{{[0-9]+}}], s{{\[[0-9]+:[0-9]+\]}}, {{0x9|0x24}} | |
| ; SI: v_mov_b32_e32 [[VA:v[0-9]+]], s[[#LOAD + 2]] | |
| ; VI: v_mov_b32_e32 [[VB:v[0-9]+]], s[[#LOAD + 3]] | |
| ; SI: v_min_legacy_f32_e32 {{v[0-9]+}}, s[[#LOAD + 3]], [[VA]] | |
| ; VI: v_mov_b32_e32 [[VA:v[0-9]+]], s[[#LOAD + 2]] | |
| ; VI: v_cmp_ngt_f32_e32 vcc, s[[#LOAD + 2]], [[VB]] | |
| ; VI: v_cndmask_b32_e32 v{{[0-9]+}}, [[VB]], [[VA]] | |
| define amdgpu_kernel void @s_test_fmin_legacy_ule_f32(ptr addrspace(1) %out, float %a, float %b) #0 { | |
| %cmp = fcmp ule float %a, %b | |
| %val = select i1 %cmp, float %a, float %b | |
| store float %val, ptr addrspace(1) %out, align 4 | |
| ret void | |
| } | |
| ; FUNC-LABEL: {{^}}s_test_fmin_legacy_ule_f32_fast: | |
| ; GCN-DAG: s_load_dwordx4 s[[[#LOAD:]]:{{[0-9]+}}], s{{\[[0-9]+:[0-9]+\]}}, {{0x9|0x24}} | |
| ; GCN: v_mov_b32_e32 [[VB:v[0-9]+]], s[[#LOAD + 3]] | |
| ; GCN: v_min_f32_e32 {{v[0-9]+}}, s[[#LOAD + 2]], [[VB]] | |
| define amdgpu_kernel void @s_test_fmin_legacy_ule_f32_fast(ptr addrspace(1) %out, float %a, float %b) #0 { | |
| %cmp = fcmp ule float %a, %b | |
| %val = select nnan nsz i1 %cmp, float %a, float %b | |
| store float %val, ptr addrspace(1) %out, align 4 | |
| ret void | |
| } | |
| ; Nsz also needed | |
| ; FIXME: Should separate tests | |
| ; GCN-LABEL: {{^}}s_test_fmin_legacy_ule_f32_nnan_src: | |
| ; GCN: s_load_dwordx4 s[[[#LOAD:]]:{{[0-9]+}}], s{{\[[0-9]+:[0-9]+\]}}, {{0x9|0x24}} | |
| ; SI: s_mov_b64 s[[[#COPY:]]:{{[0-9]+}}], s{{\[}}[[#LOAD + 2]]:[[#LOAD + 3]]{{\]}} | |
| ; SI-DAG: v_add_f32_e64 [[ADD_A:v[0-9]+]], s[[#COPY]], 1.0 | |
| ; SI-DAG: v_add_f32_e64 [[ADD_B:v[0-9]+]], s[[#COPY + 1]], 2.0 | |
| ; VI-DAG: v_add_f32_e64 [[ADD_A:v[0-9]+]], s[[#LOAD + 2]], 1.0 | |
| ; VI-DAG: v_add_f32_e64 [[ADD_B:v[0-9]+]], s[[#LOAD + 3]], 2.0 | |
| ; SI: v_min_legacy_f32_e32 {{v[0-9]+}}, [[ADD_B]], [[ADD_A]] | |
| ; VI: v_cmp_le_f32_e32 vcc, [[ADD_A]], [[ADD_B]] | |
| ; VI: v_cndmask_b32_e32 {{v[0-9]+}}, [[ADD_B]], [[ADD_A]], vcc | |
| define amdgpu_kernel void @s_test_fmin_legacy_ule_f32_nnan_src(ptr addrspace(1) %out, float %a, float %b) #0 { | |
| %a.nnan = fadd nnan float %a, 1.0 | |
| %b.nnan = fadd nnan float %b, 2.0 | |
| %cmp = fcmp ule float %a.nnan, %b.nnan | |
| %val = select i1 %cmp, float %a.nnan, float %b.nnan | |
| store float %val, ptr addrspace(1) %out, align 4 | |
| ret void | |
| } | |
| ; Nsz also needed | |
| ; FIXME: Should separate tests | |
| ; GCN-LABEL: {{^}}s_test_fmin_legacy_ule_f32_nnan_src_fast: | |
| ; GCN: s_load_dwordx4 s[[[#LOAD:]]:{{[0-9]+}}], s{{\[[0-9]+:[0-9]+\]}}, {{0x9|0x24}} | |
| ; SI: s_mov_b64 s[[[#COPY:]]:{{[0-9]+}}], s{{\[}}[[#LOAD + 2]]:[[#LOAD + 3]]{{\]}} | |
| ; SI-DAG: v_add_f32_e64 [[ADD_A:v[0-9]+]], s[[#COPY]], 1.0 | |
| ; SI-DAG: v_add_f32_e64 [[ADD_B:v[0-9]+]], s[[#COPY + 1]], 2.0 | |
| ; VI-DAG: v_add_f32_e64 [[ADD_A:v[0-9]+]], s[[#LOAD + 2]], 1.0 | |
| ; VI-DAG: v_add_f32_e64 [[ADD_B:v[0-9]+]], s[[#LOAD + 3]], 2.0 | |
| ; GCN: v_min_f32_e32 {{v[0-9]+}}, [[ADD_A]], [[ADD_B]] | |
| define amdgpu_kernel void @s_test_fmin_legacy_ule_f32_nnan_src_fast(ptr addrspace(1) %out, float %a, float %b) #0 { | |
| %a.nnan = fadd nnan float %a, 1.0 | |
| %b.nnan = fadd nnan float %b, 2.0 | |
| %cmp = fcmp ule float %a.nnan, %b.nnan | |
| %val = select nnan nsz i1 %cmp, float %a.nnan, float %b.nnan | |
| store float %val, ptr addrspace(1) %out, align 4 | |
| ret void | |
| } | |
| ; FUNC-LABEL: {{^}}test_fmin_legacy_ule_f32: | |
| ; GCN: {{buffer|flat}}_load_dword [[A:v[0-9]+]] | |
| ; GCN: {{buffer|flat}}_load_dword [[B:v[0-9]+]] | |
| ; SI: v_min_legacy_f32_e32 {{v[0-9]+}}, [[B]], [[A]] | |
| ; VI: v_cmp_ngt_f32_e32 vcc, [[A]], [[B]] | |
| ; VI: v_cndmask_b32_e32 v{{[0-9]+}}, [[B]], [[A]] | |
| define amdgpu_kernel void @test_fmin_legacy_ule_f32(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 { | |
| %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 | |
| %gep.0 = getelementptr float, ptr addrspace(1) %in, i32 %tid | |
| %gep.1 = getelementptr float, ptr addrspace(1) %gep.0, i32 1 | |
| %a = load volatile float, ptr addrspace(1) %gep.0, align 4 | |
| %b = load volatile float, ptr addrspace(1) %gep.1, align 4 | |
| %cmp = fcmp ule float %a, %b | |
| %val = select i1 %cmp, float %a, float %b | |
| store float %val, ptr addrspace(1) %out, align 4 | |
| ret void | |
| } | |
| ; FUNC-LABEL: {{^}}test_fmin_legacy_ule_f32_fast: | |
| ; GCN: {{buffer|flat}}_load_dword [[A:v[0-9]+]] | |
| ; GCN: {{buffer|flat}}_load_dword [[B:v[0-9]+]] | |
| ; GCN: v_min_f32_e32 {{v[0-9]+}}, [[A]], [[B]] | |
| define amdgpu_kernel void @test_fmin_legacy_ule_f32_fast(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 { | |
| %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 | |
| %gep.0 = getelementptr float, ptr addrspace(1) %in, i32 %tid | |
| %gep.1 = getelementptr float, ptr addrspace(1) %gep.0, i32 1 | |
| %a = load volatile float, ptr addrspace(1) %gep.0, align 4 | |
| %b = load volatile float, ptr addrspace(1) %gep.1, align 4 | |
| %cmp = fcmp ule float %a, %b | |
| %val = select nnan nsz i1 %cmp, float %a, float %b | |
| store float %val, ptr addrspace(1) %out, align 4 | |
| ret void | |
| } | |
| ; FUNC-LABEL: {{^}}test_fmin_legacy_ole_f32: | |
| ; GCN: {{buffer|flat}}_load_dword [[A:v[0-9]+]] | |
| ; GCN: {{buffer|flat}}_load_dword [[B:v[0-9]+]] | |
| ; GCN: v_cmp_le_f32_e32 vcc, [[A]], [[B]] | |
| ; GCN: v_cndmask_b32_e32 v{{[0-9]+}}, [[B]], [[A]] | |
| define amdgpu_kernel void @test_fmin_legacy_ole_f32(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 { | |
| %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 | |
| %gep.0 = getelementptr float, ptr addrspace(1) %in, i32 %tid | |
| %gep.1 = getelementptr float, ptr addrspace(1) %gep.0, i32 1 | |
| %a = load volatile float, ptr addrspace(1) %gep.0, align 4 | |
| %b = load volatile float, ptr addrspace(1) %gep.1, align 4 | |
| %cmp = fcmp ole float %a, %b | |
| %val = select i1 %cmp, float %a, float %b | |
| store float %val, ptr addrspace(1) %out, align 4 | |
| ret void | |
| } | |
| ; FUNC-LABEL: {{^}}test_fmin_legacy_ole_f32_fast: | |
| ; GCN: {{buffer|flat}}_load_dword [[A:v[0-9]+]] | |
| ; GCN: {{buffer|flat}}_load_dword [[B:v[0-9]+]] | |
| ; GCN: v_min_f32_e32 {{v[0-9]+}}, [[A]], [[B]] | |
| define amdgpu_kernel void @test_fmin_legacy_ole_f32_fast(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 { | |
| %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 | |
| %gep.0 = getelementptr float, ptr addrspace(1) %in, i32 %tid | |
| %gep.1 = getelementptr float, ptr addrspace(1) %gep.0, i32 1 | |
| %a = load volatile float, ptr addrspace(1) %gep.0, align 4 | |
| %b = load volatile float, ptr addrspace(1) %gep.1, align 4 | |
| %cmp = fcmp ole float %a, %b | |
| %val = select nnan nsz i1 %cmp, float %a, float %b | |
| store float %val, ptr addrspace(1) %out, align 4 | |
| ret void | |
| } | |
| ; FUNC-LABEL: {{^}}test_fmin_legacy_olt_f32: | |
| ; GCN: {{buffer|flat}}_load_dword [[A:v[0-9]+]] | |
| ; GCN: {{buffer|flat}}_load_dword [[B:v[0-9]+]] | |
| ; SI: v_min_legacy_f32_e32 {{v[0-9]+}}, [[A]], [[B]] | |
| ; VI: v_cmp_lt_f32_e32 vcc, [[A]], [[B]] | |
| ; VI: v_cndmask_b32_e32 v{{[0-9]+}}, [[B]], [[A]] | |
| define amdgpu_kernel void @test_fmin_legacy_olt_f32(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 { | |
| %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 | |
| %gep.0 = getelementptr float, ptr addrspace(1) %in, i32 %tid | |
| %gep.1 = getelementptr float, ptr addrspace(1) %gep.0, i32 1 | |
| %a = load volatile float, ptr addrspace(1) %gep.0, align 4 | |
| %b = load volatile float, ptr addrspace(1) %gep.1, align 4 | |
| %cmp = fcmp olt float %a, %b | |
| %val = select i1 %cmp, float %a, float %b | |
| store float %val, ptr addrspace(1) %out, align 4 | |
| ret void | |
| } | |
| ; FUNC-LABEL: {{^}}test_fmin_legacy_olt_f32_fast: | |
| ; GCN: {{buffer|flat}}_load_dword [[A:v[0-9]+]] | |
| ; GCN: {{buffer|flat}}_load_dword [[B:v[0-9]+]] | |
| ; GCN: v_min_f32_e32 {{v[0-9]+}}, [[A]], [[B]] | |
| define amdgpu_kernel void @test_fmin_legacy_olt_f32_fast(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 { | |
| %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 | |
| %gep.0 = getelementptr float, ptr addrspace(1) %in, i32 %tid | |
| %gep.1 = getelementptr float, ptr addrspace(1) %gep.0, i32 1 | |
| %a = load volatile float, ptr addrspace(1) %gep.0, align 4 | |
| %b = load volatile float, ptr addrspace(1) %gep.1, align 4 | |
| %cmp = fcmp olt float %a, %b | |
| %val = select nnan nsz i1 %cmp, float %a, float %b | |
| store float %val, ptr addrspace(1) %out, align 4 | |
| ret void | |
| } | |
| ; FUNC-LABEL: {{^}}test_fmin_legacy_ult_f32: | |
| ; GCN: {{buffer|flat}}_load_dword [[A:v[0-9]+]] | |
| ; GCN: {{buffer|flat}}_load_dword [[B:v[0-9]+]] | |
| ; GCN: v_cmp_nge_f32_e32 vcc, [[A]], [[B]] | |
| ; GCN: v_cndmask_b32_e32 v{{[0-9]+}}, [[B]], [[A]] | |
| define amdgpu_kernel void @test_fmin_legacy_ult_f32(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 { | |
| %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 | |
| %gep.0 = getelementptr float, ptr addrspace(1) %in, i32 %tid | |
| %gep.1 = getelementptr float, ptr addrspace(1) %gep.0, i32 1 | |
| %a = load volatile float, ptr addrspace(1) %gep.0, align 4 | |
| %b = load volatile float, ptr addrspace(1) %gep.1, align 4 | |
| %cmp = fcmp ult float %a, %b | |
| %val = select i1 %cmp, float %a, float %b | |
| store float %val, ptr addrspace(1) %out, align 4 | |
| ret void | |
| } | |
| ; FUNC-LABEL: {{^}}test_fmin_legacy_ult_f32_fast: | |
| ; GCN: {{buffer|flat}}_load_dword [[A:v[0-9]+]] | |
| ; GCN: {{buffer|flat}}_load_dword [[B:v[0-9]+]] | |
| ; GCN: v_min_f32_e32 {{v[0-9]+}}, [[A]], [[B]] | |
| define amdgpu_kernel void @test_fmin_legacy_ult_f32_fast(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 { | |
| %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 | |
| %gep.0 = getelementptr float, ptr addrspace(1) %in, i32 %tid | |
| %gep.1 = getelementptr float, ptr addrspace(1) %gep.0, i32 1 | |
| %a = load volatile float, ptr addrspace(1) %gep.0, align 4 | |
| %b = load volatile float, ptr addrspace(1) %gep.1, align 4 | |
| %cmp = fcmp ult float %a, %b | |
| %val = select nnan nsz i1 %cmp, float %a, float %b | |
| store float %val, ptr addrspace(1) %out, align 4 | |
| ret void | |
| } | |
| ; FUNC-LABEL: {{^}}test_fmin_legacy_ult_v1f32: | |
| ; GCN: {{buffer|flat}}_load_dword [[A:v[0-9]+]] | |
| ; GCN: {{buffer|flat}}_load_dword [[B:v[0-9]+]] | |
| ; GCN: v_cmp_nge_f32_e32 vcc, [[A]], [[B]] | |
| ; GCN: v_cndmask_b32_e32 v{{[0-9]+}}, [[B]], [[A]] | |
| define amdgpu_kernel void @test_fmin_legacy_ult_v1f32(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 { | |
| %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 | |
| %gep.0 = getelementptr <1 x float>, ptr addrspace(1) %in, i32 %tid | |
| %gep.1 = getelementptr <1 x float>, ptr addrspace(1) %gep.0, i32 1 | |
| %a = load volatile <1 x float>, ptr addrspace(1) %gep.0 | |
| %b = load volatile <1 x float>, ptr addrspace(1) %gep.1 | |
| %cmp = fcmp ult <1 x float> %a, %b | |
| %val = select <1 x i1> %cmp, <1 x float> %a, <1 x float> %b | |
| store <1 x float> %val, ptr addrspace(1) %out | |
| ret void | |
| } | |
| ; FUNC-LABEL: {{^}}test_fmin_legacy_ult_v1f32_fast: | |
| ; GCN: {{buffer|flat}}_load_dword [[A:v[0-9]+]] | |
| ; GCN: {{buffer|flat}}_load_dword [[B:v[0-9]+]] | |
| ; GCN: v_min_f32_e32 {{v[0-9]+}}, [[A]], [[B]] | |
| define amdgpu_kernel void @test_fmin_legacy_ult_v1f32_fast(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 { | |
| %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 | |
| %gep.0 = getelementptr <1 x float>, ptr addrspace(1) %in, i32 %tid | |
| %gep.1 = getelementptr <1 x float>, ptr addrspace(1) %gep.0, i32 1 | |
| %a = load volatile <1 x float>, ptr addrspace(1) %gep.0 | |
| %b = load volatile <1 x float>, ptr addrspace(1) %gep.1 | |
| %cmp = fcmp ult <1 x float> %a, %b | |
| %val = select nnan nsz <1 x i1> %cmp, <1 x float> %a, <1 x float> %b | |
| store <1 x float> %val, ptr addrspace(1) %out | |
| ret void | |
| } | |
| ; FUNC-LABEL: {{^}}test_fmin_legacy_ult_v2f32: | |
| ; GCN: {{buffer|flat}}_load_dwordx2 | |
| ; GCN: {{buffer|flat}}_load_dwordx2 | |
| ; GCN: v_cmp_nge_f32_e32 | |
| ; GCN: v_cndmask_b32_e32 | |
| ; GCN: v_cmp_nge_f32_e32 | |
| ; GCN: v_cndmask_b32_e32 | |
| define amdgpu_kernel void @test_fmin_legacy_ult_v2f32(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 { | |
| %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 | |
| %gep.0 = getelementptr <2 x float>, ptr addrspace(1) %in, i32 %tid | |
| %gep.1 = getelementptr <2 x float>, ptr addrspace(1) %gep.0, i32 1 | |
| %a = load volatile <2 x float>, ptr addrspace(1) %gep.0 | |
| %b = load volatile <2 x float>, ptr addrspace(1) %gep.1 | |
| %cmp = fcmp ult <2 x float> %a, %b | |
| %val = select <2 x i1> %cmp, <2 x float> %a, <2 x float> %b | |
| store <2 x float> %val, ptr addrspace(1) %out | |
| ret void | |
| } | |
| ; FUNC-LABEL: {{^}}test_fmin_legacy_ult_v2f32_fast: | |
| ; GCN: {{buffer|flat}}_load_dwordx2 | |
| ; GCN: {{buffer|flat}}_load_dwordx2 | |
| ; GCN: v_min_f32_e32 | |
| ; GCN: v_min_f32_e32 | |
| define amdgpu_kernel void @test_fmin_legacy_ult_v2f32_fast(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 { | |
| %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 | |
| %gep.0 = getelementptr <2 x float>, ptr addrspace(1) %in, i32 %tid | |
| %gep.1 = getelementptr <2 x float>, ptr addrspace(1) %gep.0, i32 1 | |
| %a = load volatile <2 x float>, ptr addrspace(1) %gep.0 | |
| %b = load volatile <2 x float>, ptr addrspace(1) %gep.1 | |
| %cmp = fcmp ult <2 x float> %a, %b | |
| %val = select nnan nsz <2 x i1> %cmp, <2 x float> %a, <2 x float> %b | |
| store <2 x float> %val, ptr addrspace(1) %out | |
| ret void | |
| } | |
| ; FUNC-LABEL: {{^}}test_fmin_legacy_ult_v3f32: | |
| ; GCN: v_cmp_nge_f32_e32 | |
| ; GCN: v_cndmask_b32_e32 | |
| ; GCN: v_cmp_nge_f32_e32 | |
| ; GCN: v_cndmask_b32_e32 | |
| ; GCN: v_cmp_nge_f32_e32 | |
| ; GCN: v_cndmask_b32_e32 | |
| ; GCN-NOT: v_cmp | |
| ; GCN-NOT: v_cndmask | |
| define amdgpu_kernel void @test_fmin_legacy_ult_v3f32(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 { | |
| %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 | |
| %gep.0 = getelementptr <3 x float>, ptr addrspace(1) %in, i32 %tid | |
| %gep.1 = getelementptr <3 x float>, ptr addrspace(1) %gep.0, i32 1 | |
| %a = load <3 x float>, ptr addrspace(1) %gep.0 | |
| %b = load <3 x float>, ptr addrspace(1) %gep.1 | |
| %cmp = fcmp ult <3 x float> %a, %b | |
| %val = select <3 x i1> %cmp, <3 x float> %a, <3 x float> %b | |
| store <3 x float> %val, ptr addrspace(1) %out | |
| ret void | |
| } | |
| ; FUNC-LABEL: {{^}}test_fmin_legacy_ult_v3f32_fast: | |
| ; VI-NOT: v_cmp | |
| ; VI-NOT: v_cndmask | |
| ; GCN: v_min_f32_e32 | |
| ; GCN: v_min_f32_e32 | |
| ; GCN: v_min_f32_e32 | |
| ; GCN-NOT: v_min_ | |
| define amdgpu_kernel void @test_fmin_legacy_ult_v3f32_fast(ptr addrspace(1) %out, ptr addrspace(1) %in) #0 { | |
| %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 | |
| %gep.0 = getelementptr <3 x float>, ptr addrspace(1) %in, i32 %tid | |
| %gep.1 = getelementptr <3 x float>, ptr addrspace(1) %gep.0, i32 1 | |
| %a = load <3 x float>, ptr addrspace(1) %gep.0 | |
| %b = load <3 x float>, ptr addrspace(1) %gep.1 | |
| %cmp = fcmp ult <3 x float> %a, %b | |
| %val = select nnan nsz <3 x i1> %cmp, <3 x float> %a, <3 x float> %b | |
| store <3 x float> %val, ptr addrspace(1) %out | |
| ret void | |
| } | |
| ; FUNC-LABEL: {{^}}test_fmin_legacy_ole_f32_multi_use: | |
| ; GCN: {{buffer|flat}}_load_dword [[A:v[0-9]+]] | |
| ; GCN: {{buffer|flat}}_load_dword [[B:v[0-9]+]] | |
| ; GCN-NOT: v_min | |
| ; GCN: v_cmp_le_f32 | |
| ; GCN-NEXT: v_cndmask_b32 | |
| ; GCN-NOT: v_min | |
| ; GCN: s_endpgm | |
| define amdgpu_kernel void @test_fmin_legacy_ole_f32_multi_use(ptr addrspace(1) %out0, ptr addrspace(1) %out1, ptr addrspace(1) %in) #0 { | |
| %tid = call i32 @llvm.amdgcn.workitem.id.x() #1 | |
| %gep.0 = getelementptr float, ptr addrspace(1) %in, i32 %tid | |
| %gep.1 = getelementptr float, ptr addrspace(1) %gep.0, i32 1 | |
| %a = load volatile float, ptr addrspace(1) %gep.0, align 4 | |
| %b = load volatile float, ptr addrspace(1) %gep.1, align 4 | |
| %cmp = fcmp ole float %a, %b | |
| %val0 = select i1 %cmp, float %a, float %b | |
| store float %val0, ptr addrspace(1) %out0, align 4 | |
| store i1 %cmp, ptr addrspace(1) %out1 | |
| ret void | |
| } | |
| attributes #0 = { nounwind } | |
| attributes #1 = { nounwind readnone } |