//===-- WebAssemblyUtilities.cpp - WebAssembly Utility Functions ----------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// /// /// \file /// \brief This file implements several utility functions for WebAssembly. /// //===----------------------------------------------------------------------===// #include "WebAssemblyUtilities.h" #include "WebAssemblyMachineFunctionInfo.h" #include "llvm/CodeGen/MachineInstr.h" #include "llvm/CodeGen/MachineLoopInfo.h" using namespace llvm; bool WebAssembly::isArgument(const MachineInstr &MI) { switch (MI.getOpcode()) { case WebAssembly::ARGUMENT_I32: case WebAssembly::ARGUMENT_I64: case WebAssembly::ARGUMENT_F32: case WebAssembly::ARGUMENT_F64: case WebAssembly::ARGUMENT_v16i8: case WebAssembly::ARGUMENT_v8i16: case WebAssembly::ARGUMENT_v4i32: case WebAssembly::ARGUMENT_v4f32: return true; default: return false; } } bool WebAssembly::isCopy(const MachineInstr &MI) { switch (MI.getOpcode()) { case WebAssembly::COPY_I32: case WebAssembly::COPY_I64: case WebAssembly::COPY_F32: case WebAssembly::COPY_F64: return true; default: return false; } } bool WebAssembly::isTee(const MachineInstr &MI) { switch (MI.getOpcode()) { case WebAssembly::TEE_I32: case WebAssembly::TEE_I64: case WebAssembly::TEE_F32: case WebAssembly::TEE_F64: return true; default: return false; } } /// Test whether MI is a child of some other node in an expression tree. bool WebAssembly::isChild(const MachineInstr &MI, const WebAssemblyFunctionInfo &MFI) { if (MI.getNumOperands() == 0) return false; const MachineOperand &MO = MI.getOperand(0); if (!MO.isReg() || MO.isImplicit() || !MO.isDef()) return false; unsigned Reg = MO.getReg(); return TargetRegisterInfo::isVirtualRegister(Reg) && MFI.isVRegStackified(Reg); } bool WebAssembly::isCallIndirect(const MachineInstr &MI) { switch (MI.getOpcode()) { case WebAssembly::CALL_INDIRECT_VOID: case WebAssembly::CALL_INDIRECT_I32: case WebAssembly::CALL_INDIRECT_I64: case WebAssembly::CALL_INDIRECT_F32: case WebAssembly::CALL_INDIRECT_F64: case WebAssembly::CALL_INDIRECT_v16i8: case WebAssembly::CALL_INDIRECT_v8i16: case WebAssembly::CALL_INDIRECT_v4i32: case WebAssembly::CALL_INDIRECT_v4f32: return true; default: return false; } } MachineBasicBlock *llvm::LoopBottom(const MachineLoop *Loop) { MachineBasicBlock *Bottom = Loop->getHeader(); for (MachineBasicBlock *MBB : Loop->blocks()) if (MBB->getNumber() > Bottom->getNumber()) Bottom = MBB; return Bottom; }