xref: /llvm-project/llvm/lib/Target/WebAssembly/WebAssemblyCleanCodeAfterTrap.cpp (revision 1a462296360f311d4593694aefd30c6b3e969460)
1*1a462296SCongcong Cai //===-- WebAssemblyCleanCodeAfterTrap.cpp - Clean Code After Trap ---------===//
2*1a462296SCongcong Cai //
3*1a462296SCongcong Cai // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*1a462296SCongcong Cai // See https://llvm.org/LICENSE.txt for license information.
5*1a462296SCongcong Cai // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*1a462296SCongcong Cai //
7*1a462296SCongcong Cai //===----------------------------------------------------------------------===//
8*1a462296SCongcong Cai ///
9*1a462296SCongcong Cai /// \file
10*1a462296SCongcong Cai /// This file remove instruction after trap.
11*1a462296SCongcong Cai /// ``llvm.trap`` will be convert as ``unreachable`` which is terminator.
12*1a462296SCongcong Cai /// Instruction after terminator will cause validation failed.
13*1a462296SCongcong Cai ///
14*1a462296SCongcong Cai //===----------------------------------------------------------------------===//
15*1a462296SCongcong Cai 
16*1a462296SCongcong Cai #include "WebAssembly.h"
17*1a462296SCongcong Cai #include "WebAssemblyUtilities.h"
18*1a462296SCongcong Cai #include "llvm/ADT/SmallVector.h"
19*1a462296SCongcong Cai #include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
20*1a462296SCongcong Cai #include "llvm/CodeGen/Passes.h"
21*1a462296SCongcong Cai #include "llvm/MC/MCInstrDesc.h"
22*1a462296SCongcong Cai #include "llvm/Support/Debug.h"
23*1a462296SCongcong Cai #include "llvm/Support/raw_ostream.h"
24*1a462296SCongcong Cai using namespace llvm;
25*1a462296SCongcong Cai 
26*1a462296SCongcong Cai #define DEBUG_TYPE "wasm-clean-code-after-trap"
27*1a462296SCongcong Cai 
28*1a462296SCongcong Cai namespace {
29*1a462296SCongcong Cai class WebAssemblyCleanCodeAfterTrap final : public MachineFunctionPass {
30*1a462296SCongcong Cai public:
31*1a462296SCongcong Cai   static char ID; // Pass identification, replacement for typeid
WebAssemblyCleanCodeAfterTrap()32*1a462296SCongcong Cai   WebAssemblyCleanCodeAfterTrap() : MachineFunctionPass(ID) {}
33*1a462296SCongcong Cai 
getPassName() const34*1a462296SCongcong Cai   StringRef getPassName() const override {
35*1a462296SCongcong Cai     return "WebAssembly Clean Code After Trap";
36*1a462296SCongcong Cai   }
37*1a462296SCongcong Cai 
38*1a462296SCongcong Cai   bool runOnMachineFunction(MachineFunction &MF) override;
39*1a462296SCongcong Cai };
40*1a462296SCongcong Cai } // end anonymous namespace
41*1a462296SCongcong Cai 
42*1a462296SCongcong Cai char WebAssemblyCleanCodeAfterTrap::ID = 0;
43*1a462296SCongcong Cai INITIALIZE_PASS(WebAssemblyCleanCodeAfterTrap, DEBUG_TYPE,
44*1a462296SCongcong Cai                 "WebAssembly Clean Code After Trap", false, false)
45*1a462296SCongcong Cai 
createWebAssemblyCleanCodeAfterTrap()46*1a462296SCongcong Cai FunctionPass *llvm::createWebAssemblyCleanCodeAfterTrap() {
47*1a462296SCongcong Cai   return new WebAssemblyCleanCodeAfterTrap();
48*1a462296SCongcong Cai }
49*1a462296SCongcong Cai 
runOnMachineFunction(MachineFunction & MF)50*1a462296SCongcong Cai bool WebAssemblyCleanCodeAfterTrap::runOnMachineFunction(MachineFunction &MF) {
51*1a462296SCongcong Cai   LLVM_DEBUG({
52*1a462296SCongcong Cai     dbgs() << "********** CleanCodeAfterTrap **********\n"
53*1a462296SCongcong Cai            << "********** Function: " << MF.getName() << '\n';
54*1a462296SCongcong Cai   });
55*1a462296SCongcong Cai 
56*1a462296SCongcong Cai   bool Changed = false;
57*1a462296SCongcong Cai 
58*1a462296SCongcong Cai   for (MachineBasicBlock &BB : MF) {
59*1a462296SCongcong Cai     bool HasTerminator = false;
60*1a462296SCongcong Cai     llvm::SmallVector<MachineInstr *> RemoveMI{};
61*1a462296SCongcong Cai     for (MachineInstr &MI : BB) {
62*1a462296SCongcong Cai       if (HasTerminator)
63*1a462296SCongcong Cai         RemoveMI.push_back(&MI);
64*1a462296SCongcong Cai       if (MI.hasProperty(MCID::Trap) && MI.isTerminator())
65*1a462296SCongcong Cai         HasTerminator = true;
66*1a462296SCongcong Cai     }
67*1a462296SCongcong Cai     if (!RemoveMI.empty()) {
68*1a462296SCongcong Cai       Changed = true;
69*1a462296SCongcong Cai       LLVM_DEBUG({
70*1a462296SCongcong Cai         for (MachineInstr *MI : RemoveMI) {
71*1a462296SCongcong Cai           llvm::dbgs() << "* remove ";
72*1a462296SCongcong Cai           MI->print(llvm::dbgs());
73*1a462296SCongcong Cai         }
74*1a462296SCongcong Cai       });
75*1a462296SCongcong Cai       for (MachineInstr *MI : RemoveMI)
76*1a462296SCongcong Cai         MI->eraseFromParent();
77*1a462296SCongcong Cai     }
78*1a462296SCongcong Cai   }
79*1a462296SCongcong Cai   return Changed;
80*1a462296SCongcong Cai }
81