
With D134950, targets get notified when a virtual register is created and/or cloned. Targets can do the needful with the delegate callback. AMDGPU propagates the virtual register flags maintained in the target file itself. They are useful to identify a certain type of machine operands while inserting spill stores and reloads. Since RegAllocFast spills the physical register itself, there is no way its virtual register can be mapped back to retrieve the flags. It can be solved by passing the virtual register as an additional argument. This argument has no use when the spill interfaces are called during the greedy allocator or even the PrologEpilogInserter and can pass a null register in such cases. Reviewed By: arsenm Differential Revision: https://reviews.llvm.org/D138656
124 lines
4.5 KiB
C++
124 lines
4.5 KiB
C++
//===-- VEInstrInfo.h - VE Instruction Information --------------*- C++ -*-===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file contains the VE implementation of the TargetInstrInfo class.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_TARGET_VE_VEINSTRINFO_H
|
|
#define LLVM_LIB_TARGET_VE_VEINSTRINFO_H
|
|
|
|
#include "VERegisterInfo.h"
|
|
#include "llvm/CodeGen/TargetInstrInfo.h"
|
|
|
|
#define GET_INSTRINFO_HEADER
|
|
#include "VEGenInstrInfo.inc"
|
|
|
|
namespace llvm {
|
|
|
|
class VESubtarget;
|
|
|
|
/// VEII - This namespace holds all of the Aurora VE target-specific
|
|
/// per-instruction flags. These must match the corresponding definitions in
|
|
/// VEInstrFormats.td.
|
|
namespace VEII {
|
|
enum {
|
|
// Aurora VE Instruction Flags. These flags describe the characteristics of
|
|
// the Aurora VE instructions for vector handling.
|
|
|
|
/// VE_Vector - This instruction is Vector Instruction.
|
|
VE_Vector = 0x1,
|
|
|
|
/// VE_VLInUse - This instruction has a vector register in its operands.
|
|
VE_VLInUse = 0x2,
|
|
|
|
/// VE_VLMask/Shift - This is a bitmask that selects the index number where
|
|
/// an instruction holds vector length informatio (0 to 6, 7 means undef).n
|
|
VE_VLShift = 2,
|
|
VE_VLMask = 0x07 << VE_VLShift,
|
|
};
|
|
|
|
#define HAS_VLINDEX(TSF) ((TSF)&VEII::VE_VLInUse)
|
|
#define GET_VLINDEX(TSF) \
|
|
(HAS_VLINDEX(TSF) ? (int)(((TSF)&VEII::VE_VLMask) >> VEII::VE_VLShift) : -1)
|
|
} // end namespace VEII
|
|
|
|
class VEInstrInfo : public VEGenInstrInfo {
|
|
const VERegisterInfo RI;
|
|
virtual void anchor();
|
|
|
|
public:
|
|
explicit VEInstrInfo(VESubtarget &ST);
|
|
|
|
/// getRegisterInfo - TargetInstrInfo is a superset of MRegister info. As
|
|
/// such, whenever a client has an instance of instruction info, it should
|
|
/// always be able to get register info as well (through this method).
|
|
///
|
|
const VERegisterInfo &getRegisterInfo() const { return RI; }
|
|
|
|
/// Branch Analysis & Modification {
|
|
bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB,
|
|
MachineBasicBlock *&FBB,
|
|
SmallVectorImpl<MachineOperand> &Cond,
|
|
bool AllowModify = false) const override;
|
|
|
|
unsigned removeBranch(MachineBasicBlock &MBB,
|
|
int *BytesRemoved = nullptr) const override;
|
|
|
|
unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
|
|
MachineBasicBlock *FBB, ArrayRef<MachineOperand> Cond,
|
|
const DebugLoc &DL,
|
|
int *BytesAdded = nullptr) const override;
|
|
|
|
bool
|
|
reverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const override;
|
|
/// } Branch Analysis & Modification
|
|
|
|
void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
|
|
const DebugLoc &DL, MCRegister DestReg, MCRegister SrcReg,
|
|
bool KillSrc) const override;
|
|
|
|
/// Stack Spill & Reload {
|
|
unsigned isLoadFromStackSlot(const MachineInstr &MI,
|
|
int &FrameIndex) const override;
|
|
unsigned isStoreToStackSlot(const MachineInstr &MI,
|
|
int &FrameIndex) const override;
|
|
void storeRegToStackSlot(MachineBasicBlock &MBB,
|
|
MachineBasicBlock::iterator MBBI, Register SrcReg,
|
|
bool isKill, int FrameIndex,
|
|
const TargetRegisterClass *RC,
|
|
const TargetRegisterInfo *TRI,
|
|
Register VReg) const override;
|
|
|
|
void loadRegFromStackSlot(MachineBasicBlock &MBB,
|
|
MachineBasicBlock::iterator MBBI, Register DestReg,
|
|
int FrameIndex, const TargetRegisterClass *RC,
|
|
const TargetRegisterInfo *TRI,
|
|
Register VReg) const override;
|
|
/// } Stack Spill & Reload
|
|
|
|
/// Optimization {
|
|
|
|
bool FoldImmediate(MachineInstr &UseMI, MachineInstr &DefMI, Register Reg,
|
|
MachineRegisterInfo *MRI) const override;
|
|
|
|
/// } Optimization
|
|
|
|
Register getGlobalBaseReg(MachineFunction *MF) const;
|
|
|
|
// Lower pseudo instructions after register allocation.
|
|
bool expandPostRAPseudo(MachineInstr &MI) const override;
|
|
|
|
bool expandExtendStackPseudo(MachineInstr &MI) const;
|
|
bool expandGetStackTopPseudo(MachineInstr &MI) const;
|
|
};
|
|
|
|
} // namespace llvm
|
|
|
|
#endif
|