https://github.com/farzonl updated https://github.com/llvm/llvm-project/pull/134439
>From 7feb18fcca35aca1c4c642fe4f6fea68c8d2f99d Mon Sep 17 00:00:00 2001 From: Farzon Lotfi <farzonlo...@microsoft.com> Date: Fri, 21 Mar 2025 16:07:30 -0400 Subject: [PATCH 1/2] [DirectX][Clang] Add DirectX target builtins --- .github/new-prs-labeler.yml | 5 ++++ clang/include/clang/Basic/BuiltinsDirectX.td | 15 ++++++++++ clang/include/clang/Basic/CMakeLists.txt | 4 +++ clang/include/clang/Basic/TargetBuiltins.h | 11 ++++++++ clang/include/clang/Sema/Sema.h | 7 +++++ clang/include/clang/Sema/SemaDirectX.h | 29 ++++++++++++++++++++ clang/lib/Basic/Targets/DirectX.cpp | 20 ++++++++++++++ clang/lib/Basic/Targets/DirectX.h | 4 +-- clang/lib/CodeGen/CGBuiltin.cpp | 2 ++ clang/lib/CodeGen/CMakeLists.txt | 1 + clang/lib/CodeGen/CodeGenFunction.h | 1 + clang/lib/CodeGen/TargetBuiltins/DirectX.cpp | 25 +++++++++++++++++ clang/lib/Sema/CMakeLists.txt | 1 + clang/lib/Sema/Sema.cpp | 2 ++ clang/lib/Sema/SemaChecking.cpp | 3 ++ clang/lib/Sema/SemaDirectX.cpp | 28 +++++++++++++++++++ 16 files changed, 155 insertions(+), 3 deletions(-) create mode 100644 clang/include/clang/Basic/BuiltinsDirectX.td create mode 100644 clang/include/clang/Sema/SemaDirectX.h create mode 100644 clang/lib/CodeGen/TargetBuiltins/DirectX.cpp create mode 100644 clang/lib/Sema/SemaDirectX.cpp diff --git a/.github/new-prs-labeler.yml b/.github/new-prs-labeler.yml index b93cdff8af345..464310a0bb4f6 100644 --- a/.github/new-prs-labeler.yml +++ b/.github/new-prs-labeler.yml @@ -660,6 +660,11 @@ backend:DirectX: - '**/*dxil*/**' - '**/*DXContainer*' - '**/*DXContainer*/**' + - clang/lib/Sema/SemaDirectX.cpp + - clang/include/clang/Sema/SemaDirectX.h + - clang/include/clang/Basic/BuiltinsDirectX.td + - clang/test/CodeGenDirectX/** + - clang/test/SemaDirectX/** backend:SPIR-V: - clang/lib/Driver/ToolChains/SPIRV.* diff --git a/clang/include/clang/Basic/BuiltinsDirectX.td b/clang/include/clang/Basic/BuiltinsDirectX.td new file mode 100644 index 0000000000000..e6b3bfd7bdd94 --- /dev/null +++ b/clang/include/clang/Basic/BuiltinsDirectX.td @@ -0,0 +1,15 @@ +//===--- BuiltinsDirectX.td - DirectX Builtin function database -----------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +include "clang/Basic/BuiltinsBase.td" + +def DxDot2Add : Builtin { + let Spellings = ["__builtin_dx_dot2add"]; + let Attributes = [NoThrow, Const]; + let Prototype = "float(_ExtVector<2, __fp16>,_ExtVector<2, __fp16>,float)"; +} diff --git a/clang/include/clang/Basic/CMakeLists.txt b/clang/include/clang/Basic/CMakeLists.txt index 6be6d063c20b4..4d5e1eaa3facb 100644 --- a/clang/include/clang/Basic/CMakeLists.txt +++ b/clang/include/clang/Basic/CMakeLists.txt @@ -82,6 +82,10 @@ clang_tablegen(BuiltinsBPF.inc -gen-clang-builtins SOURCE BuiltinsBPF.td TARGET ClangBuiltinsBPF) +clang_tablegen(BuiltinsDirectX.inc -gen-clang-builtins + SOURCE BuiltinsDirectX.td + TARGET ClangBuiltinsDirectX) + clang_tablegen(BuiltinsHexagon.inc -gen-clang-builtins SOURCE BuiltinsHexagon.td TARGET ClangBuiltinsHexagon) diff --git a/clang/include/clang/Basic/TargetBuiltins.h b/clang/include/clang/Basic/TargetBuiltins.h index c1ba65064f159..4e490d87ee8d6 100644 --- a/clang/include/clang/Basic/TargetBuiltins.h +++ b/clang/include/clang/Basic/TargetBuiltins.h @@ -141,6 +141,17 @@ namespace clang { }; } + /// DirectX builtins + namespace DirectX { + enum { + LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1, +#define GET_BUILTIN_ENUMERATORS +#include "clang/Basic/BuiltinsDirectX.inc" +#undef GET_BUILTIN_ENUMERATORS + LastTSBuiltin + }; + } // namespace DirectX + /// SPIRV builtins namespace SPIRV { enum { diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 6bf1caf6bdd18..30917e7ca0310 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -160,6 +160,7 @@ class SemaAVR; class SemaBPF; class SemaCodeCompletion; class SemaCUDA; +class SemaDirectX; class SemaHLSL; class SemaHexagon; class SemaLoongArch; @@ -1074,6 +1075,11 @@ class Sema final : public SemaBase { return *CUDAPtr; } + SemaDirectX &DirectX() { + assert(DirectXPtr); + return *DirectXPtr; + } + SemaHLSL &HLSL() { assert(HLSLPtr); return *HLSLPtr; @@ -1212,6 +1218,7 @@ class Sema final : public SemaBase { std::unique_ptr<SemaBPF> BPFPtr; std::unique_ptr<SemaCodeCompletion> CodeCompletionPtr; std::unique_ptr<SemaCUDA> CUDAPtr; + std::unique_ptr<SemaDirectX> DirectXPtr; std::unique_ptr<SemaHLSL> HLSLPtr; std::unique_ptr<SemaHexagon> HexagonPtr; std::unique_ptr<SemaLoongArch> LoongArchPtr; diff --git a/clang/include/clang/Sema/SemaDirectX.h b/clang/include/clang/Sema/SemaDirectX.h new file mode 100644 index 0000000000000..571a36c1a6ecf --- /dev/null +++ b/clang/include/clang/Sema/SemaDirectX.h @@ -0,0 +1,29 @@ +//===----- SemaDirectX.h ----- Semantic Analysis for DirectX +//constructs--------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +/// \file +/// This file declares semantic analysis for DirectX constructs. +/// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_SEMA_SEMADIRECTX_H +#define LLVM_CLANG_SEMA_SEMADIRECTX_H + +#include "clang/AST/ASTFwd.h" +#include "clang/Sema/SemaBase.h" + +namespace clang { +class SemaDirectX : public SemaBase { +public: + SemaDirectX(Sema &S); + + bool CheckDirectXBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall); +}; +} // namespace clang + +#endif // LLVM_CLANG_SEMA_SEMADIRECTX_H \ No newline at end of file diff --git a/clang/lib/Basic/Targets/DirectX.cpp b/clang/lib/Basic/Targets/DirectX.cpp index 0dd27e6e93b33..ff0c062e80947 100644 --- a/clang/lib/Basic/Targets/DirectX.cpp +++ b/clang/lib/Basic/Targets/DirectX.cpp @@ -12,11 +12,31 @@ #include "DirectX.h" #include "Targets.h" +#include "clang/Basic/TargetBuiltins.h" using namespace clang; using namespace clang::targets; +static constexpr int NumBuiltins = + clang::DirectX::LastTSBuiltin - Builtin::FirstTSBuiltin; + +#define GET_BUILTIN_STR_TABLE +#include "clang/Basic/BuiltinsDirectX.inc" +#undef GET_BUILTIN_STR_TABLE + +static constexpr Builtin::Info BuiltinInfos[] = { +#define GET_BUILTIN_INFOS +#include "clang/Basic/BuiltinsDirectX.inc" +#undef GET_BUILTIN_INFOS +}; +static_assert(std::size(BuiltinInfos) == NumBuiltins); + void DirectXTargetInfo::getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const { DefineStd(Builder, "DIRECTX", Opts); } + +llvm::SmallVector<Builtin::InfosShard> +DirectXTargetInfo::getTargetBuiltins() const { + return {{&BuiltinStrings, BuiltinInfos}}; +} \ No newline at end of file diff --git a/clang/lib/Basic/Targets/DirectX.h b/clang/lib/Basic/Targets/DirectX.h index 6e3ddad626341..0e88a37e32493 100644 --- a/clang/lib/Basic/Targets/DirectX.h +++ b/clang/lib/Basic/Targets/DirectX.h @@ -73,9 +73,7 @@ class LLVM_LIBRARY_VISIBILITY DirectXTargetInfo : public TargetInfo { return Feature == "directx"; } - llvm::SmallVector<Builtin::InfosShard> getTargetBuiltins() const override { - return {}; - } + llvm::SmallVector<Builtin::InfosShard> getTargetBuiltins() const override; std::string_view getClobbers() const override { return ""; } diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 310addebd50e9..fe55dfffc1cbe 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -70,6 +70,8 @@ static Value *EmitTargetArchBuiltinExpr(CodeGenFunction *CGF, case llvm::Triple::bpfeb: case llvm::Triple::bpfel: return CGF->EmitBPFBuiltinExpr(BuiltinID, E); + case llvm::Triple::dxil: + return CGF->EmitDirectXBuiltinExpr(BuiltinID, E); case llvm::Triple::x86: case llvm::Triple::x86_64: return CGF->EmitX86BuiltinExpr(BuiltinID, E); diff --git a/clang/lib/CodeGen/CMakeLists.txt b/clang/lib/CodeGen/CMakeLists.txt index ebe2fbd7db295..dc5b2a35583b4 100644 --- a/clang/lib/CodeGen/CMakeLists.txt +++ b/clang/lib/CodeGen/CMakeLists.txt @@ -118,6 +118,7 @@ add_clang_library(clangCodeGen SwiftCallingConv.cpp TargetBuiltins/ARM.cpp TargetBuiltins/AMDGPU.cpp + TargetBuiltins/DirectX.cpp TargetBuiltins/Hexagon.cpp TargetBuiltins/NVPTX.cpp TargetBuiltins/PPC.cpp diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h index af9798b30fbcf..34dee6df9dcfc 100644 --- a/clang/lib/CodeGen/CodeGenFunction.h +++ b/clang/lib/CodeGen/CodeGenFunction.h @@ -4809,6 +4809,7 @@ class CodeGenFunction : public CodeGenTypeCache { llvm::Value *EmitAMDGPUBuiltinExpr(unsigned BuiltinID, const CallExpr *E); llvm::Value *EmitHLSLBuiltinExpr(unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue); + llvm::Value *EmitDirectXBuiltinExpr(unsigned BuiltinID, const CallExpr *E); llvm::Value *EmitSPIRVBuiltinExpr(unsigned BuiltinID, const CallExpr *E); llvm::Value *EmitScalarOrConstFoldImmArg(unsigned ICEArguments, unsigned Idx, const CallExpr *E); diff --git a/clang/lib/CodeGen/TargetBuiltins/DirectX.cpp b/clang/lib/CodeGen/TargetBuiltins/DirectX.cpp new file mode 100644 index 0000000000000..07dedcf5af904 --- /dev/null +++ b/clang/lib/CodeGen/TargetBuiltins/DirectX.cpp @@ -0,0 +1,25 @@ +//===--------- DirectX.cpp - Emit LLVM Code for builtins ------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This contains code to emit Builtin calls as LLVM code. +// +//===----------------------------------------------------------------------===// + +#include "CGHLSLRuntime.h" +#include "CodeGenFunction.h" +#include "clang/Basic/TargetBuiltins.h" +#include "llvm/IR/Intrinsics.h" + +using namespace clang; +using namespace CodeGen; +using namespace llvm; + +Value *CodeGenFunction::EmitDirectXBuiltinExpr(unsigned BuiltinID, + const CallExpr *E) { +return nullptr; +} diff --git a/clang/lib/Sema/CMakeLists.txt b/clang/lib/Sema/CMakeLists.txt index d3fe80f659f69..cc7921fc32254 100644 --- a/clang/lib/Sema/CMakeLists.txt +++ b/clang/lib/Sema/CMakeLists.txt @@ -47,6 +47,7 @@ add_clang_library(clangSema SemaConsumer.cpp SemaCoroutine.cpp SemaCUDA.cpp + SemaDirectX.cpp SemaDecl.cpp SemaDeclAttr.cpp SemaDeclCXX.cpp diff --git a/clang/lib/Sema/Sema.cpp b/clang/lib/Sema/Sema.cpp index 64f5633f380ec..32d7744be9229 100644 --- a/clang/lib/Sema/Sema.cpp +++ b/clang/lib/Sema/Sema.cpp @@ -47,6 +47,7 @@ #include "clang/Sema/SemaCUDA.h" #include "clang/Sema/SemaCodeCompletion.h" #include "clang/Sema/SemaConsumer.h" +#include "clang/Sema/SemaDirectX.h" #include "clang/Sema/SemaHLSL.h" #include "clang/Sema/SemaHexagon.h" #include "clang/Sema/SemaLoongArch.h" @@ -226,6 +227,7 @@ Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, CodeCompletionPtr( std::make_unique<SemaCodeCompletion>(*this, CodeCompleter)), CUDAPtr(std::make_unique<SemaCUDA>(*this)), + DirectXPtr(std::make_unique<SemaDirectX>(*this)), HLSLPtr(std::make_unique<SemaHLSL>(*this)), HexagonPtr(std::make_unique<SemaHexagon>(*this)), LoongArchPtr(std::make_unique<SemaLoongArch>(*this)), diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 5a4fa97366809..674aa07992785 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -61,6 +61,7 @@ #include "clang/Sema/SemaAMDGPU.h" #include "clang/Sema/SemaARM.h" #include "clang/Sema/SemaBPF.h" +#include "clang/Sema/SemaDirectX.h" #include "clang/Sema/SemaHLSL.h" #include "clang/Sema/SemaHexagon.h" #include "clang/Sema/SemaLoongArch.h" @@ -1930,6 +1931,8 @@ bool Sema::CheckTSBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID, case llvm::Triple::bpfeb: case llvm::Triple::bpfel: return BPF().CheckBPFBuiltinFunctionCall(BuiltinID, TheCall); + case llvm::Triple::dxil: + return DirectX().CheckDirectXBuiltinFunctionCall(BuiltinID, TheCall); case llvm::Triple::hexagon: return Hexagon().CheckHexagonBuiltinFunctionCall(BuiltinID, TheCall); case llvm::Triple::mips: diff --git a/clang/lib/Sema/SemaDirectX.cpp b/clang/lib/Sema/SemaDirectX.cpp new file mode 100644 index 0000000000000..035bbac1a3243 --- /dev/null +++ b/clang/lib/Sema/SemaDirectX.cpp @@ -0,0 +1,28 @@ +//===- SemaDirectX.cpp - Semantic Analysis for DirectX constructs----------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// This implements Semantic Analysis for DirectX constructs. +//===----------------------------------------------------------------------===// + +#include "clang/Sema/SemaDirectX.h" +#include "clang/Basic/TargetBuiltins.h" +#include "clang/Sema/Sema.h" + +namespace clang { + +SemaDirectX::SemaDirectX(Sema &S) : SemaBase(S) {} + +bool SemaDirectX::CheckDirectXBuiltinFunctionCall(unsigned BuiltinID, + CallExpr *TheCall) { + switch (BuiltinID) { + case DirectX::BI__builtin_dx_dot2add: { + } + } + + return false; +} +} // namespace clang >From a420186cc04306323da84f4d59f1492ff2c766ed Mon Sep 17 00:00:00 2001 From: Farzon Lotfi <farzonlo...@microsoft.com> Date: Fri, 4 Apr 2025 14:55:33 -0400 Subject: [PATCH 2/2] move dot2add to DirectX.cpp TargetBuiltins --- .github/new-prs-labeler.yml | 1 + clang/include/clang/Basic/Builtins.td | 6 ----- clang/include/clang/Basic/BuiltinsDirectX.td | 2 +- clang/include/clang/Sema/SemaDirectX.h | 4 ++-- clang/lib/Basic/Targets/DirectX.cpp | 2 +- clang/lib/CodeGen/CGHLSLBuiltins.cpp | 12 ---------- clang/lib/CodeGen/TargetBuiltins/DirectX.cpp | 16 +++++++++++-- .../lib/Headers/hlsl/hlsl_intrinsic_helpers.h | 4 ++-- clang/lib/Sema/SemaDirectX.cpp | 5 ---- clang/test/CodeGenDirectX/Builtins/dot2add.c | 23 +++++++++++++++++++ 10 files changed, 44 insertions(+), 31 deletions(-) create mode 100644 clang/test/CodeGenDirectX/Builtins/dot2add.c diff --git a/.github/new-prs-labeler.yml b/.github/new-prs-labeler.yml index 464310a0bb4f6..c0c61748010d0 100644 --- a/.github/new-prs-labeler.yml +++ b/.github/new-prs-labeler.yml @@ -663,6 +663,7 @@ backend:DirectX: - clang/lib/Sema/SemaDirectX.cpp - clang/include/clang/Sema/SemaDirectX.h - clang/include/clang/Basic/BuiltinsDirectX.td + - clang/lib/CodeGen/TargetBuiltins/DirectX.cpp - clang/test/CodeGenDirectX/** - clang/test/SemaDirectX/** diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index c7ca607e4b3d2..b2c7ddb43de55 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4891,12 +4891,6 @@ def HLSLDotProduct : LangBuiltin<"HLSL_LANG"> { let Prototype = "void(...)"; } -def HLSLDot2Add : LangBuiltin<"HLSL_LANG"> { - let Spellings = ["__builtin_hlsl_dot2add"]; - let Attributes = [NoThrow, Const]; - let Prototype = "float(_ExtVector<2, _Float16>, _ExtVector<2, _Float16>, float)"; -} - def HLSLDot4AddI8Packed : LangBuiltin<"HLSL_LANG"> { let Spellings = ["__builtin_hlsl_dot4add_i8packed"]; let Attributes = [NoThrow, Const]; diff --git a/clang/include/clang/Basic/BuiltinsDirectX.td b/clang/include/clang/Basic/BuiltinsDirectX.td index e6b3bfd7bdd94..444532ab2874a 100644 --- a/clang/include/clang/Basic/BuiltinsDirectX.td +++ b/clang/include/clang/Basic/BuiltinsDirectX.td @@ -11,5 +11,5 @@ include "clang/Basic/BuiltinsBase.td" def DxDot2Add : Builtin { let Spellings = ["__builtin_dx_dot2add"]; let Attributes = [NoThrow, Const]; - let Prototype = "float(_ExtVector<2, __fp16>,_ExtVector<2, __fp16>,float)"; + let Prototype = "float(_ExtVector<2, _Float16>, _ExtVector<2, _Float16>, float)"; } diff --git a/clang/include/clang/Sema/SemaDirectX.h b/clang/include/clang/Sema/SemaDirectX.h index 571a36c1a6ecf..1f66f18fd732f 100644 --- a/clang/include/clang/Sema/SemaDirectX.h +++ b/clang/include/clang/Sema/SemaDirectX.h @@ -1,5 +1,5 @@ //===----- SemaDirectX.h ----- Semantic Analysis for DirectX -//constructs--------===// +// constructs--------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -26,4 +26,4 @@ class SemaDirectX : public SemaBase { }; } // namespace clang -#endif // LLVM_CLANG_SEMA_SEMADIRECTX_H \ No newline at end of file +#endif // LLVM_CLANG_SEMA_SEMADIRECTX_H diff --git a/clang/lib/Basic/Targets/DirectX.cpp b/clang/lib/Basic/Targets/DirectX.cpp index ff0c062e80947..ef8998dab0840 100644 --- a/clang/lib/Basic/Targets/DirectX.cpp +++ b/clang/lib/Basic/Targets/DirectX.cpp @@ -39,4 +39,4 @@ void DirectXTargetInfo::getTargetDefines(const LangOptions &Opts, llvm::SmallVector<Builtin::InfosShard> DirectXTargetInfo::getTargetBuiltins() const { return {{&BuiltinStrings, BuiltinInfos}}; -} \ No newline at end of file +} diff --git a/clang/lib/CodeGen/CGHLSLBuiltins.cpp b/clang/lib/CodeGen/CGHLSLBuiltins.cpp index 27d1c69439944..99c62808c323d 100644 --- a/clang/lib/CodeGen/CGHLSLBuiltins.cpp +++ b/clang/lib/CodeGen/CGHLSLBuiltins.cpp @@ -380,18 +380,6 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, getDotProductIntrinsic(CGM.getHLSLRuntime(), VecTy0->getElementType()), ArrayRef<Value *>{Op0, Op1}, nullptr, "hlsl.dot"); } - case Builtin::BI__builtin_hlsl_dot2add: { - assert(CGM.getTarget().getTriple().getArch() == llvm::Triple::dxil && - "Intrinsic dot2add is only allowed for dxil architecture"); - Value *A = EmitScalarExpr(E->getArg(0)); - Value *B = EmitScalarExpr(E->getArg(1)); - Value *C = EmitScalarExpr(E->getArg(2)); - - Intrinsic::ID ID = llvm ::Intrinsic::dx_dot2add; - return Builder.CreateIntrinsic( - /*ReturnType=*/C->getType(), ID, ArrayRef<Value *>{A, B, C}, nullptr, - "dx.dot2add"); - } case Builtin::BI__builtin_hlsl_dot4add_i8packed: { Value *A = EmitScalarExpr(E->getArg(0)); Value *B = EmitScalarExpr(E->getArg(1)); diff --git a/clang/lib/CodeGen/TargetBuiltins/DirectX.cpp b/clang/lib/CodeGen/TargetBuiltins/DirectX.cpp index 07dedcf5af904..202601e257036 100644 --- a/clang/lib/CodeGen/TargetBuiltins/DirectX.cpp +++ b/clang/lib/CodeGen/TargetBuiltins/DirectX.cpp @@ -20,6 +20,18 @@ using namespace CodeGen; using namespace llvm; Value *CodeGenFunction::EmitDirectXBuiltinExpr(unsigned BuiltinID, - const CallExpr *E) { -return nullptr; + const CallExpr *E) { + switch (BuiltinID) { + case DirectX::BI__builtin_dx_dot2add: { + Value *A = EmitScalarExpr(E->getArg(0)); + Value *B = EmitScalarExpr(E->getArg(1)); + Value *C = EmitScalarExpr(E->getArg(2)); + + Intrinsic::ID ID = llvm ::Intrinsic::dx_dot2add; + return Builder.CreateIntrinsic( + /*ReturnType=*/C->getType(), ID, ArrayRef<Value *>{A, B, C}, nullptr, + "dx.dot2add"); + } + } + return nullptr; } diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsic_helpers.h b/clang/lib/Headers/hlsl/hlsl_intrinsic_helpers.h index 3c15f2b38d80f..a8f025b1b5f5f 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsic_helpers.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsic_helpers.h @@ -46,8 +46,8 @@ distance_vec_impl(vector<T, N> X, vector<T, N> Y) { } constexpr float dot2add_impl(half2 a, half2 b, float c) { -#if defined(__DIRECTX__) - return __builtin_hlsl_dot2add(a, b, c); +#if (__has_builtin(__builtin_dx_dot2add)) + return __builtin_dx_dot2add(a, b, c); #else return dot(a, b) + c; #endif diff --git a/clang/lib/Sema/SemaDirectX.cpp b/clang/lib/Sema/SemaDirectX.cpp index 035bbac1a3243..eaac24cdc710e 100644 --- a/clang/lib/Sema/SemaDirectX.cpp +++ b/clang/lib/Sema/SemaDirectX.cpp @@ -18,11 +18,6 @@ SemaDirectX::SemaDirectX(Sema &S) : SemaBase(S) {} bool SemaDirectX::CheckDirectXBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { - switch (BuiltinID) { - case DirectX::BI__builtin_dx_dot2add: { - } - } - return false; } } // namespace clang diff --git a/clang/test/CodeGenDirectX/Builtins/dot2add.c b/clang/test/CodeGenDirectX/Builtins/dot2add.c new file mode 100644 index 0000000000000..181f61fea1544 --- /dev/null +++ b/clang/test/CodeGenDirectX/Builtins/dot2add.c @@ -0,0 +1,23 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5 + +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.3-library %s -emit-llvm -o - | FileCheck %s + +typedef _Float16 half; +typedef half half2 __attribute__((ext_vector_type(2))); + +// CHECK-LABEL: define float @test_dot2add( +// CHECK-SAME: <2 x half> noundef [[X:%.*]], <2 x half> noundef [[Y:%.*]], float noundef [[Z:%.*]]) #[[ATTR0:[0-9]+]] { +// CHECK-NEXT: [[ENTRY:.*:]] +// CHECK-NEXT: [[X_ADDR:%.*]] = alloca <2 x half>, align 4 +// CHECK-NEXT: [[Y_ADDR:%.*]] = alloca <2 x half>, align 4 +// CHECK-NEXT: [[Z_ADDR:%.*]] = alloca float, align 4 +// CHECK-NEXT: store <2 x half> [[X]], ptr [[X_ADDR]], align 4 +// CHECK-NEXT: store <2 x half> [[Y]], ptr [[Y_ADDR]], align 4 +// CHECK-NEXT: store float [[Z]], ptr [[Z_ADDR]], align 4 +// CHECK-NEXT: [[TMP0:%.*]] = load <2 x half>, ptr [[X_ADDR]], align 4 +// CHECK-NEXT: [[TMP1:%.*]] = load <2 x half>, ptr [[Y_ADDR]], align 4 +// CHECK-NEXT: [[TMP2:%.*]] = load float, ptr [[Z_ADDR]], align 4 +// CHECK-NEXT: [[DX_DOT2ADD:%.*]] = call float @llvm.dx.dot2add.v2f16(<2 x half> [[TMP0]], <2 x half> [[TMP1]], float [[TMP2]]) +// CHECK-NEXT: ret float [[DX_DOT2ADD]] +// +float test_dot2add(half2 X, half2 Y, float Z) { return __builtin_dx_dot2add(X, Y, Z); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits