[clang] [Clang] Enable constexpr handling for builtin elementwise fshl/fshr (PR #153572)
Timm Baeder via cfe-commits
cfe-commits at lists.llvm.org
Mon Aug 25 20:17:23 PDT 2025
================
@@ -2817,6 +2817,82 @@ static bool interp__builtin_select(InterpState &S, CodePtr OpPC,
return true;
}
+static bool interp__builtin_elementwise_fsh(InterpState &S, CodePtr OpPC,
+ const CallExpr *Call,
+ unsigned BuiltinID) {
+ assert(Call->getNumArgs() == 3);
+
+ const QualType &Arg1Type = Call->getArg(0)->getType();
+ const QualType &Arg2Type = Call->getArg(1)->getType();
+ const QualType &Arg3Type = Call->getArg(2)->getType();
+
+ // Non-vector integer types.
+ if (!Arg1Type->isVectorType()) {
+ assert(!Arg2Type->isVectorType());
+ assert(!Arg3Type->isVectorType());
+ const APSInt &Shift = popToAPSInt(
+ S.Stk, *S.getContext().classify(Call->getArg(2)->getType()));
+ const APSInt &Lo = popToAPSInt(
+ S.Stk, *S.getContext().classify(Call->getArg(1)->getType()));
+ const APSInt &Hi = popToAPSInt(
+ S.Stk, *S.getContext().classify(Call->getArg(0)->getType()));
+ APSInt Result;
+ if (BuiltinID == Builtin::BI__builtin_elementwise_fshl) {
+ Result = APSInt(llvm::APIntOps::fshl(Hi, Lo, Shift), Hi.isUnsigned());
+ } else if (BuiltinID == Builtin::BI__builtin_elementwise_fshr) {
+ Result = APSInt(llvm::APIntOps::fshr(Hi, Lo, Shift), Hi.isUnsigned());
+ } else {
+ llvm_unreachable("Wrong builtin ID");
+ }
+ pushInteger(S, Result, Call->getType());
+ return true;
+ }
+
+ // Vector type.
+ assert(Arg1Type->isVectorType() && Arg2Type->isVectorType() &&
+ Arg3Type->isVectorType());
+
+ const VectorType *VecT = Arg1Type->castAs<VectorType>();
+ const PrimType &ElemT = *S.getContext().classify(VecT->getElementType());
+ unsigned NumElems = VecT->getNumElements();
+
+ assert(VecT->getElementType() ==
+ Arg2Type->castAs<VectorType>()->getElementType() &&
+ VecT->getElementType() ==
+ Arg3Type->castAs<VectorType>()->getElementType());
----------------
tbaederr wrote:
Yes, I think the assertions still make sense in both cases.
I _think_ we should also use `ASTContext::hasSameUnqualifiedType()` in `Sema::BuiltinElementwiseTernaryMath()` like we do in `BuiltinVectorMath()`.
See also https://github.com/llvm/llvm-project/commit/4d650ef4b3d7a0f21f8681e73586d0319fc3953b, but that can be a follow-up commit (which will have to adjust the assertions as well).
https://github.com/llvm/llvm-project/pull/153572
More information about the cfe-commits
mailing list