271 lines · plain
1; RUN: llc -mtriple=amdgcn -mcpu=gfx1200 -start-before=amdgpu-unify-divergent-exit-nodes < %s | FileCheck -enable-var-scope --check-prefixes=GCN,GCN-SDAG %s2; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx1200 -start-before=amdgpu-unify-divergent-exit-nodes < %s | FileCheck -enable-var-scope --check-prefixes=GCN,GCN-GISEL %s3 4; --------------------------------------------------------------------------------5; fminimum tests6; --------------------------------------------------------------------------------7 8; GCN-LABEL: {{^}}v_fneg_minimum_f32:9; GCN: global_load_b32 [[A:v[0-9]+]]10; GCN: global_load_b32 [[B:v[0-9]+]]11; GCN: v_maximum_f32 [[RESULT:v[0-9]+]], -[[A]], -[[B]]12; GCN: global_store_b32 v[{{[0-9:]+}}], [[RESULT]]13define void @v_fneg_minimum_f32(ptr addrspace(1) %out, ptr addrspace(1) %a.ptr, ptr addrspace(1) %b.ptr) {14 %tid = call i32 @llvm.amdgcn.workitem.id.x()15 %tid.ext = sext i32 %tid to i6416 %a.gep = getelementptr inbounds float, ptr addrspace(1) %a.ptr, i64 %tid.ext17 %b.gep = getelementptr inbounds float, ptr addrspace(1) %b.ptr, i64 %tid.ext18 %out.gep = getelementptr inbounds float, ptr addrspace(1) %out, i64 %tid.ext19 %a = load volatile float, ptr addrspace(1) %a.gep20 %b = load volatile float, ptr addrspace(1) %b.gep21 %min = call float @llvm.minimum.f32(float %a, float %b)22 %fneg = fneg float %min23 store float %fneg, ptr addrspace(1) %out.gep24 ret void25}26 27; GCN-LABEL: {{^}}v_fneg_self_minimum_f32:28; GCN: global_load_b32 [[A:v[0-9]+]]29; GCN: v_maximum_f32 [[RESULT:v[0-9]+]], -[[A]], -[[A]]30; GCN: global_store_b32 v[{{[0-9:]+}}], [[RESULT]]31define void @v_fneg_self_minimum_f32(ptr addrspace(1) %out, ptr addrspace(1) %a.ptr) {32 %tid = call i32 @llvm.amdgcn.workitem.id.x()33 %tid.ext = sext i32 %tid to i6434 %a.gep = getelementptr inbounds float, ptr addrspace(1) %a.ptr, i64 %tid.ext35 %out.gep = getelementptr inbounds float, ptr addrspace(1) %out, i64 %tid.ext36 %a = load volatile float, ptr addrspace(1) %a.gep37 %min = call float @llvm.minimum.f32(float %a, float %a)38 %min.fneg = fneg float %min39 store float %min.fneg, ptr addrspace(1) %out.gep40 ret void41}42 43; GCN-LABEL: {{^}}v_fneg_posk_minimum_f32:44; GCN: global_load_b32 [[A:v[0-9]+]]45; GCN: v_maximum_f32 [[RESULT:v[0-9]+]], -[[A]], -4.046; GCN: global_store_b32 v[{{[0-9:]+}}], [[RESULT]]47define void @v_fneg_posk_minimum_f32(ptr addrspace(1) %out, ptr addrspace(1) %a.ptr) {48 %tid = call i32 @llvm.amdgcn.workitem.id.x()49 %tid.ext = sext i32 %tid to i6450 %a.gep = getelementptr inbounds float, ptr addrspace(1) %a.ptr, i64 %tid.ext51 %out.gep = getelementptr inbounds float, ptr addrspace(1) %out, i64 %tid.ext52 %a = load volatile float, ptr addrspace(1) %a.gep53 %min = call float @llvm.minimum.f32(float %a, float 4.0)54 %fneg = fneg float %min55 store float %fneg, ptr addrspace(1) %out.gep56 ret void57}58 59; GCN-LABEL: {{^}}v_fneg_negk_minimum_f32:60; GCN: global_load_b32 [[A:v[0-9]+]]61; GCN: v_maximum_f32 [[RESULT:v[0-9]+]], -[[A]], 4.062; GCN: global_store_b32 v[{{[0-9:]+}}], [[RESULT]]63define void @v_fneg_negk_minimum_f32(ptr addrspace(1) %out, ptr addrspace(1) %a.ptr) {64 %tid = call i32 @llvm.amdgcn.workitem.id.x()65 %tid.ext = sext i32 %tid to i6466 %a.gep = getelementptr inbounds float, ptr addrspace(1) %a.ptr, i64 %tid.ext67 %out.gep = getelementptr inbounds float, ptr addrspace(1) %out, i64 %tid.ext68 %a = load volatile float, ptr addrspace(1) %a.gep69 %min = call float @llvm.minimum.f32(float %a, float -4.0)70 %fneg = fneg float %min71 store float %fneg, ptr addrspace(1) %out.gep72 ret void73}74 75; GCN-LABEL: {{^}}v_fneg_0_minimum_f32:76; GCN: global_load_b32 [[A:v[0-9]+]]77; GCN: v_minimum_f32 [[RESULT:v[0-9]+]], [[A]], 078; GCN: global_store_b32 v[{{[0-9:]+}}], [[RESULT]]79define void @v_fneg_0_minimum_f32(ptr addrspace(1) %out, ptr addrspace(1) %a.ptr) {80 %tid = call i32 @llvm.amdgcn.workitem.id.x()81 %tid.ext = sext i32 %tid to i6482 %a.gep = getelementptr inbounds float, ptr addrspace(1) %a.ptr, i64 %tid.ext83 %out.gep = getelementptr inbounds float, ptr addrspace(1) %out, i64 %tid.ext84 %a = load volatile float, ptr addrspace(1) %a.gep85 %min = call float @llvm.minimum.f32(float %a, float 0.0)86 %fneg = fneg float %min87 store float %fneg, ptr addrspace(1) %out.gep88 ret void89}90 91; GCN-LABEL: {{^}}v_fneg_0_minimum_foldable_use_f32:92; GCN: global_load_b32 [[A:v[0-9]+]]93; GCN: global_load_b32 [[B:v[0-9]+]]94; GCN: v_minimum_f32 [[MIN:v[0-9]+]], [[A]], 095; GCN: v_mul_f32_e64 [[RESULT:v[0-9]+]], -[[MIN]], [[B]]96; GCN: global_store_b32 v[{{[0-9:]+}}], [[RESULT]]97define void @v_fneg_0_minimum_foldable_use_f32(ptr addrspace(1) %out, ptr addrspace(1) %a.ptr, ptr addrspace(1) %b.ptr) {98 %tid = call i32 @llvm.amdgcn.workitem.id.x()99 %tid.ext = sext i32 %tid to i64100 %a.gep = getelementptr inbounds float, ptr addrspace(1) %a.ptr, i64 %tid.ext101 %b.gep = getelementptr inbounds float, ptr addrspace(1) %b.ptr, i64 %tid.ext102 %out.gep = getelementptr inbounds float, ptr addrspace(1) %out, i64 %tid.ext103 %a = load volatile float, ptr addrspace(1) %a.gep104 %b = load volatile float, ptr addrspace(1) %b.gep105 %min = call float @llvm.minimum.f32(float %a, float 0.0)106 %fneg = fneg float %min107 %mul = fmul float %fneg, %b108 store float %mul, ptr addrspace(1) %out.gep109 ret void110}111 112; GCN-LABEL: {{^}}v_fneg_minimum_multi_use_minimum_f32:113; GCN: global_load_b32 [[A:v[0-9]+]]114; GCN: global_load_b32 [[B:v[0-9]+]]115; GCN: v_maximum_f32 [[MAX0:v[0-9]+]], -[[A]], -[[B]]116; GCN-SDAG: v_mul_f32_e32 [[MUL1:v[0-9]+]], -4.0, [[MAX0]]117; GCN-GISEL: v_mul_f32_e64 [[MUL1:v[0-9]+]], -[[MAX0]], 4.0118; GCN: global_store_b32 v[{{[0-9:]+}}], [[MAX0]]119; GCN: global_store_b32 v[{{[0-9:]+}}], [[MUL1]]120define void @v_fneg_minimum_multi_use_minimum_f32(ptr addrspace(1) %out, ptr addrspace(1) %a.ptr, ptr addrspace(1) %b.ptr) {121 %tid = call i32 @llvm.amdgcn.workitem.id.x()122 %tid.ext = sext i32 %tid to i64123 %a.gep = getelementptr inbounds float, ptr addrspace(1) %a.ptr, i64 %tid.ext124 %b.gep = getelementptr inbounds float, ptr addrspace(1) %b.ptr, i64 %tid.ext125 %out.gep = getelementptr inbounds float, ptr addrspace(1) %out, i64 %tid.ext126 %a = load volatile float, ptr addrspace(1) %a.gep127 %b = load volatile float, ptr addrspace(1) %b.gep128 %min = call float @llvm.minimum.f32(float %a, float %b)129 %fneg = fneg float %min130 %use1 = fmul float %min, 4.0131 store volatile float %fneg, ptr addrspace(1) %out132 store volatile float %use1, ptr addrspace(1) %out133 ret void134}135 136; --------------------------------------------------------------------------------137; fmaximum tests138; --------------------------------------------------------------------------------139 140; GCN-LABEL: {{^}}v_fneg_maximum_f32:141; GCN: global_load_b32 [[A:v[0-9]+]]142; GCN: global_load_b32 [[B:v[0-9]+]]143; GCN: v_minimum_f32 [[RESULT:v[0-9]+]], -[[A]], -[[B]]144; GCN: global_store_b32 v[{{[0-9:]+}}], [[RESULT]]145define void @v_fneg_maximum_f32(ptr addrspace(1) %out, ptr addrspace(1) %a.ptr, ptr addrspace(1) %b.ptr) {146 %tid = call i32 @llvm.amdgcn.workitem.id.x()147 %tid.ext = sext i32 %tid to i64148 %a.gep = getelementptr inbounds float, ptr addrspace(1) %a.ptr, i64 %tid.ext149 %b.gep = getelementptr inbounds float, ptr addrspace(1) %b.ptr, i64 %tid.ext150 %out.gep = getelementptr inbounds float, ptr addrspace(1) %out, i64 %tid.ext151 %a = load volatile float, ptr addrspace(1) %a.gep152 %b = load volatile float, ptr addrspace(1) %b.gep153 %min = call float @llvm.maximum.f32(float %a, float %b)154 %fneg = fneg float %min155 store float %fneg, ptr addrspace(1) %out.gep156 ret void157}158 159; GCN-LABEL: {{^}}v_fneg_self_maximum_f32:160; GCN: global_load_b32 [[A:v[0-9]+]]161; GCN: v_minimum_f32 [[RESULT:v[0-9]+]], -[[A]], -[[A]]162; GCN: global_store_b32 v[{{[0-9:]+}}], [[RESULT]]163define void @v_fneg_self_maximum_f32(ptr addrspace(1) %out, ptr addrspace(1) %a.ptr) {164 %tid = call i32 @llvm.amdgcn.workitem.id.x()165 %tid.ext = sext i32 %tid to i64166 %a.gep = getelementptr inbounds float, ptr addrspace(1) %a.ptr, i64 %tid.ext167 %out.gep = getelementptr inbounds float, ptr addrspace(1) %out, i64 %tid.ext168 %a = load volatile float, ptr addrspace(1) %a.gep169 %min = call float @llvm.maximum.f32(float %a, float %a)170 %min.fneg = fneg float %min171 store float %min.fneg, ptr addrspace(1) %out.gep172 ret void173}174 175; GCN-LABEL: {{^}}v_fneg_posk_maximum_f32:176; GCN: global_load_b32 [[A:v[0-9]+]]177; GCN: v_minimum_f32 [[RESULT:v[0-9]+]], -[[A]], -4.0178; GCN: global_store_b32 v[{{[0-9:]+}}], [[RESULT]]179define void @v_fneg_posk_maximum_f32(ptr addrspace(1) %out, ptr addrspace(1) %a.ptr) {180 %tid = call i32 @llvm.amdgcn.workitem.id.x()181 %tid.ext = sext i32 %tid to i64182 %a.gep = getelementptr inbounds float, ptr addrspace(1) %a.ptr, i64 %tid.ext183 %out.gep = getelementptr inbounds float, ptr addrspace(1) %out, i64 %tid.ext184 %a = load volatile float, ptr addrspace(1) %a.gep185 %min = call float @llvm.maximum.f32(float %a, float 4.0)186 %fneg = fneg float %min187 store float %fneg, ptr addrspace(1) %out.gep188 ret void189}190 191; GCN-LABEL: {{^}}v_fneg_negk_maximum_f32:192; GCN: global_load_b32 [[A:v[0-9]+]]193; GCN: v_minimum_f32 [[RESULT:v[0-9]+]], -[[A]], 4.0194; GCN: global_store_b32 v[{{[0-9:]+}}], [[RESULT]]195define void @v_fneg_negk_maximum_f32(ptr addrspace(1) %out, ptr addrspace(1) %a.ptr) {196 %tid = call i32 @llvm.amdgcn.workitem.id.x()197 %tid.ext = sext i32 %tid to i64198 %a.gep = getelementptr inbounds float, ptr addrspace(1) %a.ptr, i64 %tid.ext199 %out.gep = getelementptr inbounds float, ptr addrspace(1) %out, i64 %tid.ext200 %a = load volatile float, ptr addrspace(1) %a.gep201 %min = call float @llvm.maximum.f32(float %a, float -4.0)202 %fneg = fneg float %min203 store float %fneg, ptr addrspace(1) %out.gep204 ret void205}206 207; GCN-LABEL: {{^}}v_fneg_0_maximum_f32:208; GCN: global_load_b32 [[A:v[0-9]+]]209; GCN: v_maximum_f32 [[RESULT:v[0-9]+]], [[A]], 0210; GCN: global_store_b32 v[{{[0-9:]+}}], [[RESULT]]211define void @v_fneg_0_maximum_f32(ptr addrspace(1) %out, ptr addrspace(1) %a.ptr) {212 %tid = call i32 @llvm.amdgcn.workitem.id.x()213 %tid.ext = sext i32 %tid to i64214 %a.gep = getelementptr inbounds float, ptr addrspace(1) %a.ptr, i64 %tid.ext215 %out.gep = getelementptr inbounds float, ptr addrspace(1) %out, i64 %tid.ext216 %a = load volatile float, ptr addrspace(1) %a.gep217 %max = call float @llvm.maximum.f32(float %a, float 0.0)218 %fneg = fneg float %max219 store float %fneg, ptr addrspace(1) %out.gep220 ret void221}222 223; GCN-LABEL: {{^}}v_fneg_0_maximum_foldable_use_f32:224; GCN: global_load_b32 [[A:v[0-9]+]]225; GCN: global_load_b32 [[B:v[0-9]+]]226; GCN: v_maximum_f32 [[MAX:v[0-9]+]], [[A]], 0227; GCN: v_mul_f32_e64 [[RESULT:v[0-9]+]], -[[MAX]], [[B]]228; GCN: global_store_b32 v[{{[0-9:]+}}], [[RESULT]]229define void @v_fneg_0_maximum_foldable_use_f32(ptr addrspace(1) %out, ptr addrspace(1) %a.ptr, ptr addrspace(1) %b.ptr) {230 %tid = call i32 @llvm.amdgcn.workitem.id.x()231 %tid.ext = sext i32 %tid to i64232 %a.gep = getelementptr inbounds float, ptr addrspace(1) %a.ptr, i64 %tid.ext233 %b.gep = getelementptr inbounds float, ptr addrspace(1) %b.ptr, i64 %tid.ext234 %out.gep = getelementptr inbounds float, ptr addrspace(1) %out, i64 %tid.ext235 %a = load volatile float, ptr addrspace(1) %a.gep236 %b = load volatile float, ptr addrspace(1) %b.gep237 %max = call float @llvm.maximum.f32(float %a, float 0.0)238 %fneg = fneg float %max239 %mul = fmul float %fneg, %b240 store float %mul, ptr addrspace(1) %out.gep241 ret void242}243 244; GCN-LABEL: {{^}}v_fneg_maximum_multi_use_maximum_f32:245; GCN: global_load_b32 [[A:v[0-9]+]]246; GCN: global_load_b32 [[B:v[0-9]+]]247; GCN: v_minimum_f32 [[MAX0:v[0-9]+]], -[[A]], -[[B]]248; GCN-SDAG: v_mul_f32_e32 [[MUL1:v[0-9]+]], -4.0, [[MAX0]]249; GCN-GISEL: v_mul_f32_e64 [[MUL1:v[0-9]+]], -[[MAX0]], 4.0250; GCN: global_store_b32 v[{{[0-9:]+}}], [[MAX0]]251; GCN: global_store_b32 v[{{[0-9:]+}}], [[MUL1]]252define void @v_fneg_maximum_multi_use_maximum_f32(ptr addrspace(1) %out, ptr addrspace(1) %a.ptr, ptr addrspace(1) %b.ptr) {253 %tid = call i32 @llvm.amdgcn.workitem.id.x()254 %tid.ext = sext i32 %tid to i64255 %a.gep = getelementptr inbounds float, ptr addrspace(1) %a.ptr, i64 %tid.ext256 %b.gep = getelementptr inbounds float, ptr addrspace(1) %b.ptr, i64 %tid.ext257 %out.gep = getelementptr inbounds float, ptr addrspace(1) %out, i64 %tid.ext258 %a = load volatile float, ptr addrspace(1) %a.gep259 %b = load volatile float, ptr addrspace(1) %b.gep260 %min = call float @llvm.maximum.f32(float %a, float %b)261 %fneg = fneg float %min262 %use1 = fmul float %min, 4.0263 store volatile float %fneg, ptr addrspace(1) %out264 store volatile float %use1, ptr addrspace(1) %out265 ret void266}267 268declare i32 @llvm.amdgcn.workitem.id.x()269declare float @llvm.minimum.f32(float, float)270declare float @llvm.maximum.f32(float, float)271