Skip to content

Commit d0f07be

Browse files
committed
Fixes bugs and adds DirectX opt test.
1 parent bb2e555 commit d0f07be

File tree

4 files changed

+56
-2
lines changed

4 files changed

+56
-2
lines changed

clang/include/clang/Basic/Builtins.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5086,7 +5086,7 @@ def HLSLIsinf : LangBuiltin<"HLSL_LANG"> {
50865086
def HLSLIsnan : LangBuiltin<"HLSL_LANG"> {
50875087
let Spellings = ["__builtin_hlsl_elementwise_isnan"];
50885088
let Attributes = [NoThrow, Const];
5089-
let Prototype = "int(...)";
5089+
let Prototype = "void(...)";
50905090
}
50915091

50925092
def HLSLLerp : LangBuiltin<"HLSL_LANG"> {

llvm/lib/Target/DirectX/DXILIntrinsicExpansion.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1026,7 +1026,7 @@ static bool expandIntrinsic(Function &F, CallInst *Orig) {
10261026
Result = expand16BitIsInf(Orig);
10271027
break;
10281028
case Intrinsic::dx_isnan:
1029-
Result = expand16BitIsInf(Orig);
1029+
Result = expand16BitIsNaN(Orig);
10301030
break;
10311031
case Intrinsic::dx_lerp:
10321032
Result = expandLerpIntrinsic(Orig);

llvm/lib/Target/DirectX/DirectXTargetTransformInfo.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ bool DirectXTTIImpl::isTargetIntrinsicWithOverloadTypeAtArg(Intrinsic::ID ID,
3030
switch (ID) {
3131
case Intrinsic::dx_asdouble:
3232
case Intrinsic::dx_isinf:
33+
case Intrinsic::dx_isnan:
3334
case Intrinsic::dx_firstbitlow:
3435
case Intrinsic::dx_firstbituhigh:
3536
case Intrinsic::dx_firstbitshigh:

llvm/test/CodeGen/DirectX/isnan.ll

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
; RUN: opt -S -dxil-intrinsic-expansion -scalarizer -dxil-op-lower -mtriple=dxil-pc-shadermodel6.9-library %s | FileCheck %s --check-prefixes=CHECK,SM69CHECK
2+
; RUN: opt -S -dxil-intrinsic-expansion -mtriple=dxil-pc-shadermodel6.8-library %s | FileCheck %s --check-prefixes=CHECK,SMOLDCHECK
3+
4+
; Make sure dxil operation function calls for isnan are generated for float and half.
5+
6+
define noundef i1 @isnan_float(float noundef %a) {
7+
entry:
8+
; SM69CHECK: call i1 @dx.op.isSpecialFloat.f32(i32 8, float %{{.*}}) #[[#ATTR:]]
9+
; SMOLDCHECK: call i1 @llvm.dx.isnan.f32(float %{{.*}})
10+
%dx.isnan = call i1 @llvm.dx.isnan.f32(float %a)
11+
ret i1 %dx.isnan
12+
}
13+
14+
define noundef i1 @isnan_half(half noundef %a) {
15+
entry:
16+
; SM69CHECK: call i1 @dx.op.isSpecialFloat.f16(i32 8, half %{{.*}}) #[[#ATTR]]
17+
; SMOLDCHECK: [[BITCAST:%.*]] = bitcast half %{{.*}} to i16
18+
; SMOLDCHECK: [[ANDHIGH:%.*]] = and i16 [[BITCAST]], 31744
19+
; SMOLDCHECK: [[CMPHIGH:%.*]] = icmp eq i16 [[ANDHIGH]], 31744
20+
; SMOLDCHECK: [[ANDLOW:%.*]] = and i16 [[BITCAST]], 1023
21+
; SMOLDCHECK: [[CMPLOW:%.*]] = icmp ne i16 [[ANDLOW]], 0
22+
; SMOLDCHECK: [[AND:%.*]] = and i1 [[CMPHIGH]], [[CMPLOW]]
23+
%dx.isnan = call i1 @llvm.dx.isnan.f16(half %a)
24+
ret i1 %dx.isnan
25+
}
26+
27+
define noundef <4 x i1> @isnan_half4(<4 x half> noundef %p0) {
28+
entry:
29+
; SM69CHECK: call i1 @dx.op.isSpecialFloat.f16(i32 8, half
30+
; SM69CHECK: call i1 @dx.op.isSpecialFloat.f16(i32 8, half
31+
; SM69CHECK: call i1 @dx.op.isSpecialFloat.f16(i32 8, half
32+
; SM69CHECK: call i1 @dx.op.isSpecialFloat.f16(i32 8, half
33+
; SMOLDCHECK: [[BITCAST:%.*]] = bitcast <4 x half> %{{.*}} to <4 x i16>
34+
; SMOLDCHECK: [[ANDHIGH:%.*]] = and <4 x i16> [[BITCAST]], splat (i16 31744)
35+
; SMOLDCHECK: [[CMPHIGH:%.*]] = icmp eq <4 x i16> [[ANDHIGH]], splat (i16 31744)
36+
; SMOLDCHECK: [[ANDLOW:%.*]] = and <4 x i16> [[BITCAST]], splat (i16 1023)
37+
; SMOLDCHECK: [[CMPLOW:%.*]] = icmp ne <4 x i16> [[ANDLOW]], zeroinitializer
38+
; SMOLDCHECK: [[AND:%.*]] = and <4 x i1> [[CMPHIGH]], [[CMPLOW]]
39+
%hlsl.isnan = call <4 x i1> @llvm.dx.isnan.v4f16(<4 x half> %p0)
40+
ret <4 x i1> %hlsl.isnan
41+
}
42+
43+
define noundef <3 x i1> @isnan_float3(<3 x float> noundef %p0) {
44+
entry:
45+
; SM69CHECK: call i1 @dx.op.isSpecialFloat.f32(i32 8, float
46+
; SM69CHECK: call i1 @dx.op.isSpecialFloat.f32(i32 8, float
47+
; SM69CHECK: call i1 @dx.op.isSpecialFloat.f32(i32 8, float
48+
; SMOLDCHECK: = call <3 x i1> @llvm.dx.isnan.v3f32(<3 x float>
49+
%hlsl.isnan = call <3 x i1> @llvm.dx.isnan.v3f32(<3 x float> %p0)
50+
ret <3 x i1> %hlsl.isnan
51+
}
52+
53+
; CHECK: attributes #{{[0-9]*}} = {{{.*}} memory(none) {{.*}}}

0 commit comments

Comments
 (0)