https://github.com/kimyounhoex1 updated https://github.com/llvm/llvm-project/pull/157403
>From 38b90ecc3dc30668860cc80a6c8f075536764b5e Mon Sep 17 00:00:00 2001 From: kimyounhoex1 <dordy...@gmail.com> Date: Thu, 4 Sep 2025 00:55:24 +0900 Subject: [PATCH 1/5] todo list --- clang/lib/AST/ExprConstant.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index b4f1e76187e25..97138134fb075 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -11267,6 +11267,10 @@ static llvm::APInt ConvertBoolVectorToInt(const APValue &Val) { return Result; } +// i should emplement SLLDQ, SRLDQ shift (intrinsics) in constant expression +// handling inside this function +// avx2intrin.h -> _mm256_slli_si256 +// emmintrin.h -> _mm_slli_si128 bool VectorExprEvaluator::VisitCastExpr(const CastExpr *E) { const VectorType *VTy = E->getType()->castAs<VectorType>(); unsigned NElts = VTy->getNumElements(); >From eb258bacfb493ee6e60e833458588752da3a27e4 Mon Sep 17 00:00:00 2001 From: kimyounhoex1 <dordy...@gmail.com> Date: Thu, 4 Sep 2025 00:59:28 +0900 Subject: [PATCH 2/5] todo list --- clang/lib/AST/ExprConstant.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 97138134fb075..cfaef65511e9b 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -11267,10 +11267,6 @@ static llvm::APInt ConvertBoolVectorToInt(const APValue &Val) { return Result; } -// i should emplement SLLDQ, SRLDQ shift (intrinsics) in constant expression -// handling inside this function -// avx2intrin.h -> _mm256_slli_si256 -// emmintrin.h -> _mm_slli_si128 bool VectorExprEvaluator::VisitCastExpr(const CastExpr *E) { const VectorType *VTy = E->getType()->castAs<VectorType>(); unsigned NElts = VTy->getNumElements(); @@ -11559,7 +11555,10 @@ static bool handleVectorElementCast(EvalInfo &Info, const FPOptions FPO, << SourceTy << DestTy; return false; } - +// i should emplement SLLDQ, SRLDQ shift (intrinsics) in constant expression +// handling inside this function +// avx2intrin.h -> _mm256_slli_si256 +// emmintrin.h -> _mm_slli_si128 bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) { if (!IsConstantEvaluatedBuiltinCall(E)) return ExprEvaluatorBaseTy::VisitCallExpr(E); >From f93dc8fa5b5baaf37fc04c3e379ab0c56b94d412 Mon Sep 17 00:00:00 2001 From: kimyounhoex1 <dordy...@gmail.com> Date: Thu, 4 Sep 2025 01:33:33 +0900 Subject: [PATCH 3/5] feat(exprconst): branch statement handling --- clang/lib/AST/ExprConstant.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index cfaef65511e9b..b55fa4d0975d7 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -12042,6 +12042,13 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) { } return Success(APValue(ResultElements.data(), ResultElements.size()), E); } + case clang::X86__builtin_ia32_pslldqi128: + case clang::X86__builtin_ia32_psrldqi128: + case clang::X86__builtin_ia32_pslldqi256: + case clang::X86__builtin_ia32_psrldqi256: { + + } + } } >From eb95364b26db0d11e45914ff70c65c8beb1e1c09 Mon Sep 17 00:00:00 2001 From: kimyounhoex1 <dordy...@gmail.com> Date: Sat, 6 Sep 2025 19:18:23 +0900 Subject: [PATCH 4/5] feat(exprconst): implement shift in compile time --- clang/lib/AST/ExprConstant.cpp | 66 +++++++++++++++++++++++++++++++--- 1 file changed, 62 insertions(+), 4 deletions(-) diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index b55fa4d0975d7..1ecc36705595a 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -12042,13 +12042,71 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) { } return Success(APValue(ResultElements.data(), ResultElements.size()), E); } - case clang::X86__builtin_ia32_pslldqi128: - case clang::X86__builtin_ia32_psrldqi128: - case clang::X86__builtin_ia32_pslldqi256: - case clang::X86__builtin_ia32_psrldqi256: { + case X86::BI__builtin_ia32_pslldqi128_byteshift: + case X86::BI__builtin_ia32_psrldqi128_byteshift: { + unsigned BuiltinID = E->getBuiltinCallee(); + APSInt Amt; + if(!EvaluateInteger(E->getArg(1),Amt, Info)) + break; + unsigned Shift = (unsigned)Amt.getZExtValue(); + + APValue Vec; + if (!Evaluate(Vec, Info, E->getArg(0)) || !Vec.isVector()) + break; + + SmallVector<APValue, 16> ResultElements; + ResultElements.reserve(16); + + bool isLeft = (BuiltinID == X86::BI__builtin_ia32_pslldqi128_byteshift); + + for (unsigned i = 0; i < 16; i++) { + int SrcIdx = -1; + if (isLeft) + SrcIdx = i + Shift; + else if (i >= Shift) + SrcIdx = i - Shift; + + if (SrcIdx >= 0 && (unsigned)SrcIdx < 16) + ResultElements.push_back(Vec.getVectorElt(SrcIdx)); + else + ResultElements.push_back(APValue(0)); + } + return Success(APValue(ResultElements.data(), ResultElements.size()), E); } + + case X86::BI__builtin_ia32_pslldqi256_byteshift: + case X86::BI__builtin_ia32_psrldqi256_byteshift: { + unsigned BuiltinID = E->getBuiltinCallee(); + + APSInt Amt; + if(!EvaluateInteger(E->getArg(1),Amt, Info)) + break; + unsigned Shift = (unsigned)Amt.getZExtValue(); + + APValue Vec; + if (!Evaluate(Vec, Info, E->getArg(0)) || !Vec.isVector()) + break; + + SmallVector<APValue, 32> ResultElements; + ResultElements.reserve(32); + + bool isLeft = (BuiltinID == X86::BI__builtin_ia32_pslldqi256_byteshift); + for (unsigned i = 0; i < 32; i++) { + int SrcIdx = -1; + if (isLeft) + SrcIdx = i + Shift; + else if (i >= Shift) + SrcIdx = i - Shift; + + if (SrcIdx >= 0 && (unsigned)SrcIdx < 32) + ResultElements.push_back(Vec.getVectorElt(SrcIdx)); + else + ResultElements.push_back(APValue(0)); + } + return Success(APValue(ResultElements.data(), ResultElements.size()), E); + } } } >From f00eec1a98a6da4372d03e1c2723241aa9ebd727 Mon Sep 17 00:00:00 2001 From: kimyounhoex1 <dordy...@gmail.com> Date: Mon, 8 Sep 2025 17:08:17 +0900 Subject: [PATCH 5/5] [clang] VectorExprEvaluator::VisitCallExpr - add constant folding for X86 pslldqi/psrldqi infrinsics --- clang/lib/AST/ExprConstant.cpp | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 1ecc36705595a..2b06705a4870c 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -11555,10 +11555,7 @@ static bool handleVectorElementCast(EvalInfo &Info, const FPOptions FPO, << SourceTy << DestTy; return false; } -// i should emplement SLLDQ, SRLDQ shift (intrinsics) in constant expression -// handling inside this function -// avx2intrin.h -> _mm256_slli_si256 -// emmintrin.h -> _mm_slli_si128 + bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) { if (!IsConstantEvaluatedBuiltinCall(E)) return ExprEvaluatorBaseTy::VisitCallExpr(E); @@ -12045,16 +12042,16 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) { case X86::BI__builtin_ia32_pslldqi128_byteshift: case X86::BI__builtin_ia32_psrldqi128_byteshift: { unsigned BuiltinID = E->getBuiltinCallee(); - + APSInt Amt; - if(!EvaluateInteger(E->getArg(1),Amt, Info)) + if (!EvaluateInteger(E->getArg(1), Amt, Info)) break; unsigned Shift = (unsigned)Amt.getZExtValue(); - + APValue Vec; if (!Evaluate(Vec, Info, E->getArg(0)) || !Vec.isVector()) break; - + SmallVector<APValue, 16> ResultElements; ResultElements.reserve(16); @@ -12074,20 +12071,20 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) { } return Success(APValue(ResultElements.data(), ResultElements.size()), E); } - + case X86::BI__builtin_ia32_pslldqi256_byteshift: case X86::BI__builtin_ia32_psrldqi256_byteshift: { unsigned BuiltinID = E->getBuiltinCallee(); - + APSInt Amt; - if(!EvaluateInteger(E->getArg(1),Amt, Info)) + if (!EvaluateInteger(E->getArg(1), Amt, Info)) break; unsigned Shift = (unsigned)Amt.getZExtValue(); - + APValue Vec; if (!Evaluate(Vec, Info, E->getArg(0)) || !Vec.isVector()) break; - + SmallVector<APValue, 32> ResultElements; ResultElements.reserve(32); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits