Index: lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp =================================================================== --- lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp +++ lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp @@ -411,7 +411,9 @@ // 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); Index: test/CodeGen/WebAssembly/cfg-stackify-dbg.mir =================================================================== --- /dev/null +++ test/CodeGen/WebAssembly/cfg-stackify-dbg.mir @@ -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. + +# 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 +...