[clang] [llvm] [HLSL] Implementation of the frac intrinsic (PR #83315)

2024-02-28 Thread Farzon Lotfi via cfe-commits

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)

2024-02-28 Thread Farzon Lotfi via cfe-commits

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)

2024-02-28 Thread via cfe-commits

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)

2024-02-28 Thread Xiang Li via cfe-commits


@@ -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)

2024-02-28 Thread Farzon Lotfi via cfe-commits


@@ -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)

2024-02-28 Thread Farzon Lotfi via cfe-commits

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)

2024-02-28 Thread Xiang Li via cfe-commits


@@ -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)

2024-02-28 Thread Xiang Li via cfe-commits

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)

2024-02-28 Thread Justin Bogner via cfe-commits

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)

2024-02-28 Thread Justin Bogner via cfe-commits

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)

2024-02-28 Thread Justin Bogner via cfe-commits


@@ -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)

2024-02-28 Thread Farzon Lotfi via cfe-commits

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)

2024-02-29 Thread Farzon Lotfi via cfe-commits

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)

2024-02-29 Thread Farzon Lotfi via cfe-commits

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)

2024-02-29 Thread Farzon Lotfi via cfe-commits

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)

2024-02-29 Thread S. Bharadwaj Yadavalli via cfe-commits


@@ -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)

2024-02-29 Thread Farzon Lotfi via cfe-commits

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)

2024-02-29 Thread Xiang Li via cfe-commits

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