[clang] [clang] VectorExprEvaluator::VisitCallExpr - add constant folding for X86 pslldqi/psrldqi infrinsics (PR #157403)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Sep 8 02:26:46 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/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 <dordyd11 at 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 <dordyd11 at 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 <dordyd11 at 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 <dordyd11 at 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);
More information about the cfe-commits
mailing list