https://github.com/joaosaffran updated https://github.com/llvm/llvm-project/pull/107292
>From f1ca0a6070aa34bcce92d76df3a2e897d44e5f9c Mon Sep 17 00:00:00 2001 From: Joao Saffran <jdereze...@microsoft.com> Date: Tue, 3 Sep 2024 19:06:22 +0000 Subject: [PATCH 1/2] Adding `asuint` implementation to hlsl --- clang/include/clang/Basic/Builtins.td | 6 +++ clang/lib/CodeGen/CGBuiltin.cpp | 17 +++++++ clang/lib/Headers/hlsl/hlsl_intrinsics.h | 38 ++++++++++----- clang/lib/Sema/SemaHLSL.cpp | 22 +++++++++ clang/test/CodeGenHLSL/builtins/asuint.hlsl | 53 +++++++++++++++++++++ 5 files changed, 125 insertions(+), 11 deletions(-) create mode 100644 clang/test/CodeGenHLSL/builtins/asuint.hlsl diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 9e2a590f265ac8..38de1df11b7b5a 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4745,6 +4745,12 @@ def HLSLRcp : LangBuiltin<"HLSL_LANG"> { let Prototype = "void(...)"; } +def HLSLAsUint : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_elementwise_asuint"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void(...)"; +} + def HLSLRSqrt : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_elementwise_rsqrt"]; let Attributes = [NoThrow, Const]; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index e826c1c6fbbd23..da0cb6581761e5 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -27,9 +27,11 @@ #include "clang/AST/Decl.h" #include "clang/AST/OSLog.h" #include "clang/AST/OperationKinds.h" +#include "clang/Basic/Builtins.h" #include "clang/Basic/TargetBuiltins.h" #include "clang/Basic/TargetInfo.h" #include "clang/Basic/TargetOptions.h" +#include "clang/Basic/TokenKinds.h" #include "clang/CodeGen/CGFunctionInfo.h" #include "clang/Frontend/FrontendDiagnostic.h" #include "llvm/ADT/APFloat.h" @@ -39,6 +41,7 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/Analysis/ValueTracking.h" #include "llvm/IR/DataLayout.h" +#include "llvm/IR/DerivedTypes.h" #include "llvm/IR/InlineAsm.h" #include "llvm/IR/Intrinsics.h" #include "llvm/IR/IntrinsicsAArch64.h" @@ -62,6 +65,7 @@ #include "llvm/Support/ConvertUTF.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/ScopedPrinter.h" +#include "llvm/Support/raw_ostream.h" #include "llvm/TargetParser/AArch64TargetParser.h" #include "llvm/TargetParser/RISCVISAInfo.h" #include "llvm/TargetParser/X86TargetParser.h" @@ -18812,6 +18816,19 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { llvm::FunctionType::get(IntTy, {}, false), "__hlsl_wave_get_lane_index", {}, false, true)); } + case Builtin::BI__builtin_hlsl_elementwise_asuint: { + Value *Op = EmitScalarExpr(E->getArg(0)); + E->dump(); + llvm::Type *DestTy = llvm::Type::getInt32Ty(this->getLLVMContext()); + + if (Op -> getType()->isVectorTy()){ + auto VecTy = E->getArg(0)->getType()->getAs<VectorType>(); + DestTy = llvm::VectorType::get(DestTy, VecTy->getNumElements(), + VecTy->isSizelessVectorType()); + } + + return Builder.CreateBitCast(Op, DestTy); + } case Builtin::BI__builtin_hlsl_wave_is_first_lane: { Intrinsic::ID ID = CGM.getHLSLRuntime().getWaveIsFirstLaneIntrinsic(); return EmitRuntimeCall(Intrinsic::getDeclaration(&CGM.getModule(), ID)); diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index 5c08a45a35377d..18426597569098 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -367,17 +367,6 @@ bool any(double4); /// \brief Returns the arcsine of the input value, \a Val. /// \param Val The input value. -#ifdef __HLSL_ENABLE_16_BIT -_HLSL_BUILTIN_ALIAS(__builtin_elementwise_asin) -half asin(half); -_HLSL_BUILTIN_ALIAS(__builtin_elementwise_asin) -half2 asin(half2); -_HLSL_BUILTIN_ALIAS(__builtin_elementwise_asin) -half3 asin(half3); -_HLSL_BUILTIN_ALIAS(__builtin_elementwise_asin) -half4 asin(half4); -#endif - _HLSL_BUILTIN_ALIAS(__builtin_elementwise_asin) float asin(float); _HLSL_BUILTIN_ALIAS(__builtin_elementwise_asin) @@ -387,6 +376,33 @@ float3 asin(float3); _HLSL_BUILTIN_ALIAS(__builtin_elementwise_asin) float4 asin(float4); +//===----------------------------------------------------------------------===// +// asin builtins +//===----------------------------------------------------------------------===// + +/// \fn uint asin(T Val) +/// \brief Reinterprest. +/// \param Val The input value. + +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint) +uint asuint(float); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint) +uint2 asuint(float2); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint) +uint3 asuint(float3); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint) +uint4 asuint(float4); + + +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint) +uint asuint(double); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint) +uint2 asuint(double2); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint) +uint3 asuint(double3); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint) +uint4 asuint(double4); + //===----------------------------------------------------------------------===// // atan builtins //===----------------------------------------------------------------------===// diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index 778d524a005482..38cc0e5a2d0de0 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -9,9 +9,12 @@ //===----------------------------------------------------------------------===// #include "clang/Sema/SemaHLSL.h" +#include "clang/AST/ASTContext.h" #include "clang/AST/Decl.h" #include "clang/AST/Expr.h" #include "clang/AST/RecursiveASTVisitor.h" +#include "clang/AST/Type.h" +#include "clang/Basic/Builtins.h" #include "clang/Basic/DiagnosticSema.h" #include "clang/Basic/LLVM.h" #include "clang/Basic/SourceLocation.h" @@ -22,6 +25,8 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringRef.h" +#include "llvm/IR/DerivedTypes.h" +#include "llvm/IR/Type.h" #include "llvm/Support/Casting.h" #include "llvm/Support/DXILABI.h" #include "llvm/Support/ErrorHandling.h" @@ -1581,6 +1586,23 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { return true; break; } + case Builtin::BI__builtin_hlsl_elementwise_asuint: { + if (SemaRef.checkArgCount(TheCall, 1)) + return true; + + ExprResult A = TheCall->getArg(0); + QualType ArgTyA = A.get()->getType(); + + if(ArgTyA->isVectorType()){ + auto VecTy = TheCall->getArg(0)->getType()->getAs<VectorType>(); + auto ReturnType = this->getASTContext().getVectorType(TheCall->getCallReturnType(this->getASTContext()), VecTy->getNumElements(), + VectorKind::Generic); + + TheCall->setType(ReturnType); + } + + break; + } case Builtin::BI__builtin_elementwise_acos: case Builtin::BI__builtin_elementwise_asin: case Builtin::BI__builtin_elementwise_atan: diff --git a/clang/test/CodeGenHLSL/builtins/asuint.hlsl b/clang/test/CodeGenHLSL/builtins/asuint.hlsl new file mode 100644 index 00000000000000..33acb00ae11182 --- /dev/null +++ b/clang/test/CodeGenHLSL/builtins/asuint.hlsl @@ -0,0 +1,53 @@ +// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple dxil-pc-shadermodel6.3-library %s -fnative-half-type -emit-llvm -disable-llvm-passes -o - | FileCheck %s + +// // CHECK-LABEL: builtin_test_asuint_float +// // CHECK: bitcast float %0 to i32 +// // CHECK: ret <4 x i32> %dx.clamp +// export uint builtin_test_asuint_float(float p0) { +// return __builtin_hlsl_elementwise_asuint(p0); +// } + + +// // CHECK-LABEL: builtin_test_asuint_float +// // CHECK: bitcast float %0 to i32 +// // CHECK: ret <4 x i32> %dx.clamp +// export uint builtin_test_asuint_double(double p0) { +// return __builtin_hlsl_elementwise_asuint(p0); +// } + + +// // CHECK-LABEL: builtin_test_asuint_float +// // CHECK: bitcast float %0 to i32 +// // CHECK: ret <4 x i32> %dx.clamp +// export uint builtin_test_asuint_half(half p0) { +// return __builtin_hlsl_elementwise_asuint(p0); +// } + + +// // CHECK-LABEL: builtin_test_asuint_float +// // CHECK: bitcast float %0 to i32 +// // CHECK: ret <4 x i32> %dx.clamp +// export uint4 builtin_test_asuint_float_vector(float p0) { +// return __builtin_hlsl_elementwise_asuint(p0); +// } + + +// CHECK-LABEL: builtin_test_asuint_float +// CHECK: bitcast float %0 to i32 +// CHECK: ret <4 x i32> %dx.clamp +export uint4 builtin_test_asuint_floa4t(float p0) { + return asuint(p0); +} + +// export uint4 builtin_test_asuint4_uint(uint p0) { +// return __builtin_hlsl_elementwise_asuint(p0); +// } + + +// export uint4 builtin_test_asuint4_int(int p0) { +// return __builtin_hlsl_elementwise_asuint(p0); +// } + +// export uint builtin_test_asuint_float(float p0) { +// return __builtin_hlsl_elementwise_asuint(p0); +// } \ No newline at end of file >From c7eb945921fba3bd8124d2722d1b3b1a242a44b8 Mon Sep 17 00:00:00 2001 From: Joao Saffran <jdereze...@microsoft.com> Date: Tue, 3 Sep 2024 19:06:22 +0000 Subject: [PATCH 2/2] Adding `asuint` implementation to hlsl --- clang/lib/CodeGen/CGBuiltin.cpp | 9 ++- clang/lib/Headers/hlsl/hlsl_intrinsics.h | 10 ---- clang/lib/Sema/SemaHLSL.cpp | 12 +--- clang/test/CodeGenHLSL/builtins/asuint.hlsl | 66 +++++++-------------- 4 files changed, 27 insertions(+), 70 deletions(-) diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index da0cb6581761e5..0a5f3ad60cb684 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -27,6 +27,7 @@ #include "clang/AST/Decl.h" #include "clang/AST/OSLog.h" #include "clang/AST/OperationKinds.h" +#include "clang/AST/Type.h" #include "clang/Basic/Builtins.h" #include "clang/Basic/TargetBuiltins.h" #include "clang/Basic/TargetInfo.h" @@ -18818,13 +18819,11 @@ case Builtin::BI__builtin_hlsl_elementwise_isinf: { } case Builtin::BI__builtin_hlsl_elementwise_asuint: { Value *Op = EmitScalarExpr(E->getArg(0)); - E->dump(); llvm::Type *DestTy = llvm::Type::getInt32Ty(this->getLLVMContext()); - if (Op -> getType()->isVectorTy()){ - auto VecTy = E->getArg(0)->getType()->getAs<VectorType>(); - DestTy = llvm::VectorType::get(DestTy, VecTy->getNumElements(), - VecTy->isSizelessVectorType()); + if (Op ->getType()->isVectorTy()){ + const VectorType *VecTy = E->getArg(0)->getType()->getAs<VectorType>(); + DestTy = llvm::VectorType::get(DestTy, ElementCount::getFixed(VecTy->getNumElements())); } return Builder.CreateBitCast(Op, DestTy); diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index 18426597569098..b103579952aa0f 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -393,16 +393,6 @@ uint3 asuint(float3); _HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint) uint4 asuint(float4); - -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint) -uint asuint(double); -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint) -uint2 asuint(double2); -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint) -uint3 asuint(double3); -_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_asuint) -uint4 asuint(double4); - //===----------------------------------------------------------------------===// // atan builtins //===----------------------------------------------------------------------===// diff --git a/clang/lib/Sema/SemaHLSL.cpp b/clang/lib/Sema/SemaHLSL.cpp index 38cc0e5a2d0de0..9ff2afd24a5cd4 100644 --- a/clang/lib/Sema/SemaHLSL.cpp +++ b/clang/lib/Sema/SemaHLSL.cpp @@ -1590,16 +1590,8 @@ bool SemaHLSL::CheckBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { if (SemaRef.checkArgCount(TheCall, 1)) return true; - ExprResult A = TheCall->getArg(0); - QualType ArgTyA = A.get()->getType(); - - if(ArgTyA->isVectorType()){ - auto VecTy = TheCall->getArg(0)->getType()->getAs<VectorType>(); - auto ReturnType = this->getASTContext().getVectorType(TheCall->getCallReturnType(this->getASTContext()), VecTy->getNumElements(), - VectorKind::Generic); - - TheCall->setType(ReturnType); - } + if (CheckFloatOrHalfRepresentations(&SemaRef, TheCall)) + return true; break; } diff --git a/clang/test/CodeGenHLSL/builtins/asuint.hlsl b/clang/test/CodeGenHLSL/builtins/asuint.hlsl index 33acb00ae11182..c67a1346741171 100644 --- a/clang/test/CodeGenHLSL/builtins/asuint.hlsl +++ b/clang/test/CodeGenHLSL/builtins/asuint.hlsl @@ -1,53 +1,29 @@ // RUN: %clang_cc1 -finclude-default-header -x hlsl -triple dxil-pc-shadermodel6.3-library %s -fnative-half-type -emit-llvm -disable-llvm-passes -o - | FileCheck %s -// // CHECK-LABEL: builtin_test_asuint_float -// // CHECK: bitcast float %0 to i32 -// // CHECK: ret <4 x i32> %dx.clamp -// export uint builtin_test_asuint_float(float p0) { -// return __builtin_hlsl_elementwise_asuint(p0); -// } - -// // CHECK-LABEL: builtin_test_asuint_float -// // CHECK: bitcast float %0 to i32 -// // CHECK: ret <4 x i32> %dx.clamp -// export uint builtin_test_asuint_double(double p0) { -// return __builtin_hlsl_elementwise_asuint(p0); -// } - - -// // CHECK-LABEL: builtin_test_asuint_float -// // CHECK: bitcast float %0 to i32 -// // CHECK: ret <4 x i32> %dx.clamp -// export uint builtin_test_asuint_half(half p0) { -// return __builtin_hlsl_elementwise_asuint(p0); -// } - - -// // CHECK-LABEL: builtin_test_asuint_float -// // CHECK: bitcast float %0 to i32 -// // CHECK: ret <4 x i32> %dx.clamp -// export uint4 builtin_test_asuint_float_vector(float p0) { -// return __builtin_hlsl_elementwise_asuint(p0); -// } - - -// CHECK-LABEL: builtin_test_asuint_float -// CHECK: bitcast float %0 to i32 -// CHECK: ret <4 x i32> %dx.clamp -export uint4 builtin_test_asuint_floa4t(float p0) { +// CHECK-LABEL: test_asuint4_floa4t +// CHECK: bitcast <4 x float> %0 to <4 x i32> +export uint4 test_asuint4_floa4t(float4 p0) { return asuint(p0); } -// export uint4 builtin_test_asuint4_uint(uint p0) { -// return __builtin_hlsl_elementwise_asuint(p0); -// } - +// CHECK-LABEL: test_asuint4_uint +// CHECK: %conv = uitofp i32 %0 to float +// CHECK: %1 = bitcast float %conv to i32 +export uint4 test_asuint4_uint(uint p0) { + return asuint((float)p0); +} -// export uint4 builtin_test_asuint4_int(int p0) { -// return __builtin_hlsl_elementwise_asuint(p0); -// } +// CHECK-LABEL: test_asuint4_int +// CHECK: %conv = sitofp i32 %0 to float +// CHECK: %1 = bitcast float %conv to i32 +// CHECK: %splat.splatinsert = insertelement <4 x i32> poison, i32 %1, i64 0 +export uint4 test_asuint4_int(int p0) { + return asuint((float)p0); +} -// export uint builtin_test_asuint_float(float p0) { -// return __builtin_hlsl_elementwise_asuint(p0); -// } \ No newline at end of file +// CHECK-LABEL: test_asuint_float +// CHECK: %1 = bitcast float %0 to i32 +export uint test_asuint_float(float p0) { + return asuint(p0); +} \ No newline at end of file _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits