DAG: Consider nnan in isKnownNeverNaN

llvm-svn: 292328
This commit is contained in:
Matt Arsenault 2017-01-18 02:10:08 +00:00
parent ce9d04ce58
commit f411071d63
2 changed files with 19 additions and 0 deletions

View File

@ -3061,6 +3061,9 @@ bool SelectionDAG::isKnownNeverNaN(SDValue Op) const {
if (getTarget().Options.NoNaNsFPMath) if (getTarget().Options.NoNaNsFPMath)
return true; return true;
if (const BinaryWithFlagsSDNode *BF = dyn_cast<BinaryWithFlagsSDNode>(Op))
return BF->Flags.hasNoNaNs();
// If the value is a constant, we can obviously see if it is a NaN or not. // If the value is a constant, we can obviously see if it is a NaN or not.
if (const ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(Op)) if (const ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(Op))
return !C->getValueAPF().isNaN(); return !C->getValueAPF().isNaN();

View File

@ -7,6 +7,22 @@ declare float @llvm.maxnum.f32(float, float) #0
declare double @llvm.minnum.f64(double, double) #0 declare double @llvm.minnum.f64(double, double) #0
declare double @llvm.maxnum.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: ; GCN-LABEL: {{^}}v_test_fmed3_r_i_i_f32:
; NOSNAN: v_med3_f32 v{{[0-9]+}}, v{{[0-9]+}}, 2.0, 4.0 ; NOSNAN: v_med3_f32 v{{[0-9]+}}, v{{[0-9]+}}, 2.0, 4.0