diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp index ff2bbf55a0752..b93ae9a692c2a 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyLowerEmscriptenEHSjLj.cpp @@ -755,7 +755,6 @@ bool WebAssemblyLowerEmscriptenEHSjLj::runEHOnFunction(Function &F) { auto *II = dyn_cast(BB.getTerminator()); if (!II) continue; - Changed = true; LandingPads.insert(II->getLandingPadInst()); IRB.SetInsertPoint(II); @@ -835,6 +834,7 @@ bool WebAssemblyLowerEmscriptenEHSjLj::runEHOnFunction(Function &F) { if (auto *LPI = dyn_cast(I)) LandingPads.insert(LPI); } + Changed = !LandingPads.empty(); // Handle all the landingpad for this function together, as multiple invokes // may share a single lp diff --git a/llvm/test/CodeGen/WebAssembly/lower-em-exceptions-lpad-only.ll b/llvm/test/CodeGen/WebAssembly/lower-em-exceptions-lpad-only.ll new file mode 100644 index 0000000000000..6d5f2e8365427 --- /dev/null +++ b/llvm/test/CodeGen/WebAssembly/lower-em-exceptions-lpad-only.ll @@ -0,0 +1,25 @@ +; RUN: opt < %s -wasm-lower-em-ehsjlj -S | FileCheck %s + +target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" +target triple = "wasm32-unknown-unknown" + +@_ZTIi = external constant i8* + +; Checks if a module that only contains a landingpad (and resume) but not an +; invoke works correctly and does not crash. +; CHECK-LABEL: @landingpad_only +define void @landingpad_only() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { +entry: + br label %cont + +lpad: ; preds = %entry + %0 = landingpad { i8*, i32 } + catch i8* bitcast (i8** @_ZTIi to i8*) + catch i8* null + resume { i8*, i32 } %0 + +cont: + ret void +} + +declare i32 @__gxx_personality_v0(...)