Skip to content

Commit 63f08b5

Browse files
SC llvm teamSC llvm team
authored andcommitted
Merged main:d40413013425 into amd-gfx:85fdb0385e9e
Local branch amd-gfx 85fdb03 Manually merged main:416884544e02 into amd-gfx:39064028b3b3 Remote branch main d404130 [libc] Fix accidental LIBC_NAMESPACE_syscall definition (llvm#69548)
2 parents 85fdb03 + d404130 commit 63f08b5

File tree

49 files changed

+801
-88
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+801
-88
lines changed

clang/docs/LanguageExtensions.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -619,6 +619,14 @@ Let ``T`` be one of the following types:
619619

620620
For scalar types, consider the operation applied to a vector with a single element.
621621

622+
*Vector Size*
623+
To determine the number of elements in a vector, use ``__builtin_vectorelements()``.
624+
For fixed-sized vectors, e.g., defined via ``__attribute__((vector_size(N)))`` or ARM
625+
NEON's vector types (e.g., ``uint16x8_t``), this returns the constant number of
626+
elements at compile-time. For scalable vectors, e.g., SVE or RISC-V V, the number of
627+
elements is not known at compile-time and is determined at runtime. This builtin can
628+
be used, e.g., to increment the loop-counter in vector-type agnostic loops.
629+
622630
*Elementwise Builtins*
623631

624632
Each builtin returns a vector equivalent to applying the specified operation

clang/docs/ReleaseNotes.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,12 @@ C23 Feature Support
182182
Non-comprehensive list of changes in this release
183183
-------------------------------------------------
184184

185+
* Clang now has a ``__builtin_vectorelements()`` function that determines the number of elements in a vector.
186+
For fixed-sized vectors, e.g., defined via ``__attribute__((vector_size(N)))`` or ARM NEON's vector types
187+
(e.g., ``uint16x8_t``), this returns the constant number of elements at compile-time.
188+
For scalable vectors, e.g., SVE or RISC-V V, the number of elements is not known at compile-time and is
189+
determined at runtime.
190+
185191
New Compiler Flags
186192
------------------
187193

clang/include/clang/AST/Type.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2060,6 +2060,9 @@ class alignas(TypeAlignment) Type : public ExtQualsTypeCommonBase {
20602060
bool isSizelessType() const;
20612061
bool isSizelessBuiltinType() const;
20622062

2063+
/// Returns true for all scalable vector types.
2064+
bool isSizelessVectorType() const;
2065+
20632066
/// Returns true for SVE scalable vector types.
20642067
bool isSVESizelessBuiltinType() const;
20652068

clang/include/clang/Basic/Builtins.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -674,6 +674,7 @@ BUILTIN(__builtin_debugtrap, "v", "n")
674674
BUILTIN(__builtin_unreachable, "v", "nr")
675675
BUILTIN(__builtin_shufflevector, "v." , "nct")
676676
BUILTIN(__builtin_convertvector, "v." , "nct")
677+
BUILTIN(__builtin_vectorelements, "v." , "nct")
677678
BUILTIN(__builtin_alloca, "v*z" , "Fn")
678679
BUILTIN(__builtin_alloca_uninitialized, "v*z", "Fn")
679680
BUILTIN(__builtin_alloca_with_align, "v*zIz", "Fn")

clang/include/clang/Basic/DiagnosticASTKinds.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,8 @@ def note_constexpr_unsupported_layout : Note<
394394
"type %0 has unexpected layout">;
395395
def note_constexpr_unsupported_flexible_array : Note<
396396
"flexible array initialization is not yet supported">;
397+
def note_constexpr_non_const_vectorelements : Note<
398+
"cannot determine number of elements for sizeless vectors in a constant expression">;
397399
def err_experimental_clang_interp_failed : Error<
398400
"the experimental clang interpreter failed to evaluate an expression">;
399401

clang/include/clang/Basic/DiagnosticSemaKinds.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10169,8 +10169,8 @@ def err_shufflevector_argument_too_large : Error<
1016910169

1017010170
def err_convertvector_non_vector : Error<
1017110171
"first argument to __builtin_convertvector must be a vector">;
10172-
def err_convertvector_non_vector_type : Error<
10173-
"second argument to __builtin_convertvector must be a vector type">;
10172+
def err_builtin_non_vector_type : Error<
10173+
"%0 argument to %1 must be of vector type">;
1017410174
def err_convertvector_incompatible_vector : Error<
1017510175
"first two arguments to __builtin_convertvector must have the same number of elements">;
1017610176

clang/include/clang/Basic/TokenKinds.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -746,6 +746,7 @@ ALIAS("_pascal" , __pascal , KEYBORLAND)
746746

747747
// Clang Extensions.
748748
KEYWORD(__builtin_convertvector , KEYALL)
749+
UNARY_EXPR_OR_TYPE_TRAIT(__builtin_vectorelements, VectorElements, KEYALL)
749750
ALIAS("__char16_t" , char16_t , KEYCXX)
750751
ALIAS("__char32_t" , char32_t , KEYCXX)
751752
KEYWORD(__builtin_bit_cast , KEYALL)

clang/include/clang/Basic/arm_sve.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1862,6 +1862,7 @@ def SVBGRP_N : SInst<"svbgrp[_n_{d}]", "dda", "UcUsUiUl", MergeNone, "aarch64_sv
18621862
let TargetGuard = "sve2p1" in {
18631863
def SVFCLAMP : SInst<"svclamp[_{d}]", "dddd", "hfd", MergeNone, "aarch64_sve_fclamp", [], []>;
18641864
def SVPTRUE_COUNT : SInst<"svptrue_{d}", "}v", "QcQsQiQl", MergeNone, "aarch64_sve_ptrue_{d}", [IsOverloadNone], []>;
1865+
def SVPFALSE_COUNT_ALIAS : SInst<"svpfalse_c", "}v", "", MergeNone, "", [IsOverloadNone]>;
18651866

18661867
def SVPEXT_SINGLE : SInst<"svpext_lane_{d}", "P}i", "QcQsQiQl", MergeNone, "aarch64_sve_pext", [], [ImmCheck<1, ImmCheck0_3>]>;
18671868
def SVPEXT_X2 : SInst<"svpext_lane_{d}_x2", "2.P}i", "QcQsQiQl", MergeNone, "aarch64_sve_pext_x2", [], [ImmCheck<1, ImmCheck0_1>]>;

clang/lib/AST/ExprConstant.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13595,6 +13595,20 @@ bool IntExprEvaluator::VisitUnaryExprOrTypeTraitExpr(
1359513595
Info.Ctx.getOpenMPDefaultSimdAlign(E->getArgumentType()))
1359613596
.getQuantity(),
1359713597
E);
13598+
case UETT_VectorElements: {
13599+
QualType Ty = E->getTypeOfArgument();
13600+
// If the vector has a fixed size, we can determine the number of elements
13601+
// at compile time.
13602+
if (Ty->isVectorType())
13603+
return Success(Ty->castAs<VectorType>()->getNumElements(), E);
13604+
13605+
assert(Ty->isSizelessVectorType());
13606+
if (Info.InConstantContext)
13607+
Info.CCEDiag(E, diag::note_constexpr_non_const_vectorelements)
13608+
<< E->getSourceRange();
13609+
13610+
return false;
13611+
}
1359813612
}
1359913613

1360013614
llvm_unreachable("unknown expr/type trait");

clang/lib/AST/ItaniumMangle.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5127,6 +5127,14 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity,
51275127
Diags.Report(DiagID);
51285128
return;
51295129
}
5130+
case UETT_VectorElements: {
5131+
DiagnosticsEngine &Diags = Context.getDiags();
5132+
unsigned DiagID = Diags.getCustomDiagID(
5133+
DiagnosticsEngine::Error,
5134+
"cannot yet mangle __builtin_vectorelements expression");
5135+
Diags.Report(DiagID);
5136+
return;
5137+
}
51305138
}
51315139
break;
51325140
}

