Skip to content

Commit be7ef6c

Browse files
authored
[MachineLICM] Recognize registers clobbered at EH landing pad entry (#122446)
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: #122315
1 parent a3b6423 commit be7ef6c

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed

llvm/lib/CodeGen/MachineLICM.cpp

+13
Original file line numberDiff line numberDiff line change
@@ -633,6 +633,19 @@ void MachineLICMImpl::HoistRegionPostRA(MachineLoop *CurLoop) {
633633
if (const uint32_t *Mask = BB->getBeginClobberMask(TRI))
634634
applyBitsNotInRegMaskToRegUnitsMask(*TRI, RUClobbers, Mask);
635635

636+
// EH landing pads clobber exception pointer/selector registers.
637+
if (BB->isEHPad()) {
638+
const MachineFunction &MF = *BB->getParent();
639+
const Constant *PersonalityFn = MF.getFunction().getPersonalityFn();
640+
const TargetLowering &TLI = *MF.getSubtarget().getTargetLowering();
641+
if (MCRegister Reg = TLI.getExceptionPointerRegister(PersonalityFn))
642+
for (MCRegUnit Unit : TRI->regunits(Reg))
643+
RUClobbers.set(Unit);
644+
if (MCRegister Reg = TLI.getExceptionSelectorRegister(PersonalityFn))
645+
for (MCRegUnit Unit : TRI->regunits(Reg))
646+
RUClobbers.set(Unit);
647+
}
648+
636649
SpeculationState = SpeculateUnknown;
637650
for (MachineInstr &MI : *BB)
638651
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)