diff options
| author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2025-08-18 09:37:20 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-18 09:37:20 +0100 |
| commit | ce5276f61caa39e5b62af9ff717c6e92eefab2bb (patch) | |
| tree | 49484f08c74d3330b77641e9fcdf7effa4ed35d8 /clang/lib/AST/ExprConstant.cpp | |
| parent | ff68f7115cc816fd9ef479e3d433f7aad1364c06 (diff) | |
[Clang][X86] Add avx512 __builtin_ia32_select* constexpr handling (#152705)
This should allow us to constexpr many avx512 predicated intrinsics where they wrap basic intrinsics that are already constexpr
Fixes #152321
Diffstat (limited to 'clang/lib/AST/ExprConstant.cpp')
| -rw-r--r-- | clang/lib/AST/ExprConstant.cpp | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index cc631d73e8bd..e933918c182c 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -11783,6 +11783,51 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) { return Success(APValue(ResultElements.data(), ResultElements.size()), E); } + case X86::BI__builtin_ia32_selectb_128: + case X86::BI__builtin_ia32_selectb_256: + case X86::BI__builtin_ia32_selectb_512: + case X86::BI__builtin_ia32_selectw_128: + case X86::BI__builtin_ia32_selectw_256: + case X86::BI__builtin_ia32_selectw_512: + case X86::BI__builtin_ia32_selectd_128: + case X86::BI__builtin_ia32_selectd_256: + case X86::BI__builtin_ia32_selectd_512: + case X86::BI__builtin_ia32_selectq_128: + case X86::BI__builtin_ia32_selectq_256: + case X86::BI__builtin_ia32_selectq_512: + case X86::BI__builtin_ia32_selectph_128: + case X86::BI__builtin_ia32_selectph_256: + case X86::BI__builtin_ia32_selectph_512: + case X86::BI__builtin_ia32_selectpbf_128: + case X86::BI__builtin_ia32_selectpbf_256: + case X86::BI__builtin_ia32_selectpbf_512: + case X86::BI__builtin_ia32_selectps_128: + case X86::BI__builtin_ia32_selectps_256: + case X86::BI__builtin_ia32_selectps_512: + case X86::BI__builtin_ia32_selectpd_128: + case X86::BI__builtin_ia32_selectpd_256: + case X86::BI__builtin_ia32_selectpd_512: { + // AVX512 predicated move: "Result = Mask[] ? LHS[] : RHS[]". + APValue SourceMask, SourceLHS, SourceRHS; + if (!EvaluateAsRValue(Info, E->getArg(0), SourceMask) || + !EvaluateAsRValue(Info, E->getArg(1), SourceLHS) || + !EvaluateAsRValue(Info, E->getArg(2), SourceRHS)) + return false; + + APSInt Mask = SourceMask.getInt(); + QualType DestEltTy = E->getType()->castAs<VectorType>()->getElementType(); + unsigned SourceLen = SourceLHS.getVectorLength(); + SmallVector<APValue, 4> ResultElements; + ResultElements.reserve(SourceLen); + + for (unsigned EltNum = 0; EltNum < SourceLen; ++EltNum) { + const APValue &LHS = SourceLHS.getVectorElt(EltNum); + const APValue &RHS = SourceRHS.getVectorElt(EltNum); + ResultElements.push_back(Mask[EltNum] ? LHS : RHS); + } + + return Success(APValue(ResultElements.data(), ResultElements.size()), E); + } } } |
