forked from OSchip/llvm-project
parent
ce9d04ce58
commit
f411071d63
|
@ -3061,6 +3061,9 @@ bool SelectionDAG::isKnownNeverNaN(SDValue Op) const {
|
|||
if (getTarget().Options.NoNaNsFPMath)
|
||||
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 (const ConstantFPSDNode *C = dyn_cast<ConstantFPSDNode>(Op))
|
||||
return !C->getValueAPF().isNaN();
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue