Skip to content

Commit 72b3aaa

Browse files
committed
update firstbithigh to the correct behavior. both dxil and spirv support 16, 32, and 64 bit now.
1 parent 14ae282 commit 72b3aaa

File tree

11 files changed

+346
-100
lines changed

11 files changed

+346
-100
lines changed

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18870,7 +18870,7 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
1887018870
Value *X = EmitScalarExpr(E->getArg(0));
1887118871

1887218872
return Builder.CreateIntrinsic(
18873-
/*ReturnType=*/X->getType(),
18873+
/*ReturnType=*/ConvertType(E->getType()),
1887418874
getFirstBitHighIntrinsic(CGM.getHLSLRuntime(), E->getArg(0)->getType()),
1887518875
ArrayRef<Value *>{X}, nullptr, "hlsl.firstbithigh");
1887618876
}

clang/lib/Headers/hlsl/hlsl_intrinsics.h

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1010,38 +1010,38 @@ float4 exp2(float4);
10101010
#ifdef __HLSL_ENABLE_16_BIT
10111011
_HLSL_AVAILABILITY(shadermodel, 6.2)
10121012
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1013-
int16_t firstbithigh(int16_t);
1013+
uint firstbithigh(int16_t);
10141014
_HLSL_AVAILABILITY(shadermodel, 6.2)
10151015
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1016-
int16_t2 firstbithigh(int16_t2);
1016+
uint2 firstbithigh(int16_t2);
10171017
_HLSL_AVAILABILITY(shadermodel, 6.2)
10181018
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1019-
int16_t3 firstbithigh(int16_t3);
1019+
uint3 firstbithigh(int16_t3);
10201020
_HLSL_AVAILABILITY(shadermodel, 6.2)
10211021
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1022-
int16_t4 firstbithigh(int16_t4);
1022+
uint4 firstbithigh(int16_t4);
10231023
_HLSL_AVAILABILITY(shadermodel, 6.2)
10241024
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1025-
uint16_t firstbithigh(uint16_t);
1025+
uint firstbithigh(uint16_t);
10261026
_HLSL_AVAILABILITY(shadermodel, 6.2)
10271027
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1028-
uint16_t2 firstbithigh(uint16_t2);
1028+
uint2 firstbithigh(uint16_t2);
10291029
_HLSL_AVAILABILITY(shadermodel, 6.2)
10301030
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1031-
uint16_t3 firstbithigh(uint16_t3);
1031+
uint3 firstbithigh(uint16_t3);
10321032
_HLSL_AVAILABILITY(shadermodel, 6.2)
10331033
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1034-
uint16_t4 firstbithigh(uint16_t4);
1034+
uint4 firstbithigh(uint16_t4);
10351035
#endif
10361036

10371037
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1038-
int firstbithigh(int);
1038+
uint firstbithigh(int);
10391039
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1040-
int2 firstbithigh(int2);
1040+
uint2 firstbithigh(int2);
10411041
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1042-
int3 firstbithigh(int3);
1042+
uint3 firstbithigh(int3);
10431043
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1044-
int4 firstbithigh(int4);
1044+
uint4 firstbithigh(int4);
10451045

10461046
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
10471047
uint firstbithigh(uint);
@@ -1053,22 +1053,22 @@ _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
10531053
uint4 firstbithigh(uint4);
10541054

10551055
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1056-
int64_t firstbithigh(int64_t);
1056+
uint firstbithigh(int64_t);
10571057
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1058-
int64_t2 firstbithigh(int64_t2);
1058+
uint2 firstbithigh(int64_t2);
10591059
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1060-
int64_t3 firstbithigh(int64_t3);
1060+
uint3 firstbithigh(int64_t3);
10611061
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1062-
int64_t4 firstbithigh(int64_t4);
1062+
uint4 firstbithigh(int64_t4);
10631063

