[GlobalISel][IRTranslator] Support PHI instructions in landingpad blocks
authorKonstantin Schwarz <konstantin.schwarz@hightec-rt.com>
Tue, 18 Aug 2020 08:32:44 +0000 (10:32 +0200)
committerKonstantin Schwarz <konstantin.schwarz@hightec-rt.com>
Thu, 20 Aug 2020 08:49:31 +0000 (10:49 +0200)
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

llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
llvm/test/CodeGen/AArch64/GlobalISel/irtranslator-exceptions.ll

index adf90a8..46041f0 100644 (file)
@@ -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
index 528a2ad..c3c97a2 100644 (file)
@@ -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
+}