From: Heejin Ahn Date: Fri, 29 Mar 2019 19:36:51 +0000 (+0000) Subject: [WebAssembly] Handle END_LOOP in unreachable BB in CFGStackify X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=67f74aceab191c5ecad2394edb267ecee49d872d;p=platform%2Fupstream%2Fllvm.git [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 --- diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp index 39641b4..b64aa30 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp @@ -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); diff --git a/llvm/test/CodeGen/WebAssembly/cfg-stackify-dbg.mir b/llvm/test/CodeGen/WebAssembly/cfg-stackify-dbg.mir new file mode 100644 index 0000000..cd76d91 --- /dev/null +++ b/llvm/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. 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 +...