From f411071d636d83f37ee98ab6a7c36c4c48c8c622 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Wed, 18 Jan 2017 02:10:08 +0000 Subject: [PATCH] DAG: Consider nnan in isKnownNeverNaN llvm-svn: 292328 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 3 +++ llvm/test/CodeGen/AMDGPU/fmed3.ll | 16 ++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index 24aed22e2280..be3eef9234b8 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -3061,6 +3061,9 @@ bool SelectionDAG::isKnownNeverNaN(SDValue Op) const { if (getTarget().Options.NoNaNsFPMath) return true; + if (const BinaryWithFlagsSDNode *BF = dyn_cast(Op)) + return BF->Flags.hasNoNaNs(); + // If the value is a constant, we can obviously see if it is a NaN or not. if (const ConstantFPSDNode *C = dyn_cast(Op)) return !C->getValueAPF().isNaN(); diff --git a/llvm/test/CodeGen/AMDGPU/fmed3.ll b/llvm/test/CodeGen/AMDGPU/fmed3.ll index e66678069130..44889c9c4721 100644 --- a/llvm/test/CodeGen/AMDGPU/fmed3.ll +++ b/llvm/test/CodeGen/AMDGPU/fmed3.ll @@ -7,6 +7,22 @@ declare float @llvm.maxnum.f32(float, float) #0 declare double @llvm.minnum.f64(double, double) #0 declare double @llvm.maxnum.f64(double, double) #0 +; GCN-LABEL: {{^}}v_test_nnan_input_fmed3_r_i_i_f32: +; GCN: v_add_f32_e32 [[ADD:v[0-9]+]], 1.0, v{{[0-9]+}} +; GCN: v_med3_f32 v{{[0-9]+}}, [[ADD]], 2.0, 4.0 +define void @v_test_nnan_input_fmed3_r_i_i_f32(float addrspace(1)* %out, float addrspace(1)* %aptr) #1 { + %tid = call i32 @llvm.amdgcn.workitem.id.x() + %gep0 = getelementptr float, float addrspace(1)* %aptr, i32 %tid + %outgep = getelementptr float, float addrspace(1)* %out, i32 %tid + %a = load float, float addrspace(1)* %gep0 + %a.add = fadd nnan float %a, 1.0 + %max = call float @llvm.maxnum.f32(float %a.add, float 2.0) + %med = call float @llvm.minnum.f32(float %max, float 4.0) + + store float %med, float addrspace(1)* %outgep + ret void +} + ; GCN-LABEL: {{^}}v_test_fmed3_r_i_i_f32: ; NOSNAN: v_med3_f32 v{{[0-9]+}}, v{{[0-9]+}}, 2.0, 4.0