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

Reply via email to