Skip to content

Commit 12322b2

Browse files
authored
[AArch64][SVE] Allow basic use of target("aarch64.svcount") with +sve (#167875)
This prevents the backend from crashing for basic uses of __SVCount_t type (e.g., as function arguments), without +sve2p1 or +sme2. Fixes #167462
1 parent f7e6521 commit 12322b2

File tree

2 files changed

+13
-11
lines changed

2 files changed

+13
-11
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,9 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
445445
addRegisterClass(MVT::nxv8i1, &AArch64::PPRRegClass);
446446
addRegisterClass(MVT::nxv16i1, &AArch64::PPRRegClass);
447447

448+
// Add sve predicate as counter type
449+
addRegisterClass(MVT::aarch64svcount, &AArch64::PPRRegClass);
450+
448451
// Add legal sve data types
449452
addRegisterClass(MVT::nxv16i8, &AArch64::ZPRRegClass);
450453
addRegisterClass(MVT::nxv8i16, &AArch64::ZPRRegClass);
@@ -473,15 +476,6 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
473476
}
474477
}
475478

476-
if (Subtarget->hasSVE2p1() || Subtarget->hasSME2()) {
477-
addRegisterClass(MVT::aarch64svcount, &AArch64::PPRRegClass);
478-
setOperationPromotedToType(ISD::LOAD, MVT::aarch64svcount, MVT::nxv16i1);
479-
setOperationPromotedToType(ISD::STORE, MVT::aarch64svcount, MVT::nxv16i1);
480-
481-
setOperationAction(ISD::SELECT, MVT::aarch64svcount, Custom);
482-
setOperationAction(ISD::SELECT_CC, MVT::aarch64svcount, Expand);
483-
}
484-
485479
// Compute derived properties from the register classes
486480
computeRegisterProperties(Subtarget->getRegisterInfo());
487481

@@ -1609,6 +1603,14 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
16091603
MVT::nxv4i16, MVT::nxv4i32, MVT::nxv8i8, MVT::nxv8i16 })
16101604
setOperationAction(ISD::SIGN_EXTEND_INREG, VT, Legal);
16111605

1606+
// Promote predicate as counter load/stores to standard predicates.
1607+
setOperationPromotedToType(ISD::LOAD, MVT::aarch64svcount, MVT::nxv16i1);
1608+
setOperationPromotedToType(ISD::STORE, MVT::aarch64svcount, MVT::nxv16i1);
1609+
1610+
// Predicate as counter legalization actions.
1611+
setOperationAction(ISD::SELECT, MVT::aarch64svcount, Custom);
1612+
setOperationAction(ISD::SELECT_CC, MVT::aarch64svcount, Expand);
1613+
16121614
for (auto VT :
16131615
{MVT::nxv16i1, MVT::nxv8i1, MVT::nxv4i1, MVT::nxv2i1, MVT::nxv1i1}) {
16141616
setOperationAction(ISD::CONCAT_VECTORS, VT, Custom);

llvm/test/CodeGen/AArch64/sme-aarch64-svcount.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2-
; RUN: llc -O0 -mtriple=aarch64 -mattr=+sve2p1 < %s | FileCheck %s --check-prefixes=CHECK,CHECK-O0
3-
; RUN: llc -O3 -mtriple=aarch64 -mattr=+sve2p1 < %s | FileCheck %s --check-prefixes=CHECK,CHECK-O3
2+
; RUN: llc -O0 -mtriple=aarch64 -mattr=+sve < %s | FileCheck %s --check-prefixes=CHECK,CHECK-O0
3+
; RUN: llc -O3 -mtriple=aarch64 -mattr=+sve < %s | FileCheck %s --check-prefixes=CHECK,CHECK-O3
44

55
;
66
; Test simple loads, stores and return.

0 commit comments

Comments
 (0)