10641064
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1065-
uint64_t firstbithigh(uint64_t);
1065+
uint firstbithigh(uint64_t);
10661066
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1067-
uint64_t2 firstbithigh(uint64_t2);
1067+
uint2 firstbithigh(uint64_t2);
10681068
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1069-
uint64_t3 firstbithigh(uint64_t3);
1069+
uint3 firstbithigh(uint64_t3);
10701070
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1071-
uint64_t4 firstbithigh(uint64_t4);
1071+
uint4 firstbithigh(uint64_t4);
10721072

10731073
//===----------------------------------------------------------------------===//
10741074
// floor builtins

clang/lib/Sema/SemaHLSL.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1955,16 +1955,20 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) {
19551955
QualType ArgTy = Arg->getType();
19561956
QualType EltTy = ArgTy;
19571957

1958-
if (auto *VecTy = EltTy->getAs<VectorType>())
1958+
QualType ResTy = SemaRef.Context.UnsignedIntTy;
1959+
1960+
if (auto *VecTy = EltTy->getAs<VectorType>()) {
19591961
EltTy = VecTy->getElementType();
1962+
ResTy = SemaRef.Context.getVectorType(ResTy, VecTy->getNumElements(), VecTy->getVectorKind());
1963+
}
19601964

19611965
if (!EltTy->isIntegerType()) {
19621966
Diag(Arg->getBeginLoc(), diag::err_builtin_invalid_arg_type)
19631967
<< 1 << /* integer ty */ 6 << ArgTy;
19641968
return true;
19651969
}
19661970

1967-
TheCall->setType(ArgTy);
1971+
TheCall->setType(ResTy);
19681972
break;
19691973
}
19701974
case Builtin::BI__builtin_hlsl_select: {

clang/test/CodeGenHLSL/builtins/firstbithigh.hlsl

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -8,50 +8,50 @@
88

99
#ifdef __HLSL_ENABLE_16_BIT
1010
// CHECK-LABEL: test_firstbithigh_ushort
11-
// CHECK: call i16 @llvm.[[TARGET]].firstbituhigh.i16
12-
int test_firstbithigh_ushort(uint16_t p0) {
11+
// CHECK: call i32 @llvm.[[TARGET]].firstbituhigh.i16
12+
uint test_firstbithigh_ushort(uint16_t p0) {
1313
return firstbithigh(p0);
1414
}
1515

1616
// CHECK-LABEL: test_firstbithigh_ushort2
17-
// CHECK: call <2 x i16> @llvm.[[TARGET]].firstbituhigh.v2i16
18-
uint16_t2 test_firstbithigh_ushort2(uint16_t2 p0) {
17+
// CHECK: call <2 x i32> @llvm.[[TARGET]].firstbituhigh.v2i16
18+
uint2 test_firstbithigh_ushort2(uint16_t2 p0) {
1919
return firstbithigh(p0);
2020
}
2121

2222
// CHECK-LABEL: test_firstbithigh_ushort3
23-
// CHECK: call <3 x i16> @llvm.[[TARGET]].firstbituhigh.v3i16
24-
uint16_t3 test_firstbithigh_ushort3(uint16_t3 p0) {
23+
// CHECK: call <3 x i32> @llvm.[[TARGET]].firstbituhigh.v3i16
24+
uint3 test_firstbithigh_ushort3(uint16_t3 p0) {
2525
return firstbithigh(p0);
2626
}
2727

2828
// CHECK-LABEL: test_firstbithigh_ushort4
29-
// CHECK: call <4 x i16> @llvm.[[TARGET]].firstbituhigh.v4i16
30-
uint16_t4 test_firstbithigh_ushort4(uint16_t4 p0) {
29+
// CHECK: call <4 x i32> @llvm.[[TARGET]].firstbituhigh.v4i16
30+
uint4 test_firstbithigh_ushort4(uint16_t4 p0) {
3131
return firstbithigh(p0);
3232
}
3333

3434
// CHECK-LABEL: test_firstbithigh_short
35-
// CHECK: call i16 @llvm.[[TARGET]].firstbitshigh.i16
36-
int16_t test_firstbithigh_short(int16_t p0) {
35+
// CHECK: call i32 @llvm.[[TARGET]].firstbitshigh.i16
36+
uint test_firstbithigh_short(int16_t p0) {
3737
return firstbithigh(p0);
3838
}
3939

4040
// CHECK-LABEL: test_firstbithigh_short2
41-
// CHECK: call <2 x i16> @llvm.[[TARGET]].firstbitshigh.v2i16
42-
int16_t2 test_firstbithigh_short2(int16_t2 p0) {
41+
// CHECK: call <2 x i32> @llvm.[[TARGET]].firstbitshigh.v2i16
42+
uint2 test_firstbithigh_short2(int16_t2 p0) {
4343
return firstbithigh(p0);
4444
}
4545

4646
// CHECK-LABEL: test_firstbithigh_short3
47-
// CHECK: call <3 x i16> @llvm.[[TARGET]].firstbitshigh.v3i16
48-
int16_t3 test_firstbithigh_short3(int16_t3 p0) {
47+
// CHECK: call <3 x i32> @llvm.[[TARGET]].firstbitshigh.v3i16
48+
uint3 test_firstbithigh_short3(int16_t3 p0) {
4949
return firstbithigh(p0);
5050
}
5151

5252
// CHECK-LABEL: test_firstbithigh_short4
53-
// CHECK: call <4 x i16> @llvm.[[TARGET]].firstbitshigh.v4i16
54-
int16_t4 test_firstbithigh_short4(int16_t4 p0) {
53+
// CHECK: call <4 x i32> @llvm.[[TARGET]].firstbitshigh.v4i16
54+
uint4 test_firstbithigh_short4(int16_t4 p0) {
5555
return firstbithigh(p0);
5656
}
5757
#endif // __HLSL_ENABLE_16_BIT
@@ -81,73 +81,73 @@ uint4 test_firstbithigh_uint4(uint4 p0) {
8181
}
8282

8383
// CHECK-LABEL: test_firstbithigh_ulong
84-
// CHECK: call i64 @llvm.[[TARGET]].firstbituhigh.i64
85-
uint64_t test_firstbithigh_ulong(uint64_t p0) {
84+
// CHECK: call i32 @llvm.[[TARGET]].firstbituhigh.i64
85+
uint test_firstbithigh_ulong(uint64_t p0) {
8686
return firstbithigh(p0);
8787
}
8888

8989
// CHECK-LABEL: test_firstbithigh_ulong2
90-
// CHECK: call <2 x i64> @llvm.[[TARGET]].firstbituhigh.v2i64
91-
uint64_t2 test_firstbithigh_ulong2(uint64_t2 p0) {
90+
// CHECK: call <2 x i32> @llvm.[[TARGET]].firstbituhigh.v2i64
91+
uint2 test_firstbithigh_ulong2(uint64_t2 p0) {
9292
return firstbithigh(p0);
9393
}
9494

9595
// CHECK-LABEL: test_firstbithigh_ulong3
96-
// CHECK: call <3 x i64> @llvm.[[TARGET]].firstbituhigh.v3i64
97-
uint64_t3 test_firstbithigh_ulong3(uint64_t3 p0) {
96+
// CHECK: call <3 x i32> @llvm.[[TARGET]].firstbituhigh.v3i64
97+
uint3 test_firstbithigh_ulong3(uint64_t3 p0) {
9898
return firstbithigh(p0);
9999
}
100100

101101
// CHECK-LABEL: test_firstbithigh_ulong4
102-
// CHECK: call <4 x i64> @llvm.[[TARGET]].firstbituhigh.v4i64
103-
uint64_t4 test_firstbithigh_ulong4(uint64_t4 p0) {
102+
// CHECK: call <4 x i32> @llvm.[[TARGET]].firstbituhigh.v4i64
103+
uint4 test_firstbithigh_ulong4(uint64_t4 p0) {
104104
return firstbithigh(p0);
105105
}
106106

107107
// CHECK-LABEL: test_firstbithigh_int
108108
// CHECK: call i32 @llvm.[[TARGET]].firstbitshigh.i32
109-
int test_firstbithigh_int(int p0) {
109+
uint test_firstbithigh_int(int p0) {
110110
return firstbithigh(p0);
111111
}
112112

113113
// CHECK-LABEL: test_firstbithigh_int2
114114
// CHECK: call <2 x i32> @llvm.[[TARGET]].firstbitshigh.v2i32
115-
int2 test_firstbithigh_int2(int2 p0) {
115+
uint2 test_firstbithigh_int2(int2 p0) {
116116
return firstbithigh(p0);
117117
}
118118

119119
// CHECK-LABEL: test_firstbithigh_int3
120120
// CHECK: call <3 x i32> @llvm.[[TARGET]].firstbitshigh.v3i32
121-
int3 test_firstbithigh_int3(int3 p0) {
121+
uint3 test_firstbithigh_int3(int3 p0) {
122122
return firstbithigh(p0);
123123
}
124124

125125
// CHECK-LABEL: test_firstbithigh_int4
126126
// CHECK: call <4 x i32> @llvm.[[TARGET]].firstbitshigh.v4i32
127-
int4 test_firstbithigh_int4(int4 p0) {
127+
uint4 test_firstbithigh_int4(int4 p0) {
128128
return firstbithigh(p0);
129129
}
130130

131131
// CHECK-LABEL: test_firstbithigh_long
132-
// CHECK: call i64 @llvm.[[TARGET]].firstbitshigh.i64
133-
int64_t test_firstbithigh_long(int64_t p0) {
132+
// CHECK: call i32 @llvm.[[TARGET]].firstbitshigh.i64
133+
uint test_firstbithigh_long(int64_t p0) {
134134
return firstbithigh(p0);
135135
}
136136

137137
// CHECK-LABEL: test_firstbithigh_long2
138-
// CHECK: call <2 x i64> @llvm.[[TARGET]].firstbitshigh.v2i64
139-
int64_t2 test_firstbithigh_long2(int64_t2 p0) {
138+
// CHECK: call <2 x i32> @llvm.[[TARGET]].firstbitshigh.v2i64
139+
uint2 test_firstbithigh_long2(int64_t2 p0) {
140140
return firstbithigh(p0);
141141
}
142142

143143
// CHECK-LABEL: test_firstbithigh_long3
144-
// CHECK: call <3 x i64> @llvm.[[TARGET]].firstbitshigh.v3i64
145-
int64_t3 test_firstbithigh_long3(int64_t3 p0) {
144+
// CHECK: call <3 x i32> @llvm.[[TARGET]].firstbitshigh.v3i64
145+
uint3 test_firstbithigh_long3(int64_t3 p0) {
146146
return firstbithigh(p0);
147147
}
148148

149149
// CHECK-LABEL: test_firstbithigh_long4
150-
// CHECK: call <4 x i64> @llvm.[[TARGET]].firstbitshigh.v4i64
151-
int64_t4 test_firstbithigh_long4(int64_t4 p0) {
150+
// CHECK: call <4 x i32> @llvm.[[TARGET]].firstbitshigh.v4i64
151+
uint4 test_firstbithigh_long4(int64_t4 p0) {
152152
return firstbithigh(p0);
153153
}

llvm/include/llvm/IR/IntrinsicsDirectX.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,6 @@ def int_dx_step : DefaultAttrsIntrinsic<[LLVMMatchType<0>], [llvm_anyfloat_ty, L
9292
def int_dx_splitdouble : DefaultAttrsIntrinsic<[llvm_anyint_ty, LLVMMatchType<0>],
9393
[LLVMScalarOrSameVectorWidth<0, llvm_double_ty>], [IntrNoMem]>;
9494
def int_dx_radians : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>], [IntrNoMem]>;
95-
def int_dx_firstbituhigh : DefaultAttrsIntrinsic<[llvm_anyint_ty], [LLVMMatchType<0>], [IntrNoMem]>;
96-
def int_dx_firstbitshigh : DefaultAttrsIntrinsic<[llvm_anyint_ty], [LLVMMatchType<0>], [IntrNoMem]>;
95+
def int_dx_firstbituhigh : DefaultAttrsIntrinsic<[LLVMScalarOrSameVectorWidth<0, llvm_i32_ty>], [llvm_anyint_ty], [IntrNoMem]>;
96+
def int_dx_firstbitshigh : DefaultAttrsIntrinsic<[LLVMScalarOrSameVectorWidth<0, llvm_i32_ty>], [llvm_anyint_ty], [IntrNoMem]>;
9797
}

llvm/include/llvm/IR/IntrinsicsSPIRV.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,6 @@ let TargetPrefix = "spv" in {
9898
[llvm_any_ty],
9999
[llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i32_ty, llvm_i1_ty],
100100
[IntrNoMem]>;
101-
def int_spv_firstbituhigh : DefaultAttrsIntrinsic<[llvm_anyint_ty], [LLVMMatchType<0>], [IntrNoMem]>;
102-
def int_spv_firstbitshigh : DefaultAttrsIntrinsic<[llvm_anyint_ty], [LLVMMatchType<0>], [IntrNoMem]>;
101+
def int_spv_firstbituhigh : DefaultAttrsIntrinsic<[LLVMScalarOrSameVectorWidth<0, llvm_i32_ty>], [llvm_anyint_ty], [IntrNoMem]>;
102+
def int_spv_firstbitshigh : DefaultAttrsIntrinsic<[LLVMScalarOrSameVectorWidth<0, llvm_i32_ty>], [llvm_anyint_ty], [IntrNoMem]>;
103103
}

llvm/lib/Target/DirectX/DXIL.td

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -564,24 +564,24 @@ def CountBits : DXILOp<31, unaryBits> {
564564
let attributes = [Attributes<DXIL1_0, [ReadNone]>];
565565
}
566566

567-
def FirstbitHi : DXILOp<33, unaryBits> {
567+
def FirstbitHi : DXILOp<33, unary> {
568568
let Doc = "Returns the location of the first set bit starting from "
569569
"the highest order bit and working downward.";
570570
let LLVMIntrinsic = int_dx_firstbituhigh;
571571
let arguments = [OverloadTy];
572-
let result = OverloadTy;
572+
let result = Int32Ty;
573573
let overloads =
574574
[Overloads<DXIL1_0, [Int16Ty, Int32Ty, Int64Ty]>];
575575
let stages = [Stages<DXIL1_0, [all_stages]>];
576576
let attributes = [Attributes<DXIL1_0, [ReadNone]>];
577577
}
578578

579-
def FirstbitSHi : DXILOp<34, unaryBits> {
579+
def FirstbitSHi : DXILOp<34, unary> {
580580
let Doc = "Returns the location of the first set bit from "
581581
"the highest order bit based on the sign.";
582582
let LLVMIntrinsic = int_dx_firstbitshigh;
583583
let arguments = [OverloadTy];
584-
let result = OverloadTy;
584+
let result = Int32Ty;
585585
let overloads =
586586
[Overloads<DXIL1_0, [Int16Ty, Int32Ty, Int64Ty]>];
587587
let stages = [Stages<DXIL1_0, [all_stages]>];

llvm/lib/Target/SPIRV/SPIRVGlobalRegistry.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,7 @@ Register SPIRVGlobalRegistry::getOrCreateCompositeOrNull(
424424
LLT LLTy = LLT::scalar(64);
425425
Register SpvVecConst =
426426
CurMF->getRegInfo().createGenericVirtualRegister(LLTy);
427-
CurMF->getRegInfo().setRegClass(SpvVecConst, &SPIRV::iIDRegClass);
427+
CurMF->getRegInfo().setRegClass(SpvVecConst, getRegClass(SpvType));
428428
assignSPIRVTypeToVReg(SpvType, SpvVecConst, *CurMF);
429429
DT.add(CA, CurMF, SpvVecConst);
430430
MachineInstrBuilder MIB;

0 commit comments

Comments
 (0)