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/8] 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/8] 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/8] 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/8] 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/8] [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); >From 6b0dc7bec982fe2acd0dc3a7f0030344190fbd10 Mon Sep 17 00:00:00 2001 From: kimyounhoex1 <dordy...@gmail.com> Date: Thu, 4 Sep 2025 01:33:33 +0900 Subject: [PATCH 6/8] Title: [clang] VectorExprEvaluator::VisitCallExpr - add constant folding for X86 psllDqi/psrlDqi intrinsics feat(exprconst): branch statement handling --- clang/lib/AST/ExprConstant.cpp | 62 ++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index dc78e29378b26..a350816857917 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -12095,7 +12095,69 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) { break; } } + 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 2c6d3607c9be26d20851374f7accd7ffeb5e9afc Mon Sep 17 00:00:00 2001 From: kimyounhoex1 <dordy...@gmail.com> Date: Thu, 11 Sep 2025 22:38:37 +0900 Subject: [PATCH 7/8] [clang] VectorExprEvaluator::VisitCallExpr - add constant folding for X86 pslldqi/psrldqi infrinsics --- clang/lib/AST/ExprConstant.cpp | 86 ++++++++++++++-------------------- 1 file changed, 36 insertions(+), 50 deletions(-) diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index a350816857917..1dc3d869fa5c8 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -11592,7 +11592,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); @@ -12096,69 +12099,52 @@ 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)) - 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_psrldqi128_byteshift: 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(); + return false; + unsigned ShiftVal = (unsigned)Amt.getZExtValue() & 0xff; APValue Vec; if (!Evaluate(Vec, Info, E->getArg(0)) || !Vec.isVector()) break; - SmallVector<APValue, 32> ResultElements; - ResultElements.reserve(32); + unsigned NumElts = Vec.getVectorLength(); + const unsigned LaneBytes = 16; + SmallVector<APValue, 64> Result; + Result.resize(NumElts, APValue(0)); - bool isLeft = (BuiltinID == X86::BI__builtin_ia32_pslldqi256_byteshift); + bool IsLeft = (E->getBuiltinCallee() == X86::BI__builtin_ia32_pslldqi128_byteshift || + E->getBuiltinCallee() == 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; + SmallVector<APValue, 64> Result; + Result.resize(NumElts, APValue(0)); - if (SrcIdx >= 0 && (unsigned)SrcIdx < 32) - ResultElements.push_back(Vec.getVectorElt(SrcIdx)); + SmallVector<int, 64> Indices; + Indices.reserve(NumElts); + + unsigned LaneSize = LaneBytes; + for (unsigned laneBase = 0; laneBase < NumElts; laneBase += LaneSize) { + for (unsigned i = 0; i < LaneSize; ++i) { + int src = IsLeft ? (i + ShiftVal) : (int)i - (int)ShiftVal; + + if (src >= 0 && (unsigned)src < LaneSize) + Indices.push_back(laneBase + src); + else + Indices.push_back(-1); + } + } + + for (unsigned i = 0; i < NumElts; i++) { + int src = Indices[i]; + if (src >= 0) + Result[i] = Vec.getVectorElt((unsigned)src); else - ResultElements.push_back(APValue(0)); + Result[i] = APValue(0); } - return Success(APValue(ResultElements.data(), ResultElements.size()), E); + return Success(APValue(Result.data(), Result.size()), E); } } } >From 94354209d2f396b340fbed4ab19ba4e9ea950b65 Mon Sep 17 00:00:00 2001 From: kimyounhoex1 <dordy...@gmail.com> Date: Fri, 12 Sep 2025 00:45:32 +0900 Subject: [PATCH 8/8] [clang] VectorExprEvaluator::VisitCallExpr - add constant folding for X86 pslldqi/psrldqi infrinsics --- clang/lib/AST/ExprConstant.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp index 1dc3d869fa5c8..e04ba2193828b 100644 --- a/clang/lib/AST/ExprConstant.cpp +++ b/clang/lib/AST/ExprConstant.cpp @@ -12116,8 +12116,9 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) { SmallVector<APValue, 64> Result; Result.resize(NumElts, APValue(0)); - bool IsLeft = (E->getBuiltinCallee() == X86::BI__builtin_ia32_pslldqi128_byteshift || - E->getBuiltinCallee() == X86::BI__builtin_ia32_pslldqi256_byteshift); + bool IsLeft = + (E->getBuiltinCallee() == X86::BI__builtin_ia32_pslldqi128_byteshift || + E->getBuiltinCallee() == X86::BI__builtin_ia32_pslldqi256_byteshift); SmallVector<APValue, 64> Result; Result.resize(NumElts, APValue(0)); @@ -12136,7 +12137,7 @@ bool VectorExprEvaluator::VisitCallExpr(const CallExpr *E) { Indices.push_back(-1); } } - + for (unsigned i = 0; i < NumElts; i++) { int src = Indices[i]; if (src >= 0) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits