Return type of DXIL Ops may be different from valid overload type of the parameters, if any. Such DXIL Ops are correctly represented in DXIL.td. However, DXILEmitter assumes the return type to be the same as parameter overload type, if one exists. This results in generation in incorrect overload index value in DXILOperation.inc for the DXIL Op and incorrect DXIL operation function call in DXILOpLowering pass. This change distinguishes return types correctly from parameter overload types in DXILEmitter backend to handle such DXIL ops. Add specification for DXIL Op `isinf` and corresponding tests to verify the above change. Fixes issue #85125
26 lines
846 B
LLVM
26 lines
846 B
LLVM
; RUN: opt -S -dxil-op-lower < %s | FileCheck %s
|
|
|
|
; Make sure dxil operation function calls for isinf are generated for float and half.
|
|
; CHECK: call i1 @dx.op.isSpecialFloat.f32(i32 9, float %{{.*}})
|
|
; CHECK: call i1 @dx.op.isSpecialFloat.f16(i32 9, half %{{.*}})
|
|
|
|
; Function Attrs: noinline nounwind optnone
|
|
define noundef i1 @isinf_float(float noundef %a) #0 {
|
|
entry:
|
|
%a.addr = alloca float, align 4
|
|
store float %a, ptr %a.addr, align 4
|
|
%0 = load float, ptr %a.addr, align 4
|
|
%dx.isinf = call i1 @llvm.dx.isinf.f32(float %0)
|
|
ret i1 %dx.isinf
|
|
}
|
|
|
|
; Function Attrs: noinline nounwind optnone
|
|
define noundef i1 @isinf_half(half noundef %p0) #0 {
|
|
entry:
|
|
%p0.addr = alloca half, align 2
|
|
store half %p0, ptr %p0.addr, align 2
|
|
%0 = load half, ptr %p0.addr, align 2
|
|
%dx.isinf = call i1 @llvm.dx.isinf.f16(half %0)
|
|
ret i1 %dx.isinf
|
|
}
|