[clang] [llvm] [HLSL] Implementation of the frac intrinsic (PR #83315)
https://github.com/farzonl created https://github.com/llvm/llvm-project/pull/83315 This change implements the frontend for #70099 Builtins.td - add the frac builtin CGBuiltin.cpp - add the builtin to DirectX intrinsic mapping hlsl_intrinsics.h - add the frac api SemaChecking.cpp - add type checks for builtin IntrinsicsDirectX.td - add the frac intrinsic The backend changes for this are going to be very simple: https://github.com/llvm/llvm-project/commit/f309a0eb558b65dfaff0d1d23b7d07fb07e27121 They were not included because llvm/lib/Target/DirectX/DXIL.td is going through a major refactor. >From cd8a27e4571b8e791ce5ccaaf51dd570ee8bc6d3 Mon Sep 17 00:00:00 2001 From: Farzon Lotfi Date: Wed, 28 Feb 2024 13:20:01 -0500 Subject: [PATCH] [HLSL] Implementation of the frac intrinsic This change implements the frontend for #70099 Builtins.td - add the frac builtin CGBuiltin.cpp - add the builtin to DirectX intrinsic mapping hlsl_intrinsics.h - add the frac api SemaChecking.cpp - add type checks for builtin IntrinsicsDirectX.td - add the frac intrinsic The backend changes for this are going to be very simple: https://github.com/llvm/llvm-project/commit/f309a0eb558b65dfaff0d1d23b7d07fb07e27121 They were not included because llvm/lib/Target/DirectX/DXIL.td is going through a major refactor. --- clang/include/clang/Basic/Builtins.td | 6 ++ clang/lib/CodeGen/CGBuiltin.cpp | 8 +++ clang/lib/Headers/hlsl/hlsl_intrinsics.h | 32 + clang/lib/Sema/SemaChecking.cpp | 15 clang/test/CodeGenHLSL/builtins/frac.hlsl | 69 +++ clang/test/SemaHLSL/BuiltIns/frac-errors.hlsl | 27 .../test/SemaHLSL/OverloadResolutionBugs.hlsl | 12 llvm/include/llvm/IR/IntrinsicsDirectX.td | 2 + 8 files changed, 171 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/frac.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/frac-errors.hlsl diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 3bc35c5bb38ecf..415552d19e0700 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4536,6 +4536,12 @@ def HLSLDotProduct : LangBuiltin<"HLSL_LANG"> { let Prototype = "void(...)"; } +def HLSLFrac : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_elementwise_frac"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void(...)"; +} + // Builtins for XRay. def XRayCustomEvent : Builtin { let Spellings = ["__xray_customevent"]; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 2d16e7cdc06053..fbf34ae94c0af6 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -18007,6 +18007,14 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, /*ReturnType*/ T0->getScalarType(), Intrinsic::dx_dot, ArrayRef{Op0, Op1}, nullptr, "dx.dot"); } break; + case Builtin::BI__builtin_hlsl_elementwise_frac: { +Value *Op0 = EmitScalarExpr(E->getArg(0)); +if (!E->getArg(0)->getType()->hasFloatingRepresentation()) + llvm_unreachable("frac operand must have a float representation"); +return Builder.CreateIntrinsic( +/*ReturnType*/ Op0->getType(), Intrinsic::dx_frac, +ArrayRef{Op0}, nullptr, "dx.frac"); + } } return nullptr; } diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index 08e5d981a4a4ca..17b600abdfad1e 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -317,6 +317,38 @@ double3 floor(double3); _HLSL_BUILTIN_ALIAS(__builtin_elementwise_floor) double4 floor(double4); +//===--===// +// frac builtins +//===--===// + +/// \fn T frac(T x) +/// \brief Returns the fractional (or decimal) part of x. \a x parameter. +/// \param x The specified input value. +/// +/// If \a the return value is greater than or equal to 0 and less than 1. + +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_frac) +half frac(half); +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_frac) +half2 frac(half2); +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_frac) +half3 frac(half3); +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_frac) +half4 frac(half4); + +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_frac) +float frac(float); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_frac) +float2 frac(float2); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_frac) +float3 frac(float3); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_frac) +float4 frac(float4); + //===-
[clang] [llvm] [HLSL] Implementation of the frac intrinsic (PR #83315)
https://github.com/farzonl ready_for_review https://github.com/llvm/llvm-project/pull/83315 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL] Implementation of the frac intrinsic (PR #83315)
llvmbot wrote: @llvm/pr-subscribers-backend-x86 @llvm/pr-subscribers-clang Author: Farzon Lotfi (farzonl) Changes This change implements the frontend for #70099 Builtins.td - add the frac builtin CGBuiltin.cpp - add the builtin to DirectX intrinsic mapping hlsl_intrinsics.h - add the frac api SemaChecking.cpp - add type checks for builtin IntrinsicsDirectX.td - add the frac intrinsic The backend changes for this are going to be very simple: https://github.com/llvm/llvm-project/commit/f309a0eb558b65dfaff0d1d23b7d07fb07e27121 They were not included because llvm/lib/Target/DirectX/DXIL.td is going through a major refactor. --- Full diff: https://github.com/llvm/llvm-project/pull/83315.diff 8 Files Affected: - (modified) clang/include/clang/Basic/Builtins.td (+6) - (modified) clang/lib/CodeGen/CGBuiltin.cpp (+8) - (modified) clang/lib/Headers/hlsl/hlsl_intrinsics.h (+32) - (modified) clang/lib/Sema/SemaChecking.cpp (+15) - (added) clang/test/CodeGenHLSL/builtins/frac.hlsl (+69) - (added) clang/test/SemaHLSL/BuiltIns/frac-errors.hlsl (+27) - (modified) clang/test/SemaHLSL/OverloadResolutionBugs.hlsl (+12) - (modified) llvm/include/llvm/IR/IntrinsicsDirectX.td (+2) ``diff diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 3bc35c5bb38ecf..415552d19e0700 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4536,6 +4536,12 @@ def HLSLDotProduct : LangBuiltin<"HLSL_LANG"> { let Prototype = "void(...)"; } +def HLSLFrac : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_elementwise_frac"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void(...)"; +} + // Builtins for XRay. def XRayCustomEvent : Builtin { let Spellings = ["__xray_customevent"]; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 2d16e7cdc06053..fbf34ae94c0af6 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -18007,6 +18007,14 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, /*ReturnType*/ T0->getScalarType(), Intrinsic::dx_dot, ArrayRef{Op0, Op1}, nullptr, "dx.dot"); } break; + case Builtin::BI__builtin_hlsl_elementwise_frac: { +Value *Op0 = EmitScalarExpr(E->getArg(0)); +if (!E->getArg(0)->getType()->hasFloatingRepresentation()) + llvm_unreachable("frac operand must have a float representation"); +return Builder.CreateIntrinsic( +/*ReturnType*/ Op0->getType(), Intrinsic::dx_frac, +ArrayRef{Op0}, nullptr, "dx.frac"); + } } return nullptr; } diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index 08e5d981a4a4ca..17b600abdfad1e 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -317,6 +317,38 @@ double3 floor(double3); _HLSL_BUILTIN_ALIAS(__builtin_elementwise_floor) double4 floor(double4); +//===--===// +// frac builtins +//===--===// + +/// \fn T frac(T x) +/// \brief Returns the fractional (or decimal) part of x. \a x parameter. +/// \param x The specified input value. +/// +/// If \a the return value is greater than or equal to 0 and less than 1. + +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_frac) +half frac(half); +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_frac) +half2 frac(half2); +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_frac) +half3 frac(half3); +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_frac) +half4 frac(half4); + +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_frac) +float frac(float); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_frac) +float2 frac(float2); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_frac) +float3 frac(float3); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_frac) +float4 frac(float4); + //===--===// // log builtins //===--===// diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 0de76ee119cf81..5583150a2be731 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -5247,6 +5247,21 @@ bool Sema::CheckHLSLBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { return true; break; } + case Builtin::BI__builtin_hlsl_elementwise_frac: { +if (PrepareBuiltinElementwiseMathOneArgCall(TheCall)) + return true; +QualType PassedType = TheCall->getArg(0)->getType(); +if (!PassedType->hasFloatingRepresentation()) { + QualT
[clang] [llvm] [HLSL] Implementation of the frac intrinsic (PR #83315)
@@ -0,0 +1,27 @@ + +// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -fnative-half-type -emit-llvm -disable-llvm-passes -verify -verify-ignore-unexpected + python3kgae wrote: What will happen for ``` struct A { float a; }; A fa; __builtin_hlsl_elementwise_frac (fa) ``` https://github.com/llvm/llvm-project/pull/83315 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL] Implementation of the frac intrinsic (PR #83315)
@@ -0,0 +1,27 @@ + +// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -fnative-half-type -emit-llvm -disable-llvm-passes -verify -verify-ignore-unexpected + farzonl wrote: error: 1st argument must be a vector, integer or floating point type (was 'A') https://github.com/llvm/llvm-project/pull/83315 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL] Implementation of the frac intrinsic (PR #83315)
https://github.com/farzonl edited https://github.com/llvm/llvm-project/pull/83315 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL] Implementation of the frac intrinsic (PR #83315)
@@ -0,0 +1,27 @@ + +// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.6-library %s -fnative-half-type -emit-llvm -disable-llvm-passes -verify -verify-ignore-unexpected + python3kgae wrote: Just curious. Don't need a test case I think. https://github.com/llvm/llvm-project/pull/83315 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL] Implementation of the frac intrinsic (PR #83315)
https://github.com/python3kgae approved this pull request. https://github.com/llvm/llvm-project/pull/83315 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL] Implementation of the frac intrinsic (PR #83315)
https://github.com/bogner edited https://github.com/llvm/llvm-project/pull/83315 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL] Implementation of the frac intrinsic (PR #83315)
https://github.com/bogner approved this pull request. LGTM other than the formatting in the test cases https://github.com/llvm/llvm-project/pull/83315 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL] Implementation of the frac intrinsic (PR #83315)
@@ -0,0 +1,69 @@ +// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple \ +// RUN: dxil-pc-shadermodel6.3-library %s -fnative-half-type \ +// RUN: -emit-llvm -disable-llvm-passes -o - | FileCheck %s \ +// RUN: --check-prefixes=CHECK,NATIVE_HALF +// RUN: %clang_cc1 -finclude-default-header -x hlsl -triple \ +// RUN: dxil-pc-shadermodel6.3-library %s -emit-llvm -disable-llvm-passes \ +// RUN: -o - | FileCheck %s --check-prefixes=CHECK,NO_HALF + +// NATIVE_HALF: define noundef half @ +// NATIVE_HALF: %dx.frac = call half @llvm.dx.frac.f16( +// NATIVE_HALF: ret half %dx.frac +// NO_HALF: define noundef float @"?test_frac_half@@YA$halff@$halff@@Z"( +// NO_HALF: %dx.frac = call float @llvm.dx.frac.f32( +// NO_HALF: ret float %dx.frac +half test_frac_half ( half p0 ) { + return frac ( p0 ); +} bogner wrote: Please follow LLVM formatting conventions in test cases, ie: ```c++ half test_frac_half(half p0) { return frac (p0); } ``` (aside: we should probably teach clang-format to recognize hlsl) https://github.com/llvm/llvm-project/pull/83315 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL] Implementation of the frac intrinsic (PR #83315)
https://github.com/farzonl updated https://github.com/llvm/llvm-project/pull/83315 >From cd8a27e4571b8e791ce5ccaaf51dd570ee8bc6d3 Mon Sep 17 00:00:00 2001 From: Farzon Lotfi Date: Wed, 28 Feb 2024 13:20:01 -0500 Subject: [PATCH 1/2] [HLSL] Implementation of the frac intrinsic This change implements the frontend for #70099 Builtins.td - add the frac builtin CGBuiltin.cpp - add the builtin to DirectX intrinsic mapping hlsl_intrinsics.h - add the frac api SemaChecking.cpp - add type checks for builtin IntrinsicsDirectX.td - add the frac intrinsic The backend changes for this are going to be very simple: https://github.com/llvm/llvm-project/commit/f309a0eb558b65dfaff0d1d23b7d07fb07e27121 They were not included because llvm/lib/Target/DirectX/DXIL.td is going through a major refactor. --- clang/include/clang/Basic/Builtins.td | 6 ++ clang/lib/CodeGen/CGBuiltin.cpp | 8 +++ clang/lib/Headers/hlsl/hlsl_intrinsics.h | 32 + clang/lib/Sema/SemaChecking.cpp | 15 clang/test/CodeGenHLSL/builtins/frac.hlsl | 69 +++ clang/test/SemaHLSL/BuiltIns/frac-errors.hlsl | 27 .../test/SemaHLSL/OverloadResolutionBugs.hlsl | 12 llvm/include/llvm/IR/IntrinsicsDirectX.td | 2 + 8 files changed, 171 insertions(+) create mode 100644 clang/test/CodeGenHLSL/builtins/frac.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/frac-errors.hlsl diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 3bc35c5bb38ecf..415552d19e0700 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4536,6 +4536,12 @@ def HLSLDotProduct : LangBuiltin<"HLSL_LANG"> { let Prototype = "void(...)"; } +def HLSLFrac : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_elementwise_frac"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void(...)"; +} + // Builtins for XRay. def XRayCustomEvent : Builtin { let Spellings = ["__xray_customevent"]; diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 2d16e7cdc06053..fbf34ae94c0af6 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -18007,6 +18007,14 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, /*ReturnType*/ T0->getScalarType(), Intrinsic::dx_dot, ArrayRef{Op0, Op1}, nullptr, "dx.dot"); } break; + case Builtin::BI__builtin_hlsl_elementwise_frac: { +Value *Op0 = EmitScalarExpr(E->getArg(0)); +if (!E->getArg(0)->getType()->hasFloatingRepresentation()) + llvm_unreachable("frac operand must have a float representation"); +return Builder.CreateIntrinsic( +/*ReturnType*/ Op0->getType(), Intrinsic::dx_frac, +ArrayRef{Op0}, nullptr, "dx.frac"); + } } return nullptr; } diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index 08e5d981a4a4ca..17b600abdfad1e 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -317,6 +317,38 @@ double3 floor(double3); _HLSL_BUILTIN_ALIAS(__builtin_elementwise_floor) double4 floor(double4); +//===--===// +// frac builtins +//===--===// + +/// \fn T frac(T x) +/// \brief Returns the fractional (or decimal) part of x. \a x parameter. +/// \param x The specified input value. +/// +/// If \a the return value is greater than or equal to 0 and less than 1. + +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_frac) +half frac(half); +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_frac) +half2 frac(half2); +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_frac) +half3 frac(half3); +_HLSL_16BIT_AVAILABILITY(shadermodel, 6.2) +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_frac) +half4 frac(half4); + +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_frac) +float frac(float); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_frac) +float2 frac(float2); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_frac) +float3 frac(float3); +_HLSL_BUILTIN_ALIAS(__builtin_hlsl_elementwise_frac) +float4 frac(float4); + //===--===// // log builtins //===--===// diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 0de76ee119cf81..5583150a2be731 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -5247,6 +5247,21 @@ bool Sema::CheckHLSLBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall) { return true; break; } + case Builtin::BI__builtin_hls
[clang] [llvm] [HLSL] Implementation of the frac intrinsic (PR #83315)
https://github.com/farzonl updated https://github.com/llvm/llvm-project/pull/83315 >From 2ec582be1c361c212ea846c8433a9cebfeb7b4ba Mon Sep 17 00:00:00 2001 From: Farzon Lotfi Date: Thu, 29 Feb 2024 10:23:31 -0500 Subject: [PATCH 1/3] address merge conflicts --- clang/include/clang/Basic/Builtins.td | 7 +- .../clang/Basic/DiagnosticSemaKinds.td| 2 +- clang/lib/CodeGen/CGBuiltin.cpp | 23 --- clang/lib/Headers/hlsl/hlsl_intrinsics.h | 32 + clang/lib/Sema/SemaChecking.cpp | 25 +++ clang/test/CodeGenHLSL/builtins/frac.hlsl | 69 +++ clang/test/SemaHLSL/BuiltIns/frac-errors.hlsl | 27 .../test/SemaHLSL/OverloadResolutionBugs.hlsl | 12 llvm/include/llvm/IR/IntrinsicsDirectX.td | 8 ++- 9 files changed, 191 insertions(+), 14 deletions(-) create mode 100644 clang/test/CodeGenHLSL/builtins/frac.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/frac-errors.hlsl diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 36151b49d9363d..9af07e16e1b3cf 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4535,9 +4535,14 @@ def HLSLDotProduct : LangBuiltin<"HLSL_LANG"> { let Attributes = [NoThrow, Const]; let Prototype = "void(...)"; } +def HLSLFrac : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_elementwise_frac"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void(...)"; +} def HLSLLerp : LangBuiltin<"HLSL_LANG"> { - let Spellings = ["__builtin_hlsl_lerp"]; + let Spellings = ["__builtin_hlsl_elementwise_frac"]; let Attributes = [NoThrow, Const]; let Prototype = "void(...)"; } diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 4ef3ac8c96cd26..4f8902e37bd3bb 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -10270,7 +10270,7 @@ def err_vec_builtin_non_vector_all : Error< "all arguments to %0 must be vectors">; def err_vec_builtin_incompatible_vector_all : Error< "all arguments to %0 must have vectors of the same type">; - + def err_vec_builtin_non_vector : Error< "first two arguments to %0 must be vectors">; def err_vec_builtin_incompatible_vector : Error< diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 74ca96117793c4..98684448f4ff5c 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -18020,14 +18020,7 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, V = Builder.CreateFMul(S, V); return Builder.CreateFAdd(X, V, "dx.lerp"); } - // DXC does this via casting to float should we do the same thing? - if (Xty->isIntegerTy()) { -auto V = Builder.CreateSub(Y, X); -V = Builder.CreateMul(S, V); -return Builder.CreateAdd(X, V, "dx.lerp"); - } - // Bools should have been promoted - llvm_unreachable("Scalar Lerp is only supported on ints and floats."); + llvm_unreachable("Scalar Lerp is only supported on floats."); } // A VectorSplat should have happened assert(Xty->isVectorTy() && Yty->isVectorTy() && Sty->isVectorTy() && @@ -18041,12 +18034,24 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, E->getArg(2)->getType()->getAs(); // A HLSLVectorTruncation should have happend assert(XVecTy->getNumElements() == YVecTy->getNumElements() && - SVecTy->getNumElements() && + XVecTy->getNumElements() == SVecTy->getNumElements() && "Lerp requires vectors to be of the same size."); +assert(XVecTy->getElementType()->isRealFloatingType() && + XVecTy->getElementType() == YVecTy->getElementType() && + XVecTy->getElementType() == SVecTy->getElementType() && + "Lerp requires float vectors to be of the same type."); return Builder.CreateIntrinsic( /*ReturnType*/ Xty, Intrinsic::dx_lerp, ArrayRef{X, Y, S}, nullptr, "dx.lerp"); } + case Builtin::BI__builtin_hlsl_elementwise_frac: { +Value *Op0 = EmitScalarExpr(E->getArg(0)); +if (!E->getArg(0)->getType()->hasFloatingRepresentation()) + llvm_unreachable("frac operand must have a float representation"); +return Builder.CreateIntrinsic( +/*ReturnType*/ Op0->getType(), Intrinsic::dx_frac, +ArrayRef{Op0}, nullptr, "dx.frac"); + } } return nullptr; } diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index 1314bdefa37e7b..0aa8651ba80dc4 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -317,6 +317,38 @@ double3 floor(double3); _HLSL_BUILTIN_ALIAS(__builtin_elementwise_floor) double4 floor(double4); +//===
[clang] [llvm] [HLSL] Implementation of the frac intrinsic (PR #83315)
https://github.com/farzonl updated https://github.com/llvm/llvm-project/pull/83315 >From 2ec582be1c361c212ea846c8433a9cebfeb7b4ba Mon Sep 17 00:00:00 2001 From: Farzon Lotfi Date: Thu, 29 Feb 2024 10:23:31 -0500 Subject: [PATCH 1/4] address merge conflicts --- clang/include/clang/Basic/Builtins.td | 7 +- .../clang/Basic/DiagnosticSemaKinds.td| 2 +- clang/lib/CodeGen/CGBuiltin.cpp | 23 --- clang/lib/Headers/hlsl/hlsl_intrinsics.h | 32 + clang/lib/Sema/SemaChecking.cpp | 25 +++ clang/test/CodeGenHLSL/builtins/frac.hlsl | 69 +++ clang/test/SemaHLSL/BuiltIns/frac-errors.hlsl | 27 .../test/SemaHLSL/OverloadResolutionBugs.hlsl | 12 llvm/include/llvm/IR/IntrinsicsDirectX.td | 8 ++- 9 files changed, 191 insertions(+), 14 deletions(-) create mode 100644 clang/test/CodeGenHLSL/builtins/frac.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/frac-errors.hlsl diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 36151b49d9363d..9af07e16e1b3cf 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4535,9 +4535,14 @@ def HLSLDotProduct : LangBuiltin<"HLSL_LANG"> { let Attributes = [NoThrow, Const]; let Prototype = "void(...)"; } +def HLSLFrac : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_elementwise_frac"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void(...)"; +} def HLSLLerp : LangBuiltin<"HLSL_LANG"> { - let Spellings = ["__builtin_hlsl_lerp"]; + let Spellings = ["__builtin_hlsl_elementwise_frac"]; let Attributes = [NoThrow, Const]; let Prototype = "void(...)"; } diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 4ef3ac8c96cd26..4f8902e37bd3bb 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -10270,7 +10270,7 @@ def err_vec_builtin_non_vector_all : Error< "all arguments to %0 must be vectors">; def err_vec_builtin_incompatible_vector_all : Error< "all arguments to %0 must have vectors of the same type">; - + def err_vec_builtin_non_vector : Error< "first two arguments to %0 must be vectors">; def err_vec_builtin_incompatible_vector : Error< diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 74ca96117793c4..98684448f4ff5c 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -18020,14 +18020,7 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, V = Builder.CreateFMul(S, V); return Builder.CreateFAdd(X, V, "dx.lerp"); } - // DXC does this via casting to float should we do the same thing? - if (Xty->isIntegerTy()) { -auto V = Builder.CreateSub(Y, X); -V = Builder.CreateMul(S, V); -return Builder.CreateAdd(X, V, "dx.lerp"); - } - // Bools should have been promoted - llvm_unreachable("Scalar Lerp is only supported on ints and floats."); + llvm_unreachable("Scalar Lerp is only supported on floats."); } // A VectorSplat should have happened assert(Xty->isVectorTy() && Yty->isVectorTy() && Sty->isVectorTy() && @@ -18041,12 +18034,24 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, E->getArg(2)->getType()->getAs(); // A HLSLVectorTruncation should have happend assert(XVecTy->getNumElements() == YVecTy->getNumElements() && - SVecTy->getNumElements() && + XVecTy->getNumElements() == SVecTy->getNumElements() && "Lerp requires vectors to be of the same size."); +assert(XVecTy->getElementType()->isRealFloatingType() && + XVecTy->getElementType() == YVecTy->getElementType() && + XVecTy->getElementType() == SVecTy->getElementType() && + "Lerp requires float vectors to be of the same type."); return Builder.CreateIntrinsic( /*ReturnType*/ Xty, Intrinsic::dx_lerp, ArrayRef{X, Y, S}, nullptr, "dx.lerp"); } + case Builtin::BI__builtin_hlsl_elementwise_frac: { +Value *Op0 = EmitScalarExpr(E->getArg(0)); +if (!E->getArg(0)->getType()->hasFloatingRepresentation()) + llvm_unreachable("frac operand must have a float representation"); +return Builder.CreateIntrinsic( +/*ReturnType*/ Op0->getType(), Intrinsic::dx_frac, +ArrayRef{Op0}, nullptr, "dx.frac"); + } } return nullptr; } diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index 1314bdefa37e7b..0aa8651ba80dc4 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -317,6 +317,38 @@ double3 floor(double3); _HLSL_BUILTIN_ALIAS(__builtin_elementwise_floor) double4 floor(double4); +//===
[clang] [llvm] [HLSL] Implementation of the frac intrinsic (PR #83315)
https://github.com/farzonl updated https://github.com/llvm/llvm-project/pull/83315 >From 2ec582be1c361c212ea846c8433a9cebfeb7b4ba Mon Sep 17 00:00:00 2001 From: Farzon Lotfi Date: Thu, 29 Feb 2024 10:23:31 -0500 Subject: [PATCH 1/5] address merge conflicts --- clang/include/clang/Basic/Builtins.td | 7 +- .../clang/Basic/DiagnosticSemaKinds.td| 2 +- clang/lib/CodeGen/CGBuiltin.cpp | 23 --- clang/lib/Headers/hlsl/hlsl_intrinsics.h | 32 + clang/lib/Sema/SemaChecking.cpp | 25 +++ clang/test/CodeGenHLSL/builtins/frac.hlsl | 69 +++ clang/test/SemaHLSL/BuiltIns/frac-errors.hlsl | 27 .../test/SemaHLSL/OverloadResolutionBugs.hlsl | 12 llvm/include/llvm/IR/IntrinsicsDirectX.td | 8 ++- 9 files changed, 191 insertions(+), 14 deletions(-) create mode 100644 clang/test/CodeGenHLSL/builtins/frac.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/frac-errors.hlsl diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 36151b49d9363d..9af07e16e1b3cf 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4535,9 +4535,14 @@ def HLSLDotProduct : LangBuiltin<"HLSL_LANG"> { let Attributes = [NoThrow, Const]; let Prototype = "void(...)"; } +def HLSLFrac : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_elementwise_frac"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void(...)"; +} def HLSLLerp : LangBuiltin<"HLSL_LANG"> { - let Spellings = ["__builtin_hlsl_lerp"]; + let Spellings = ["__builtin_hlsl_elementwise_frac"]; let Attributes = [NoThrow, Const]; let Prototype = "void(...)"; } diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 4ef3ac8c96cd26..4f8902e37bd3bb 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -10270,7 +10270,7 @@ def err_vec_builtin_non_vector_all : Error< "all arguments to %0 must be vectors">; def err_vec_builtin_incompatible_vector_all : Error< "all arguments to %0 must have vectors of the same type">; - + def err_vec_builtin_non_vector : Error< "first two arguments to %0 must be vectors">; def err_vec_builtin_incompatible_vector : Error< diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 74ca96117793c4..98684448f4ff5c 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -18020,14 +18020,7 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, V = Builder.CreateFMul(S, V); return Builder.CreateFAdd(X, V, "dx.lerp"); } - // DXC does this via casting to float should we do the same thing? - if (Xty->isIntegerTy()) { -auto V = Builder.CreateSub(Y, X); -V = Builder.CreateMul(S, V); -return Builder.CreateAdd(X, V, "dx.lerp"); - } - // Bools should have been promoted - llvm_unreachable("Scalar Lerp is only supported on ints and floats."); + llvm_unreachable("Scalar Lerp is only supported on floats."); } // A VectorSplat should have happened assert(Xty->isVectorTy() && Yty->isVectorTy() && Sty->isVectorTy() && @@ -18041,12 +18034,24 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, E->getArg(2)->getType()->getAs(); // A HLSLVectorTruncation should have happend assert(XVecTy->getNumElements() == YVecTy->getNumElements() && - SVecTy->getNumElements() && + XVecTy->getNumElements() == SVecTy->getNumElements() && "Lerp requires vectors to be of the same size."); +assert(XVecTy->getElementType()->isRealFloatingType() && + XVecTy->getElementType() == YVecTy->getElementType() && + XVecTy->getElementType() == SVecTy->getElementType() && + "Lerp requires float vectors to be of the same type."); return Builder.CreateIntrinsic( /*ReturnType*/ Xty, Intrinsic::dx_lerp, ArrayRef{X, Y, S}, nullptr, "dx.lerp"); } + case Builtin::BI__builtin_hlsl_elementwise_frac: { +Value *Op0 = EmitScalarExpr(E->getArg(0)); +if (!E->getArg(0)->getType()->hasFloatingRepresentation()) + llvm_unreachable("frac operand must have a float representation"); +return Builder.CreateIntrinsic( +/*ReturnType*/ Op0->getType(), Intrinsic::dx_frac, +ArrayRef{Op0}, nullptr, "dx.frac"); + } } return nullptr; } diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index 1314bdefa37e7b..0aa8651ba80dc4 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -317,6 +317,38 @@ double3 floor(double3); _HLSL_BUILTIN_ALIAS(__builtin_elementwise_floor) double4 floor(double4); +//===
[clang] [llvm] [HLSL] Implementation of the frac intrinsic (PR #83315)
@@ -5246,6 +5246,23 @@ bool CheckVectorElementCallArgs(Sema *S, CallExpr *TheCall) { return true; } +bool CheckAllArgsAreFloatRepresentation(Sema *S, CallExpr *TheCall) { bharadwajy wrote: Consider changing the function name to either `CheckAllArgsAreFloatType`, `CheckAllArgsAreFloats` or `CheckAllArgsHaveFloatRepresentation` https://github.com/llvm/llvm-project/pull/83315 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [llvm] [HLSL] Implementation of the frac intrinsic (PR #83315)
https://github.com/farzonl updated https://github.com/llvm/llvm-project/pull/83315 >From 2ec582be1c361c212ea846c8433a9cebfeb7b4ba Mon Sep 17 00:00:00 2001 From: Farzon Lotfi Date: Thu, 29 Feb 2024 10:23:31 -0500 Subject: [PATCH 1/6] address merge conflicts --- clang/include/clang/Basic/Builtins.td | 7 +- .../clang/Basic/DiagnosticSemaKinds.td| 2 +- clang/lib/CodeGen/CGBuiltin.cpp | 23 --- clang/lib/Headers/hlsl/hlsl_intrinsics.h | 32 + clang/lib/Sema/SemaChecking.cpp | 25 +++ clang/test/CodeGenHLSL/builtins/frac.hlsl | 69 +++ clang/test/SemaHLSL/BuiltIns/frac-errors.hlsl | 27 .../test/SemaHLSL/OverloadResolutionBugs.hlsl | 12 llvm/include/llvm/IR/IntrinsicsDirectX.td | 8 ++- 9 files changed, 191 insertions(+), 14 deletions(-) create mode 100644 clang/test/CodeGenHLSL/builtins/frac.hlsl create mode 100644 clang/test/SemaHLSL/BuiltIns/frac-errors.hlsl diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td index 36151b49d9363d..9af07e16e1b3cf 100644 --- a/clang/include/clang/Basic/Builtins.td +++ b/clang/include/clang/Basic/Builtins.td @@ -4535,9 +4535,14 @@ def HLSLDotProduct : LangBuiltin<"HLSL_LANG"> { let Attributes = [NoThrow, Const]; let Prototype = "void(...)"; } +def HLSLFrac : LangBuiltin<"HLSL_LANG"> { + let Spellings = ["__builtin_hlsl_elementwise_frac"]; + let Attributes = [NoThrow, Const]; + let Prototype = "void(...)"; +} def HLSLLerp : LangBuiltin<"HLSL_LANG"> { - let Spellings = ["__builtin_hlsl_lerp"]; + let Spellings = ["__builtin_hlsl_elementwise_frac"]; let Attributes = [NoThrow, Const]; let Prototype = "void(...)"; } diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 4ef3ac8c96cd26..4f8902e37bd3bb 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -10270,7 +10270,7 @@ def err_vec_builtin_non_vector_all : Error< "all arguments to %0 must be vectors">; def err_vec_builtin_incompatible_vector_all : Error< "all arguments to %0 must have vectors of the same type">; - + def err_vec_builtin_non_vector : Error< "first two arguments to %0 must be vectors">; def err_vec_builtin_incompatible_vector : Error< diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 74ca96117793c4..98684448f4ff5c 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -18020,14 +18020,7 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, V = Builder.CreateFMul(S, V); return Builder.CreateFAdd(X, V, "dx.lerp"); } - // DXC does this via casting to float should we do the same thing? - if (Xty->isIntegerTy()) { -auto V = Builder.CreateSub(Y, X); -V = Builder.CreateMul(S, V); -return Builder.CreateAdd(X, V, "dx.lerp"); - } - // Bools should have been promoted - llvm_unreachable("Scalar Lerp is only supported on ints and floats."); + llvm_unreachable("Scalar Lerp is only supported on floats."); } // A VectorSplat should have happened assert(Xty->isVectorTy() && Yty->isVectorTy() && Sty->isVectorTy() && @@ -18041,12 +18034,24 @@ Value *CodeGenFunction::EmitHLSLBuiltinExpr(unsigned BuiltinID, E->getArg(2)->getType()->getAs(); // A HLSLVectorTruncation should have happend assert(XVecTy->getNumElements() == YVecTy->getNumElements() && - SVecTy->getNumElements() && + XVecTy->getNumElements() == SVecTy->getNumElements() && "Lerp requires vectors to be of the same size."); +assert(XVecTy->getElementType()->isRealFloatingType() && + XVecTy->getElementType() == YVecTy->getElementType() && + XVecTy->getElementType() == SVecTy->getElementType() && + "Lerp requires float vectors to be of the same type."); return Builder.CreateIntrinsic( /*ReturnType*/ Xty, Intrinsic::dx_lerp, ArrayRef{X, Y, S}, nullptr, "dx.lerp"); } + case Builtin::BI__builtin_hlsl_elementwise_frac: { +Value *Op0 = EmitScalarExpr(E->getArg(0)); +if (!E->getArg(0)->getType()->hasFloatingRepresentation()) + llvm_unreachable("frac operand must have a float representation"); +return Builder.CreateIntrinsic( +/*ReturnType*/ Op0->getType(), Intrinsic::dx_frac, +ArrayRef{Op0}, nullptr, "dx.frac"); + } } return nullptr; } diff --git a/clang/lib/Headers/hlsl/hlsl_intrinsics.h b/clang/lib/Headers/hlsl/hlsl_intrinsics.h index 1314bdefa37e7b..0aa8651ba80dc4 100644 --- a/clang/lib/Headers/hlsl/hlsl_intrinsics.h +++ b/clang/lib/Headers/hlsl/hlsl_intrinsics.h @@ -317,6 +317,38 @@ double3 floor(double3); _HLSL_BUILTIN_ALIAS(__builtin_elementwise_floor) double4 floor(double4); +//===
[clang] [llvm] [HLSL] Implementation of the frac intrinsic (PR #83315)
https://github.com/python3kgae closed https://github.com/llvm/llvm-project/pull/83315 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits