//===-- WebAssemblyArgumentMove.cpp - Argument instruction moving ---------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// /// /// \file /// This file moves ARGUMENT instructions after ScheduleDAG scheduling. /// /// Arguments are really live-in registers, however, since we use virtual /// registers and LLVM doesn't support live-in virtual registers, we're /// currently making do with ARGUMENT instructions which are placed at the top /// of the entry block. The trick is to get them to *stay* at the top of the /// entry block. /// /// The ARGUMENTS physical register keeps these instructions pinned in place /// during liveness-aware CodeGen passes, however one thing which does not /// respect this is the ScheduleDAG scheduler. This pass is therefore run /// immediately after that. /// /// This is all hopefully a temporary solution until we find a better solution /// for describing the live-in nature of arguments. /// //===----------------------------------------------------------------------===// #include "MCTargetDesc/WebAssemblyMCTargetDesc.h" #include "WebAssembly.h" #include "WebAssemblyMachineFunctionInfo.h" #include "WebAssemblySubtarget.h" #include "WebAssemblyUtilities.h" #include "llvm/CodeGen/MachineBlockFrequencyInfo.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/Passes.h" #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" usingnamespacellvm; #define DEBUG_TYPE … namespace { class WebAssemblyArgumentMove final : public MachineFunctionPass { … }; } // end anonymous namespace char WebAssemblyArgumentMove::ID = …; INITIALIZE_PASS(…) FunctionPass *llvm::createWebAssemblyArgumentMove() { … } bool WebAssemblyArgumentMove::runOnMachineFunction(MachineFunction &MF) { … }