Skip to content

Commit 5836394

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

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
@@ -18880,7 +18880,7 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID,
1888018880
Value *X = EmitScalarExpr(E->getArg(0));
1888118881

1888218882
return Builder.CreateIntrinsic(
18883-
/*ReturnType=*/X->getType(),
18883+
/*ReturnType=*/ConvertType(E->getType()),
1888418884
getFirstBitHighIntrinsic(CGM.getHLSLRuntime(), E->getArg(0)->getType()),
1888518885
ArrayRef<Value *>{X}, nullptr, "hlsl.firstbithigh");
1888618886
}

clang/lib/Headers/hlsl/hlsl_intrinsics.h

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1020,38 +1020,38 @@ float4 exp2(float4);
10201020
#ifdef __HLSL_ENABLE_16_BIT
10211021
_HLSL_AVAILABILITY(shadermodel, 6.2)
10221022
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1023-
int16_t firstbithigh(int16_t);
1023+
uint firstbithigh(int16_t);
10241024
_HLSL_AVAILABILITY(shadermodel, 6.2)
10251025
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1026-
int16_t2 firstbithigh(int16_t2);
1026+
uint2 firstbithigh(int16_t2);
10271027
_HLSL_AVAILABILITY(shadermodel, 6.2)
10281028
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1029-
int16_t3 firstbithigh(int16_t3);
1029+
uint3 firstbithigh(int16_t3);
10301030
_HLSL_AVAILABILITY(shadermodel, 6.2)
10311031
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1032-
int16_t4 firstbithigh(int16_t4);
1032+
uint4 firstbithigh(int16_t4);
10331033
_HLSL_AVAILABILITY(shadermodel, 6.2)
10341034
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1035-
uint16_t firstbithigh(uint16_t);
1035+
uint firstbithigh(uint16_t);
10361036
_HLSL_AVAILABILITY(shadermodel, 6.2)
10371037
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1038-
uint16_t2 firstbithigh(uint16_t2);
1038+
uint2 firstbithigh(uint16_t2);
10391039
_HLSL_AVAILABILITY(shadermodel, 6.2)
10401040
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1041-
uint16_t3 firstbithigh(uint16_t3);
1041+
uint3 firstbithigh(uint16_t3);
10421042
_HLSL_AVAILABILITY(shadermodel, 6.2)
10431043
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1044-
uint16_t4 firstbithigh(uint16_t4);
1044+
uint4 firstbithigh(uint16_t4);
10451045
#endif
10461046

10471047
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1048-
int firstbithigh(int);
1048+
uint firstbithigh(int);
10491049
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1050-
int2 firstbithigh(int2);
1050+
uint2 firstbithigh(int2);
10511051
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1052-
int3 firstbithigh(int3);
1052+
uint3 firstbithigh(int3);
10531053
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1054-
int4 firstbithigh(int4);
1054+
uint4 firstbithigh(int4);
10551055

10561056
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
10571057
uint firstbithigh(uint);
@@ -1063,22 +1063,22 @@ _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
10631063
uint4 firstbithigh(uint4);
10641064

10651065
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1066-
int64_t firstbithigh(int64_t);
1066+
uint firstbithigh(int64_t);
10671067
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1068-
int64_t2 firstbithigh(int64_t2);
1068+
uint2 firstbithigh(int64_t2);
10691069
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1070-
int64_t3 firstbithigh(int64_t3);
1070+
uint3 firstbithigh(int64_t3);
10711071
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1072-
int64_t4 firstbithigh(int64_t4);
1072+
uint4 firstbithigh(int64_t4);
10731073

10741074
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1075-
uint64_t firstbithigh(uint64_t);
1075+
uint firstbithigh(uint64_t);
10761076
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1077-
uint64_t2 firstbithigh(uint64_t2);
1077+
uint2 firstbithigh(uint64_t2);
10781078
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1079-
uint64_t3 firstbithigh(uint64_t3);
1079+
uint3 firstbithigh(uint64_t3);
10801080
_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_firstbithigh)
1081-
uint64_t4 firstbithigh(uint64_t4);
1081+
uint4 firstbithigh(uint64_t4);
10821082

10831083
//===----------------------------------------------------------------------===//
10841084
// 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
@@ -93,6 +93,6 @@ def int_dx_step : DefaultAttrsIntrinsic<[LLVMMatchType<0>], [llvm_anyfloat_ty, L
9393
def int_dx_splitdouble : DefaultAttrsIntrinsic<[llvm_anyint_ty, LLVMMatchType<0>],
9494
[LLVMScalarOrSameVectorWidth<0, llvm_double_ty>], [IntrNoMem]>;
9595
def int_dx_radians : DefaultAttrsIntrinsic<[llvm_anyfloat_ty], [LLVMMatchType<0>], [IntrNoMem]>;
96-
def int_dx_firstbituhigh : DefaultAttrsIntrinsic<[llvm_anyint_ty], [LLVMMatchType<0>], [IntrNoMem]>;
97-
def int_dx_firstbitshigh : DefaultAttrsIntrinsic<[llvm_anyint_ty], [LLVMMatchType<0>], [IntrNoMem]>;
96+
def int_dx_firstbituhigh : DefaultAttrsIntrinsic<[LLVMScalarOrSameVectorWidth<0, llvm_i32_ty>], [llvm_anyint_ty], [IntrNoMem]>;
97+
def int_dx_firstbitshigh : DefaultAttrsIntrinsic<[LLVMScalarOrSameVectorWidth<0, llvm_i32_ty>], [llvm_anyint_ty], [IntrNoMem]>;
9898
}

llvm/include/llvm/IR/IntrinsicsSPIRV.td

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

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)