1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=SI-SAFE -check-prefix=SI -check-prefix=FUNC %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -enable-no-nans-fp-math -enable-unsafe-fp-math -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=SI-NONAN -check-prefix=SI -check-prefix=FUNC %s 3*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=r600 -mcpu=redwood < %s | FileCheck -check-prefix=EG -check-prefix=FUNC %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; FIXME: Should replace unsafe-fp-math with no signed zeros. 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.r600.read.tidig.x() #1 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; The two inputs to the instruction are different SGPRs from the same 10*9880d681SAndroid Build Coastguard Worker; super register, so we can't fold both SGPR operands even though they 11*9880d681SAndroid Build Coastguard Worker; are both the same register. 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_test_fmin_legacy_subreg_inputs_f32: 14*9880d681SAndroid Build Coastguard Worker; EG: MIN * 15*9880d681SAndroid Build Coastguard Worker; SI-SAFE: v_min_legacy_f32_e32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}} 16*9880d681SAndroid Build Coastguard Worker; SI-NONAN: v_min_f32_e32 v{{[0-9]+}}, s{{[0-9]+}}, v{{[0-9]+}} 17*9880d681SAndroid Build Coastguard Workerdefine void @s_test_fmin_legacy_subreg_inputs_f32(<4 x float> addrspace(1)* %out, <4 x float> inreg %reg0) #0 { 18*9880d681SAndroid Build Coastguard Worker %r0 = extractelement <4 x float> %reg0, i32 0 19*9880d681SAndroid Build Coastguard Worker %r1 = extractelement <4 x float> %reg0, i32 1 20*9880d681SAndroid Build Coastguard Worker %r2 = fcmp uge float %r0, %r1 21*9880d681SAndroid Build Coastguard Worker %r3 = select i1 %r2, float %r1, float %r0 22*9880d681SAndroid Build Coastguard Worker %vec = insertelement <4 x float> undef, float %r3, i32 0 23*9880d681SAndroid Build Coastguard Worker store <4 x float> %vec, <4 x float> addrspace(1)* %out, align 16 24*9880d681SAndroid Build Coastguard Worker ret void 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_test_fmin_legacy_ule_f32: 28*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[A:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xb 29*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[B:s[0-9]+]], s{{\[[0-9]+:[0-9]+\]}}, 0xc 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker; SI-SAFE-DAG: v_mov_b32_e32 [[VA:v[0-9]+]], [[A]] 32*9880d681SAndroid Build Coastguard Worker; SI-NONAN-DAG: v_mov_b32_e32 [[VB:v[0-9]+]], [[B]] 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Worker; SI-SAFE: v_min_legacy_f32_e32 {{v[0-9]+}}, [[B]], [[VA]] 35*9880d681SAndroid Build Coastguard Worker; SI-NONAN: v_min_f32_e32 {{v[0-9]+}}, [[A]], [[VB]] 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Workerdefine void @s_test_fmin_legacy_ule_f32(float addrspace(1)* %out, float %a, float %b) #0 { 38*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ule float %a, %b 39*9880d681SAndroid Build Coastguard Worker %val = select i1 %cmp, float %a, float %b 40*9880d681SAndroid Build Coastguard Worker store float %val, float addrspace(1)* %out, align 4 41*9880d681SAndroid Build Coastguard Worker ret void 42*9880d681SAndroid Build Coastguard Worker} 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: @test_fmin_legacy_ule_f32 45*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[A:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 46*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[B:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4 47*9880d681SAndroid Build Coastguard Worker; SI-SAFE: v_min_legacy_f32_e32 {{v[0-9]+}}, [[B]], [[A]] 48*9880d681SAndroid Build Coastguard Worker; SI-NONAN: v_min_f32_e32 {{v[0-9]+}}, [[B]], [[A]] 49*9880d681SAndroid Build Coastguard Workerdefine void @test_fmin_legacy_ule_f32(float addrspace(1)* %out, float addrspace(1)* %in) #0 { 50*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.r600.read.tidig.x() #1 51*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr float, float addrspace(1)* %in, i32 %tid 52*9880d681SAndroid Build Coastguard Worker %gep.1 = getelementptr float, float addrspace(1)* %gep.0, i32 1 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker %a = load volatile float, float addrspace(1)* %gep.0, align 4 55*9880d681SAndroid Build Coastguard Worker %b = load volatile float, float addrspace(1)* %gep.1, align 4 56*9880d681SAndroid Build Coastguard Worker 57*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ule float %a, %b 58*9880d681SAndroid Build Coastguard Worker %val = select i1 %cmp, float %a, float %b 59*9880d681SAndroid Build Coastguard Worker store float %val, float addrspace(1)* %out, align 4 60*9880d681SAndroid Build Coastguard Worker ret void 61*9880d681SAndroid Build Coastguard Worker} 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: @test_fmin_legacy_ole_f32 64*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[A:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 65*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[B:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4 66*9880d681SAndroid Build Coastguard Worker; SI-SAFE: v_min_legacy_f32_e32 {{v[0-9]+}}, [[A]], [[B]] 67*9880d681SAndroid Build Coastguard Worker; SI-NONAN: v_min_f32_e32 {{v[0-9]+}}, [[B]], [[A]] 68*9880d681SAndroid Build Coastguard Workerdefine void @test_fmin_legacy_ole_f32(float addrspace(1)* %out, float addrspace(1)* %in) #0 { 69*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.r600.read.tidig.x() #1 70*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr float, float addrspace(1)* %in, i32 %tid 71*9880d681SAndroid Build Coastguard Worker %gep.1 = getelementptr float, float addrspace(1)* %gep.0, i32 1 72*9880d681SAndroid Build Coastguard Worker 73*9880d681SAndroid Build Coastguard Worker %a = load volatile float, float addrspace(1)* %gep.0, align 4 74*9880d681SAndroid Build Coastguard Worker %b = load volatile float, float addrspace(1)* %gep.1, align 4 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ole float %a, %b 77*9880d681SAndroid Build Coastguard Worker %val = select i1 %cmp, float %a, float %b 78*9880d681SAndroid Build Coastguard Worker store float %val, float addrspace(1)* %out, align 4 79*9880d681SAndroid Build Coastguard Worker ret void 80*9880d681SAndroid Build Coastguard Worker} 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: @test_fmin_legacy_olt_f32 83*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[A:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 84*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[B:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4 85*9880d681SAndroid Build Coastguard Worker; SI-SAFE: v_min_legacy_f32_e32 {{v[0-9]+}}, [[A]], [[B]] 86*9880d681SAndroid Build Coastguard Worker; SI-NONAN: v_min_f32_e32 {{v[0-9]+}}, [[B]], [[A]] 87*9880d681SAndroid Build Coastguard Workerdefine void @test_fmin_legacy_olt_f32(float addrspace(1)* %out, float addrspace(1)* %in) #0 { 88*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.r600.read.tidig.x() #1 89*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr float, float addrspace(1)* %in, i32 %tid 90*9880d681SAndroid Build Coastguard Worker %gep.1 = getelementptr float, float addrspace(1)* %gep.0, i32 1 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker %a = load volatile float, float addrspace(1)* %gep.0, align 4 93*9880d681SAndroid Build Coastguard Worker %b = load volatile float, float addrspace(1)* %gep.1, align 4 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker %cmp = fcmp olt float %a, %b 96*9880d681SAndroid Build Coastguard Worker %val = select i1 %cmp, float %a, float %b 97*9880d681SAndroid Build Coastguard Worker store float %val, float addrspace(1)* %out, align 4 98*9880d681SAndroid Build Coastguard Worker ret void 99*9880d681SAndroid Build Coastguard Worker} 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: @test_fmin_legacy_ult_f32 102*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[A:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 103*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[B:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4 104*9880d681SAndroid Build Coastguard Worker; SI-SAFE: v_min_legacy_f32_e32 {{v[0-9]+}}, [[B]], [[A]] 105*9880d681SAndroid Build Coastguard Worker; SI-NONAN: v_min_f32_e32 {{v[0-9]+}}, [[B]], [[A]] 106*9880d681SAndroid Build Coastguard Workerdefine void @test_fmin_legacy_ult_f32(float addrspace(1)* %out, float addrspace(1)* %in) #0 { 107*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.r600.read.tidig.x() #1 108*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr float, float addrspace(1)* %in, i32 %tid 109*9880d681SAndroid Build Coastguard Worker %gep.1 = getelementptr float, float addrspace(1)* %gep.0, i32 1 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker %a = load volatile float, float addrspace(1)* %gep.0, align 4 112*9880d681SAndroid Build Coastguard Worker %b = load volatile float, float addrspace(1)* %gep.1, align 4 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ult float %a, %b 115*9880d681SAndroid Build Coastguard Worker %val = select i1 %cmp, float %a, float %b 116*9880d681SAndroid Build Coastguard Worker store float %val, float addrspace(1)* %out, align 4 117*9880d681SAndroid Build Coastguard Worker ret void 118*9880d681SAndroid Build Coastguard Worker} 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_fmin_legacy_ult_v1f32: 121*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[A:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 122*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[B:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4 123*9880d681SAndroid Build Coastguard Worker; SI-SAFE: v_min_legacy_f32_e32 {{v[0-9]+}}, [[B]], [[A]] 124*9880d681SAndroid Build Coastguard Worker; SI-NONAN: v_min_f32_e32 {{v[0-9]+}}, [[B]], [[A]] 125*9880d681SAndroid Build Coastguard Workerdefine void @test_fmin_legacy_ult_v1f32(<1 x float> addrspace(1)* %out, <1 x float> addrspace(1)* %in) #0 { 126*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.r600.read.tidig.x() #1 127*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr <1 x float>, <1 x float> addrspace(1)* %in, i32 %tid 128*9880d681SAndroid Build Coastguard Worker %gep.1 = getelementptr <1 x float>, <1 x float> addrspace(1)* %gep.0, i32 1 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker %a = load <1 x float>, <1 x float> addrspace(1)* %gep.0 131*9880d681SAndroid Build Coastguard Worker %b = load <1 x float>, <1 x float> addrspace(1)* %gep.1 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ult <1 x float> %a, %b 134*9880d681SAndroid Build Coastguard Worker %val = select <1 x i1> %cmp, <1 x float> %a, <1 x float> %b 135*9880d681SAndroid Build Coastguard Worker store <1 x float> %val, <1 x float> addrspace(1)* %out 136*9880d681SAndroid Build Coastguard Worker ret void 137*9880d681SAndroid Build Coastguard Worker} 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_fmin_legacy_ult_v2f32: 140*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dwordx2 141*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dwordx2 142*9880d681SAndroid Build Coastguard Worker; SI-SAFE: v_min_legacy_f32_e32 143*9880d681SAndroid Build Coastguard Worker; SI-SAFE: v_min_legacy_f32_e32 144*9880d681SAndroid Build Coastguard Worker 145*9880d681SAndroid Build Coastguard Worker; SI-NONAN: v_min_f32_e32 146*9880d681SAndroid Build Coastguard Worker; SI-NONAN: v_min_f32_e32 147*9880d681SAndroid Build Coastguard Workerdefine void @test_fmin_legacy_ult_v2f32(<2 x float> addrspace(1)* %out, <2 x float> addrspace(1)* %in) #0 { 148*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.r600.read.tidig.x() #1 149*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr <2 x float>, <2 x float> addrspace(1)* %in, i32 %tid 150*9880d681SAndroid Build Coastguard Worker %gep.1 = getelementptr <2 x float>, <2 x float> addrspace(1)* %gep.0, i32 1 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Worker %a = load <2 x float>, <2 x float> addrspace(1)* %gep.0 153*9880d681SAndroid Build Coastguard Worker %b = load <2 x float>, <2 x float> addrspace(1)* %gep.1 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ult <2 x float> %a, %b 156*9880d681SAndroid Build Coastguard Worker %val = select <2 x i1> %cmp, <2 x float> %a, <2 x float> %b 157*9880d681SAndroid Build Coastguard Worker store <2 x float> %val, <2 x float> addrspace(1)* %out 158*9880d681SAndroid Build Coastguard Worker ret void 159*9880d681SAndroid Build Coastguard Worker} 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}test_fmin_legacy_ult_v3f32: 162*9880d681SAndroid Build Coastguard Worker; SI-SAFE: v_min_legacy_f32_e32 163*9880d681SAndroid Build Coastguard Worker; SI-SAFE: v_min_legacy_f32_e32 164*9880d681SAndroid Build Coastguard Worker; SI-SAFE: v_min_legacy_f32_e32 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Worker; SI-NONAN: v_min_f32_e32 167*9880d681SAndroid Build Coastguard Worker; SI-NONAN: v_min_f32_e32 168*9880d681SAndroid Build Coastguard Worker; SI-NONAN: v_min_f32_e32 169*9880d681SAndroid Build Coastguard Workerdefine void @test_fmin_legacy_ult_v3f32(<3 x float> addrspace(1)* %out, <3 x float> addrspace(1)* %in) #0 { 170*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.r600.read.tidig.x() #1 171*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr <3 x float>, <3 x float> addrspace(1)* %in, i32 %tid 172*9880d681SAndroid Build Coastguard Worker %gep.1 = getelementptr <3 x float>, <3 x float> addrspace(1)* %gep.0, i32 1 173*9880d681SAndroid Build Coastguard Worker 174*9880d681SAndroid Build Coastguard Worker %a = load <3 x float>, <3 x float> addrspace(1)* %gep.0 175*9880d681SAndroid Build Coastguard Worker %b = load <3 x float>, <3 x float> addrspace(1)* %gep.1 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ult <3 x float> %a, %b 178*9880d681SAndroid Build Coastguard Worker %val = select <3 x i1> %cmp, <3 x float> %a, <3 x float> %b 179*9880d681SAndroid Build Coastguard Worker store <3 x float> %val, <3 x float> addrspace(1)* %out 180*9880d681SAndroid Build Coastguard Worker ret void 181*9880d681SAndroid Build Coastguard Worker} 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: @test_fmin_legacy_ole_f32_multi_use 184*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[A:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}} 185*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[B:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4 186*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_min 187*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_le_f32 188*9880d681SAndroid Build Coastguard Worker; SI-NEXT: v_cndmask_b32 189*9880d681SAndroid Build Coastguard Worker; SI-NOT: v_min 190*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm 191*9880d681SAndroid Build Coastguard Workerdefine void @test_fmin_legacy_ole_f32_multi_use(float addrspace(1)* %out0, i1 addrspace(1)* %out1, float addrspace(1)* %in) #0 { 192*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.r600.read.tidig.x() #1 193*9880d681SAndroid Build Coastguard Worker %gep.0 = getelementptr float, float addrspace(1)* %in, i32 %tid 194*9880d681SAndroid Build Coastguard Worker %gep.1 = getelementptr float, float addrspace(1)* %gep.0, i32 1 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Worker %a = load volatile float, float addrspace(1)* %gep.0, align 4 197*9880d681SAndroid Build Coastguard Worker %b = load volatile float, float addrspace(1)* %gep.1, align 4 198*9880d681SAndroid Build Coastguard Worker 199*9880d681SAndroid Build Coastguard Worker %cmp = fcmp ole float %a, %b 200*9880d681SAndroid Build Coastguard Worker %val0 = select i1 %cmp, float %a, float %b 201*9880d681SAndroid Build Coastguard Worker store float %val0, float addrspace(1)* %out0, align 4 202*9880d681SAndroid Build Coastguard Worker store i1 %cmp, i1 addrspace(1)* %out1 203*9880d681SAndroid Build Coastguard Worker ret void 204*9880d681SAndroid Build Coastguard Worker} 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind } 207*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind readnone } 208