forked from OSchip/llvm-project
[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:
parent
055e4dce45
commit
67f74aceab
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
...
|
Loading…
Reference in New Issue