[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