WebAssemblyUtilities.cpp revision 321369
1311116Sdim//===-- WebAssemblyUtilities.cpp - WebAssembly Utility Functions ----------===// 2311116Sdim// 3311116Sdim// The LLVM Compiler Infrastructure 4311116Sdim// 5311116Sdim// This file is distributed under the University of Illinois Open Source 6311116Sdim// License. See LICENSE.TXT for details. 7311116Sdim// 8311116Sdim//===----------------------------------------------------------------------===// 9311116Sdim/// 10311116Sdim/// \file 11311116Sdim/// \brief This file implements several utility functions for WebAssembly. 12311116Sdim/// 13311116Sdim//===----------------------------------------------------------------------===// 14311116Sdim 15311116Sdim#include "WebAssemblyUtilities.h" 16311116Sdim#include "WebAssemblyMachineFunctionInfo.h" 17311116Sdim#include "llvm/CodeGen/MachineInstr.h" 18321369Sdim#include "llvm/CodeGen/MachineLoopInfo.h" 19311116Sdimusing namespace llvm; 20311116Sdim 21311116Sdimbool WebAssembly::isArgument(const MachineInstr &MI) { 22311116Sdim switch (MI.getOpcode()) { 23311116Sdim case WebAssembly::ARGUMENT_I32: 24311116Sdim case WebAssembly::ARGUMENT_I64: 25311116Sdim case WebAssembly::ARGUMENT_F32: 26311116Sdim case WebAssembly::ARGUMENT_F64: 27311116Sdim case WebAssembly::ARGUMENT_v16i8: 28311116Sdim case WebAssembly::ARGUMENT_v8i16: 29311116Sdim case WebAssembly::ARGUMENT_v4i32: 30311116Sdim case WebAssembly::ARGUMENT_v4f32: 31311116Sdim return true; 32311116Sdim default: 33311116Sdim return false; 34311116Sdim } 35311116Sdim} 36311116Sdim 37311116Sdimbool WebAssembly::isCopy(const MachineInstr &MI) { 38311116Sdim switch (MI.getOpcode()) { 39311116Sdim case WebAssembly::COPY_I32: 40311116Sdim case WebAssembly::COPY_I64: 41311116Sdim case WebAssembly::COPY_F32: 42311116Sdim case WebAssembly::COPY_F64: 43311116Sdim return true; 44311116Sdim default: 45311116Sdim return false; 46311116Sdim } 47311116Sdim} 48311116Sdim 49311116Sdimbool WebAssembly::isTee(const MachineInstr &MI) { 50311116Sdim switch (MI.getOpcode()) { 51311116Sdim case WebAssembly::TEE_I32: 52311116Sdim case WebAssembly::TEE_I64: 53311116Sdim case WebAssembly::TEE_F32: 54311116Sdim case WebAssembly::TEE_F64: 55311116Sdim return true; 56311116Sdim default: 57311116Sdim return false; 58311116Sdim } 59311116Sdim} 60311116Sdim 61311116Sdim/// Test whether MI is a child of some other node in an expression tree. 62311116Sdimbool WebAssembly::isChild(const MachineInstr &MI, 63311116Sdim const WebAssemblyFunctionInfo &MFI) { 64311116Sdim if (MI.getNumOperands() == 0) 65311116Sdim return false; 66311116Sdim const MachineOperand &MO = MI.getOperand(0); 67311116Sdim if (!MO.isReg() || MO.isImplicit() || !MO.isDef()) 68311116Sdim return false; 69311116Sdim unsigned Reg = MO.getReg(); 70311116Sdim return TargetRegisterInfo::isVirtualRegister(Reg) && 71311116Sdim MFI.isVRegStackified(Reg); 72311116Sdim} 73321369Sdim 74321369Sdimbool WebAssembly::isCallIndirect(const MachineInstr &MI) { 75321369Sdim switch (MI.getOpcode()) { 76321369Sdim case WebAssembly::CALL_INDIRECT_VOID: 77321369Sdim case WebAssembly::CALL_INDIRECT_I32: 78321369Sdim case WebAssembly::CALL_INDIRECT_I64: 79321369Sdim case WebAssembly::CALL_INDIRECT_F32: 80321369Sdim case WebAssembly::CALL_INDIRECT_F64: 81321369Sdim case WebAssembly::CALL_INDIRECT_v16i8: 82321369Sdim case WebAssembly::CALL_INDIRECT_v8i16: 83321369Sdim case WebAssembly::CALL_INDIRECT_v4i32: 84321369Sdim case WebAssembly::CALL_INDIRECT_v4f32: 85321369Sdim return true; 86321369Sdim default: 87321369Sdim return false; 88321369Sdim } 89321369Sdim} 90321369Sdim 91321369SdimMachineBasicBlock *llvm::LoopBottom(const MachineLoop *Loop) { 92321369Sdim MachineBasicBlock *Bottom = Loop->getHeader(); 93321369Sdim for (MachineBasicBlock *MBB : Loop->blocks()) 94321369Sdim if (MBB->getNumber() > Bottom->getNumber()) 95321369Sdim Bottom = MBB; 96321369Sdim return Bottom; 97321369Sdim} 98