1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=amdgcn -mcpu=SI -verify-machineinstrs | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=amdgcn -mcpu=tonga -verify-machineinstrs | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; This test checks that no VGPR to SGPR copies are created by the register 5*9880d681SAndroid Build Coastguard Worker; allocator. 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.SI.image.sample.v2i32(<2 x i32>, <8 x i32>, <4 x i32>, i32, i32, i32, i32, i32, i32, i32, i32) #1 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}phi1: 12*9880d681SAndroid Build Coastguard Worker; CHECK: s_buffer_load_dword [[DST:s[0-9]]], {{s\[[0-9]+:[0-9]+\]}}, 0x0 13*9880d681SAndroid Build Coastguard Worker; CHECK: v_mov_b32_e32 v{{[0-9]}}, [[DST]] 14*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps void @phi1(<16 x i8> addrspace(2)* inreg %arg, <16 x i8> addrspace(2)* inreg %arg1, <8 x i32> addrspace(2)* inreg %arg2, i32 inreg %arg3, <2 x i32> %arg4, <2 x i32> %arg5, <2 x i32> %arg6, <3 x i32> %arg7, <2 x i32> %arg8, <2 x i32> %arg9, <2 x i32> %arg10, float %arg11, float %arg12, float %arg13, float %arg14, float %arg15, float %arg16, float %arg17, float %arg18, float %arg19) #0 { 15*9880d681SAndroid Build Coastguard Workermain_body: 16*9880d681SAndroid Build Coastguard Worker %tmp = getelementptr <16 x i8>, <16 x i8> addrspace(2)* %arg, i32 0 17*9880d681SAndroid Build Coastguard Worker %tmp20 = load <16 x i8>, <16 x i8> addrspace(2)* %tmp, !tbaa !0 18*9880d681SAndroid Build Coastguard Worker %tmp21 = call float @llvm.SI.load.const(<16 x i8> %tmp20, i32 0) 19*9880d681SAndroid Build Coastguard Worker %tmp22 = call float @llvm.SI.load.const(<16 x i8> %tmp20, i32 16) 20*9880d681SAndroid Build Coastguard Worker %tmp23 = call float @llvm.SI.load.const(<16 x i8> %tmp20, i32 32) 21*9880d681SAndroid Build Coastguard Worker %tmp24 = fptosi float %tmp22 to i32 22*9880d681SAndroid Build Coastguard Worker %tmp25 = icmp ne i32 %tmp24, 0 23*9880d681SAndroid Build Coastguard Worker br i1 %tmp25, label %ENDIF, label %ELSE 24*9880d681SAndroid Build Coastguard Worker 25*9880d681SAndroid Build Coastguard WorkerELSE: ; preds = %main_body 26*9880d681SAndroid Build Coastguard Worker %tmp26 = fsub float -0.000000e+00, %tmp21 27*9880d681SAndroid Build Coastguard Worker br label %ENDIF 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard WorkerENDIF: ; preds = %ELSE, %main_body 30*9880d681SAndroid Build Coastguard Worker %temp.0 = phi float [ %tmp26, %ELSE ], [ %tmp21, %main_body ] 31*9880d681SAndroid Build Coastguard Worker %tmp27 = fadd float %temp.0, %tmp23 32*9880d681SAndroid Build Coastguard Worker call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 0, float %tmp27, float %tmp27, float 0.000000e+00, float 1.000000e+00) 33*9880d681SAndroid Build Coastguard Worker ret void 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Worker; Make sure this program doesn't crash 37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}phi2: 38*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps void @phi2(<16 x i8> addrspace(2)* inreg %arg, <16 x i8> addrspace(2)* inreg %arg1, <8 x i32> addrspace(2)* inreg %arg2, i32 inreg %arg3, <2 x i32> %arg4, <2 x i32> %arg5, <2 x i32> %arg6, <3 x i32> %arg7, <2 x i32> %arg8, <2 x i32> %arg9, <2 x i32> %arg10, float %arg11, float %arg12, float %arg13, float %arg14, float %arg15, float %arg16, float %arg17, float %arg18, float %arg19) #0 { 39*9880d681SAndroid Build Coastguard Workermain_body: 40*9880d681SAndroid Build Coastguard Worker %tmp = getelementptr <16 x i8>, <16 x i8> addrspace(2)* %arg, i32 0 41*9880d681SAndroid Build Coastguard Worker %tmp20 = load <16 x i8>, <16 x i8> addrspace(2)* %tmp, !tbaa !0 42*9880d681SAndroid Build Coastguard Worker %tmp21 = call float @llvm.SI.load.const(<16 x i8> %tmp20, i32 16) 43*9880d681SAndroid Build Coastguard Worker %tmp22 = call float @llvm.SI.load.const(<16 x i8> %tmp20, i32 32) 44*9880d681SAndroid Build Coastguard Worker %tmp23 = call float @llvm.SI.load.const(<16 x i8> %tmp20, i32 36) 45*9880d681SAndroid Build Coastguard Worker %tmp24 = call float @llvm.SI.load.const(<16 x i8> %tmp20, i32 40) 46*9880d681SAndroid Build Coastguard Worker %tmp25 = call float @llvm.SI.load.const(<16 x i8> %tmp20, i32 48) 47*9880d681SAndroid Build Coastguard Worker %tmp26 = call float @llvm.SI.load.const(<16 x i8> %tmp20, i32 52) 48*9880d681SAndroid Build Coastguard Worker %tmp27 = call float @llvm.SI.load.const(<16 x i8> %tmp20, i32 56) 49*9880d681SAndroid Build Coastguard Worker %tmp28 = call float @llvm.SI.load.const(<16 x i8> %tmp20, i32 64) 50*9880d681SAndroid Build Coastguard Worker %tmp29 = call float @llvm.SI.load.const(<16 x i8> %tmp20, i32 68) 51*9880d681SAndroid Build Coastguard Worker %tmp30 = call float @llvm.SI.load.const(<16 x i8> %tmp20, i32 72) 52*9880d681SAndroid Build Coastguard Worker %tmp31 = call float @llvm.SI.load.const(<16 x i8> %tmp20, i32 76) 53*9880d681SAndroid Build Coastguard Worker %tmp32 = call float @llvm.SI.load.const(<16 x i8> %tmp20, i32 80) 54*9880d681SAndroid Build Coastguard Worker %tmp33 = call float @llvm.SI.load.const(<16 x i8> %tmp20, i32 84) 55*9880d681SAndroid Build Coastguard Worker %tmp34 = call float @llvm.SI.load.const(<16 x i8> %tmp20, i32 88) 56*9880d681SAndroid Build Coastguard Worker %tmp35 = call float @llvm.SI.load.const(<16 x i8> %tmp20, i32 92) 57*9880d681SAndroid Build Coastguard Worker %tmp36 = getelementptr <8 x i32>, <8 x i32> addrspace(2)* %arg2, i32 0 58*9880d681SAndroid Build Coastguard Worker %tmp37 = load <8 x i32>, <8 x i32> addrspace(2)* %tmp36, !tbaa !0 59*9880d681SAndroid Build Coastguard Worker %tmp38 = getelementptr <16 x i8>, <16 x i8> addrspace(2)* %arg1, i32 0 60*9880d681SAndroid Build Coastguard Worker %tmp39 = load <16 x i8>, <16 x i8> addrspace(2)* %tmp38, !tbaa !0 61*9880d681SAndroid Build Coastguard Worker %tmp40 = call float @llvm.SI.fs.interp(i32 0, i32 0, i32 %arg3, <2 x i32> %arg5) 62*9880d681SAndroid Build Coastguard Worker %tmp41 = call float @llvm.SI.fs.interp(i32 1, i32 0, i32 %arg3, <2 x i32> %arg5) 63*9880d681SAndroid Build Coastguard Worker %tmp42 = call float @llvm.SI.fs.interp(i32 0, i32 1, i32 %arg3, <2 x i32> %arg5) 64*9880d681SAndroid Build Coastguard Worker %tmp43 = call float @llvm.SI.fs.interp(i32 1, i32 1, i32 %arg3, <2 x i32> %arg5) 65*9880d681SAndroid Build Coastguard Worker %tmp44 = call float @llvm.SI.fs.interp(i32 2, i32 1, i32 %arg3, <2 x i32> %arg5) 66*9880d681SAndroid Build Coastguard Worker %tmp45 = bitcast float %tmp40 to i32 67*9880d681SAndroid Build Coastguard Worker %tmp46 = bitcast float %tmp41 to i32 68*9880d681SAndroid Build Coastguard Worker %tmp47 = insertelement <2 x i32> undef, i32 %tmp45, i32 0 69*9880d681SAndroid Build Coastguard Worker %tmp48 = insertelement <2 x i32> %tmp47, i32 %tmp46, i32 1 70*9880d681SAndroid Build Coastguard Worker %tmp39.bc = bitcast <16 x i8> %tmp39 to <4 x i32> 71*9880d681SAndroid Build Coastguard Worker %tmp49 = call <4 x float> @llvm.SI.image.sample.v2i32(<2 x i32> %tmp48, <8 x i32> %tmp37, <4 x i32> %tmp39.bc, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0) 72*9880d681SAndroid Build Coastguard Worker %tmp50 = extractelement <4 x float> %tmp49, i32 2 73*9880d681SAndroid Build Coastguard Worker %tmp51 = call float @fabs(float %tmp50) 74*9880d681SAndroid Build Coastguard Worker %tmp52 = fmul float %tmp42, %tmp42 75*9880d681SAndroid Build Coastguard Worker %tmp53 = fmul float %tmp43, %tmp43 76*9880d681SAndroid Build Coastguard Worker %tmp54 = fadd float %tmp53, %tmp52 77*9880d681SAndroid Build Coastguard Worker %tmp55 = fmul float %tmp44, %tmp44 78*9880d681SAndroid Build Coastguard Worker %tmp56 = fadd float %tmp54, %tmp55 79*9880d681SAndroid Build Coastguard Worker %tmp57 = call float @llvm.amdgcn.rsq.f32(float %tmp56) 80*9880d681SAndroid Build Coastguard Worker %tmp58 = fmul float %tmp42, %tmp57 81*9880d681SAndroid Build Coastguard Worker %tmp59 = fmul float %tmp43, %tmp57 82*9880d681SAndroid Build Coastguard Worker %tmp60 = fmul float %tmp44, %tmp57 83*9880d681SAndroid Build Coastguard Worker %tmp61 = fmul float %tmp58, %tmp22 84*9880d681SAndroid Build Coastguard Worker %tmp62 = fmul float %tmp59, %tmp23 85*9880d681SAndroid Build Coastguard Worker %tmp63 = fadd float %tmp62, %tmp61 86*9880d681SAndroid Build Coastguard Worker %tmp64 = fmul float %tmp60, %tmp24 87*9880d681SAndroid Build Coastguard Worker %tmp65 = fadd float %tmp63, %tmp64 88*9880d681SAndroid Build Coastguard Worker %tmp66 = fsub float -0.000000e+00, %tmp25 89*9880d681SAndroid Build Coastguard Worker %tmp67 = fmul float %tmp65, %tmp51 90*9880d681SAndroid Build Coastguard Worker %tmp68 = fadd float %tmp67, %tmp66 91*9880d681SAndroid Build Coastguard Worker %tmp69 = fmul float %tmp26, %tmp68 92*9880d681SAndroid Build Coastguard Worker %tmp70 = fmul float %tmp27, %tmp68 93*9880d681SAndroid Build Coastguard Worker %tmp71 = call float @fabs(float %tmp69) 94*9880d681SAndroid Build Coastguard Worker %tmp72 = fcmp olt float 0x3EE4F8B580000000, %tmp71 95*9880d681SAndroid Build Coastguard Worker %tmp73 = sext i1 %tmp72 to i32 96*9880d681SAndroid Build Coastguard Worker %tmp74 = bitcast i32 %tmp73 to float 97*9880d681SAndroid Build Coastguard Worker %tmp75 = bitcast float %tmp74 to i32 98*9880d681SAndroid Build Coastguard Worker %tmp76 = icmp ne i32 %tmp75, 0 99*9880d681SAndroid Build Coastguard Worker br i1 %tmp76, label %IF, label %ENDIF 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard WorkerIF: ; preds = %main_body 102*9880d681SAndroid Build Coastguard Worker %tmp77 = fsub float -0.000000e+00, %tmp69 103*9880d681SAndroid Build Coastguard Worker %tmp78 = call float @llvm.exp2.f32(float %tmp77) 104*9880d681SAndroid Build Coastguard Worker %tmp79 = fsub float -0.000000e+00, %tmp78 105*9880d681SAndroid Build Coastguard Worker %tmp80 = fadd float 1.000000e+00, %tmp79 106*9880d681SAndroid Build Coastguard Worker %tmp81 = fdiv float 1.000000e+00, %tmp69 107*9880d681SAndroid Build Coastguard Worker %tmp82 = fmul float %tmp80, %tmp81 108*9880d681SAndroid Build Coastguard Worker %tmp83 = fmul float %tmp31, %tmp82 109*9880d681SAndroid Build Coastguard Worker br label %ENDIF 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard WorkerENDIF: ; preds = %IF, %main_body 112*9880d681SAndroid Build Coastguard Worker %temp4.0 = phi float [ %tmp83, %IF ], [ %tmp31, %main_body ] 113*9880d681SAndroid Build Coastguard Worker %tmp84 = call float @fabs(float %tmp70) 114*9880d681SAndroid Build Coastguard Worker %tmp85 = fcmp olt float 0x3EE4F8B580000000, %tmp84 115*9880d681SAndroid Build Coastguard Worker %tmp86 = sext i1 %tmp85 to i32 116*9880d681SAndroid Build Coastguard Worker %tmp87 = bitcast i32 %tmp86 to float 117*9880d681SAndroid Build Coastguard Worker %tmp88 = bitcast float %tmp87 to i32 118*9880d681SAndroid Build Coastguard Worker %tmp89 = icmp ne i32 %tmp88, 0 119*9880d681SAndroid Build Coastguard Worker br i1 %tmp89, label %IF25, label %ENDIF24 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard WorkerIF25: ; preds = %ENDIF 122*9880d681SAndroid Build Coastguard Worker %tmp90 = fsub float -0.000000e+00, %tmp70 123*9880d681SAndroid Build Coastguard Worker %tmp91 = call float @llvm.exp2.f32(float %tmp90) 124*9880d681SAndroid Build Coastguard Worker %tmp92 = fsub float -0.000000e+00, %tmp91 125*9880d681SAndroid Build Coastguard Worker %tmp93 = fadd float 1.000000e+00, %tmp92 126*9880d681SAndroid Build Coastguard Worker %tmp94 = fdiv float 1.000000e+00, %tmp70 127*9880d681SAndroid Build Coastguard Worker %tmp95 = fmul float %tmp93, %tmp94 128*9880d681SAndroid Build Coastguard Worker %tmp96 = fmul float %tmp35, %tmp95 129*9880d681SAndroid Build Coastguard Worker br label %ENDIF24 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard WorkerENDIF24: ; preds = %IF25, %ENDIF 132*9880d681SAndroid Build Coastguard Worker %temp8.0 = phi float [ %tmp96, %IF25 ], [ %tmp35, %ENDIF ] 133*9880d681SAndroid Build Coastguard Worker %tmp97 = fmul float %tmp28, %temp4.0 134*9880d681SAndroid Build Coastguard Worker %tmp98 = fmul float %tmp29, %temp4.0 135*9880d681SAndroid Build Coastguard Worker %tmp99 = fmul float %tmp30, %temp4.0 136*9880d681SAndroid Build Coastguard Worker %tmp100 = fmul float %tmp32, %temp8.0 137*9880d681SAndroid Build Coastguard Worker %tmp101 = fadd float %tmp100, %tmp97 138*9880d681SAndroid Build Coastguard Worker %tmp102 = fmul float %tmp33, %temp8.0 139*9880d681SAndroid Build Coastguard Worker %tmp103 = fadd float %tmp102, %tmp98 140*9880d681SAndroid Build Coastguard Worker %tmp104 = fmul float %tmp34, %temp8.0 141*9880d681SAndroid Build Coastguard Worker %tmp105 = fadd float %tmp104, %tmp99 142*9880d681SAndroid Build Coastguard Worker %tmp106 = call float @llvm.pow.f32(float %tmp51, float %tmp21) 143*9880d681SAndroid Build Coastguard Worker %tmp107 = fsub float -0.000000e+00, %tmp101 144*9880d681SAndroid Build Coastguard Worker %tmp108 = fmul float %tmp107, %tmp106 145*9880d681SAndroid Build Coastguard Worker %tmp109 = fsub float -0.000000e+00, %tmp103 146*9880d681SAndroid Build Coastguard Worker %tmp110 = fmul float %tmp109, %tmp106 147*9880d681SAndroid Build Coastguard Worker %tmp111 = fsub float -0.000000e+00, %tmp105 148*9880d681SAndroid Build Coastguard Worker %tmp112 = fmul float %tmp111, %tmp106 149*9880d681SAndroid Build Coastguard Worker %tmp113 = call i32 @llvm.SI.packf16(float %tmp108, float %tmp110) 150*9880d681SAndroid Build Coastguard Worker %tmp114 = bitcast i32 %tmp113 to float 151*9880d681SAndroid Build Coastguard Worker %tmp115 = call i32 @llvm.SI.packf16(float %tmp112, float 1.000000e+00) 152*9880d681SAndroid Build Coastguard Worker %tmp116 = bitcast i32 %tmp115 to float 153*9880d681SAndroid Build Coastguard Worker call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %tmp114, float %tmp116, float %tmp114, float %tmp116) 154*9880d681SAndroid Build Coastguard Worker ret void 155*9880d681SAndroid Build Coastguard Worker} 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Worker; We just want ot make sure the program doesn't crash 158*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}loop: 159*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps void @loop(<16 x i8> addrspace(2)* inreg %arg, <16 x i8> addrspace(2)* inreg %arg1, <8 x i32> addrspace(2)* inreg %arg2, i32 inreg %arg3, <2 x i32> %arg4, <2 x i32> %arg5, <2 x i32> %arg6, <3 x i32> %arg7, <2 x i32> %arg8, <2 x i32> %arg9, <2 x i32> %arg10, float %arg11, float %arg12, float %arg13, float %arg14, float %arg15, float %arg16, float %arg17, float %arg18, float %arg19) #0 { 160*9880d681SAndroid Build Coastguard Workermain_body: 161*9880d681SAndroid Build Coastguard Worker %tmp = getelementptr <16 x i8>, <16 x i8> addrspace(2)* %arg, i32 0 162*9880d681SAndroid Build Coastguard Worker %tmp20 = load <16 x i8>, <16 x i8> addrspace(2)* %tmp, !tbaa !0 163*9880d681SAndroid Build Coastguard Worker %tmp21 = call float @llvm.SI.load.const(<16 x i8> %tmp20, i32 0) 164*9880d681SAndroid Build Coastguard Worker %tmp22 = call float @llvm.SI.load.const(<16 x i8> %tmp20, i32 4) 165*9880d681SAndroid Build Coastguard Worker %tmp23 = call float @llvm.SI.load.const(<16 x i8> %tmp20, i32 8) 166*9880d681SAndroid Build Coastguard Worker %tmp24 = call float @llvm.SI.load.const(<16 x i8> %tmp20, i32 12) 167*9880d681SAndroid Build Coastguard Worker %tmp25 = fptosi float %tmp24 to i32 168*9880d681SAndroid Build Coastguard Worker %tmp26 = bitcast i32 %tmp25 to float 169*9880d681SAndroid Build Coastguard Worker %tmp27 = bitcast float %tmp26 to i32 170*9880d681SAndroid Build Coastguard Worker br label %LOOP 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard WorkerLOOP: ; preds = %ENDIF, %main_body 173*9880d681SAndroid Build Coastguard Worker %temp4.0 = phi float [ %tmp21, %main_body ], [ %temp5.0, %ENDIF ] 174*9880d681SAndroid Build Coastguard Worker %temp5.0 = phi float [ %tmp22, %main_body ], [ %temp6.0, %ENDIF ] 175*9880d681SAndroid Build Coastguard Worker %temp6.0 = phi float [ %tmp23, %main_body ], [ %temp4.0, %ENDIF ] 176*9880d681SAndroid Build Coastguard Worker %temp8.0 = phi float [ 0.000000e+00, %main_body ], [ %tmp36, %ENDIF ] 177*9880d681SAndroid Build Coastguard Worker %tmp28 = bitcast float %temp8.0 to i32 178*9880d681SAndroid Build Coastguard Worker %tmp29 = icmp sge i32 %tmp28, %tmp27 179*9880d681SAndroid Build Coastguard Worker %tmp30 = sext i1 %tmp29 to i32 180*9880d681SAndroid Build Coastguard Worker %tmp31 = bitcast i32 %tmp30 to float 181*9880d681SAndroid Build Coastguard Worker %tmp32 = bitcast float %tmp31 to i32 182*9880d681SAndroid Build Coastguard Worker %tmp33 = icmp ne i32 %tmp32, 0 183*9880d681SAndroid Build Coastguard Worker br i1 %tmp33, label %IF, label %ENDIF 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard WorkerIF: ; preds = %LOOP 186*9880d681SAndroid Build Coastguard Worker call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 0, float %temp4.0, float %temp5.0, float %temp6.0, float 1.000000e+00) 187*9880d681SAndroid Build Coastguard Worker ret void 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard WorkerENDIF: ; preds = %LOOP 190*9880d681SAndroid Build Coastguard Worker %tmp34 = bitcast float %temp8.0 to i32 191*9880d681SAndroid Build Coastguard Worker %tmp35 = add i32 %tmp34, 1 192*9880d681SAndroid Build Coastguard Worker %tmp36 = bitcast i32 %tmp35 to float 193*9880d681SAndroid Build Coastguard Worker br label %LOOP 194*9880d681SAndroid Build Coastguard Worker} 195*9880d681SAndroid Build Coastguard Worker 196*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind readnone 197*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.SI.load.const(<16 x i8>, i32) #1 198*9880d681SAndroid Build Coastguard Worker 199*9880d681SAndroid Build Coastguard Worker; Function Attrs: readonly 200*9880d681SAndroid Build Coastguard Workerdeclare float @fabs(float) #2 201*9880d681SAndroid Build Coastguard Worker 202*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.SI.export(i32, i32, i32, i32, i32, float, float, float, float) 203*9880d681SAndroid Build Coastguard Worker 204*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind readnone 205*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.SI.fs.interp(i32, i32, i32, <2 x i32>) #1 206*9880d681SAndroid Build Coastguard Worker 207*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind readnone 208*9880d681SAndroid Build Coastguard Workerdeclare <4 x float> @llvm.SI.sample.v2i32(<2 x i32>, <8 x i32>, <16 x i8>, i32) #1 209*9880d681SAndroid Build Coastguard Worker 210*9880d681SAndroid Build Coastguard Worker; Function Attrs: readnone 211*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.amdgcn.rsq.f32(float) #1 212*9880d681SAndroid Build Coastguard Worker 213*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.exp2.f32(float) #1 214*9880d681SAndroid Build Coastguard Worker 215*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind readnone 216*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.pow.f32(float, float) #1 217*9880d681SAndroid Build Coastguard Worker 218*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind readnone 219*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.SI.packf16(float, float) #1 220*9880d681SAndroid Build Coastguard Worker 221*9880d681SAndroid Build Coastguard Worker; This checks for a bug in the FixSGPRCopies pass where VReg96 222*9880d681SAndroid Build Coastguard Worker; registers were being identified as an SGPR regclass which was causing 223*9880d681SAndroid Build Coastguard Worker; an assertion failure. 224*9880d681SAndroid Build Coastguard Worker 225*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}sample_v3: 226*9880d681SAndroid Build Coastguard Worker; CHECK: image_sample 227*9880d681SAndroid Build Coastguard Worker; CHECK: image_sample 228*9880d681SAndroid Build Coastguard Worker; CHECK: exp 229*9880d681SAndroid Build Coastguard Worker; CHECK: s_endpgm 230*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps void @sample_v3([17 x <16 x i8>] addrspace(2)* byval %arg, [32 x <16 x i8>] addrspace(2)* byval %arg1, [16 x <8 x i32>] addrspace(2)* byval %arg2, float inreg %arg3, i32 inreg %arg4, <2 x i32> %arg5, <2 x i32> %arg6, <2 x i32> %arg7, <3 x i32> %arg8, <2 x i32> %arg9, <2 x i32> %arg10, <2 x i32> %arg11, float %arg12, float %arg13, float %arg14, float %arg15, float %arg16, float %arg17, float %arg18, float %arg19, float %arg20) #0 { 231*9880d681SAndroid Build Coastguard Workerentry: 232*9880d681SAndroid Build Coastguard Worker %tmp = getelementptr [17 x <16 x i8>], [17 x <16 x i8>] addrspace(2)* %arg, i64 0, i32 0 233*9880d681SAndroid Build Coastguard Worker %tmp21 = load <16 x i8>, <16 x i8> addrspace(2)* %tmp, !tbaa !0 234*9880d681SAndroid Build Coastguard Worker %tmp22 = call float @llvm.SI.load.const(<16 x i8> %tmp21, i32 16) 235*9880d681SAndroid Build Coastguard Worker %tmp23 = getelementptr [16 x <8 x i32>], [16 x <8 x i32>] addrspace(2)* %arg2, i64 0, i32 0 236*9880d681SAndroid Build Coastguard Worker %tmp24 = load <8 x i32>, <8 x i32> addrspace(2)* %tmp23, !tbaa !0 237*9880d681SAndroid Build Coastguard Worker %tmp25 = getelementptr [32 x <16 x i8>], [32 x <16 x i8>] addrspace(2)* %arg1, i64 0, i32 0 238*9880d681SAndroid Build Coastguard Worker %tmp26 = load <16 x i8>, <16 x i8> addrspace(2)* %tmp25, !tbaa !0 239*9880d681SAndroid Build Coastguard Worker %tmp27 = fcmp oeq float %tmp22, 0.000000e+00 240*9880d681SAndroid Build Coastguard Worker %tmp26.bc = bitcast <16 x i8> %tmp26 to <4 x i32> 241*9880d681SAndroid Build Coastguard Worker br i1 %tmp27, label %if, label %else 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Workerif: ; preds = %entry 244*9880d681SAndroid Build Coastguard Worker %val.if = call <4 x float> @llvm.SI.image.sample.v2i32(<2 x i32> zeroinitializer, <8 x i32> %tmp24, <4 x i32> %tmp26.bc, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0) 245*9880d681SAndroid Build Coastguard Worker %val.if.0 = extractelement <4 x float> %val.if, i32 0 246*9880d681SAndroid Build Coastguard Worker %val.if.1 = extractelement <4 x float> %val.if, i32 1 247*9880d681SAndroid Build Coastguard Worker %val.if.2 = extractelement <4 x float> %val.if, i32 2 248*9880d681SAndroid Build Coastguard Worker br label %endif 249*9880d681SAndroid Build Coastguard Worker 250*9880d681SAndroid Build Coastguard Workerelse: ; preds = %entry 251*9880d681SAndroid Build Coastguard Worker %val.else = call <4 x float> @llvm.SI.image.sample.v2i32(<2 x i32> <i32 1, i32 0>, <8 x i32> %tmp24, <4 x i32> %tmp26.bc, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0) 252*9880d681SAndroid Build Coastguard Worker %val.else.0 = extractelement <4 x float> %val.else, i32 0 253*9880d681SAndroid Build Coastguard Worker %val.else.1 = extractelement <4 x float> %val.else, i32 1 254*9880d681SAndroid Build Coastguard Worker %val.else.2 = extractelement <4 x float> %val.else, i32 2 255*9880d681SAndroid Build Coastguard Worker br label %endif 256*9880d681SAndroid Build Coastguard Worker 257*9880d681SAndroid Build Coastguard Workerendif: ; preds = %else, %if 258*9880d681SAndroid Build Coastguard Worker %val.0 = phi float [ %val.if.0, %if ], [ %val.else.0, %else ] 259*9880d681SAndroid Build Coastguard Worker %val.1 = phi float [ %val.if.1, %if ], [ %val.else.1, %else ] 260*9880d681SAndroid Build Coastguard Worker %val.2 = phi float [ %val.if.2, %if ], [ %val.else.2, %else ] 261*9880d681SAndroid Build Coastguard Worker call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %val.0, float %val.1, float %val.2, float 0.000000e+00) 262*9880d681SAndroid Build Coastguard Worker ret void 263*9880d681SAndroid Build Coastguard Worker} 264*9880d681SAndroid Build Coastguard Worker 265*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}copy1: 266*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_load_dword 267*9880d681SAndroid Build Coastguard Worker; CHECK: v_add 268*9880d681SAndroid Build Coastguard Worker; CHECK: s_endpgm 269*9880d681SAndroid Build Coastguard Workerdefine void @copy1(float addrspace(1)* %out, float addrspace(1)* %in0) { 270*9880d681SAndroid Build Coastguard Workerentry: 271*9880d681SAndroid Build Coastguard Worker %tmp = load float, float addrspace(1)* %in0 272*9880d681SAndroid Build Coastguard Worker %tmp1 = fcmp oeq float %tmp, 0.000000e+00 273*9880d681SAndroid Build Coastguard Worker br i1 %tmp1, label %if0, label %endif 274*9880d681SAndroid Build Coastguard Worker 275*9880d681SAndroid Build Coastguard Workerif0: ; preds = %entry 276*9880d681SAndroid Build Coastguard Worker %tmp2 = bitcast float %tmp to i32 277*9880d681SAndroid Build Coastguard Worker %tmp3 = fcmp olt float %tmp, 0.000000e+00 278*9880d681SAndroid Build Coastguard Worker br i1 %tmp3, label %if1, label %endif 279*9880d681SAndroid Build Coastguard Worker 280*9880d681SAndroid Build Coastguard Workerif1: ; preds = %if0 281*9880d681SAndroid Build Coastguard Worker %tmp4 = add i32 %tmp2, 1 282*9880d681SAndroid Build Coastguard Worker br label %endif 283*9880d681SAndroid Build Coastguard Worker 284*9880d681SAndroid Build Coastguard Workerendif: ; preds = %if1, %if0, %entry 285*9880d681SAndroid Build Coastguard Worker %tmp5 = phi i32 [ 0, %entry ], [ %tmp2, %if0 ], [ %tmp4, %if1 ] 286*9880d681SAndroid Build Coastguard Worker %tmp6 = bitcast i32 %tmp5 to float 287*9880d681SAndroid Build Coastguard Worker store float %tmp6, float addrspace(1)* %out 288*9880d681SAndroid Build Coastguard Worker ret void 289*9880d681SAndroid Build Coastguard Worker} 290*9880d681SAndroid Build Coastguard Worker 291*9880d681SAndroid Build Coastguard Worker; This test is just checking that we don't crash / assertion fail. 292*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}copy2: 293*9880d681SAndroid Build Coastguard Worker; CHECK: s_endpgm 294*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps void @copy2([17 x <16 x i8>] addrspace(2)* byval %arg, [32 x <16 x i8>] addrspace(2)* byval %arg1, [16 x <8 x i32>] addrspace(2)* byval %arg2, float inreg %arg3, i32 inreg %arg4, <2 x i32> %arg5, <2 x i32> %arg6, <2 x i32> %arg7, <3 x i32> %arg8, <2 x i32> %arg9, <2 x i32> %arg10, <2 x i32> %arg11, float %arg12, float %arg13, float %arg14, float %arg15, float %arg16, float %arg17, float %arg18, float %arg19, float %arg20) #0 { 295*9880d681SAndroid Build Coastguard Workerentry: 296*9880d681SAndroid Build Coastguard Worker br label %LOOP68 297*9880d681SAndroid Build Coastguard Worker 298*9880d681SAndroid Build Coastguard WorkerLOOP68: ; preds = %ENDIF69, %entry 299*9880d681SAndroid Build Coastguard Worker %temp4.7 = phi float [ 0.000000e+00, %entry ], [ %v, %ENDIF69 ] 300*9880d681SAndroid Build Coastguard Worker %t = phi i32 [ 20, %entry ], [ %x, %ENDIF69 ] 301*9880d681SAndroid Build Coastguard Worker %g = icmp eq i32 0, %t 302*9880d681SAndroid Build Coastguard Worker %l = bitcast float %temp4.7 to i32 303*9880d681SAndroid Build Coastguard Worker br i1 %g, label %IF70, label %ENDIF69 304*9880d681SAndroid Build Coastguard Worker 305*9880d681SAndroid Build Coastguard WorkerIF70: ; preds = %LOOP68 306*9880d681SAndroid Build Coastguard Worker %q = icmp ne i32 %l, 13 307*9880d681SAndroid Build Coastguard Worker %temp.8 = select i1 %q, float 1.000000e+00, float 0.000000e+00 308*9880d681SAndroid Build Coastguard Worker call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 0, float %temp.8, float 0.000000e+00, float 0.000000e+00, float 1.000000e+00) 309*9880d681SAndroid Build Coastguard Worker ret void 310*9880d681SAndroid Build Coastguard Worker 311*9880d681SAndroid Build Coastguard WorkerENDIF69: ; preds = %LOOP68 312*9880d681SAndroid Build Coastguard Worker %u = add i32 %l, %t 313*9880d681SAndroid Build Coastguard Worker %v = bitcast i32 %u to float 314*9880d681SAndroid Build Coastguard Worker %x = add i32 %t, -1 315*9880d681SAndroid Build Coastguard Worker br label %LOOP68 316*9880d681SAndroid Build Coastguard Worker} 317*9880d681SAndroid Build Coastguard Worker 318*9880d681SAndroid Build Coastguard Worker; This test checks that image_sample resource descriptors aren't loaded into 319*9880d681SAndroid Build Coastguard Worker; vgprs. The verifier will fail if this happens. 320*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:{{^}}sample_rsrc: 321*9880d681SAndroid Build Coastguard Worker; CHECK: image_sample 322*9880d681SAndroid Build Coastguard Worker; CHECK: image_sample 323*9880d681SAndroid Build Coastguard Worker; CHECK: s_endpgm 324*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps void @sample_rsrc([6 x <16 x i8>] addrspace(2)* byval %arg, [17 x <16 x i8>] addrspace(2)* byval %arg1, [16 x <4 x i32>] addrspace(2)* byval %arg2, [32 x <8 x i32>] addrspace(2)* byval %arg3, float inreg %arg4, i32 inreg %arg5, <2 x i32> %arg6, <2 x i32> %arg7, <2 x i32> %arg8, <3 x i32> %arg9, <2 x i32> %arg10, <2 x i32> %arg11, <2 x i32> %arg12, float %arg13, float %arg14, float %arg15, float %arg16, float %arg17, float %arg18, i32 %arg19, float %arg20, float %arg21) #0 { 325*9880d681SAndroid Build Coastguard Workerbb: 326*9880d681SAndroid Build Coastguard Worker %tmp = getelementptr [17 x <16 x i8>], [17 x <16 x i8>] addrspace(2)* %arg1, i32 0, i32 0 327*9880d681SAndroid Build Coastguard Worker %tmp22 = load <16 x i8>, <16 x i8> addrspace(2)* %tmp, !tbaa !2 328*9880d681SAndroid Build Coastguard Worker %tmp23 = call float @llvm.SI.load.const(<16 x i8> %tmp22, i32 16) 329*9880d681SAndroid Build Coastguard Worker %tmp25 = getelementptr [32 x <8 x i32>], [32 x <8 x i32>] addrspace(2)* %arg3, i32 0, i32 0 330*9880d681SAndroid Build Coastguard Worker %tmp26 = load <8 x i32>, <8 x i32> addrspace(2)* %tmp25, !tbaa !2 331*9880d681SAndroid Build Coastguard Worker %tmp27 = getelementptr [16 x <4 x i32>], [16 x <4 x i32>] addrspace(2)* %arg2, i32 0, i32 0 332*9880d681SAndroid Build Coastguard Worker %tmp28 = load <4 x i32>, <4 x i32> addrspace(2)* %tmp27, !tbaa !2 333*9880d681SAndroid Build Coastguard Worker %tmp29 = call float @llvm.SI.fs.interp(i32 0, i32 0, i32 %arg5, <2 x i32> %arg7) 334*9880d681SAndroid Build Coastguard Worker %tmp30 = call float @llvm.SI.fs.interp(i32 1, i32 0, i32 %arg5, <2 x i32> %arg7) 335*9880d681SAndroid Build Coastguard Worker %tmp31 = bitcast float %tmp23 to i32 336*9880d681SAndroid Build Coastguard Worker %tmp36 = icmp ne i32 %tmp31, 0 337*9880d681SAndroid Build Coastguard Worker br i1 %tmp36, label %bb38, label %bb80 338*9880d681SAndroid Build Coastguard Worker 339*9880d681SAndroid Build Coastguard Workerbb38: ; preds = %bb 340*9880d681SAndroid Build Coastguard Worker %tmp52 = bitcast float %tmp29 to i32 341*9880d681SAndroid Build Coastguard Worker %tmp53 = bitcast float %tmp30 to i32 342*9880d681SAndroid Build Coastguard Worker %tmp54 = insertelement <2 x i32> undef, i32 %tmp52, i32 0 343*9880d681SAndroid Build Coastguard Worker %tmp55 = insertelement <2 x i32> %tmp54, i32 %tmp53, i32 1 344*9880d681SAndroid Build Coastguard Worker %tmp56 = bitcast <8 x i32> %tmp26 to <8 x i32> 345*9880d681SAndroid Build Coastguard Worker %tmp58 = call <4 x float> @llvm.SI.image.sample.v2i32(<2 x i32> %tmp55, <8 x i32> %tmp56, <4 x i32> %tmp28, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0) 346*9880d681SAndroid Build Coastguard Worker br label %bb71 347*9880d681SAndroid Build Coastguard Worker 348*9880d681SAndroid Build Coastguard Workerbb80: ; preds = %bb 349*9880d681SAndroid Build Coastguard Worker %tmp81 = bitcast float %tmp29 to i32 350*9880d681SAndroid Build Coastguard Worker %tmp82 = bitcast float %tmp30 to i32 351*9880d681SAndroid Build Coastguard Worker %tmp82.2 = add i32 %tmp82, 1 352*9880d681SAndroid Build Coastguard Worker %tmp83 = insertelement <2 x i32> undef, i32 %tmp81, i32 0 353*9880d681SAndroid Build Coastguard Worker %tmp84 = insertelement <2 x i32> %tmp83, i32 %tmp82.2, i32 1 354*9880d681SAndroid Build Coastguard Worker %tmp85 = bitcast <8 x i32> %tmp26 to <8 x i32> 355*9880d681SAndroid Build Coastguard Worker %tmp87 = call <4 x float> @llvm.SI.image.sample.v2i32(<2 x i32> %tmp84, <8 x i32> %tmp85, <4 x i32> %tmp28, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0) 356*9880d681SAndroid Build Coastguard Worker br label %bb71 357*9880d681SAndroid Build Coastguard Worker 358*9880d681SAndroid Build Coastguard Workerbb71: ; preds = %bb80, %bb38 359*9880d681SAndroid Build Coastguard Worker %tmp72 = phi <4 x float> [ %tmp58, %bb38 ], [ %tmp87, %bb80 ] 360*9880d681SAndroid Build Coastguard Worker %tmp88 = extractelement <4 x float> %tmp72, i32 0 361*9880d681SAndroid Build Coastguard Worker call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %tmp88, float %tmp88, float %tmp88, float %tmp88) 362*9880d681SAndroid Build Coastguard Worker ret void 363*9880d681SAndroid Build Coastguard Worker} 364*9880d681SAndroid Build Coastguard Worker 365*9880d681SAndroid Build Coastguard Worker; Check the the resource descriptor is stored in an sgpr. 366*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}mimg_srsrc_sgpr: 367*9880d681SAndroid Build Coastguard Worker; CHECK: image_sample v{{[0-9]+}}, v[{{[0-9]+:[0-9]+}}], s[{{[0-9]+:[0-9]+}}], s[{{[0-9]+:[0-9]+}}] dmask:0x1 368*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps void @mimg_srsrc_sgpr([34 x <8 x i32>] addrspace(2)* byval %arg) #0 { 369*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0) #0 370*9880d681SAndroid Build Coastguard Worker %tmp7 = getelementptr [34 x <8 x i32>], [34 x <8 x i32>] addrspace(2)* %arg, i32 0, i32 %tid 371*9880d681SAndroid Build Coastguard Worker %tmp8 = load <8 x i32>, <8 x i32> addrspace(2)* %tmp7, align 32, !tbaa !0 372*9880d681SAndroid Build Coastguard Worker %tmp9 = call <4 x float> @llvm.SI.image.sample.v2i32(<2 x i32> <i32 1061158912, i32 1048576000>, <8 x i32> %tmp8, <4 x i32> undef, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0) 373*9880d681SAndroid Build Coastguard Worker %tmp10 = extractelement <4 x float> %tmp9, i32 0 374*9880d681SAndroid Build Coastguard Worker %tmp12 = call i32 @llvm.SI.packf16(float undef, float %tmp10) 375*9880d681SAndroid Build Coastguard Worker %tmp13 = bitcast i32 %tmp12 to float 376*9880d681SAndroid Build Coastguard Worker call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %tmp13, float undef, float undef, float undef) 377*9880d681SAndroid Build Coastguard Worker ret void 378*9880d681SAndroid Build Coastguard Worker} 379*9880d681SAndroid Build Coastguard Worker 380*9880d681SAndroid Build Coastguard Worker; Check the the sampler is stored in an sgpr. 381*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}mimg_ssamp_sgpr: 382*9880d681SAndroid Build Coastguard Worker; CHECK: image_sample v{{[0-9]+}}, v[{{[0-9]+:[0-9]+}}], s[{{[0-9]+:[0-9]+}}], s[{{[0-9]+:[0-9]+}}] dmask:0x1 383*9880d681SAndroid Build Coastguard Workerdefine amdgpu_ps void @mimg_ssamp_sgpr([17 x <4 x i32>] addrspace(2)* byval %arg) #0 { 384*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0) #0 385*9880d681SAndroid Build Coastguard Worker %tmp7 = getelementptr [17 x <4 x i32>], [17 x <4 x i32>] addrspace(2)* %arg, i32 0, i32 %tid 386*9880d681SAndroid Build Coastguard Worker %tmp8 = load <4 x i32>, <4 x i32> addrspace(2)* %tmp7, align 16, !tbaa !0 387*9880d681SAndroid Build Coastguard Worker %tmp9 = call <4 x float> @llvm.SI.image.sample.v2i32(<2 x i32> <i32 1061158912, i32 1048576000>, <8 x i32> undef, <4 x i32> %tmp8, i32 15, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0) 388*9880d681SAndroid Build Coastguard Worker %tmp10 = extractelement <4 x float> %tmp9, i32 0 389*9880d681SAndroid Build Coastguard Worker %tmp12 = call i32 @llvm.SI.packf16(float %tmp10, float undef) 390*9880d681SAndroid Build Coastguard Worker %tmp13 = bitcast i32 %tmp12 to float 391*9880d681SAndroid Build Coastguard Worker call void @llvm.SI.export(i32 15, i32 1, i32 1, i32 0, i32 1, float %tmp13, float undef, float undef, float undef) 392*9880d681SAndroid Build Coastguard Worker ret void 393*9880d681SAndroid Build Coastguard Worker} 394*9880d681SAndroid Build Coastguard Worker 395*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.mbcnt.lo(i32, i32) #1 396*9880d681SAndroid Build Coastguard Worker 397*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind } 398*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind readnone } 399*9880d681SAndroid Build Coastguard Workerattributes #2 = { nounwind readonly } 400*9880d681SAndroid Build Coastguard Worker 401*9880d681SAndroid Build Coastguard Worker!0 = !{!1, !1, i64 0, i32 1} 402*9880d681SAndroid Build Coastguard Worker!1 = !{!"const", null} 403*9880d681SAndroid Build Coastguard Worker!2 = !{!1, !1, i64 0} 404