Skip to content

Commit ae1596a

Browse files
authored
[AArch64] Support preserve_none calling convention (#91046)
Adds AArch64 support for the `preserve_none` calling convention. Registers X0-X7, X9-X15 and X19-X28 are caller save, and can be used to pass arguments. Delegates to AAPCS for all other registers. Closes #87423
1 parent 4ee950e commit ae1596a

16 files changed

+643
-16
lines changed

clang/include/clang/Basic/Attr.td

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3068,7 +3068,8 @@ def M68kRTD: DeclOrTypeAttr {
30683068
let Documentation = [M68kRTDDocs];
30693069
}
30703070

3071-
def PreserveNone : DeclOrTypeAttr, TargetSpecificAttr<TargetAnyX86> {
3071+
def PreserveNone : DeclOrTypeAttr,
3072+
TargetSpecificAttr<TargetArch<!listconcat(TargetAArch64.Arches, TargetAnyX86.Arches)>> {
30723073
let Spellings = [Clang<"preserve_none">];
30733074
let Subjects = SubjectList<[FunctionLike]>;
30743075
let Documentation = [PreserveNoneDocs];

clang/include/clang/Basic/AttrDocs.td

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5660,18 +5660,21 @@ experimental at this time.
56605660
def PreserveNoneDocs : Documentation {
56615661
let Category = DocCatCallingConvs;
56625662
let Content = [{
5663-
On X86-64 target, this attribute changes the calling convention of a function.
5663+
On X86-64 and AArch64 targets, this attribute changes the calling convention of a function.
56645664
The ``preserve_none`` calling convention tries to preserve as few general
56655665
registers as possible. So all general registers are caller saved registers. It
56665666
also uses more general registers to pass arguments. This attribute doesn't
5667-
impact floating-point registers (XMMs/YMMs). Floating-point registers still
5668-
follow the c calling convention. ``preserve_none``'s ABI is still unstable, and
5667+
impact floating-point registers. ``preserve_none``'s ABI is still unstable, and
56695668
may be changed in the future.
56705669

5671-
- Only RSP and RBP are preserved by callee.
5672-
5673-
- Register R12, R13, R14, R15, RDI, RSI, RDX, RCX, R8, R9, R11, and RAX now can
5674-
be used to pass function arguments.
5670+
- On X86-64, only RSP and RBP are preserved by the callee.
5671+
Registers R12, R13, R14, R15, RDI, RSI, RDX, RCX, R8, R9, R11, and RAX now can
5672+
be used to pass function arguments. Floating-point registers (XMMs/YMMs) still
5673+
follow the C calling convention.
5674+
- On AArch64, only LR and FP are preserved by the callee.
5675+
Registers X19-X28, X0-X7, and X9-X15 are used to pass function arguments.
5676+
X8, X16-X18, SIMD and floating-point registers follow the AAPCS calling
5677+
convention.
56755678
}];
56765679
}
56775680

clang/lib/Basic/Targets/AArch64.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1203,6 +1203,7 @@ AArch64TargetInfo::checkCallingConvention(CallingConv CC) const {
12031203
case CC_SwiftAsync:
12041204
case CC_PreserveMost:
12051205
case CC_PreserveAll:
1206+
case CC_PreserveNone:
12061207
case CC_OpenCLKernel:
12071208
case CC_AArch64VectorCall:
12081209
case CC_AArch64SVEPCS:

clang/test/CodeGen/preserve-call-conv.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm < %s | FileCheck %s --check-prefixes=CHECK,X86-LINUX
2-
// RUN: %clang_cc1 -triple arm64-unknown-unknown -emit-llvm < %s | FileCheck %s
1+
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm < %s | FileCheck %s --check-prefixes=CHECK,LINUX
2+
// RUN: %clang_cc1 -triple arm64-unknown-unknown -emit-llvm < %s | FileCheck %s --check-prefixes=CHECK,LINUX
33

44
// RUN: %clang_cc1 -triple x86_64-unknown-windows-msvc -emit-llvm %s -o - | FileCheck %s
55
// RUN: %clang_cc1 -triple aarch64-unknown-windows-msvc -emit-llvm %s -o - | FileCheck %s
@@ -23,5 +23,5 @@ void boo(void) __attribute__((preserve_all)) {
2323
// is lowered to the corresponding calling convention attrribute at the LLVM IR
2424
// level.
2525
void bar(void) __attribute__((preserve_none)) {
26-
// X86-LINUX-LABEL: define {{(dso_local )?}}preserve_nonecc void @bar()
26+
// LINUX-LABEL: define {{(dso_local )?}}preserve_nonecc void @bar()
2727
}

llvm/docs/LangRef.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,7 @@ added in the future:
462462
registers to pass arguments. This attribute doesn't impact non-general
463463
purpose registers (e.g. floating point registers, on X86 XMMs/YMMs).
464464
Non-general purpose registers still follow the standard c calling
465-
convention. Currently it is for x86_64 only.
465+
convention. Currently it is for x86_64 and AArch64 only.
466466
"``cxx_fast_tlscc``" - The `CXX_FAST_TLS` calling convention for access functions
467467
Clang generates an access function to access C++-style TLS. The access
468468
function generally has an entry block, an exit block and an initialization

llvm/lib/Target/AArch64/AArch64CallingConvention.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ bool CC_AArch64_Arm64EC_CFGuard_Check(unsigned ValNo, MVT ValVT, MVT LocVT,
5252
bool CC_AArch64_GHC(unsigned ValNo, MVT ValVT, MVT LocVT,
5353
CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags,
5454
CCState &State);
55+
bool CC_AArch64_Preserve_None(unsigned ValNo, MVT ValVT, MVT LocVT,
56+
CCValAssign::LocInfo LocInfo,
57+
ISD::ArgFlagsTy ArgFlags, CCState &State);
5558
bool RetCC_AArch64_AAPCS(unsigned ValNo, MVT ValVT, MVT LocVT,
5659
CCValAssign::LocInfo LocInfo, ISD::ArgFlagsTy ArgFlags,
5760
CCState &State);

llvm/lib/Target/AArch64/AArch64CallingConvention.td

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,32 @@ def CC_AArch64_GHC : CallingConv<[
494494
CCIfType<[i64], CCAssignToReg<[X19, X20, X21, X22, X23, X24, X25, X26, X27, X28]>>
495495
]>;
496496

497+
let Entry = 1 in
498+
def CC_AArch64_Preserve_None : CallingConv<[
499+
// We can pass arguments in all general registers, except:
500+
// - X8, used for sret
501+
// - X16/X17, used by the linker as IP0/IP1
502+
// - X18, the platform register
503+
// - X29, the frame pointer
504+
// - X30, the link register
505+
// General registers are not preserved with the exception of
506+
// FP, LR, and X18
507+
// Non-volatile registers are used first, so functions may call
508+
// normal functions without saving and reloading arguments.
509+
CCIfType<[i32], CCAssignToReg<[W19, W20, W21, W22, W23,
510+
W24, W25, W26, W27, W28,
511+
W0, W1, W2, W3, W4, W5,
512+
W6, W7, W9, W10, W11,
513+
W12, W13, W14, W15]>>,
514+
CCIfType<[i64], CCAssignToReg<[X19, X20, X21, X22, X23,
515+
X24, X25, X26, X27, X28,
516+
X0, X1, X2, X3, X4, X5,
517+
X6, X7, X9, X10, X11,
518+
X12, X13, X14, X15]>>,
519+
520+
CCDelegateTo<CC_AArch64_AAPCS>
521+
]>;
522+
497523
// The order of the callee-saves in this file is important, because the
498524
// FrameLowering code will use this order to determine the layout the
499525
// callee-save area in the stack frame. As can be observed below, Darwin
@@ -606,6 +632,8 @@ def CSR_AArch64_AllRegs
606632

607633
def CSR_AArch64_NoRegs : CalleeSavedRegs<(add)>;
608634

635+
def CSR_AArch64_NoneRegs : CalleeSavedRegs<(add LR, FP)>;
636+
609637
def CSR_AArch64_RT_MostRegs : CalleeSavedRegs<(add CSR_AArch64_AAPCS,
610638
(sequence "X%u", 9, 15))>;
611639

@@ -681,6 +709,8 @@ def CSR_Darwin_AArch64_RT_AllRegs
681709
// These all preserve x18 in addition to any other registers.
682710
def CSR_AArch64_NoRegs_SCS
683711
: CalleeSavedRegs<(add CSR_AArch64_NoRegs, X18)>;
712+
def CSR_AArch64_NoneRegs_SCS
713+
: CalleeSavedRegs<(add CSR_AArch64_NoneRegs, X18)>;
684714
def CSR_AArch64_AllRegs_SCS
685715
: CalleeSavedRegs<(add CSR_AArch64_AllRegs, X18)>;
686716
def CSR_AArch64_AAPCS_SwiftError_SCS

llvm/lib/Target/AArch64/AArch64ISelLowering.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6961,6 +6961,8 @@ CCAssignFn *AArch64TargetLowering::CCAssignFnForCall(CallingConv::ID CC,
69616961
report_fatal_error("Unsupported calling convention.");
69626962
case CallingConv::GHC:
69636963
return CC_AArch64_GHC;
6964+
case CallingConv::PreserveNone:
6965+
return CC_AArch64_Preserve_None;
69646966
case CallingConv::C:
69656967
case CallingConv::Fast:
69666968
case CallingConv::PreserveMost:
@@ -7483,6 +7485,20 @@ SDValue AArch64TargetLowering::LowerFormalArguments(
74837485
FuncInfo->setLazySaveTPIDR2Obj(TPIDR2Obj);
74847486
}
74857487

7488+
if (CallConv == CallingConv::PreserveNone) {
7489+
for (const ISD::InputArg &I : Ins) {
7490+
if (I.Flags.isSwiftSelf() || I.Flags.isSwiftError() ||
7491+
I.Flags.isSwiftAsync()) {
7492+
MachineFunction &MF = DAG.getMachineFunction();
7493+
DAG.getContext()->diagnose(DiagnosticInfoUnsupported(
7494+
MF.getFunction(),
7495+
"Swift attributes can't be used with preserve_none",
7496+
DL.getDebugLoc()));
7497+
break;
7498+
}
7499+
}
7500+
}
7501+
74867502
return Chain;
74877503
}
74887504

@@ -7654,6 +7670,7 @@ static bool mayTailCallThisCC(CallingConv::ID CC) {
76547670
case CallingConv::AArch64_SVE_VectorCall:
76557671
case CallingConv::PreserveMost:
76567672
case CallingConv::PreserveAll:
7673+
case CallingConv::PreserveNone:
76577674
case CallingConv::Swift:
76587675
case CallingConv::SwiftTail:
76597676
case CallingConv::Tail:
@@ -8728,6 +8745,20 @@ AArch64TargetLowering::LowerCall(CallLoweringInfo &CLI,
87288745
}
87298746
}
87308747

8748+
if (CallConv == CallingConv::PreserveNone) {
8749+
for (const ISD::OutputArg &O : Outs) {
8750+
if (O.Flags.isSwiftSelf() || O.Flags.isSwiftError() ||
8751+
O.Flags.isSwiftAsync()) {
8752+
MachineFunction &MF = DAG.getMachineFunction();
8753+
DAG.getContext()->diagnose(DiagnosticInfoUnsupported(
8754+
MF.getFunction(),
8755+
"Swift attributes can't be used with preserve_none",
8756+
DL.getDebugLoc()));
8757+
break;
8758+
}
8759+
}
8760+
}
8761+
87318762
return Result;
87328763
}
87338764

llvm/lib/Target/AArch64/AArch64RegisterInfo.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ AArch64RegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
7575
// GHC set of callee saved regs is empty as all those regs are
7676
// used for passing STG regs around
7777
return CSR_AArch64_NoRegs_SaveList;
78+
if (MF->getFunction().getCallingConv() == CallingConv::PreserveNone)
79+
return CSR_AArch64_NoneRegs_SaveList;
7880
if (MF->getFunction().getCallingConv() == CallingConv::AnyReg)
7981
return CSR_AArch64_AllRegs_SaveList;
8082

@@ -260,6 +262,9 @@ AArch64RegisterInfo::getCallPreservedMask(const MachineFunction &MF,
260262
if (CC == CallingConv::GHC)
261263
// This is academic because all GHC calls are (supposed to be) tail calls
262264
return SCS ? CSR_AArch64_NoRegs_SCS_RegMask : CSR_AArch64_NoRegs_RegMask;
265+
if (CC == CallingConv::PreserveNone)
266+
return SCS ? CSR_AArch64_NoneRegs_SCS_RegMask
267+
: CSR_AArch64_NoneRegs_RegMask;
263268
if (CC == CallingConv::AnyReg)
264269
return SCS ? CSR_AArch64_AllRegs_SCS_RegMask : CSR_AArch64_AllRegs_RegMask;
265270

@@ -294,12 +299,11 @@ AArch64RegisterInfo::getCallPreservedMask(const MachineFunction &MF,
294299
if (CC == CallingConv::PreserveMost)
295300
return SCS ? CSR_AArch64_RT_MostRegs_SCS_RegMask
296301
: CSR_AArch64_RT_MostRegs_RegMask;
297-
else if (CC == CallingConv::PreserveAll)
302+
if (CC == CallingConv::PreserveAll)
298303
return SCS ? CSR_AArch64_RT_AllRegs_SCS_RegMask
299304
: CSR_AArch64_RT_AllRegs_RegMask;
300305

301-
else
302-
return SCS ? CSR_AArch64_AAPCS_SCS_RegMask : CSR_AArch64_AAPCS_RegMask;
306+
return SCS ? CSR_AArch64_AAPCS_SCS_RegMask : CSR_AArch64_AAPCS_RegMask;
303307
}
304308

305309
const uint32_t *AArch64RegisterInfo::getCustomEHPadPreservedMask(
@@ -585,6 +589,8 @@ bool AArch64RegisterInfo::isArgumentRegister(const MachineFunction &MF,
585589
report_fatal_error("Unsupported calling convention.");
586590
case CallingConv::GHC:
587591
return HasReg(CC_AArch64_GHC_ArgRegs, Reg);
592+
case CallingConv::PreserveNone:
593+
return HasReg(CC_AArch64_Preserve_None_ArgRegs, Reg);
588594
case CallingConv::C:
589595
case CallingConv::Fast:
590596
case CallingConv::PreserveMost:

llvm/lib/Target/AArch64/GISel/AArch64CallLowering.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -784,6 +784,7 @@ static bool mayTailCallThisCC(CallingConv::ID CC) {
784784
case CallingConv::C:
785785
case CallingConv::PreserveMost:
786786
case CallingConv::PreserveAll:
787+
case CallingConv::PreserveNone:
787788
case CallingConv::Swift:
788789
case CallingConv::SwiftTail:
789790
case CallingConv::Tail:
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
; RUN: llc -mtriple=aarch64-apple-darwin -stop-after finalize-isel <%s | FileCheck %s
2+
3+
; Check that the callee doesn't have calleeSavedRegisters.
4+
define preserve_nonecc i64 @callee1(i64 %a0, i64 %b0, i64 %c0, i64 %d0, i64 %e0) nounwind {
5+
%a1 = mul i64 %a0, %b0
6+
%a2 = mul i64 %a1, %c0
7+
%a3 = mul i64 %a2, %d0
8+
%a4 = mul i64 %a3, %e0
9+
ret i64 %a4
10+
}
11+
; CHECK: name: callee1
12+
; CHECK-NOT: calleeSavedRegisters:
13+
; CHECK: RET_ReallyLR implicit $x0
14+
15+
; Check that RegMask is csr_aarch64_noneregs.
16+
define i64 @caller1(i64 %a0) nounwind {
17+
%b1 = call preserve_nonecc i64 @callee1(i64 %a0, i64 %a0, i64 %a0, i64 %a0, i64 %a0)
18+
%b2 = add i64 %b1, %a0
19+
ret i64 %b2
20+
}
21+
; CHECK: name: caller1
22+
; CHECK: BL @callee1, csr_aarch64_noneregs
23+
; CHECK: RET_ReallyLR implicit $x0
24+
25+
26+
; Check that the callee doesn't have calleeSavedRegisters.
27+
define preserve_nonecc {i64, i64} @callee2(i64 %a0, i64 %b0, i64 %c0, i64 %d0, i64 %e0) nounwind {
28+
%a1 = mul i64 %a0, %b0
29+
%a2 = mul i64 %a1, %c0
30+
%a3 = mul i64 %a2, %d0
31+
%a4 = mul i64 %a3, %e0
32+
%b4 = insertvalue {i64, i64} undef, i64 %a3, 0
33+
%b5 = insertvalue {i64, i64} %b4, i64 %a4, 1
34+
ret {i64, i64} %b5
35+
}
36+
; CHECK: name: callee2
37+
; CHECK-NOT: calleeSavedRegisters:
38+
; CHECK: RET_ReallyLR implicit $x0
39+
40+
41+
; Check that RegMask is csr_aarch64_noneregs.
42+
define {i64, i64} @caller2(i64 %a0) nounwind {
43+
%b1 = call preserve_nonecc {i64, i64} @callee2(i64 %a0, i64 %a0, i64 %a0, i64 %a0, i64 %a0)
44+
ret {i64, i64} %b1
45+
}
46+
; CHECK: name: caller2
47+
; CHECK: BL @callee2, csr_aarch64_noneregs
48+
; CHECK: RET_ReallyLR implicit $x0
49+
50+
51+
%struct.Large = type { i64, double, double }
52+
53+
; Declare the callee with a sret parameter.
54+
declare preserve_nonecc void @callee3(ptr noalias nocapture writeonly sret(%struct.Large) align 4 %a0, i64 %b0) nounwind;
55+
56+
; Check that RegMask is csr_aarch64_noneregs.
57+
define void @caller3(i64 %a0) nounwind {
58+
%a1 = alloca %struct.Large, align 8
59+
call preserve_nonecc void @callee3(ptr nonnull sret(%struct.Large) align 8 %a1, i64 %a0)
60+
ret void
61+
}
62+
; CHECK: name: caller3
63+
; CHECK: BL @callee3, csr_aarch64_noneregs
64+
; CHECK: RET_ReallyLR
65+
66+
67+
; Check that the callee doesn't have calleeSavedRegisters.
68+
define preserve_nonecc {i64, double} @callee4(i64 %a0, i64 %b0, i64 %c0, i64 %d0, i64 %e0) nounwind {
69+
%a1 = mul i64 %a0, %b0
70+
%a2 = mul i64 %a1, %c0
71+
%a3 = mul i64 %a2, %d0
72+
%a4 = mul i64 %a3, %e0
73+
%b4 = insertvalue {i64, double} undef, i64 %a3, 0
74+
%b5 = insertvalue {i64, double} %b4, double 1.2, 1
75+
ret {i64, double} %b5
76+
}
77+
; CHECK: name: callee4
78+
; CHECK-NOT: calleeSavedRegisters:
79+
; CHECK: RET_ReallyLR implicit $x0, implicit $d0
80+
81+
; Check that RegMask is csr_aarch64_noneregs.
82+
define {i64, double} @caller4(i64 %a0) nounwind {
83+
%b1 = call preserve_nonecc {i64, double} @callee4(i64 %a0, i64 %a0, i64 %a0, i64 %a0, i64 %a0)
84+
ret {i64, double} %b1
85+
}
86+
; CHECK: name: caller4
87+
; CHECK: BL @callee4, csr_aarch64_noneregs
88+
; CHECK: RET_ReallyLR implicit $x0, implicit $d0

llvm/test/CodeGen/AArch64/preserve.ll

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,15 @@ define preserve_allcc void @foo() #0 {
1515
call void @bar2()
1616
ret void
1717
}
18+
define preserve_nonecc void @qux() #0 {
19+
; CHECK: qux Clobbered Registers: $ffr $fpcr $fpsr $nzcv $sp $vg $wsp $za $b0 $b1 $b2 $b3 $b4 $b5 $b6 $b7 $b16 $b17 $b18 $b19 $b20 $b21 $b22 $b23 $b24 $b25 $b26 $b27 $b28 $b29 $b30 $b31 $d0 $d1 $d2 $d3 $d4 $d5 $d6 $d7 $d16 $d17 $d18 $d19 $d20 $d21 $d22 $d23 $d24 $d25 $d26 $d27 $d28 $d29 $d30 $d31 $h0 $h1 $h2 $h3 $h4 $h5 $h6 $h7 $h16 $h17 $h18 $h19 $h20 $h21 $h22 $h23 $h24 $h25 $h26 $h27 $h28 $h29 $h30 $h31 $p0 $p1 $p2 $p3 $p4 $p5 $p6 $p7 $p8 $p9 $p10 $p11 $p12 $p13 $p14 $p15 $pn0 $pn1 $pn2 $pn3 $pn4 $pn5 $pn6 $pn7 $pn8 $pn9 $pn10 $pn11 $pn12 $pn13 $pn14 $pn15 $q0 $q1 $q2 $q3 $q4 $q5 $q6 $q7 $q8 $q9 $q10 $q11 $q12 $q13 $q14 $q15 $q16 $q17 $q18 $q19 $q20 $q21 $q22 $q23 $q24 $q25 $q26 $q27 $q28 $q29 $q30 $q31 $s0 $s1 $s2 $s3 $s4 $s5 $s6 $s7 $s16 $s17 $s18 $s19 $s20 $s21 $s22 $s23 $s24 $s25 $s26 $s27 $s28 $s29 $s30 $s31 $w0 $w1 $w2 $w3 $w4 $w5 $w6 $w7 $w8 $w9 $w10 $w11 $w12 $w13 $w14 $w15 $w16 $w17 $w18 $x0 $x1 $x2 $x3 $x4 $x5 $x6 $x7 $x8 $x9 $x10 $x11 $x12 $x13 $x14 $x15 $x16 $x17 $x18 $z0 $z1 $z2 $z3 $z4 $z5 $z6 $z7 $z8 $z9 $z10 $z11 $z12 $z13 $z14 $z15 $z16 $z17 $z18 $z19 $z20 $z21 $z22 $z23 $z24 $z25 $z26 $z27 $z28 $z29 $z30 $z31 $zab0 $zad0 $zad1 $zad2 $zad3 $zad4 $zad5 $zad6 $zad7 $zah0 $zah1 $zaq0 $zaq1 $zaq2 $zaq3 $zaq4 $zaq5 $zaq6 $zaq7 $zaq8 $zaq9 $zaq10 $zaq11 $zaq12 $zaq13 $zaq14 $zaq15 $zas0 $zas1 $zas2 $zas3 $zt0 $d0_d1 $d1_d2 $d2_d3 $d3_d4 $d4_d5 $d5_d6 $d6_d7 $d7_d8 $d15_d16 $d16_d17 $d17_d18 $d18_d19 $d19_d20 $d20_d21 $d21_d22 $d22_d23 $d23_d24 $d24_d25 $d25_d26 $d26_d27 $d27_d28 $d28_d29 $d29_d30 $d30_d31 $d31_d0 $d0_d1_d2_d3 $d1_d2_d3_d4 $d2_d3_d4_d5 $d3_d4_d5_d6 $d4_d5_d6_d7 $d5_d6_d7_d8 $d6_d7_d8_d9 $d7_d8_d9_d10 $d13_d14_d15_d16 $d14_d15_d16_d17 $d15_d16_d17_d18 $d16_d17_d18_d19 $d17_d18_d19_d20 $d18_d19_d20_d21 $d19_d20_d21_d22 $d20_d21_d22_d23 $d21_d22_d23_d24 $d22_d23_d24_d25 $d23_d24_d25_d26 $d24_d25_d26_d27 $d25_d26_d27_d28 $d26_d27_d28_d29 $d27_d28_d29_d30 $d28_d29_d30_d31 $d29_d30_d31_d0 $d30_d31_d0_d1 $d31_d0_d1_d2 $d0_d1_d2 $d1_d2_d3 $d2_d3_d4 $d3_d4_d5 $d4_d5_d6 $d5_d6_d7 $d6_d7_d8 $d7_d8_d9 $d14_d15_d16 $d15_d16_d17 $d16_d17_d18 $d17_d18_d19 $d18_d19_d20 $d19_d20_d21 $d20_d21_d22 $d21_d22_d23 $d22_d23_d24 $d23_d24_d25 $d24_d25_d26 $d25_d26_d27 $d26_d27_d28 $d27_d28_d29 $d28_d29_d30 $d29_d30_d31 $d30_d31_d0 $d31_d0_d1 $p0_p1 $p1_p2 $p2_p3 $p3_p4 $p4_p5 $p5_p6 $p6_p7 $p7_p8 $p8_p9 $p9_p10 $p10_p11 $p11_p12 $p12_p13 $p13_p14 $p14_p15 $p15_p0 $q0_q1 $q1_q2 $q2_q3 $q3_q4 $q4_q5 $q5_q6 $q6_q7 $q7_q8 $q8_q9 $q9_q10 $q10_q11 $q11_q12 $q12_q13 $q13_q14 $q14_q15 $q15_q16 $q16_q17 $q17_q18 $q18_q19 $q19_q20 $q20_q21 $q21_q22 $q22_q23 $q23_q24 $q24_q25 $q25_q26 $q26_q27 $q27_q28 $q28_q29 $q29_q30 $q30_q31 $q31_q0 $q0_q1_q2_q3 $q1_q2_q3_q4 $q2_q3_q4_q5 $q3_q4_q5_q6 $q4_q5_q6_q7 $q5_q6_q7_q8 $q6_q7_q8_q9 $q7_q8_q9_q10 $q8_q9_q10_q11 $q9_q10_q11_q12 $q10_q11_q12_q13 $q11_q12_q13_q14 $q12_q13_q14_q15 $q13_q14_q15_q16 $q14_q15_q16_q17 $q15_q16_q17_q18 $q16_q17_q18_q19 $q17_q18_q19_q20 $q18_q19_q20_q21 $q19_q20_q21_q22 $q20_q21_q22_q23 $q21_q22_q23_q24 $q22_q23_q24_q25 $q23_q24_q25_q26 $q24_q25_q26_q27 $q25_q26_q27_q28 $q26_q27_q28_q29 $q27_q28_q29_q30 $q28_q29_q30_q31 $q29_q30_q31_q0 $q30_q31_q0_q1 $q31_q0_q1_q2 $q0_q1_q2 $q1_q2_q3 $q2_q3_q4 $q3_q4_q5 $q4_q5_q6 $q5_q6_q7 $q6_q7_q8 $q7_q8_q9 $q8_q9_q10 $q9_q10_q11 $q10_q11_q12 $q11_q12_q13 $q12_q13_q14 $q13_q14_q15 $q14_q15_q16 $q15_q16_q17 $q16_q17_q18 $q17_q18_q19 $q18_q19_q20 $q19_q20_q21 $q20_q21_q22 $q21_q22_q23 $q22_q23_q24 $q23_q24_q25 $q24_q25_q26 $q25_q26_q27 $q26_q27_q28 $q27_q28_q29 $q28_q29_q30 $q29_q30_q31 $q30_q31_q0 $q31_q0_q1 $x0_x1_x2_x3_x4_x5_x6_x7 $x2_x3_x4_x5_x6_x7_x8_x9 $x4_x5_x6_x7_x8_x9_x10_x11 $x6_x7_x8_x9_x10_x11_x12_x13 $x8_x9_x10_x11_x12_x13_x14_x15 $x10_x11_x12_x13_x14_x15_x16_x17 $x12_x13_x14_x15_x16_x17_x18_x19 $x14_x15_x16_x17_x18_x19_x20_x21 $x16_x17_x18_x19_x20_x21_x22_x23 $x18_x19_x20_x21_x22_x23_x24_x25 $w30_wzr $w0_w1 $w2_w3 $w4_w5 $w6_w7 $w8_w9 $w10_w11 $w12_w13 $w14_w15 $w16_w17 $w18_w19 $lr_xzr $x0_x1 $x2_x3 $x4_x5 $x6_x7 $x8_x9 $x10_x11 $x12_x13 $x14_x15 $x16_x17 $x18_x19 $z0_z1 $z1_z2 $z2_z3 $z3_z4 $z4_z5 $z5_z6 $z6_z7 $z7_z8 $z8_z9 $z9_z10 $z10_z11 $z11_z12 $z12_z13 $z13_z14 $z14_z15 $z15_z16 $z16_z17 $z17_z18 $z18_z19 $z19_z20 $z20_z21 $z21_z22 $z22_z23 $z23_z24 $z24_z25 $z25_z26 $z26_z27 $z27_z28 $z28_z29 $z29_z30 $z30_z31 $z31_z0 $z0_z1_z2_z3 $z1_z2_z3_z4 $z2_z3_z4_z5 $z3_z4_z5_z6 $z4_z5_z6_z7 $z5_z6_z7_z8 $z6_z7_z8_z9 $z7_z8_z9_z10 $z8_z9_z10_z11 $z9_z10_z11_z12 $z10_z11_z12_z13 $z11_z12_z13_z14 $z12_z13_z14_z15 $z13_z14_z15_z16 $z14_z15_z16_z17 $z15_z16_z17_z18 $z16_z17_z18_z19 $z17_z18_z19_z20 $z18_z19_z20_z21 $z19_z20_z21_z22 $z20_z21_z22_z23 $z21_z22_z23_z24 $z22_z23_z24_z25 $z23_z24_z25_z26 $z24_z25_z26_z27 $z25_z26_z27_z28 $z26_z27_z28_z29 $z27_z28_z29_z30 $z28_z29_z30_z31 $z29_z30_z31_z0 $z30_z31_z0_z1 $z31_z0_z1_z2 $z0_z1_z2 $z1_z2_z3 $z2_z3_z4 $z3_z4_z5 $z4_z5_z6 $z5_z6_z7 $z6_z7_z8 $z7_z8_z9 $z8_z9_z10 $z9_z10_z11 $z10_z11_z12 $z11_z12_z13 $z12_z13_z14 $z13_z14_z15 $z14_z15_z16 $z15_z16_z17 $z16_z17_z18 $z17_z18_z19 $z18_z19_z20 $z19_z20_z21 $z20_z21_z22 $z21_z22_z23 $z22_z23_z24 $z23_z24_z25 $z24_z25_z26 $z25_z26_z27 $z26_z27_z28 $z27_z28_z29 $z28_z29_z30 $z29_z30_z31 $z30_z31_z0 $z31_z0_z1 $z16_z24 $z17_z25 $z18_z26 $z19_z27 $z20_z28 $z21_z29 $z22_z30 $z23_z31 $z0_z8 $z1_z9 $z2_z10 $z3_z11 $z4_z12 $z5_z13 $z6_z14 $z7_z15 $z16_z20_z24_z28 $z17_z21_z25_z29 $z18_z22_z26_z30 $z19_z23_z27_z31 $z0_z4_z8_z12 $z1_z5_z9_z13 $z2_z6_z10_z14 $z3_z7_z11_z15
20+
21+
call void @bar1()
22+
call void @bar2()
23+
ret void
24+
}
1825
declare void @bar2()
1926

20-
@llvm.used = appending global [2 x ptr] [ptr @foo, ptr @baz]
27+
@llvm.used = appending global [3 x ptr] [ptr @foo, ptr @baz, ptr @qux]
2128

2229
attributes #0 = {nounwind}

0 commit comments

Comments
 (0)