clang/lib/AST/Type.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2369,7 +2369,7 @@ bool Type::isIncompleteType(NamedDecl **Def) const {
23692369
}
23702370

23712371
bool Type::isSizelessBuiltinType() const {
2372-
if (isSVESizelessBuiltinType() || isRVVSizelessBuiltinType())
2372+
if (isSizelessVectorType())
23732373
return true;
23742374

23752375
if (const BuiltinType *BT = getAs<BuiltinType>()) {
@@ -2403,6 +2403,10 @@ bool Type::isWebAssemblyTableType() const {
24032403

24042404
bool Type::isSizelessType() const { return isSizelessBuiltinType(); }
24052405

2406+
bool Type::isSizelessVectorType() const {
2407+
return isSVESizelessBuiltinType() || isRVVSizelessBuiltinType();
2408+
}
2409+
24062410
bool Type::isSVESizelessBuiltinType() const {
24072411
if (const BuiltinType *BT = getAs<BuiltinType>()) {
24082412
switch (BT->getKind()) {

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10160,6 +10160,13 @@ Value *CodeGenFunction::EmitAArch64SVEBuiltinExpr(unsigned BuiltinID,
1016010160
case SVE::BI__builtin_sve_svpfalse_b:
1016110161
return ConstantInt::getFalse(Ty);
1016210162

10163+
case SVE::BI__builtin_sve_svpfalse_c: {
10164+
auto SVBoolTy = ScalableVectorType::get(Builder.getInt1Ty(), 16);
10165+
Function *CastToSVCountF =
10166+
CGM.getIntrinsic(Intrinsic::aarch64_sve_convert_from_svbool, Ty);
10167+
return Builder.CreateCall(CastToSVCountF, ConstantInt::getFalse(SVBoolTy));
10168+
}
10169+
1016310170
case SVE::BI__builtin_sve_svlen_bf16:
1016410171
case SVE::BI__builtin_sve_svlen_f16:
1016510172
case SVE::BI__builtin_sve_svlen_f32:

clang/lib/CodeGen/CGExprScalar.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3083,6 +3083,9 @@ ScalarExprEmitter::VisitUnaryExprOrTypeTraitExpr(
30833083
E->getTypeOfArgument()->getPointeeType()))
30843084
.getQuantity();
30853085
return llvm::ConstantInt::get(CGF.SizeTy, Alignment);
3086+
} else if (E->getKind() == UETT_VectorElements) {
3087+
auto *VecTy = cast<llvm::VectorType>(ConvertType(E->getTypeOfArgument()));
3088+
return Builder.CreateElementCount(CGF.SizeTy, VecTy->getElementCount());
30863089
}
30873090

30883091
// If this isn't sizeof(vla), the result must be constant; use the constant

clang/lib/Lex/Lexer.cpp

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@
4747
#include <tuple>
4848
#include <utility>
4949

50+
#ifdef __SSE4_2__
51+
#include <nmmintrin.h>
52+
#endif
53+
5054
using namespace clang;
5155

5256
//===----------------------------------------------------------------------===//
@@ -1847,19 +1851,47 @@ bool Lexer::LexUnicodeIdentifierStart(Token &Result, uint32_t C,
18471851
return true;
18481852
}
18491853

1854+
static const char *
1855+
fastParseASCIIIdentifier(const char *CurPtr,
1856+
[[maybe_unused]] const char *BufferEnd) {
1857+
#ifdef __SSE4_2__
1858+
alignas(16) static constexpr char AsciiIdentifierRange[16] = {
1859+
'_', '_', 'A', 'Z', 'a', 'z', '0', '9',
1860+
};
1861+
constexpr ssize_t BytesPerRegister = 16;
1862+
1863+
__m128i AsciiIdentifierRangeV =
1864+
_mm_load_si128((const __m128i *)AsciiIdentifierRange);
1865+
1866+
while (LLVM_LIKELY(BufferEnd - CurPtr >= BytesPerRegister)) {
1867+
__m128i Cv = _mm_loadu_si128((const __m128i *)(CurPtr));
1868+
1869+
int Consumed = _mm_cmpistri(AsciiIdentifierRangeV, Cv,
1870+
_SIDD_LEAST_SIGNIFICANT | _SIDD_CMP_RANGES |
1871+
_SIDD_UBYTE_OPS | _SIDD_NEGATIVE_POLARITY);
1872+
CurPtr += Consumed;
1873+
if (Consumed == BytesPerRegister)
1874+
continue;
1875+
return CurPtr;
1876+
}
1877+
#endif
1878+
1879+
unsigned char C = *CurPtr;
1880+
while (isAsciiIdentifierContinue(C))
1881+
C = *++CurPtr;
1882+
return CurPtr;
1883+
}
1884+
18501885
bool Lexer::LexIdentifierContinue(Token &Result, const char *CurPtr) {
18511886
// Match [_A-Za-z0-9]*, we have already matched an identifier start.
1887+
18521888
while (true) {
1853-
unsigned char C = *CurPtr;
1854-
// Fast path.
1855-
if (isAsciiIdentifierContinue(C)) {
1856-
++CurPtr;
1857-
continue;
1858-
}
1889+
1890+
CurPtr = fastParseASCIIIdentifier(CurPtr, BufferEnd);
18591891

18601892
unsigned Size;
18611893
// Slow path: handle trigraph, unicode codepoints, UCNs.
1862-
C = getCharAndSize(CurPtr, Size);
1894+
unsigned char C = getCharAndSize(CurPtr, Size);
18631895
if (isAsciiIdentifierContinue(C)) {
18641896
CurPtr = ConsumeChar(CurPtr, Size, Result);
18651897
continue;

clang/lib/Parse/ParseExpr.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1463,6 +1463,7 @@ ExprResult Parser::ParseCastExpression(CastParseKind ParseKind,
14631463
case tok::kw_vec_step: // unary-expression: OpenCL 'vec_step' expression
14641464
// unary-expression: '__builtin_omp_required_simd_align' '(' type-name ')'
14651465
case tok::kw___builtin_omp_required_simd_align:
1466+
case tok::kw___builtin_vectorelements:
14661467
if (NotPrimaryExpression)
14671468
*NotPrimaryExpression = true;
14681469
AllowSuffix = false;
@@ -2339,7 +2340,8 @@ Parser::ParseExprAfterUnaryExprOrTypeTrait(const Token &OpTok,
23392340
assert(OpTok.isOneOf(tok::kw_typeof, tok::kw_typeof_unqual, tok::kw_sizeof,
23402341
tok::kw___alignof, tok::kw_alignof, tok::kw__Alignof,
23412342
tok::kw_vec_step,
2342-
tok::kw___builtin_omp_required_simd_align) &&
2343+
tok::kw___builtin_omp_required_simd_align,
2344+
tok::kw___builtin_vectorelements) &&
23432345
"Not a typeof/sizeof/alignof/vec_step expression!");
23442346

23452347
ExprResult Operand;
@@ -2460,7 +2462,8 @@ ExprResult Parser::ParseSYCLUniqueStableNameExpression() {
24602462
ExprResult Parser::ParseUnaryExprOrTypeTraitExpression() {
24612463
assert(Tok.isOneOf(tok::kw_sizeof, tok::kw___alignof, tok::kw_alignof,
24622464
tok::kw__Alignof, tok::kw_vec_step,
2463-
tok::kw___builtin_omp_required_simd_align) &&
2465+
tok::kw___builtin_omp_required_simd_align,
2466+
tok::kw___builtin_vectorelements) &&
24642467
"Not a sizeof/alignof/vec_step expression!");
24652468
Token OpTok = Tok;
24662469
ConsumeToken();
@@ -2539,6 +2542,8 @@ ExprResult Parser::ParseUnaryExprOrTypeTraitExpression() {
25392542
ExprKind = UETT_VecStep;
25402543
else if (OpTok.is(tok::kw___builtin_omp_required_simd_align))
25412544
ExprKind = UETT_OpenMPRequiredSimdAlign;
2545+
else if (OpTok.is(tok::kw___builtin_vectorelements))
2546+
ExprKind = UETT_VectorElements;
25422547

25432548
if (isCastExpr)
25442549
return Actions.ActOnUnaryExprOrTypeTraitExpr(OpTok.getLocation(),

clang/lib/Sema/SemaChecking.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8752,8 +8752,9 @@ ExprResult Sema::SemaConvertVectorExpr(Expr *E, TypeSourceInfo *TInfo,
87528752
diag::err_convertvector_non_vector)
87538753
<< E->getSourceRange());
87548754
if (!DstTy->isVectorType() && !DstTy->isDependentType())
8755-
return ExprError(Diag(BuiltinLoc,
8756-
diag::err_convertvector_non_vector_type));
8755+
return ExprError(Diag(BuiltinLoc, diag::err_builtin_non_vector_type)
8756+
<< "second"
8757+
<< "__builtin_convertvector");
87578758

87588759
if (!SrcTy->isDependentType() && !DstTy->isDependentType()) {
87598760
unsigned SrcElts = SrcTy->castAs<VectorType>()->getNumElements();

clang/lib/Sema/SemaExpr.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#include "clang/Basic/SourceManager.h"
3636
#include "clang/Basic/Specifiers.h"
3737
#include "clang/Basic/TargetInfo.h"
38+
#include "clang/Basic/TypeTraits.h"
3839
#include "clang/Lex/LiteralSupport.h"
3940
#include "clang/Lex/Preprocessor.h"
4041
#include "clang/Sema/AnalysisBasedWarnings.h"
@@ -4353,6 +4354,18 @@ static bool CheckVecStepTraitOperandType(Sema &S, QualType T,
43534354
return false;
43544355
}
43554356

4357+
static bool CheckVectorElementsTraitOperandType(Sema &S, QualType T,
4358+
SourceLocation Loc,
4359+
SourceRange ArgRange) {
4360+
// builtin_vectorelements supports both fixed-sized and scalable vectors.
4361+
if (!T->isVectorType() && !T->isSizelessVectorType())
4362+
return S.Diag(Loc, diag::err_builtin_non_vector_type)
4363+
<< ""
4364+
<< "__builtin_vectorelements" << T << ArgRange;
4365+
4366+
return false;
4367+
}
4368+
43564369
static bool CheckExtensionTraitOperandType(Sema &S, QualType T,
43574370
SourceLocation Loc,
43584371
SourceRange ArgRange,
@@ -4454,6 +4467,10 @@ bool Sema::CheckUnaryExprOrTypeTraitOperand(Expr *E,
44544467
return CheckVecStepTraitOperandType(*this, ExprTy, E->getExprLoc(),
44554468
E->getSourceRange());
44564469

4470+
if (ExprKind == UETT_VectorElements)
4471+
return CheckVectorElementsTraitOperandType(*this, ExprTy, E->getExprLoc(),
4472+
E->getSourceRange());
4473+
44574474
// Explicitly list some types as extensions.
44584475
if (!CheckExtensionTraitOperandType(*this, ExprTy, E->getExprLoc(),
44594476
E->getSourceRange(), ExprKind))
@@ -4745,6 +4762,10 @@ bool Sema::CheckUnaryExprOrTypeTraitOperand(QualType ExprType,
47454762
if (ExprKind == UETT_VecStep)
47464763
return CheckVecStepTraitOperandType(*this, ExprType, OpLoc, ExprRange);
47474764

4765+
if (ExprKind == UETT_VectorElements)
4766+
return CheckVectorElementsTraitOperandType(*this, ExprType, OpLoc,
4767+
ExprRange);
4768+
47484769
// Explicitly list some types as extensions.
47494770
if (!CheckExtensionTraitOperandType(*this, ExprType, OpLoc, ExprRange,
47504771
ExprKind))
@@ -4851,6 +4872,8 @@ Sema::CreateUnaryExprOrTypeTraitExpr(Expr *E, SourceLocation OpLoc,
48514872
} else if (E->refersToBitField()) { // C99 6.5.3.4p1.
48524873
Diag(E->getExprLoc(), diag::err_sizeof_alignof_typeof_bitfield) << 0;
48534874
isInvalid = true;
4875+
} else if (ExprKind == UETT_VectorElements) {
4876+
isInvalid = CheckUnaryExprOrTypeTraitOperand(E, UETT_VectorElements);
48544877
} else {
48554878
isInvalid = CheckUnaryExprOrTypeTraitOperand(E, UETT_SizeOf);
48564879
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py
2+
// REQUIRES: aarch64-registered-target
3+
// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve2p1 -S -disable-O0-optnone -Werror -Wall -emit-llvm -o - %s | opt -S -passes=mem2reg,tailcallelim | FileCheck %s
4+
// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve2p1 -S -disable-O0-optnone -Werror -Wall -emit-llvm -o - -x c++ %s | opt -S -passes=mem2reg,tailcallelim | FileCheck %s -check-prefix=CPP-CHECK
5+
// RUN: %clang_cc1 -DSVE_OVERLOADED_FORMS -triple aarch64-none-linux-gnu -target-feature +sve2p1 -S -disable-O0-optnone -Werror -Wall -emit-llvm -o - %s | opt -S -passes=mem2reg,tailcallelim | FileCheck %s
6+
// RUN: %clang_cc1 -DSVE_OVERLOADED_FORMS -triple aarch64-none-linux-gnu -target-feature +sve2p1 -S -disable-O0-optnone -Werror -Wall -emit-llvm -o - -x c++ %s | opt -S -passes=mem2reg,tailcallelim | FileCheck %s -check-prefix=CPP-CHECK
7+
// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve2p1 -S -disable-O0-optnone -Werror -Wall -o /dev/null %s
8+
#include <arm_sve.h>
9+
10+
#ifdef SVE_OVERLOADED_FORMS
11+
// A simple used,unused... macro, long enough to represent any SVE builtin.
12+
#define SVE_ACLE_FUNC(A1,A2_UNUSED,A3,A4_UNUSED) A1##A3
13+
#else
14+
#define SVE_ACLE_FUNC(A1,A2,A3,A4) A1##A2##A3##A4
15+
#endif
16+
17+
// CHECK-LABEL: @test_svpfalse_c(
18+
// CHECK-NEXT: entry:
19+
// CHECK-NEXT: [[TMP0:%.*]] = tail call target("aarch64.svcount") @llvm.aarch64.sve.convert.from.svbool.taarch64.svcountt(<vscale x 16 x i1> zeroinitializer)
20+
// CHECK-NEXT: ret target("aarch64.svcount") [[TMP0]]
21+
//
22+
// CPP-CHECK-LABEL: @_Z15test_svpfalse_cv(
23+
// CPP-CHECK-NEXT: entry:
24+
// CPP-CHECK-NEXT: [[TMP0:%.*]] = tail call target("aarch64.svcount") @llvm.aarch64.sve.convert.from.svbool.taarch64.svcountt(<vscale x 16 x i1> zeroinitializer)
25+
// CPP-CHECK-NEXT: ret target("aarch64.svcount") [[TMP0]]
26+
//
27+
svcount_t test_svpfalse_c()
28+
{
29+
return SVE_ACLE_FUNC(svpfalse_c,,,)();
30+
}

0 commit comments

Comments
 (0)