https://github.com/RKSimon created 
https://github.com/llvm/llvm-project/pull/204969

I've also moved the constant expression evaluations to be with the other 
generic implementations instead of the x86 custom handling

>From fde0b181457ead270ebcee97216c3a6882376ee1 Mon Sep 17 00:00:00 2001
From: Simon Pilgrim <[email protected]>
Date: Sun, 21 Jun 2026 10:37:57 +0100
Subject: [PATCH] [X86] Remove x86 PDEP/PEXT clang intrinsics and rely on
 generic elementwise implementations

I've also moved the constant expression evaluations to be with the other 
generic implementations instead of the x86 custom handling
---
 clang/include/clang/Basic/BuiltinsX86.td    |  2 --
 clang/include/clang/Basic/BuiltinsX86_64.td |  2 --
 clang/lib/AST/ByteCode/InterpBuiltin.cpp    | 20 ++++++--------
 clang/lib/AST/ExprConstant.cpp              | 29 +++++++--------------
 clang/lib/CodeGen/TargetBuiltins/X86.cpp    | 10 -------
 clang/lib/Headers/bmi2intrin.h              |  8 +++---
 6 files changed, 22 insertions(+), 49 deletions(-)

diff --git a/clang/include/clang/Basic/BuiltinsX86.td 
b/clang/include/clang/Basic/BuiltinsX86.td
index c8c371625b568..d4009479e8e2b 100644
--- a/clang/include/clang/Basic/BuiltinsX86.td
+++ b/clang/include/clang/Basic/BuiltinsX86.td
@@ -816,8 +816,6 @@ let Attributes = [NoThrow, Const, Constexpr] in {
 
 let Features = "bmi2", Attributes = [NoThrow, Const, Constexpr] in {
   def bzhi_si : X86Builtin<"unsigned int(unsigned int, unsigned int)">;
-  def pdep_si : X86Builtin<"unsigned int(unsigned int, unsigned int)">;
-  def pext_si : X86Builtin<"unsigned int(unsigned int, unsigned int)">;
 }
 
 let Features = "tbm", Attributes = [NoThrow, Const, Constexpr] in {
diff --git a/clang/include/clang/Basic/BuiltinsX86_64.td 
b/clang/include/clang/Basic/BuiltinsX86_64.td
index baba21d47f93f..02b48674bac51 100644
--- a/clang/include/clang/Basic/BuiltinsX86_64.td
+++ b/clang/include/clang/Basic/BuiltinsX86_64.td
@@ -137,8 +137,6 @@ let Attributes = [NoThrow, Const, Constexpr] in {
 
 let Features = "bmi2", Attributes = [NoThrow, Const, Constexpr] in {
   def bzhi_di : X86Builtin<"unsigned long long int(unsigned long long int, 
unsigned long long int)">;
-  def pdep_di : X86Builtin<"unsigned long long int(unsigned long long int, 
unsigned long long int)">;
-  def pext_di : X86Builtin<"unsigned long long int(unsigned long long int, 
unsigned long long int)">;
 }
 
 let Features = "tbm", Attributes = [NoThrow, Const, Constexpr] in {
diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp 
b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
index 5eb1e51f76a00..73a73bdb5a80d 100644
--- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp
+++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
@@ -5114,18 +5114,6 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, 
const CallExpr *Call,
           return APInt(Src.getBitWidth(), Src.countTrailingZeros());
         });
 
-  case clang::X86::BI__builtin_ia32_pdep_si:
-  case clang::X86::BI__builtin_ia32_pdep_di:
-  case Builtin::BI__builtin_elementwise_pdep:
-    return interp__builtin_elementwise_int_binop(S, OpPC, Call,
-                                                 llvm::APIntOps::expandBits);
-
-  case clang::X86::BI__builtin_ia32_pext_si:
-  case clang::X86::BI__builtin_ia32_pext_di:
-  case Builtin::BI__builtin_elementwise_pext:
-    return interp__builtin_elementwise_int_binop(S, OpPC, Call,
-                                                 llvm::APIntOps::compressBits);
-
   case clang::X86::BI__builtin_ia32_addcarryx_u32:
   case clang::X86::BI__builtin_ia32_addcarryx_u64:
     return interp__builtin_ia32_addcarry_subborrow(S, OpPC, Frame, Call,
@@ -5176,6 +5164,14 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, 
const CallExpr *Call,
     return interp__builtin_elementwise_int_unaryop(
         S, OpPC, Call, [](const APSInt &Src) { return Src.reverseBits(); });
 
+  case Builtin::BI__builtin_elementwise_pdep:
+    return interp__builtin_elementwise_int_binop(S, OpPC, Call,
+                                                 llvm::APIntOps::expandBits);
+
+  case Builtin::BI__builtin_elementwise_pext:
+    return interp__builtin_elementwise_int_binop(S, OpPC, Call,
+                                                 llvm::APIntOps::compressBits);
+
   case Builtin::BI__builtin_elementwise_abs:
     return interp__builtin_elementwise_abs(S, OpPC, Frame, Call, BuiltinID);
 
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index f7d63d91737c0..b8362cf84d210 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -12472,6 +12472,16 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr 
*E) {
       return LHS.isSigned() ? LHS.ssub_sat(RHS) : LHS.usub_sat(RHS);
     });
 
