forked from OSchip/llvm-project
[GlobalISel][IRTranslator] Support PHI instructions in landingpad blocks
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
This commit is contained in:
parent
a6436b0b3a
commit
7497b861f4
|
@ -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
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue