blob: e32772d491cf717e7d429d46fcafd47e0f4b7560 [file] [log] [blame]
Dan Gohman4fc4e422016-10-24 19:49:43 +00001//===-- WebAssemblyUtilities.cpp - WebAssembly Utility Functions ----------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9///
10/// \file
11/// \brief This file implements several utility functions for WebAssembly.
12///
13//===----------------------------------------------------------------------===//
14
15#include "WebAssemblyUtilities.h"
16#include "WebAssemblyMachineFunctionInfo.h"
17#include "llvm/CodeGen/MachineInstr.h"
Dan Gohmanf52ee172017-02-27 22:38:58 +000018#include "llvm/CodeGen/MachineLoopInfo.h"
Dan Gohman4fc4e422016-10-24 19:49:43 +000019using namespace llvm;
20
21bool WebAssembly::isArgument(const MachineInstr &MI) {
22 switch (MI.getOpcode()) {
23 case WebAssembly::ARGUMENT_I32:
24 case WebAssembly::ARGUMENT_I64:
25 case WebAssembly::ARGUMENT_F32:
26 case WebAssembly::ARGUMENT_F64:
27 case WebAssembly::ARGUMENT_v16i8:
28 case WebAssembly::ARGUMENT_v8i16:
29 case WebAssembly::ARGUMENT_v4i32:
30 case WebAssembly::ARGUMENT_v4f32:
31 return true;
32 default:
33 return false;
34 }
35}
36
37bool WebAssembly::isCopy(const MachineInstr &MI) {
38 switch (MI.getOpcode()) {
39 case WebAssembly::COPY_I32:
40 case WebAssembly::COPY_I64:
41 case WebAssembly::COPY_F32:
42 case WebAssembly::COPY_F64:
43 return true;
44 default:
45 return false;
46 }
47}
48
49bool WebAssembly::isTee(const MachineInstr &MI) {
50 switch (MI.getOpcode()) {
51 case WebAssembly::TEE_I32:
52 case WebAssembly::TEE_I64:
53 case WebAssembly::TEE_F32:
54 case WebAssembly::TEE_F64:
55 return true;
56 default:
57 return false;
58 }
59}
60
61/// Test whether MI is a child of some other node in an expression tree.
62bool WebAssembly::isChild(const MachineInstr &MI,
63 const WebAssemblyFunctionInfo &MFI) {
64 if (MI.getNumOperands() == 0)
65 return false;
66 const MachineOperand &MO = MI.getOperand(0);
67 if (!MO.isReg() || MO.isImplicit() || !MO.isDef())
68 return false;
69 unsigned Reg = MO.getReg();
70 return TargetRegisterInfo::isVirtualRegister(Reg) &&
71 MFI.isVRegStackified(Reg);
72}
Dan Gohmand934cb82017-02-24 23:18:00 +000073
74bool WebAssembly::isCallIndirect(const MachineInstr &MI) {
75 switch (MI.getOpcode()) {
76 case WebAssembly::CALL_INDIRECT_VOID:
77 case WebAssembly::CALL_INDIRECT_I32:
78 case WebAssembly::CALL_INDIRECT_I64:
79 case WebAssembly::CALL_INDIRECT_F32:
80 case WebAssembly::CALL_INDIRECT_F64:
81 case WebAssembly::CALL_INDIRECT_v16i8:
82 case WebAssembly::CALL_INDIRECT_v8i16:
83 case WebAssembly::CALL_INDIRECT_v4i32:
84 case WebAssembly::CALL_INDIRECT_v4f32:
85 return true;
86 default:
87 return false;
88 }
89}
Dan Gohmanf52ee172017-02-27 22:38:58 +000090
91MachineBasicBlock *llvm::LoopBottom(const MachineLoop *Loop) {
92 MachineBasicBlock *Bottom = Loop->getHeader();
93 for (MachineBasicBlock *MBB : Loop->blocks())
94 if (MBB->getNumber() > Bottom->getNumber())
95 Bottom = MBB;
96 return Bottom;
97}