LLVM 22.0.0git
LanaiInstrInfo.h
Go to the documentation of this file.
1//===- LanaiInstrInfo.h - Lanai Instruction Information ---------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file contains the Lanai implementation of the TargetInstrInfo class.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_LIB_TARGET_LANAI_LANAIINSTRINFO_H
14#define LLVM_LIB_TARGET_LANAI_LANAIINSTRINFO_H
15
16#include "LanaiRegisterInfo.h"
19
20#define GET_INSTRINFO_HEADER
21#include "LanaiGenInstrInfo.inc"
22
23namespace llvm {
24
25class LanaiSubtarget;
26
28 const LanaiRegisterInfo RegisterInfo;
29
30public:
32
33 // getRegisterInfo - TargetInstrInfo is a superset of MRegister info. As
34 // such, whenever a client has an instance of instruction info, it should
35 // always be able to get register info as well (through this method).
36 virtual const LanaiRegisterInfo &getRegisterInfo() const {
37 return RegisterInfo;
38 }
39
41 const MachineInstr &MIb) const override;
42
44 int &FrameIndex) const override;
45
47 int &FrameIndex) const override;
48
50 int &FrameIndex) const override;
51
53 const DebugLoc &DL, Register DestinationRegister,
54 Register SourceRegister, bool KillSource,
55 bool RenamableDest = false,
56 bool RenamableSrc = false) const override;
57
60 Register SourceRegister, bool IsKill, int FrameIndex,
61 const TargetRegisterClass *RegisterClass,
62 const TargetRegisterInfo *RegisterInfo, Register VReg,
63 MachineInstr::MIFlag Flags = MachineInstr::NoFlags) const override;
64
67 Register DestinationRegister, int FrameIndex,
68 const TargetRegisterClass *RegisterClass,
69 const TargetRegisterInfo *RegisterInfo, Register VReg,
70 MachineInstr::MIFlag Flags = MachineInstr::NoFlags) const override;
71
72 bool expandPostRAPseudo(MachineInstr &MI) const override;
73
75 const MachineInstr &LdSt,
77 bool &OffsetIsScalable, LocationSize &Width,
78 const TargetRegisterInfo *TRI) const override;
79
81 const MachineOperand *&BaseOp,
82 int64_t &Offset, LocationSize &Width,
83 const TargetRegisterInfo *TRI) const;
84
85 std::pair<unsigned, unsigned>
86 decomposeMachineOperandsTargetFlags(unsigned TF) const override;
87
90
92 MachineBasicBlock *&FalseBlock,
94 bool AllowModify) const override;
95
97 int *BytesRemoved = nullptr) const override;
98
99 // For a comparison instruction, return the source registers in SrcReg and
100 // SrcReg2 if having two register operands, and the value it compares against
101 // in CmpValue. Return true if the comparison instruction can be analyzed.
102 bool analyzeCompare(const MachineInstr &MI, Register &SrcReg,
103 Register &SrcReg2, int64_t &CmpMask,
104 int64_t &CmpValue) const override;
105
106 // See if the comparison instruction can be converted into something more
107 // efficient. E.g., on Lanai register-register instructions can set the flag
108 // register, obviating the need for a separate compare.
109 bool optimizeCompareInstr(MachineInstr &CmpInstr, Register SrcReg,
110 Register SrcReg2, int64_t CmpMask, int64_t CmpValue,
111 const MachineRegisterInfo *MRI) const override;
112
113 // Analyze the given select instruction, returning true if it cannot be
114 // understood. It is assumed that MI->isSelect() is true.
115 //
116 // When successful, return the controlling condition and the operands that
117 // determine the true and false result values.
118 //
119 // Result = SELECT Cond, TrueOp, FalseOp
120 //
121 // Lanai can optimize certain select instructions, for example by predicating
122 // the instruction defining one of the operands and sets Optimizable to true.
123 bool analyzeSelect(const MachineInstr &MI,
124 SmallVectorImpl<MachineOperand> &Cond, unsigned &TrueOp,
125 unsigned &FalseOp, bool &Optimizable) const override;
126
127 // Given a select instruction that was understood by analyzeSelect and
128 // returned Optimizable = true, attempt to optimize MI by merging it with one
129 // of its operands. Returns NULL on failure.
130 //
131 // When successful, returns the new select instruction. The client is
132 // responsible for deleting MI.
133 //
134 // If both sides of the select can be optimized, the TrueOp is modifed.
135 // PreferFalse is not used.
138 bool PreferFalse) const override;
139
141 SmallVectorImpl<MachineOperand> &Condition) const override;
142
144 MachineBasicBlock *FalseBlock,
145 ArrayRef<MachineOperand> Condition,
146 const DebugLoc &DL,
147 int *BytesAdded = nullptr) const override;
148};
149
150static inline bool isSPLSOpcode(unsigned Opcode) {
151 switch (Opcode) {
152 case Lanai::LDBs_RI:
153 case Lanai::LDBz_RI:
154 case Lanai::LDHs_RI:
155 case Lanai::LDHz_RI:
156 case Lanai::STB_RI:
157 case Lanai::STH_RI:
158 return true;
159 default:
160 return false;
161 }
162}
163
164static inline bool isRMOpcode(unsigned Opcode) {
165 switch (Opcode) {
166 case Lanai::LDW_RI:
167 case Lanai::SW_RI:
168 return true;
169 default:
170 return false;
171 }
172}
173
174static inline bool isRRMOpcode(unsigned Opcode) {
175 switch (Opcode) {
176 case Lanai::LDBs_RR:
177 case Lanai::LDBz_RR:
178 case Lanai::LDHs_RR:
179 case Lanai::LDHz_RR:
180 case Lanai::LDWz_RR:
181 case Lanai::LDW_RR:
182 case Lanai::STB_RR:
183 case Lanai::STH_RR:
184 case Lanai::SW_RR:
185 return true;
186 default:
187 return false;
188 }
189}
190
191} // namespace llvm
192
193#endif // LLVM_LIB_TARGET_LANAI_LANAIINSTRINFO_H
unsigned const MachineRegisterInfo * MRI
MachineBasicBlock & MBB
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
IRTranslator LLVM IR MI
Register const TargetRegisterInfo * TRI
const SmallVectorImpl< MachineOperand > & Cond
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:41
A debug info location.
Definition DebugLoc.h:124
bool areMemAccessesTriviallyDisjoint(const MachineInstr &MIa, const MachineInstr &MIb) const override
unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TrueBlock, MachineBasicBlock *FalseBlock, ArrayRef< MachineOperand > Condition, const DebugLoc &DL, int *BytesAdded=nullptr) const override
Register isStoreToStackSlot(const MachineInstr &MI, int &FrameIndex) const override
bool analyzeSelect(const MachineInstr &MI, SmallVectorImpl< MachineOperand > &Cond, unsigned &TrueOp, unsigned &FalseOp, bool &Optimizable) const override
void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator Position, Register DestinationRegister, int FrameIndex, const TargetRegisterClass *RegisterClass, const TargetRegisterInfo *RegisterInfo, Register VReg, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
Register isLoadFromStackSlotPostFE(const MachineInstr &MI, int &FrameIndex) const override
std::pair< unsigned, unsigned > decomposeMachineOperandsTargetFlags(unsigned TF) const override
bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TrueBlock, MachineBasicBlock *&FalseBlock, SmallVectorImpl< MachineOperand > &Condition, bool AllowModify) const override
virtual const LanaiRegisterInfo & getRegisterInfo() const
MachineInstr * optimizeSelect(MachineInstr &MI, SmallPtrSetImpl< MachineInstr * > &SeenMIs, bool PreferFalse) const override
bool expandPostRAPseudo(MachineInstr &MI) const override
LanaiInstrInfo(const LanaiSubtarget &STI)
bool getMemOperandWithOffsetWidth(const MachineInstr &LdSt, const MachineOperand *&BaseOp, int64_t &Offset, LocationSize &Width, const TargetRegisterInfo *TRI) const
ArrayRef< std::pair< unsigned, const char * > > getSerializableDirectMachineOperandTargetFlags() const override
bool optimizeCompareInstr(MachineInstr &CmpInstr, Register SrcReg, Register SrcReg2, int64_t CmpMask, int64_t CmpValue, const MachineRegisterInfo *MRI) const override
bool analyzeCompare(const MachineInstr &MI, Register &SrcReg, Register &SrcReg2, int64_t &CmpMask, int64_t &CmpValue) const override
Register isLoadFromStackSlot(const MachineInstr &MI, int &FrameIndex) const override
unsigned removeBranch(MachineBasicBlock &MBB, int *BytesRemoved=nullptr) const override
bool getMemOperandsWithOffsetWidth(const MachineInstr &LdSt, SmallVectorImpl< const MachineOperand * > &BaseOps, int64_t &Offset, bool &OffsetIsScalable, LocationSize &Width, const TargetRegisterInfo *TRI) const override
void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator Position, Register SourceRegister, bool IsKill, int FrameIndex, const TargetRegisterClass *RegisterClass, const TargetRegisterInfo *RegisterInfo, Register VReg, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
bool reverseBranchCondition(SmallVectorImpl< MachineOperand > &Condition) const override
void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator Position, const DebugLoc &DL, Register DestinationRegister, Register SourceRegister, bool KillSource, bool RenamableDest=false, bool RenamableSrc=false) const override
MachineInstrBundleIterator< MachineInstr > iterator
Representation of each machine instruction.
MachineOperand class - Representation of each machine instruction operand.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Wrapper class representing virtual and physical registers.
Definition Register.h:19
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:477
static bool isRMOpcode(unsigned Opcode)
static bool isRRMOpcode(unsigned Opcode)
static bool isSPLSOpcode(unsigned Opcode)