Skip to content

Commit d07322b

Browse files
committed
[AArch64][SME] Propagate desired ZA states in the MachineSMEABIPass
This patch adds a propagation step to the MachineSMEABIPass that propagates desired ZA states forwards/backwards (from predecessors to successors, or vice versa). The aim of this is to pick better ZA states for edge bundles, as when many (or all) blocks in a bundle do not have a preferred ZA state, the ZA state assigned to a bundle can be less than ideal. An important case is nested loops, where only the inner loop has a preferred ZA state. Here we'd like to propagate the ZA state up from the inner loop to the outer loops (to avoid saves/restores in any loop). Change-Id: I39f9c7d7608e2fa070be2fb88351b4d1d0079041
1 parent e380fb8 commit d07322b

File tree

5 files changed

+163
-178
lines changed

5 files changed

+163
-178
lines changed

llvm/lib/Target/AArch64/MachineSMEABIPass.cpp

Lines changed: 83 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,11 @@ struct MachineSMEABI : public MachineFunctionPass {
213213
/// E.g., ACTIVE -> LOCAL_SAVED will insert code required to save ZA.
214214
void insertStateChanges();
215215

216+
/// Propagates desired states forwards (from predecessors -> successors) if
217+
/// \p Forwards, otherwise, propagates backwards (from successors ->
218+
/// predecessors).
219+
void propagateDesiredStates(bool Forwards = true);
220+
216221
// Emission routines for private and shared ZA functions (using lazy saves).
217222
void emitNewZAPrologue(MachineBasicBlock &MBB,
218223
MachineBasicBlock::iterator MBBI);
@@ -287,8 +292,10 @@ struct MachineSMEABI : public MachineFunctionPass {
287292
/// Contains the needed ZA state for each instruction in a block.
288293
/// Instructions that do not require a ZA state are not recorded.
289294
struct BlockInfo {
290-
ZAState FixedEntryState{ZAState::ANY};
291295
SmallVector<InstInfo> Insts;
296+
ZAState FixedEntryState{ZAState::ANY};
297+
ZAState DesiredIncomingState{ZAState::ANY};
298+
ZAState DesiredOutgoingState{ZAState::ANY};
292299
LiveRegs PhysLiveRegsAtEntry = LiveRegs::None;
293300
LiveRegs PhysLiveRegsAtExit = LiveRegs::None;
294301
};
@@ -381,28 +388,80 @@ void MachineSMEABI::collectNeededZAStates(SMEAttrs SMEFnAttrs) {
381388

382389
// Reverse vector (as we had to iterate backwards for liveness).
383390
std::reverse(Block.Insts.begin(), Block.Insts.end());
391+
392+
// Record the desired states on entry/exit of this block. These are the
393+
// states that would not incur a state transition.
394+
if (!Block.Insts.empty()) {
395+
Block.DesiredIncomingState = Block.Insts.front().NeededState;
396+
Block.DesiredOutgoingState = Block.Insts.back().NeededState;
397+
}
398+
}
399+
}
400+
401+
void MachineSMEABI::propagateDesiredStates(bool Forwards) {
402+
// If `Forwards`, this propagates desired states from predecessors to
403+
// successors, otherwise, this propagates states from successors to
404+
// predecessors.
405+
auto GetBlockState = [](BlockInfo &Block, bool Incoming) -> ZAState & {
406+
return Incoming ? Block.DesiredIncomingState : Block.DesiredOutgoingState;
407+
};
408+
409+
SmallVector<MachineBasicBlock *> Worklist;
410+
for (auto [BlockID, BlockInfo] : enumerate(State.Blocks)) {
411+
if (!isLegalEdgeBundleZAState(GetBlockState(BlockInfo, Forwards)))
412+
Worklist.push_back(MF->getBlockNumbered(BlockID));
413+
}
414+
415+
while (!Worklist.empty()) {
416+
MachineBasicBlock *MBB = Worklist.pop_back_val();
417+
auto &BlockInfo = State.Blocks[MBB->getNumber()];
418+
419+
// Pick a legal edge bundle state that matches the majority of
420+
// predecessors/successors.
421+
int StateCounts[ZAState::NUM_ZA_STATE] = {0};
422+
for (MachineBasicBlock *PredOrSucc :
423+
Forwards ? predecessors(MBB) : successors(MBB)) {
424+
auto &PredOrSuccBlockInfo = State.Blocks[PredOrSucc->getNumber()];
425+
auto ZAState = GetBlockState(PredOrSuccBlockInfo, !Forwards);
426+
if (isLegalEdgeBundleZAState(ZAState))
427+
StateCounts[ZAState]++;
428+
}
429+
430+
ZAState PropagatedState = ZAState(max_element(StateCounts) - StateCounts);
431+
auto &CurrentState = GetBlockState(BlockInfo, Forwards);
432+
if (PropagatedState != CurrentState) {
433+
CurrentState = PropagatedState;
434+
auto &OtherState = GetBlockState(BlockInfo, !Forwards);
435+
// Propagate to the incoming/outgoing state if that is also "ANY".
436+
if (OtherState == ZAState::ANY)
437+
OtherState = PropagatedState;
438+
// Push any successors/predecessors that may need updating to the
439+
// worklist.
440+
for (MachineBasicBlock *SuccOrPred :
441+
Forwards ? successors(MBB) : predecessors(MBB)) {
442+
auto &SuccOrPredBlockInfo = State.Blocks[SuccOrPred->getNumber()];
443+
if (!isLegalEdgeBundleZAState(
444+
GetBlockState(SuccOrPredBlockInfo, Forwards)))
445+
Worklist.push_back(SuccOrPred);
446+
}
447+
}
384448
}
385449
}
386450

387451
void MachineSMEABI::assignBundleZAStates() {
388452
State.BundleStates.resize(Bundles->getNumBundles());
453+
389454
for (unsigned I = 0, E = Bundles->getNumBundles(); I != E; ++I) {
390455
LLVM_DEBUG(dbgs() << "Assigning ZA state for edge bundle: " << I << '\n');
391456

392457
// Attempt to assign a ZA state for this bundle that minimizes state
393458
// transitions. Edges within loops are given a higher weight as we assume
394459
// they will be executed more than once.
395-
// TODO: We should propagate desired incoming/outgoing states through blocks
396-
// that have the "ANY" state first to make better global decisions.
397460
int EdgeStateCounts[ZAState::NUM_ZA_STATE] = {0};
398461
for (unsigned BlockID : Bundles->getBlocks(I)) {
399462
LLVM_DEBUG(dbgs() << "- bb." << BlockID);
400463

401-
const BlockInfo &Block = State.Blocks[BlockID];
402-
if (Block.Insts.empty()) {
403-
LLVM_DEBUG(dbgs() << " (no state preference)\n");
404-
continue;
405-
}
464+
BlockInfo &Block = State.Blocks[BlockID];
406465
bool IsLoop = MLI && MLI->getLoopFor(MF->getBlockNumbered(BlockID));
407466
bool InEdge = Bundles->getBundle(BlockID, /*Out=*/false) == I;
408467
bool OutEdge = Bundles->getBundle(BlockID, /*Out=*/true) == I;
@@ -411,26 +470,28 @@ void MachineSMEABI::assignBundleZAStates() {
411470
LLVM_DEBUG(dbgs() << " IsLoop");
412471

413472
LLVM_DEBUG(dbgs() << " (EdgeWeight: " << EdgeWeight << ')');
414-
ZAState DesiredIncomingState = Block.Insts.front().NeededState;
415-
if (InEdge && isLegalEdgeBundleZAState(DesiredIncomingState)) {
416-
EdgeStateCounts[DesiredIncomingState] += EdgeWeight;
473+
bool LegalInEdge =
474+
InEdge && isLegalEdgeBundleZAState(Block.DesiredIncomingState);
475+
bool LegalOutEgde =
476+
OutEdge && isLegalEdgeBundleZAState(Block.DesiredOutgoingState);
477+
if (LegalInEdge) {
417478
LLVM_DEBUG(dbgs() << " DesiredIncomingState: "
418-
<< getZAStateString(DesiredIncomingState));
479+
<< getZAStateString(Block.DesiredIncomingState));
480+
EdgeStateCounts[Block.DesiredIncomingState] += EdgeWeight;
419481
}
420-
ZAState DesiredOutgoingState = Block.Insts.back().NeededState;
421-
if (OutEdge && isLegalEdgeBundleZAState(DesiredOutgoingState)) {
422-
EdgeStateCounts[DesiredOutgoingState] += EdgeWeight;
482+
if (LegalOutEgde) {
423483
LLVM_DEBUG(dbgs() << " DesiredOutgoingState: "
424-
<< getZAStateString(DesiredOutgoingState));
484+
<< getZAStateString(Block.DesiredOutgoingState));
485+
EdgeStateCounts[Block.DesiredOutgoingState] += EdgeWeight;
425486
}
487+
if (!LegalInEdge && !LegalOutEgde)
488+
LLVM_DEBUG(dbgs() << " (no state preference)");
426489
LLVM_DEBUG(dbgs() << '\n');
427490
}
428491

429492
ZAState BundleState =
430493
ZAState(max_element(EdgeStateCounts) - EdgeStateCounts);
431494

432-
// Force ZA to be active in bundles that don't have a preferred state.
433-
// TODO: Something better here (to avoid extra mode switches).
434495
if (BundleState == ZAState::ANY)
435496
BundleState = ZAState::ACTIVE;
436497

@@ -839,6 +900,10 @@ bool MachineSMEABI::runOnMachineFunction(MachineFunction &MF) {
839900
MLI = &getAnalysis<MachineLoopInfoWrapperPass>().getLI();
840901

841902
collectNeededZAStates(SMEFnAttrs);
903+
if (OptLevel != CodeGenOptLevel::None) {
904+
for (bool Forwards : {true, false})
905+
propagateDesiredStates(Forwards);
906+
}
842907
assignBundleZAStates();
843908
insertStateChanges();
844909

llvm/test/CodeGen/AArch64/sme-agnostic-za.ll

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,6 @@ define i64 @test_many_callee_arguments(
363363
ret i64 %ret
364364
}
365365

366-
; FIXME: The new lowering should avoid saves/restores in the probing loop.
367366
define void @agnostic_za_buffer_alloc_with_stack_probes() nounwind "aarch64_za_state_agnostic" "probe-stack"="inline-asm" "stack-probe-size"="65536"{
368367
; CHECK-LABEL: agnostic_za_buffer_alloc_with_stack_probes:
369368
; CHECK: // %bb.0:
@@ -401,18 +400,14 @@ define void @agnostic_za_buffer_alloc_with_stack_probes() nounwind "aarch64_za_s
401400
; CHECK-NEWLOWERING-NEXT: bl __arm_sme_state_size
402401
; CHECK-NEWLOWERING-NEXT: mov x8, sp
403402
; CHECK-NEWLOWERING-NEXT: sub x19, x8, x0
403+
; CHECK-NEWLOWERING-NEXT: mov x0, x19
404+
; CHECK-NEWLOWERING-NEXT: bl __arm_sme_save
404405
; CHECK-NEWLOWERING-NEXT: .LBB7_1: // =>This Inner Loop Header: Depth=1
405406
; CHECK-NEWLOWERING-NEXT: sub sp, sp, #16, lsl #12 // =65536
406407
; CHECK-NEWLOWERING-NEXT: cmp sp, x19
407-
; CHECK-NEWLOWERING-NEXT: mov x0, x19
408-
; CHECK-NEWLOWERING-NEXT: mrs x8, NZCV
409-
; CHECK-NEWLOWERING-NEXT: bl __arm_sme_save
410-
; CHECK-NEWLOWERING-NEXT: msr NZCV, x8
411408
; CHECK-NEWLOWERING-NEXT: b.le .LBB7_3
412409
; CHECK-NEWLOWERING-NEXT: // %bb.2: // in Loop: Header=BB7_1 Depth=1
413-
; CHECK-NEWLOWERING-NEXT: mov x0, x19
414410
; CHECK-NEWLOWERING-NEXT: str xzr, [sp]
415-
; CHECK-NEWLOWERING-NEXT: bl __arm_sme_restore
416411
; CHECK-NEWLOWERING-NEXT: b .LBB7_1
417412
; CHECK-NEWLOWERING-NEXT: .LBB7_3:
418413
; CHECK-NEWLOWERING-NEXT: mov sp, x19

llvm/test/CodeGen/AArch64/sme-za-control-flow.ll

Lines changed: 27 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -223,65 +223,34 @@ exit:
223223
ret void
224224
}
225225

226-
; FIXME: The codegen for this case could be improved (by tuning weights).
227-
; Here the ZA save has been hoisted out of the conditional, but would be better
228-
; to sink it.
229226
define void @cond_private_za_call(i1 %cond) "aarch64_inout_za" nounwind {
230-
; CHECK-LABEL: cond_private_za_call:
231-
; CHECK: // %bb.0:
232-
; CHECK-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
233-
; CHECK-NEXT: mov x29, sp
234-
; CHECK-NEXT: sub sp, sp, #16
235-
; CHECK-NEXT: rdsvl x8, #1
236-
; CHECK-NEXT: mov x9, sp
237-
; CHECK-NEXT: msub x9, x8, x8, x9
238-
; CHECK-NEXT: mov sp, x9
239-
; CHECK-NEXT: stp x9, x8, [x29, #-16]
240-
; CHECK-NEXT: tbz w0, #0, .LBB3_4
241-
; CHECK-NEXT: // %bb.1: // %private_za_call
242-
; CHECK-NEXT: sub x8, x29, #16
243-
; CHECK-NEXT: msr TPIDR2_EL0, x8
244-
; CHECK-NEXT: bl private_za_call
245-
; CHECK-NEXT: smstart za
246-
; CHECK-NEXT: mrs x8, TPIDR2_EL0
247-
; CHECK-NEXT: sub x0, x29, #16
248-
; CHECK-NEXT: cbnz x8, .LBB3_3
249-
; CHECK-NEXT: // %bb.2: // %private_za_call
250-
; CHECK-NEXT: bl __arm_tpidr2_restore
251-
; CHECK-NEXT: .LBB3_3: // %private_za_call
252-
; CHECK-NEXT: msr TPIDR2_EL0, xzr
253-
; CHECK-NEXT: .LBB3_4: // %exit
254-
; CHECK-NEXT: mov sp, x29
255-
; CHECK-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload
256-
; CHECK-NEXT: b shared_za_call
257-
;
258-
; CHECK-NEWLOWERING-LABEL: cond_private_za_call:
259-
; CHECK-NEWLOWERING: // %bb.0:
260-
; CHECK-NEWLOWERING-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
261-
; CHECK-NEWLOWERING-NEXT: mov x29, sp
262-
; CHECK-NEWLOWERING-NEXT: sub sp, sp, #16
263-
; CHECK-NEWLOWERING-NEXT: rdsvl x8, #1
264-
; CHECK-NEWLOWERING-NEXT: mov x9, sp
265-
; CHECK-NEWLOWERING-NEXT: msub x9, x8, x8, x9
266-
; CHECK-NEWLOWERING-NEXT: mov sp, x9
267-
; CHECK-NEWLOWERING-NEXT: sub x10, x29, #16
268-
; CHECK-NEWLOWERING-NEXT: stp x9, x8, [x29, #-16]
269-
; CHECK-NEWLOWERING-NEXT: msr TPIDR2_EL0, x10
270-
; CHECK-NEWLOWERING-NEXT: tbz w0, #0, .LBB3_2
271-
; CHECK-NEWLOWERING-NEXT: // %bb.1: // %private_za_call
272-
; CHECK-NEWLOWERING-NEXT: bl private_za_call
273-
; CHECK-NEWLOWERING-NEXT: .LBB3_2: // %exit
274-
; CHECK-NEWLOWERING-NEXT: smstart za
275-
; CHECK-NEWLOWERING-NEXT: mrs x8, TPIDR2_EL0
276-
; CHECK-NEWLOWERING-NEXT: sub x0, x29, #16
277-
; CHECK-NEWLOWERING-NEXT: cbnz x8, .LBB3_4
278-
; CHECK-NEWLOWERING-NEXT: // %bb.3: // %exit
279-
; CHECK-NEWLOWERING-NEXT: bl __arm_tpidr2_restore
280-
; CHECK-NEWLOWERING-NEXT: .LBB3_4: // %exit
281-
; CHECK-NEWLOWERING-NEXT: msr TPIDR2_EL0, xzr
282-
; CHECK-NEWLOWERING-NEXT: mov sp, x29
283-
; CHECK-NEWLOWERING-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload
284-
; CHECK-NEWLOWERING-NEXT: b shared_za_call
227+
; CHECK-COMMON-LABEL: cond_private_za_call:
228+
; CHECK-COMMON: // %bb.0:
229+
; CHECK-COMMON-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
230+
; CHECK-COMMON-NEXT: mov x29, sp
231+
; CHECK-COMMON-NEXT: sub sp, sp, #16
232+
; CHECK-COMMON-NEXT: rdsvl x8, #1
233+
; CHECK-COMMON-NEXT: mov x9, sp
234+
; CHECK-COMMON-NEXT: msub x9, x8, x8, x9
235+
; CHECK-COMMON-NEXT: mov sp, x9
236+
; CHECK-COMMON-NEXT: stp x9, x8, [x29, #-16]
237+
; CHECK-COMMON-NEXT: tbz w0, #0, .LBB3_4
238+
; CHECK-COMMON-NEXT: // %bb.1: // %private_za_call
239+
; CHECK-COMMON-NEXT: sub x8, x29, #16
240+
; CHECK-COMMON-NEXT: msr TPIDR2_EL0, x8
241+
; CHECK-COMMON-NEXT: bl private_za_call
242+
; CHECK-COMMON-NEXT: smstart za
243+
; CHECK-COMMON-NEXT: mrs x8, TPIDR2_EL0
244+
; CHECK-COMMON-NEXT: sub x0, x29, #16
245+
; CHECK-COMMON-NEXT: cbnz x8, .LBB3_3
246+
; CHECK-COMMON-NEXT: // %bb.2: // %private_za_call
247+
; CHECK-COMMON-NEXT: bl __arm_tpidr2_restore
248+
; CHECK-COMMON-NEXT: .LBB3_3: // %private_za_call
249+
; CHECK-COMMON-NEXT: msr TPIDR2_EL0, xzr
250+
; CHECK-COMMON-NEXT: .LBB3_4: // %exit
251+
; CHECK-COMMON-NEXT: mov sp, x29
252+
; CHECK-COMMON-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload
253+
; CHECK-COMMON-NEXT: b shared_za_call
285254
br i1 %cond, label %private_za_call, label %exit
286255

287256
private_za_call:

llvm/test/CodeGen/AArch64/sme-za-exceptions.ll

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -56,31 +56,23 @@ define void @za_with_raii(i1 %fail) "aarch64_inout_za" personality ptr @__gxx_pe
5656
; CHECK-NEXT: adrp x8, .L.str
5757
; CHECK-NEXT: add x8, x8, :lo12:.L.str
5858
; CHECK-NEXT: str x8, [x0]
59-
; CHECK-NEXT: .Ltmp0:
59+
; CHECK-NEXT: .Ltmp0: // EH_LABEL
6060
; CHECK-NEXT: adrp x1, :got:typeinfo_for_char_const_ptr
6161
; CHECK-NEXT: mov x2, xzr
6262
; CHECK-NEXT: ldr x1, [x1, :got_lo12:typeinfo_for_char_const_ptr]
6363
; CHECK-NEXT: bl __cxa_throw
64-
; CHECK-NEXT: .Ltmp1:
65-
; CHECK-NEXT: smstart za
66-
; CHECK-NEXT: mrs x8, TPIDR2_EL0
67-
; CHECK-NEXT: sub x0, x29, #16
68-
; CHECK-NEXT: cbnz x8, .LBB0_4
69-
; CHECK-NEXT: // %bb.3: // %throw_exception
70-
; CHECK-NEXT: bl __arm_tpidr2_restore
71-
; CHECK-NEXT: .LBB0_4: // %throw_exception
72-
; CHECK-NEXT: msr TPIDR2_EL0, xzr
73-
; CHECK-NEXT: // %bb.5: // %throw_fail
74-
; CHECK-NEXT: .LBB0_6: // %unwind_dtors
75-
; CHECK-NEXT: .Ltmp2:
64+
; CHECK-NEXT: .Ltmp1: // EH_LABEL
65+
; CHECK-NEXT: // %bb.3: // %throw_fail
66+
; CHECK-NEXT: .LBB0_4: // %unwind_dtors
67+
; CHECK-NEXT: .Ltmp2: // EH_LABEL
7668
; CHECK-NEXT: mov x19, x0
7769
; CHECK-NEXT: smstart za
7870
; CHECK-NEXT: mrs x8, TPIDR2_EL0
7971
; CHECK-NEXT: sub x0, x29, #16
80-
; CHECK-NEXT: cbnz x8, .LBB0_8
81-
; CHECK-NEXT: // %bb.7: // %unwind_dtors
72+
; CHECK-NEXT: cbnz x8, .LBB0_6
73+
; CHECK-NEXT: // %bb.5: // %unwind_dtors
8274
; CHECK-NEXT: bl __arm_tpidr2_restore
83-
; CHECK-NEXT: .LBB0_8: // %unwind_dtors
75+
; CHECK-NEXT: .LBB0_6: // %unwind_dtors
8476
; CHECK-NEXT: msr TPIDR2_EL0, xzr
8577
; CHECK-NEXT: bl shared_za_call
8678
; CHECK-NEXT: sub x8, x29, #16
@@ -142,11 +134,11 @@ define dso_local void @try_catch() "aarch64_inout_za" personality ptr @__gxx_per
142134
; CHECK-NEXT: msub x9, x8, x8, x9
143135
; CHECK-NEXT: mov sp, x9
144136
; CHECK-NEXT: stp x9, x8, [x29, #-16]
145-
; CHECK-NEXT: .Ltmp3:
137+
; CHECK-NEXT: .Ltmp3: // EH_LABEL
146138
; CHECK-NEXT: sub x8, x29, #16
147139
; CHECK-NEXT: msr TPIDR2_EL0, x8
148140
; CHECK-NEXT: bl may_throw
149-
; CHECK-NEXT: .Ltmp4:
141+
; CHECK-NEXT: .Ltmp4: // EH_LABEL
150142
; CHECK-NEXT: .LBB1_1: // %after_catch
151143
; CHECK-NEXT: smstart za
152144
; CHECK-NEXT: mrs x8, TPIDR2_EL0
@@ -160,7 +152,7 @@ define dso_local void @try_catch() "aarch64_inout_za" personality ptr @__gxx_per
160152
; CHECK-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload
161153
; CHECK-NEXT: b shared_za_call
162154
; CHECK-NEXT: .LBB1_4: // %catch
163-
; CHECK-NEXT: .Ltmp5:
155+
; CHECK-NEXT: .Ltmp5: // EH_LABEL
164156
; CHECK-NEXT: bl __cxa_begin_catch
165157
; CHECK-NEXT: smstart za
166158
; CHECK-NEXT: mrs x8, TPIDR2_EL0
@@ -235,16 +227,16 @@ define void @try_catch_shared_za_callee() "aarch64_new_za" personality ptr @__gx
235227
; CHECK-NEXT: zero {za}
236228
; CHECK-NEXT: .LBB2_2:
237229
; CHECK-NEXT: smstart za
238-
; CHECK-NEXT: .Ltmp6:
230+
; CHECK-NEXT: .Ltmp6: // EH_LABEL
239231
; CHECK-NEXT: bl shared_za_call
240-
; CHECK-NEXT: .Ltmp7:
232+
; CHECK-NEXT: .Ltmp7: // EH_LABEL
241233
; CHECK-NEXT: .LBB2_3: // %exit
242234
; CHECK-NEXT: smstop za
243235
; CHECK-NEXT: mov sp, x29
244236
; CHECK-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload
245237
; CHECK-NEXT: ret
246238
; CHECK-NEXT: .LBB2_4: // %catch
247-
; CHECK-NEXT: .Ltmp8:
239+
; CHECK-NEXT: .Ltmp8: // EH_LABEL
248240
; CHECK-NEXT: bl __cxa_begin_catch
249241
; CHECK-NEXT: smstart za
250242
; CHECK-NEXT: mrs x8, TPIDR2_EL0

0 commit comments

Comments
 (0)