1- ; RUN: opt -S -scalarizer -dxil-op-lower -mtriple=dxil-pc-shadermodel6.3-library %s | FileCheck %s
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 -scalarizer -dxil-op-lower -mtriple=dxil-pc-shadermodel6.8-library %s | FileCheck %s --check-prefixes=CHECK,SMOLDCHECK
23
34; Make sure dxil operation function calls for isinf are generated for float and half.
45
@@ -11,17 +12,47 @@ entry:
1112
1213define noundef i1 @isinf_half (half noundef %a ) {
1314entry:
14- ; CHECK: call i1 @dx.op.isSpecialFloat.f16(i32 9, half %{{.*}}) #[[#ATTR]]
15+ ; SM69CHECK: call i1 @dx.op.isSpecialFloat.f16(i32 9, half %{{.*}}) #[[#ATTR]]
16+ ; SMOLDCHECK: [[BITCAST:%.*]] = bitcast half %a to i16
17+ ; SMOLDCHECK: [[CMPHIGH:%.*]] = icmp eq i16 [[BITCAST]], 31744
18+ ; SMOLDCHECK: [[CMPLOW:%.*]] = icmp eq i16 [[BITCAST]], -1024
19+ ; SMOLDCHECK: [[OR:%.*]] = or i1 [[CMPHIGH]], [[CMPLOW]]
1520 %dx.isinf = call i1 @llvm.dx.isinf.f16 (half %a )
1621 ret i1 %dx.isinf
1722}
1823
1924define noundef <4 x i1 > @isinf_half4 (<4 x half > noundef %p0 ) {
2025entry:
21- ; CHECK: call i1 @dx.op.isSpecialFloat.f16(i32 9, half
22- ; CHECK: call i1 @dx.op.isSpecialFloat.f16(i32 9, half
23- ; CHECK: call i1 @dx.op.isSpecialFloat.f16(i32 9, half
24- ; CHECK: call i1 @dx.op.isSpecialFloat.f16(i32 9, half
26+ ; SM69CHECK: call i1 @dx.op.isSpecialFloat.f16(i32 9, half
27+ ; SM69CHECK: call i1 @dx.op.isSpecialFloat.f16(i32 9, half
28+ ; SM69CHECK: call i1 @dx.op.isSpecialFloat.f16(i32 9, half
29+ ; SM69CHECK: call i1 @dx.op.isSpecialFloat.f16(i32 9, half
30+
31+ ; SMOLDCHECK: [[ee0:%.*]] = extractelement <4 x half> %p0, i64 0
32+ ; SMOLDCHECK: [[BITCAST0:%.*]] = bitcast half [[ee0]] to i16
33+ ; SMOLDCHECK: [[ee1:%.*]] = extractelement <4 x half> %p0, i64 1
34+ ; SMOLDCHECK: [[BITCAST1:%.*]] = bitcast half [[ee1]] to i16
35+ ; SMOLDCHECK:[[ee2:%.*]] = extractelement <4 x half> %p0, i64 2
36+ ; SMOLDCHECK: [[BITCAST2:%.*]] = bitcast half [[ee2]] to i16
37+ ; SMOLDCHECK: [[ee3:%.*]] = extractelement <4 x half> %p0, i64 3
38+ ; SMOLDCHECK: [[BITCAST3:%.*]] = bitcast half [[ee3]] to i16
39+ ; SMOLDCHECK: [[ICMPHIGH0:%.*]] = icmp eq i16 [[BITCAST0]], 31744
40+ ; SMOLDCHECK: [[ICMPHIGH1:%.*]] = icmp eq i16 [[BITCAST1]], 31744
41+ ; SMOLDCHECK: [[ICMPHIGH2:%.*]] = icmp eq i16 [[BITCAST2]], 31744
42+ ; SMOLDCHECK: [[ICMPHIGH3:%.*]] = icmp eq i16 [[BITCAST3]], 31744
43+ ; SMOLDCHECK: [[ICMPLOW0:%.*]] = icmp eq i16 [[BITCAST0]], -1024
44+ ; SMOLDCHECK: [[ICMPLOW1:%.*]] = icmp eq i16 [[BITCAST1]], -1024
45+ ; SMOLDCHECK: [[ICMPLOW2:%.*]] = icmp eq i16 [[BITCAST2]], -1024
46+ ; SMOLDCHECK: [[ICMPLOW3:%.*]] = icmp eq i16 [[BITCAST3]], -1024
47+ ; SMOLDCHECK: [[OR0:%.*]] = or i1 [[ICMPHIGH0]], [[ICMPLOW0]]
48+ ; SMOLDCHECK: [[OR1:%.*]] = or i1 [[ICMPHIGH1]], [[ICMPLOW1]]
49+ ; SMOLDCHECK: [[OR2:%.*]] = or i1 [[ICMPHIGH2]], [[ICMPLOW2]]
50+ ; SMOLDCHECK: [[OR3:%.*]] = or i1 [[ICMPHIGH3]], [[ICMPLOW3]]
51+ ; SMOLDCHECK: %.upto019 = insertelement <4 x i1> poison, i1 [[OR0]], i64 0
52+ ; SMOLDCHECK: %.upto120 = insertelement <4 x i1> %.upto019, i1 [[OR1]], i64 1
53+ ; SMOLDCHECK: %.upto221 = insertelement <4 x i1> %.upto120, i1 [[OR2]], i64 2
54+ ; SMOLDCHECK: %0 = insertelement <4 x i1> %.upto221, i1 [[OR3]], i64 3
55+
2556 %hlsl.isinf = call <4 x i1 > @llvm.dx.isinf.v4f16 (<4 x half > %p0 )
2657 ret <4 x i1 > %hlsl.isinf
2758}
0 commit comments