Skip to content

Commit 001ecec

Browse files
committed
[MachineLICM] Recognize registers clobbered at EH landing pad entry
EH landing pad entry implicitly clobbers target-specific exception pointer and exception selector registers. The post-RA MachineLICM pass needs to take these into account when deciding whether to hoist an instruction out of the loop that initializes one of these registers. Fixes: llvm#122315
1 parent 9b49da2 commit 001ecec

File tree

2 files changed

+74
-0
lines changed

2 files changed

+74
-0
lines changed

llvm/lib/CodeGen/MachineLICM.cpp

+15
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,21 @@ void MachineLICMImpl::HoistRegionPostRA(MachineLoop *CurLoop,
639639
if (const uint32_t *Mask = BB->getBeginClobberMask(TRI))
640640
applyBitsNotInRegMaskToRegUnitsMask(*TRI, RUClobbers, Mask);
641641

642+
// EH landing pads clobber exception pointer/selector registers
643+
if (BB->isEHPad()) {
644+
const MachineFunction &MF = *BB->getParent();
645+
if (MF.getFunction().hasPersonalityFn()) {
646+
auto PersonalityFn = MF.getFunction().getPersonalityFn();
647+
const TargetLowering &TLI = *MF.getSubtarget().getTargetLowering();
648+
if (unsigned Reg = TLI.getExceptionPointerRegister(PersonalityFn))
649+
for (MCRegUnitIterator RUI(Reg, TRI); RUI.isValid(); ++RUI)
650+
RUClobbers.set(*RUI);
651+
if (unsigned Reg = TLI.getExceptionSelectorRegister(PersonalityFn))
652+
for (MCRegUnitIterator RUI(Reg, TRI); RUI.isValid(); ++RUI)
653+
RUClobbers.set(*RUI);
654+
}
655+
}
656+
642657
SpeculationState = SpeculateUnknown;
643658
for (MachineInstr &MI : *BB)
644659
ProcessMI(&MI, RUDefs, RUClobbers, StoredFIs, Candidates, CurLoop);

llvm/test/CodeGen/SystemZ/pr122315.ll

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; Verify that MachineLICM recognizes that EH landing pad entry clobbers %r6/%r7
3+
;
4+
; RUN: llc < %s -verify-machineinstrs -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
5+
6+
declare i64 @personality(i64, i64, i64, ptr, ptr)
7+
declare void @callee(i64, i64, i64, i64, i64)
8+
declare void @panic()
9+
10+
define void @test() uwtable personality ptr @personality {
11+
; CHECK-LABEL: test:
12+
; CHECK: .Lfunc_begin0:
13+
; CHECK-NEXT: .cfi_startproc
14+
; CHECK-NEXT: .cfi_personality 0, personality
15+
; CHECK-NEXT: .cfi_lsda 0, .Lexception0
16+
; CHECK-NEXT: # %bb.0: # %start
17+
; CHECK-NEXT: stmg %r6, %r15, 48(%r15)
18+
; CHECK-NEXT: .cfi_offset %r6, -112
19+
; CHECK-NEXT: .cfi_offset %r7, -104
20+
; CHECK-NEXT: .cfi_offset %r14, -48
21+
; CHECK-NEXT: .cfi_offset %r15, -40
22+
; CHECK-NEXT: aghi %r15, -160
23+
; CHECK-NEXT: .cfi_def_cfa_offset 320
24+
; CHECK-NEXT: .LBB0_1: # %bb1
25+
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
26+
; CHECK-NEXT: lghi %r2, 0
27+
; CHECK-NEXT: lghi %r3, 0
28+
; CHECK-NEXT: lghi %r4, 0
29+
; CHECK-NEXT: lghi %r5, 0
30+
; CHECK-NEXT: lghi %r6, 0
31+
; CHECK-NEXT: brasl %r14, callee@PLT
32+
; CHECK-NEXT: .Ltmp0:
33+
; CHECK-NEXT: brasl %r14, panic@PLT
34+
; CHECK-NEXT: .Ltmp1:
35+
; CHECK-NEXT: j .LBB0_3
36+
; CHECK-NEXT: .LBB0_2: # %bb3
37+
; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1
38+
; CHECK-NEXT: .Ltmp2:
39+
; CHECK-NEXT: j .LBB0_1
40+
; CHECK-NEXT: .LBB0_3: # %bb2
41+
; CHECK-NEXT: lmg %r6, %r15, 208(%r15)
42+
; CHECK-NEXT: br %r14
43+
start:
44+
br label %bb1
45+
46+
bb1:
47+
call void @callee(i64 0, i64 0, i64 0, i64 0, i64 0)
48+
invoke void @panic()
49+
to label %bb2 unwind label %bb3
50+
51+
bb2:
52+
ret void
53+
54+
bb3:
55+
%lp = landingpad { ptr, i32 }
56+
catch ptr null
57+
br label %bb1
58+
}
59+

0 commit comments

Comments
 (0)