diff options
author | Vincent <llvm@viceroygroup.ca> | 2025-08-14 19:34:23 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-08-14 12:34:23 +0100 |
commit | d3bbdc7bdea651658c4964346d34ac470742d90d (patch) | |
tree | aad9e875b76ca6d60d2bb5943647d6a7ea471cd4 /clang/lib/AST/ExprConstant.cpp | |
parent | 3bc3b4cf5fe96afed668f24d741e509bae55cdc6 (diff) | |
download | llvm-d3bbdc7bdea651658c4964346d34ac470742d90d.zip llvm-d3bbdc7bdea651658c4964346d34ac470742d90d.tar.gz llvm-d3bbdc7bdea651658c4964346d34ac470742d90d.tar.bz2 |
[clang] constexpr `__builtin_elementwise_abs` support (#152497)
Added constant evaluation support for `__builtin_elementwise_abs` on integer, float and vector type.
fixes #152276
---------
Co-authored-by: Simon Pilgrim <llvm-dev@redking.me.uk>
Diffstat (limited to 'clang/lib/AST/ExprConstant.cpp')
-rw-r--r-- | clang/lib/AST/ExprConstant.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 36dd0f5..7d45422 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -11639,6 +11639,29 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) { return Success(APValue(ResultElements.data(), ResultElements.size()), E); } + case Builtin::BI__builtin_elementwise_abs: { + APValue Source; + if (!EvaluateAsRValue(Info, E->getArg(0), Source)) + return false; + + QualType DestEltTy = E->getType()->castAs<VectorType>()->getElementType(); + unsigned SourceLen = Source.getVectorLength(); + SmallVector<APValue, 4> ResultElements; + ResultElements.reserve(SourceLen); + + for (unsigned EltNum = 0; EltNum < SourceLen; ++EltNum) { + APValue CurrentEle = Source.getVectorElt(EltNum); + APValue Val = DestEltTy->isFloatingType() + ? APValue(llvm::abs(CurrentEle.getFloat())) + : APValue(APSInt( + CurrentEle.getInt().abs(), + DestEltTy->isUnsignedIntegerOrEnumerationType())); + ResultElements.push_back(Val); + } + + return Success(APValue(ResultElements.data(), ResultElements.size()), E); + } + case Builtin::BI__builtin_elementwise_add_sat: case Builtin::BI__builtin_elementwise_sub_sat: case clang::X86::BI__builtin_ia32_pmulhuw128: @@ -13387,6 +13410,14 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E, return Success(Operand, E); } + case Builtin::BI__builtin_elementwise_abs: { + APSInt Val; + if (!EvaluateInteger(E->getArg(0), Val, Info)) + return false; + + return Success(Val.abs(), E); + } + case Builtin::BI__builtin_expect: case Builtin::BI__builtin_expect_with_probability: return Visit(E->getArg(0)); @@ -15878,6 +15909,7 @@ bool FloatExprEvaluator::VisitCallExpr(const CallExpr *E) { return Error(E); return true; + case Builtin::BI__builtin_elementwise_abs: case Builtin::BI__builtin_fabs: case Builtin::BI__builtin_fabsf: case Builtin::BI__builtin_fabsl: |