From 2dbff99e43a082c76202cfafb8f5da40f11c94dc Mon Sep 17 00:00:00 2001 From: Heejin Ahn Date: Fri, 29 Mar 2019 19:36:51 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@357303 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../WebAssembly/WebAssemblyCFGStackify.cpp | 4 ++- test/CodeGen/WebAssembly/cfg-stackify-dbg.mir | 27 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 test/CodeGen/WebAssembly/cfg-stackify-dbg.mir diff --git a/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp b/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp index 39641b414cb..b64aa3023bb 100644 --- a/lib/Target/WebAssembly/WebAssemblyCFGStackify.cpp +++ b/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/test/CodeGen/WebAssembly/cfg-stackify-dbg.mir b/test/CodeGen/WebAssembly/cfg-stackify-dbg.mir new file mode 100644 index 00000000000..cd76d9132f9 --- /dev/null +++ b/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 +... -- 2.50.1