Skip to content

Commit

Permalink
[GlobalISel][IRTranslator] Support PHI instructions in landingpad blocks
Browse files Browse the repository at this point in the history
The check for the landingpad instructions was overly restrictive. In optimimized builds PHI nodes can appear
before the landingpad instructions, resulting in a fallback to SelectionDAG.

This change relaxes the check to allow PHI nodes.

Reviewed By: arsenm

Differential Revision: https://reviews.llvm.org/D86141
  • Loading branch information
konstantinschwarz committed Aug 20, 2020
1 parent a6436b0 commit 7497b86
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 1 deletion.
2 changes: 1 addition & 1 deletion llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2030,7 +2030,7 @@ bool IRTranslator::translateInvoke(const User &U,
return false;

// FIXME: support Windows exception handling.
if (!isa<LandingPadInst>(EHPadBB->front()))
if (!isa<LandingPadInst>(EHPadBB->getFirstNonPHI()))
return false;

// Emit the actual call, bracketed by EH_LABELs so that the MF knows about
Expand Down
39 changes: 39 additions & 0 deletions llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-exceptions.ll
Original file line number Diff line number Diff line change
Expand Up @@ -87,3 +87,42 @@ broken:
continue:
ret void
}

; CHECK-LABEL: name: test_lpad_phi
; CHECK: body:
; CHECK-NEXT: bb.1 (%ir-block.0):
; CHECK: successors: %[[GOOD:bb.[0-9]+]]{{.*}}%[[BAD:bb.[0-9]+]]
; CHECK: [[ELEVEN:%[0-9]+]]:_(s32) = G_CONSTANT i32 11
; CHECK: EH_LABEL
; CHECK: BL @may_throw, csr_darwin_aarch64_aapcs, implicit-def $lr, implicit $sp
; CHECK: EH_LABEL
; CHECK: G_BR %[[GOOD]]

; CHECK: [[BAD]].{{[a-z]+}} (landing-pad):
; CHECK: [[PHI_ELEVEN:%[0-9]+]]:_(s32) = G_PHI [[ELEVEN]](s32), %bb.1
; CHECK: EH_LABEL
; CHECK: G_STORE [[PHI_ELEVEN]](s32), {{%[0-9]+}}(p0) :: (store 4 into @global_var)

; CHECK: [[GOOD]].{{[a-z]+}}:
; CHECK: [[SEL:%[0-9]+]]:_(s32) = G_PHI
; CHECK: $w0 = COPY [[SEL]]

@global_var = external global i32

declare void @may_throw()
define i32 @test_lpad_phi() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
store i32 42, i32* @global_var
invoke void @may_throw()
to label %continue unwind label %lpad

lpad: ; preds = %entry
%p = phi i32 [ 11, %0 ] ; Trivial, but -O0 keeps it
%1 = landingpad { i8*, i32 }
catch i8* null
store i32 %p, i32* @global_var
br label %continue

continue: ; preds = %entry, %lpad
%r.0 = phi i32 [ 13, %0 ], [ 55, %lpad ]
ret i32 %r.0
}

0 comments on commit 7497b86

Please sign in to comment.