[clang] [clang] VectorExprEvaluator::VisitCallExpr - add constant folding for X86 pslldqi/psrldqi infrinsics (PR #157403)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Sep 11 08:45:50 PDT 2025
https://github.com/kimyounhoex1 updated https://github.com/llvm/llvm-project/pull/157403
>From 38b90ecc3dc30668860cc80a6c8f075536764b5e Mon Sep 17 00:00:00 2001
From: kimyounhoex1 <dordyd11 at 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 <dordyd11 at 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 <dordyd11 at 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 <dordyd11 at 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 <dordyd11 at 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 <dordyd11 at 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 <dordyd11 at 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 <dordyd11 at 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)
More information about the cfe-commits
mailing list