+  case Builtin::BI__builtin_elementwise_pdep:
+    return EvaluateBinOpExpr([](const APSInt &Val, const APSInt &Msk) {
+      return llvm::APIntOps::expandBits(Val, Msk);
+    });
+
+  case Builtin::BI__builtin_elementwise_pext:
+    return EvaluateBinOpExpr([](const APSInt &Val, const APSInt &Msk) {
+      return llvm::APIntOps::compressBits(Val, Msk);
+    });
+
   case X86::BI__builtin_ia32_extract128i256:
   case X86::BI__builtin_ia32_vextractf128_pd256:
   case X86::BI__builtin_ia32_vextractf128_ps256:
@@ -17926,25 +17936,6 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const 
CallExpr *E,
     return Success(Val.countTrailingZeros(), E);
   }
 
-  case clang::X86::BI__builtin_ia32_pdep_si:
-  case clang::X86::BI__builtin_ia32_pdep_di:
-  case Builtin::BI__builtin_elementwise_pdep: {
-    APSInt Val, Msk;
-    if (!EvaluateInteger(E->getArg(0), Val, Info) ||
-        !EvaluateInteger(E->getArg(1), Msk, Info))
-      return false;
-    return Success(llvm::APIntOps::expandBits(Val, Msk), E);
-  }
-
-  case clang::X86::BI__builtin_ia32_pext_si:
-  case clang::X86::BI__builtin_ia32_pext_di:
-  case Builtin::BI__builtin_elementwise_pext: {
-    APSInt Val, Msk;
-    if (!EvaluateInteger(E->getArg(0), Val, Info) ||
-        !EvaluateInteger(E->getArg(1), Msk, Info))
-      return false;
-    return Success(llvm::APIntOps::compressBits(Val, Msk), E);
-  }
   case X86::BI__builtin_ia32_ptestz128:
   case X86::BI__builtin_ia32_ptestz256:
   case X86::BI__builtin_ia32_vtestzps:
diff --git a/clang/lib/CodeGen/TargetBuiltins/X86.cpp 
b/clang/lib/CodeGen/TargetBuiltins/X86.cpp
index 50125a71fcd5f..acfeb9967cd2f 100644
--- a/clang/lib/CodeGen/TargetBuiltins/X86.cpp
+++ b/clang/lib/CodeGen/TargetBuiltins/X86.cpp
@@ -976,16 +976,6 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned 
BuiltinID,
     Function *F = CGM.getIntrinsic(Intrinsic::cttz, Ops[0]->getType());
     return Builder.CreateCall(F, {Ops[0], Builder.getInt1(false)});
   }
-  case X86::BI__builtin_ia32_pdep_si:
-  case X86::BI__builtin_ia32_pdep_di: {
-    Function *F = CGM.getIntrinsic(Intrinsic::pdep, Ops[0]->getType());
-    return Builder.CreateCall(F, Ops);
-  }
-  case X86::BI__builtin_ia32_pext_si:
-  case X86::BI__builtin_ia32_pext_di: {
-    Function *F = CGM.getIntrinsic(Intrinsic::pext, Ops[0]->getType());
-    return Builder.CreateCall(F, Ops);
-  }
   case X86::BI__builtin_ia32_undef128:
   case X86::BI__builtin_ia32_undef256:
   case X86::BI__builtin_ia32_undef512:
diff --git a/clang/lib/Headers/bmi2intrin.h b/clang/lib/Headers/bmi2intrin.h
index bdb61b13fb83b..38e6d1d28da8b 100644
--- a/clang/lib/Headers/bmi2intrin.h
+++ b/clang/lib/Headers/bmi2intrin.h
@@ -74,7 +74,7 @@ _bzhi_u32(unsigned int __X, unsigned int __Y) {
 /// \returns The 32-bit result.
 static __inline__ unsigned int __DEFAULT_FN_ATTRS
 _pdep_u32(unsigned int __X, unsigned int __Y) {
-  return __builtin_ia32_pdep_si(__X, __Y);
+  return __builtin_elementwise_pdep(__X, __Y);
 }
 
 /// Extract (gather) bits from the unsigned 32-bit integer \a __X into the
@@ -103,7 +103,7 @@ _pdep_u32(unsigned int __X, unsigned int __Y) {
 /// \returns The 32-bit result.
 static __inline__ unsigned int __DEFAULT_FN_ATTRS
 _pext_u32(unsigned int __X, unsigned int __Y) {
-  return __builtin_ia32_pext_si(__X, __Y);
+  return __builtin_elementwise_pext(__X, __Y);
 }
 
 /// Multiplies the unsigned 32-bit integers \a __X and \a __Y to form a
@@ -186,7 +186,7 @@ _bzhi_u64(unsigned long long __X, unsigned long long __Y) {
 /// \returns The 64-bit result.
 static __inline__ unsigned long long __DEFAULT_FN_ATTRS
 _pdep_u64(unsigned long long __X, unsigned long long __Y) {
-  return __builtin_ia32_pdep_di(__X, __Y);
+  return __builtin_elementwise_pdep(__X, __Y);
 }
 
 /// Extract (gather) bits from the unsigned 64-bit integer \a __X into the
@@ -215,7 +215,7 @@ _pdep_u64(unsigned long long __X, unsigned long long __Y) {
 /// \returns The 64-bit result.
 static __inline__ unsigned long long __DEFAULT_FN_ATTRS
 _pext_u64(unsigned long long __X, unsigned long long __Y) {
-  return __builtin_ia32_pext_di(__X, __Y);
+  return __builtin_elementwise_pext(__X, __Y);
 }
 
 /// Multiplies the unsigned 64-bit integers \a __X and \a __Y to form a

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to