mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-30 16:34:03 +00:00
34ef4cd65b
Ordinarily (shl (add x, c1), c2) -> (add (shl x, c2), c1 << c2) is only done if the add has one use. If the resulting constant add can be folded into an addressing mode, force this to happen for the pointer operand. This ends up happening a lot because of how LDS objects are allocated. Since the globals are allocated next to each other, acessing the first element of the second object is directly indexed by a shifted pointer. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@215739 91177308-0d34-0410-b5e6-96231b3b80d8
110 lines
4.8 KiB
C++
110 lines
4.8 KiB
C++
//===-- SIISelLowering.h - SI DAG Lowering Interface ------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
/// \file
|
|
/// \brief SI DAG Lowering interface definition
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_LIB_TARGET_R600_SIISELLOWERING_H
|
|
#define LLVM_LIB_TARGET_R600_SIISELLOWERING_H
|
|
|
|
#include "AMDGPUISelLowering.h"
|
|
#include "SIInstrInfo.h"
|
|
|
|
namespace llvm {
|
|
|
|
class SITargetLowering : public AMDGPUTargetLowering {
|
|
SDValue LowerParameter(SelectionDAG &DAG, EVT VT, EVT MemVT, SDLoc DL,
|
|
SDValue Chain, unsigned Offset, bool Signed) const;
|
|
SDValue LowerSampleIntrinsic(unsigned Opcode, const SDValue &Op,
|
|
SelectionDAG &DAG) const;
|
|
SDValue LowerGlobalAddress(AMDGPUMachineFunction *MFI, SDValue Op,
|
|
SelectionDAG &DAG) const override;
|
|
|
|
SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
|
|
SDValue LowerINTRINSIC_VOID(SDValue Op, SelectionDAG &DAG) const;
|
|
SDValue LowerFrameIndex(SDValue Op, SelectionDAG &DAG) const;
|
|
SDValue LowerLOAD(SDValue Op, SelectionDAG &DAG) const;
|
|
SDValue LowerSELECT(SDValue Op, SelectionDAG &DAG) const;
|
|
SDValue LowerFastFDIV(SDValue Op, SelectionDAG &DAG) const;
|
|
SDValue LowerFDIV32(SDValue Op, SelectionDAG &DAG) const;
|
|
SDValue LowerFDIV64(SDValue Op, SelectionDAG &DAG) const;
|
|
SDValue LowerFDIV(SDValue Op, SelectionDAG &DAG) const;
|
|
SDValue LowerSTORE(SDValue Op, SelectionDAG &DAG) const;
|
|
SDValue LowerTrig(SDValue Op, SelectionDAG &DAG) const;
|
|
SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
|
|
|
|
bool foldImm(SDValue &Operand, int32_t &Immediate,
|
|
bool &ScalarSlotUsed) const;
|
|
const TargetRegisterClass *getRegClassForNode(SelectionDAG &DAG,
|
|
const SDValue &Op) const;
|
|
bool fitsRegClass(SelectionDAG &DAG, const SDValue &Op,
|
|
unsigned RegClass) const;
|
|
void ensureSRegLimit(SelectionDAG &DAG, SDValue &Operand,
|
|
unsigned RegClass, bool &ScalarSlotUsed) const;
|
|
|
|
SDNode *foldOperands(MachineSDNode *N, SelectionDAG &DAG) const;
|
|
void adjustWritemask(MachineSDNode *&N, SelectionDAG &DAG) const;
|
|
MachineSDNode *AdjustRegClass(MachineSDNode *N, SelectionDAG &DAG) const;
|
|
|
|
static SDValue performUCharToFloatCombine(SDNode *N,
|
|
DAGCombinerInfo &DCI);
|
|
SDValue performSHLPtrCombine(SDNode *N,
|
|
unsigned AS,
|
|
DAGCombinerInfo &DCI) const;
|
|
|
|
public:
|
|
SITargetLowering(TargetMachine &tm);
|
|
|
|
bool isLegalAddressingMode(const AddrMode &AM,
|
|
Type *Ty) const override;
|
|
|
|
bool allowsMisalignedMemoryAccesses(EVT VT, unsigned AS,
|
|
unsigned Align,
|
|
bool *IsFast) const override;
|
|
|
|
EVT getOptimalMemOpType(uint64_t Size, unsigned DstAlign,
|
|
unsigned SrcAlign, bool IsMemset,
|
|
bool ZeroMemset,
|
|
bool MemcpyStrSrc,
|
|
MachineFunction &MF) const override;
|
|
|
|
TargetLoweringBase::LegalizeTypeAction
|
|
getPreferredVectorAction(EVT VT) const override;
|
|
|
|
bool shouldConvertConstantLoadToIntImm(const APInt &Imm,
|
|
Type *Ty) const override;
|
|
|
|
SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
|
|
bool isVarArg,
|
|
const SmallVectorImpl<ISD::InputArg> &Ins,
|
|
SDLoc DL, SelectionDAG &DAG,
|
|
SmallVectorImpl<SDValue> &InVals) const override;
|
|
|
|
MachineBasicBlock * EmitInstrWithCustomInserter(MachineInstr * MI,
|
|
MachineBasicBlock * BB) const override;
|
|
EVT getSetCCResultType(LLVMContext &Context, EVT VT) const override;
|
|
MVT getScalarShiftAmountTy(EVT VT) const override;
|
|
bool isFMAFasterThanFMulAndFAdd(EVT VT) const override;
|
|
SDValue LowerOperation(SDValue Op, SelectionDAG &DAG) const override;
|
|
SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
|
|
SDNode *PostISelFolding(MachineSDNode *N, SelectionDAG &DAG) const override;
|
|
void AdjustInstrPostInstrSelection(MachineInstr *MI,
|
|
SDNode *Node) const override;
|
|
|
|
int32_t analyzeImmediate(const SDNode *N) const;
|
|
SDValue CreateLiveInRegister(SelectionDAG &DAG, const TargetRegisterClass *RC,
|
|
unsigned Reg, EVT VT) const override;
|
|
};
|
|
|
|
} // End namespace llvm
|
|
|
|
#endif
|