brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.4 KiB · 62c62c9 Raw
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