forked from OSchip/llvm-project
[WebAssembly] Fix unwind mismatch stat computation
Summary: There was a bug when computing the number of unwind destination mismatches in CFGStackify. When there are many mismatched calls that share the same (original) destination BB, they have to be counted separately. This also fixes a typo and runs `fixUnwindMismatches` only when the wasm exception handling is enabled. This is to prevent unnecessary computations and does not change behavior. Reviewers: dschuff Subscribers: sbc100, jgravelle-google, hiraditya, sunfish, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D68552 llvm-svn: 373975
This commit is contained in:
parent
ae5bad7277
commit
daeead4b02
|
@ -848,7 +848,7 @@ bool WebAssemblyCFGStackify::fixUnwindMismatches(MachineFunction &MF) {
|
|||
SmallVector<const MachineBasicBlock *, 8> EHPadStack;
|
||||
// Range of intructions to be wrapped in a new nested try/catch
|
||||
using TryRange = std::pair<MachineInstr *, MachineInstr *>;
|
||||
// In original CFG, <unwind destionation BB, a vector of try ranges>
|
||||
// In original CFG, <unwind destination BB, a vector of try ranges>
|
||||
DenseMap<MachineBasicBlock *, SmallVector<TryRange, 4>> UnwindDestToTryRanges;
|
||||
// In new CFG, <destination to branch to, a vector of try ranges>
|
||||
DenseMap<MachineBasicBlock *, SmallVector<TryRange, 4>> BrDestToTryRanges;
|
||||
|
@ -985,7 +985,7 @@ bool WebAssemblyCFGStackify::fixUnwindMismatches(MachineFunction &MF) {
|
|||
// ...
|
||||
// cont:
|
||||
for (auto &P : UnwindDestToTryRanges) {
|
||||
NumUnwindMismatches++;
|
||||
NumUnwindMismatches += P.second.size();
|
||||
|
||||
// This means the destination is the appendix BB, which was separately
|
||||
// handled above.
|
||||
|
@ -1300,6 +1300,8 @@ void WebAssemblyCFGStackify::placeMarkers(MachineFunction &MF) {
|
|||
}
|
||||
}
|
||||
// Fix mismatches in unwind destinations induced by linearizing the code.
|
||||
if (MCAI->getExceptionHandlingType() == ExceptionHandling::Wasm &&
|
||||
MF.getFunction().hasPersonalityFn())
|
||||
fixUnwindMismatches(MF);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
; RUN: llc < %s -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -disable-block-placement -verify-machineinstrs -fast-isel=false -machine-sink-split-probability-threshold=0 -cgp-freq-ratio-to-skip-merge=1000 -exception-model=wasm -mattr=+exception-handling | FileCheck %s
|
||||
; RUN: llc < %s -O0 -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -verify-machineinstrs -exception-model=wasm -mattr=+exception-handling | FileCheck %s --check-prefix=NOOPT
|
||||
; RUN: llc < %s -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -disable-block-placement -verify-machineinstrs -fast-isel=false -machine-sink-split-probability-threshold=0 -cgp-freq-ratio-to-skip-merge=1000 -exception-model=wasm -mattr=+exception-handling -wasm-disable-ehpad-sort | FileCheck %s --check-prefix=NOSORT
|
||||
; RUN: llc < %s -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -disable-block-placement -verify-machineinstrs -fast-isel=false -machine-sink-split-probability-threshold=0 -cgp-freq-ratio-to-skip-merge=1000 -exception-model=wasm -mattr=+exception-handling -wasm-disable-ehpad-sort -stats 2>&1 | FileCheck %s --check-prefix=NOSORT-STAT
|
||||
|
||||
target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
|
||||
target triple = "wasm32-unknown-unknown"
|
||||
|
@ -702,6 +703,9 @@ ehcleanup: ; preds = %entry
|
|||
cleanupret from %0 unwind to caller
|
||||
}
|
||||
|
||||
; Check if the unwind destination mismatch stats are correct
|
||||
; NOSORT-STAT: 11 wasm-cfg-stackify - Number of EH pad unwind mismatches found
|
||||
|
||||
declare void @foo()
|
||||
declare void @bar()
|
||||
declare i32 @baz()
|
||||
|
|
Loading…
Reference in New Issue