Skip to content

Commit 16de155

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

File tree

2 files changed

+57
-7
lines changed

2 files changed

+57
-7
lines changed

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,8 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
462462
addRegisterClass(MVT::nxv4bf16, &AArch64::ZPRRegClass);
463463
addRegisterClass(MVT::nxv8bf16, &AArch64::ZPRRegClass);
464464

465+
addRegisterClass(MVT::aarch64svcount, &AArch64::PPRRegClass);
466+
465467
if (Subtarget->useSVEForFixedLengthVectors()) {
466468
for (MVT VT : MVT::integer_fixedlen_vector_valuetypes())
467469
if (useSVEForFixedLengthVectorVT(VT))
@@ -473,14 +475,11 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
473475
}
474476
}
475477

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);
478+
setOperationPromotedToType(ISD::LOAD, MVT::aarch64svcount, MVT::nxv16i1);
479+
setOperationPromotedToType(ISD::STORE, MVT::aarch64svcount, MVT::nxv16i1);
480480

481-
setOperationAction(ISD::SELECT, MVT::aarch64svcount, Custom);
482-
setOperationAction(ISD::SELECT_CC, MVT::aarch64svcount, Expand);
483-
}
481+
setOperationAction(ISD::SELECT, MVT::aarch64svcount, Custom);
482+
setOperationAction(ISD::SELECT_CC, MVT::aarch64svcount, Expand);
484483

485484
// Compute derived properties from the register classes
486485
computeRegisterProperties(Subtarget->getRegisterInfo());
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
2+
; RUN: llc < %s -mtriple=aarch64-linux-gnu -mattr=+sve | FileCheck %s
3+
4+
;; This file tests basic use of `target("aarch64.svcount")` works with only +sve.
5+
6+
declare void @svcount_fn_arg(target("aarch64.svcount"))
7+
8+
define void @svcount_fn_call() {
9+
; CHECK-LABEL: svcount_fn_call:
10+
; CHECK: // %bb.0: // %entry
11+
; CHECK-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
12+
; CHECK-NEXT: .cfi_def_cfa_offset 16
13+
; CHECK-NEXT: .cfi_offset w30, -16
14+
; CHECK-NEXT: pfalse p0.b
15+
; CHECK-NEXT: bl svcount_fn_arg
16+
; CHECK-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
17+
; CHECK-NEXT: ret
18+
entry:
19+
call void @svcount_fn_arg(target("aarch64.svcount") zeroinitializer)
20+
ret void
21+
}
22+
23+
define target("aarch64.svcount") @select_svcount(i1 %cond, target("aarch64.svcount") %pn0, target("aarch64.svcount") %pn1) {
24+
; CHECK-LABEL: select_svcount:
25+
; CHECK: // %bb.0:
26+
; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0
27+
; CHECK-NEXT: sbfx x8, x0, #0, #1
28+
; CHECK-NEXT: whilelo p2.b, xzr, x8
29+
; CHECK-NEXT: sel p0.b, p2, p0.b, p1.b
30+
; CHECK-NEXT: ret
31+
%sel = select i1 %cond, target("aarch64.svcount") %pn0, target("aarch64.svcount") %pn1
32+
ret target("aarch64.svcount") %sel
33+
}
34+
35+
define void @store_svcount(ptr %ptr, target("aarch64.svcount") %pn) {
36+
; CHECK-LABEL: store_svcount:
37+
; CHECK: // %bb.0:
38+
; CHECK-NEXT: str p0, [x0]
39+
; CHECK-NEXT: ret
40+
store target("aarch64.svcount") %pn, ptr %ptr, align 2
41+
ret void
42+
}
43+
44+
define target("aarch64.svcount") @load_svcount(ptr %ptr) {
45+
; CHECK-LABEL: load_svcount:
46+
; CHECK: // %bb.0:
47+
; CHECK-NEXT: ldr p0, [x0]
48+
; CHECK-NEXT: ret
49+
%pn = load target("aarch64.svcount"), ptr %ptr, align 2
50+
ret target("aarch64.svcount") %pn
51+
}

0 commit comments

Comments
 (0)