[clang] [X86][Clang] Add AVX512 Integer Comparison Intrinsics for constexpr Evaluation (PR #164026)

via cfe-commits cfe-commits at lists.llvm.org
Fri Oct 17 18:30:02 PDT 2025


github-actions[bot] wrote:

<!--LLVM CODE FORMAT COMMENT: {clang-format}-->


:warning: C/C++ code formatter, clang-format found issues in your code. :warning:

<details>
<summary>
You can test this locally with the following command:
</summary>

``````````bash
git-clang-format --diff origin/main HEAD --extensions cpp,c,h -- clang/lib/AST/ByteCode/InterpBuiltin.cpp clang/lib/AST/ExprConstant.cpp clang/lib/Headers/avx512vlbwintrin.h clang/test/CodeGen/X86/avx512vlbw-builtins.c --diff_from_common_commit
``````````

:warning:
The reproduction instructions above might return results for more than one PR
in a stack if you are using a stacked PR workflow. You can limit the results by
changing `origin/main` to the base branch/commit you want to compare against.
:warning:

</details>

<details>
<summary>
View the diff from clang-format here.
</summary>

``````````diff
diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
index f1032658c..a9bdd6532 100644
--- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp
+++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
@@ -3101,61 +3101,61 @@ static bool interp__builtin_vec_set(InterpState &S, CodePtr OpPC,
   return true;
 }
 
-  static bool interp__builtin_cmp_mask(InterpState &S, CodePtr OpPC,
-                                        const CallExpr *Call, unsigned ID,
-                                        bool IsUnsigned) {
-    assert(Call->getNumArgs() == 4);
+static bool interp__builtin_cmp_mask(InterpState &S, CodePtr OpPC,
+                                     const CallExpr *Call, unsigned ID,
+                                     bool IsUnsigned) {
+  assert(Call->getNumArgs() == 4);
 
-    APSInt Mask = popToAPSInt(S, Call->getArg(3));
-    APSInt Opcode = popToAPSInt(S, Call->getArg(2));
-    const Pointer &LHS = S.Stk.pop<Pointer>();
-    const Pointer &RHS = S.Stk.pop<Pointer>();
-
-    assert(LHS.getNumElems() == RHS.getNumElems());
+  APSInt Mask = popToAPSInt(S, Call->getArg(3));
+  APSInt Opcode = popToAPSInt(S, Call->getArg(2));
+  const Pointer &LHS = S.Stk.pop<Pointer>();
+  const Pointer &RHS = S.Stk.pop<Pointer>();
 
-    APInt RetMask = APInt::getZero(LHS.getNumElems());
-    unsigned VectorLen = LHS.getNumElems();
-    PrimType ElemT = LHS.getFieldDesc()->getPrimType();
+  assert(LHS.getNumElems() == RHS.getNumElems());
 
-    INT_TYPE_SWITCH_NO_BOOL(ElemT, {
-      for (unsigned ElemNum = 0; ElemNum < VectorLen; ++ElemNum) {
-        APSInt A = LHS.elem<T>(ElemNum).toAPSInt();
-        APSInt B = RHS.elem<T>(ElemNum).toAPSInt();
-        bool result = false;
-        switch (Opcode.getExtValue() & 0x7) {
-          case 0x00: // _MM_CMPINT_EQ
-            result = (A == B);
-            break;
-          case 0x01: // _MM_CMPINT_LT
-            result = IsUnsigned ? A.ult(B) : A.slt(B);
-            break;
-          case 0x02: // _MM_CMPINT_LE
-            result = IsUnsigned ? A.ule(B) : A.sle(B);
-            break;
-          case 0x03: // _MM_CMPINT_FALSE
-            result = false;
-            break;
-          case 0x04: // _MM_CMPINT_NE
-            result = (A != B);
-            break;
-          case 0x05: // _MM_CMPINT_NLT (>=)
-            result = IsUnsigned ? A.uge(B) : A.sge(B);
-            break;
-          case 0x06: // _MM_CMPINT_NLE (>)
-            result = IsUnsigned ? A.ugt(B) : A.sgt(B);
-            break;
-          case 0x07: // _MM_CMPINT_TRUE
-            result = true;
-            break;
-        }
+  APInt RetMask = APInt::getZero(LHS.getNumElems());
+  unsigned VectorLen = LHS.getNumElems();
+  PrimType ElemT = LHS.getFieldDesc()->getPrimType();
 
-        RetMask.setBitVal(ElemNum, Mask[ElemNum] && result);
+  INT_TYPE_SWITCH_NO_BOOL(ElemT, {
+    for (unsigned ElemNum = 0; ElemNum < VectorLen; ++ElemNum) {
+      APSInt A = LHS.elem<T>(ElemNum).toAPSInt();
+      APSInt B = RHS.elem<T>(ElemNum).toAPSInt();
+      bool result = false;
+      switch (Opcode.getExtValue() & 0x7) {
+      case 0x00: // _MM_CMPINT_EQ
+        result = (A == B);
+        break;
+      case 0x01: // _MM_CMPINT_LT
+        result = IsUnsigned ? A.ult(B) : A.slt(B);
+        break;
+      case 0x02: // _MM_CMPINT_LE
+        result = IsUnsigned ? A.ule(B) : A.sle(B);
+        break;
+      case 0x03: // _MM_CMPINT_FALSE
+        result = false;
+        break;
+      case 0x04: // _MM_CMPINT_NE
+        result = (A != B);
+        break;
+      case 0x05: // _MM_CMPINT_NLT (>=)
+        result = IsUnsigned ? A.uge(B) : A.sge(B);
+        break;
+      case 0x06: // _MM_CMPINT_NLE (>)
+        result = IsUnsigned ? A.ugt(B) : A.sgt(B);
+        break;
+      case 0x07: // _MM_CMPINT_TRUE
+        result = true;
+        break;
       }
-    });
 
-    pushInteger(S, RetMask, Call->getType());
-    return true;
-  }
+      RetMask.setBitVal(ElemNum, Mask[ElemNum] && result);
+    }
+  });
+
+  pushInteger(S, RetMask, Call->getType());
+  return true;
+}
 
 static bool interp__builtin_ia32_vpconflict(InterpState &S, CodePtr OpPC,
                                             const CallExpr *Call) {
@@ -4208,7 +4208,8 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
   case X86::BI__builtin_ia32_cmpw512_mask:
   case X86::BI__builtin_ia32_cmpd512_mask:
   case X86::BI__builtin_ia32_cmpq512_mask:
-    return interp__builtin_cmp_mask(S, OpPC, Call, BuiltinID, /*IsUnsigned*/false);
+    return interp__builtin_cmp_mask(S, OpPC, Call, BuiltinID,
+                                    /*IsUnsigned*/ false);
 
   case X86::BI__builtin_ia32_ucmpb128_mask:
   case X86::BI__builtin_ia32_ucmpw128_mask:
@@ -4222,7 +4223,8 @@ bool InterpretBuiltin(InterpState &S, CodePtr OpPC, const CallExpr *Call,
   case X86::BI__builtin_ia32_ucmpw512_mask:
   case X86::BI__builtin_ia32_ucmpd512_mask:
   case X86::BI__builtin_ia32_ucmpq512_mask:
-    return interp__builtin_cmp_mask(S, OpPC, Call, BuiltinID, /*IsUnsigned*/true);
+    return interp__builtin_cmp_mask(S, OpPC, Call, BuiltinID,
+                                    /*IsUnsigned*/ true);
 
   default:
     S.FFDiag(S.Current->getLocation(OpPC),
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index ef17e1638..e1e717ebe 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -15476,8 +15476,9 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E,
   case clang::X86::BI__builtin_ia32_ucmpq512_mask: {
     assert(E->getNumArgs() == 4);
 
-    bool IsUnsigned = (BuiltinOp >= clang::X86::BI__builtin_ia32_ucmpb128_mask &&
-                      BuiltinOp <= clang::X86::BI__builtin_ia32_ucmpq512_mask);
+    bool IsUnsigned =
+        (BuiltinOp >= clang::X86::BI__builtin_ia32_ucmpb128_mask &&
+         BuiltinOp <= clang::X86::BI__builtin_ia32_ucmpq512_mask);
 
     APValue LHS, RHS;
     APSInt Mask, Opcode;
@@ -15487,7 +15488,7 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E,
         !EvaluateInteger(E->getArg(3), Mask, Info))
       return false;
 
-      assert(LHS.getVectorLength() == RHS.getVectorLength());
+    assert(LHS.getVectorLength() == RHS.getVectorLength());
 
     APSInt RetMask = APSInt::getUnsigned(0);
     unsigned VectorLen = LHS.getVectorLength();
@@ -15498,30 +15499,30 @@ bool IntExprEvaluator::VisitBuiltinCallExpr(const CallExpr *E,
       bool result = false;
 
       switch (Opcode.getExtValue() & 0x7) {
-        case 0: // _MM_CMPINT_EQ
-          result = (A == B);
-          break;
-        case 1: // _MM_CMPINT_LT
-          result = IsUnsigned ? A.ult(B) : A.slt(B);
-          break;
-        case 2: // _MM_CMPINT_LE
-          result = IsUnsigned ? A.ule(B) : A.sle(B);
-          break;
-        case 3: // _MM_CMPINT_FALSE
-          result = false;
-          break;
-        case 4: // _MM_CMPINT_NE
-          result = (A != B);
-          break;
-        case 5: // _MM_CMPINT_NLT (>=)
-          result = IsUnsigned ? A.uge(B) : A.sge(B);
-          break;
-        case 6: // _MM_CMPINT_NLE (>)
-          result = IsUnsigned ? A.ugt(B) : A.sgt(B);
-          break;
-        case 7: // _MM_CMPINT_TRUE
-          result = true;
-          break;
+      case 0: // _MM_CMPINT_EQ
+        result = (A == B);
+        break;
+      case 1: // _MM_CMPINT_LT
+        result = IsUnsigned ? A.ult(B) : A.slt(B);
+        break;
+      case 2: // _MM_CMPINT_LE
+        result = IsUnsigned ? A.ule(B) : A.sle(B);
+        break;
+      case 3: // _MM_CMPINT_FALSE
+        result = false;
+        break;
+      case 4: // _MM_CMPINT_NE
+        result = (A != B);
+        break;
+      case 5: // _MM_CMPINT_NLT (>=)
+        result = IsUnsigned ? A.uge(B) : A.sge(B);
+        break;
+      case 6: // _MM_CMPINT_NLE (>)
+        result = IsUnsigned ? A.ugt(B) : A.sgt(B);
+        break;
+      case 7: // _MM_CMPINT_TRUE
+        result = true;
+        break;
       }
 
       RetMask.setBitVal(ElemNum, Mask[ElemNum] && result);
diff --git a/clang/lib/Headers/avx512vlbwintrin.h b/clang/lib/Headers/avx512vlbwintrin.h
index ff7ee777e..97e48357f 100644
--- a/clang/lib/Headers/avx512vlbwintrin.h
+++ b/clang/lib/Headers/avx512vlbwintrin.h
@@ -2386,21 +2386,18 @@ _mm256_mask_storeu_epi8 (void *__P, __mmask32 __U, __m256i __A)
 }
 
 static __inline__ __mmask16 __DEFAULT_FN_ATTRS128_CONSTEXPR
-_mm_test_epi8_mask (__m128i __A, __m128i __B)
-{
+_mm_test_epi8_mask(__m128i __A, __m128i __B) {
   return _mm_cmpneq_epi8_mask (_mm_and_si128(__A, __B), _mm_setzero_si128());
 }
 
 static __inline__ __mmask16 __DEFAULT_FN_ATTRS128_CONSTEXPR
-_mm_mask_test_epi8_mask (__mmask16 __U, __m128i __A, __m128i __B)
-{
+_mm_mask_test_epi8_mask(__mmask16 __U, __m128i __A, __m128i __B) {
   return _mm_mask_cmpneq_epi8_mask (__U, _mm_and_si128 (__A, __B),
                                     _mm_setzero_si128());
 }
 
 static __inline__ __mmask32 __DEFAULT_FN_ATTRS256_CONSTEXPR
-_mm256_test_epi8_mask (__m256i __A, __m256i __B)
-{
+_mm256_test_epi8_mask(__m256i __A, __m256i __B) {
   return _mm256_cmpneq_epi8_mask (_mm256_and_si256(__A, __B),
                                   _mm256_setzero_si256());
 }
@@ -2440,8 +2437,7 @@ _mm256_mask_test_epi16_mask (__mmask16 __U, __m256i __A, __m256i __B)
 }
 
 static __inline__ __mmask16 __DEFAULT_FN_ATTRS128_CONSTEXPR
-_mm_testn_epi8_mask (__m128i __A, __m128i __B)
-{
+_mm_testn_epi8_mask(__m128i __A, __m128i __B) {
   return _mm_cmpeq_epi8_mask (_mm_and_si128 (__A, __B), _mm_setzero_si128());
 }
 

``````````

</details>


https://github.com/llvm/llvm-project/pull/164026


More information about the cfe-commits mailing list