[WebAssembly] Handle END_LOOP in unreachable BB in CFGStackify

Summary:
This fixes crashes when a BB in which an END_LOOP is to be placed is
unreachable and does not have any predecessors. Fixes PR41307.

Reviewers: dschuff

Subscribers: yurydelendik, sbc100, jgravelle-google, sunfish, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D60004

llvm-svn: 357303
This commit is contained in:
Heejin Ahn 2019-03-29 19:36:51 +00:00
parent 055e4dce45
commit 67f74aceab
2 changed files with 30 additions and 1 deletions

View File

@ -411,7 +411,9 @@ void WebAssemblyCFGStackify::placeLoopMarker(MachineBasicBlock &MBB) {
// Mark the end of the loop (using arbitrary debug location that branched to
// the loop end as its location).
InsertPos = getEarliestInsertPos(AfterLoop, BeforeSet, AfterSet);
DebugLoc EndDL = (*AfterLoop->pred_rbegin())->findBranchDebugLoc();
DebugLoc EndDL = AfterLoop->pred_empty()
? DebugLoc()
: (*AfterLoop->pred_rbegin())->findBranchDebugLoc();
MachineInstr *End =
BuildMI(*AfterLoop, InsertPos, EndDL, TII.get(WebAssembly::END_LOOP));
registerScope(Begin, End);

View File

@ -0,0 +1,27 @@
# RUN: llc -mtriple=wasm32-unknown-unknown -run-pass wasm-cfg-stackify %s -o - | FileCheck %s
# This tests if END_LOOP marker is placed correctly when the BB it is to be
# placed is unreachable. Regression test for PR41307.
# CHECK-LABEL: unreachable_test
name: unreachable_test
liveins:
- { reg: '$arguments' }
body: |
bb.0:
successors: %bb.1
bb.1:
; predecessors: %bb.0, %bb.2
successors: %bb.2
bb.2:
; predecessors: %bb.1
successors: %bb.1
BR %bb.1, implicit-def dead $arguments
; CHECK: bb.3
; CHECK: END_LOOP
bb.3:
UNREACHABLE implicit-def $arguments
...