LLVM  14.0.0git
Macros | Functions | Variables
CombinerHelper.cpp File Reference
#include "llvm/CodeGen/GlobalISel/CombinerHelper.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallBitVector.h"
#include "llvm/CodeGen/GlobalISel/Combiner.h"
#include "llvm/CodeGen/GlobalISel/GISelChangeObserver.h"
#include "llvm/CodeGen/GlobalISel/GISelKnownBits.h"
#include "llvm/CodeGen/GlobalISel/GenericMachineInstrs.h"
#include "llvm/CodeGen/GlobalISel/LegalizerHelper.h"
#include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
#include "llvm/CodeGen/GlobalISel/MIPatternMatch.h"
#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
#include "llvm/CodeGen/GlobalISel/RegisterBankInfo.h"
#include "llvm/CodeGen/GlobalISel/Utils.h"
#include "llvm/CodeGen/LowLevelType.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineDominators.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/CodeGen/MachineMemOperand.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/TargetInstrInfo.h"
#include "llvm/CodeGen/TargetLowering.h"
#include "llvm/CodeGen/TargetOpcodes.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/MathExtras.h"
#include <tuple>
Include dependency graph for CombinerHelper.cpp:

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "gi-combiner"
 

Functions

static unsigned littleEndianByteAt (const unsigned ByteWidth, const unsigned I)
 
static unsigned bigEndianByteAt (const unsigned ByteWidth, const unsigned I)
 
static Optional< bool > isBigEndian (const SmallDenseMap< int64_t, int64_t, 8 > &MemOffset2Idx, int64_t LowestIdx)
 Given a map from byte offsets in memory to indices in a load/store, determine if that map corresponds to a little or big endian byte pattern. More...
 
static TypegetTypeForLLT (LLT Ty, LLVMContext &C)
 
static Optional< APFloatconstantFoldFpUnary (unsigned Opcode, LLT DstTy, const Register Op, const MachineRegisterInfo &MRI)
 
static Register peekThroughBitcast (Register Reg, const MachineRegisterInfo &MRI)
 
static bool isConstValidTrue (const TargetLowering &TLI, unsigned ScalarSizeBits, int64_t Cst, bool IsVector, bool IsFP)
 
static Optional< std::pair< GZExtLoad *, int64_t > > matchLoadAndBytePosition (Register Reg, unsigned MemSizeInBits, const MachineRegisterInfo &MRI)
 Helper function for findLoadOffsetsForLoadOrCombine. More...
 
static Optional< int64_t > getTruncStoreByteOffset (GStore &Store, Register &SrcVal, MachineRegisterInfo &MRI)
 Check if the store Store is a truncstore that can be merged. More...
 

Variables

static cl::opt< bool > ForceLegalIndexing ("force-legal-indexing", cl::Hidden, cl::init(false), cl::desc("Force all indexed operations to be " "legal for the GlobalISel combiner"))
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "gi-combiner"

Definition at line 36 of file CombinerHelper.cpp.

Function Documentation

◆ bigEndianByteAt()

static unsigned bigEndianByteAt ( const unsigned  ByteWidth,
const unsigned  I 
)
static
Returns
The big endian in-memory byte position of byte I in a ByteWidth bytes wide type.

E.g. Given a 4-byte type x, x[0] -> byte 3

Definition at line 75 of file CombinerHelper.cpp.

References assert(), and I.

Referenced by isBigEndian(), and llvm::CombinerHelper::matchLoadOrCombine().

◆ constantFoldFpUnary()

static Optional<APFloat> constantFoldFpUnary ( unsigned  Opcode,
LLT  DstTy,
const Register  Op,
const MachineRegisterInfo MRI 
)
static

◆ getTruncStoreByteOffset()

static Optional<int64_t> getTruncStoreByteOffset ( GStore Store,
Register SrcVal,
MachineRegisterInfo MRI 
)
static

Check if the store Store is a truncstore that can be merged.

That is, it's a store of a shifted value of SrcVal. If SrcVal is an empty Register then it does not need to match and SrcVal is set to the source value found. On match, returns the start byte offset of the SrcVal that is being stored.

Definition at line 3347 of file CombinerHelper.cpp.

References llvm::MachineRegisterInfo::getType(), llvm::Register::isValid(), llvm::MIPatternMatch::m_any_of(), llvm::MIPatternMatch::m_GAShr(), llvm::MIPatternMatch::m_GLShr(), llvm::MIPatternMatch::m_GTrunc(), llvm::MIPatternMatch::m_ICst(), llvm::MIPatternMatch::m_Reg(), llvm::MIPatternMatch::mi_match(), MRI, llvm::None, Offset, and llvm::SPII::Store.

Referenced by llvm::CombinerHelper::matchTruncStoreMerge().

◆ getTypeForLLT()

static Type* getTypeForLLT ( LLT  Ty,
LLVMContext C 
)
static

◆ isBigEndian()

static Optional<bool> isBigEndian ( const SmallDenseMap< int64_t, int64_t, 8 > &  MemOffset2Idx,
int64_t  LowestIdx 
)
static

Given a map from byte offsets in memory to indices in a load/store, determine if that map corresponds to a little or big endian byte pattern.

Parameters
MemOffset2Idxmaps memory offsets to address offsets.
LowestIdxis the lowest index in MemOffset2Idx.
Returns
true if the map corresponds to a big endian byte pattern, false if it corresponds to a little endian byte pattern, and None otherwise.

E.g. given a 32-bit type x, and x[AddrOffset], the in-memory byte patterns are as follows:

AddrOffset Little endian Big endian 0 0 3 1 1 2 2 2 1 3 3 0

Definition at line 98 of file CombinerHelper.cpp.

References assert(), bigEndianByteAt(), llvm::DenseMapBase< SmallDenseMap< KeyT, ValueT, 4, DenseMapInfo< KeyT >, llvm::detail::DenseMapPair< KeyT, ValueT > >, KeyT, ValueT, DenseMapInfo< KeyT >, llvm::detail::DenseMapPair< KeyT, ValueT > >::end(), llvm::DenseMapBase< SmallDenseMap< KeyT, ValueT, 4, DenseMapInfo< KeyT >, llvm::detail::DenseMapPair< KeyT, ValueT > >, KeyT, ValueT, DenseMapInfo< KeyT >, llvm::detail::DenseMapPair< KeyT, ValueT > >::find(), littleEndianByteAt(), llvm::None, and llvm::DenseMapBase< SmallDenseMap< KeyT, ValueT, 4, DenseMapInfo< KeyT >, llvm::detail::DenseMapPair< KeyT, ValueT > >, KeyT, ValueT, DenseMapInfo< KeyT >, llvm::detail::DenseMapPair< KeyT, ValueT > >::size().

Referenced by collectInsertionElements(), createGPRPairNode(), llvm::SelectionDAG::getConstant(), llvm::CombinerHelper::matchLoadOrCombine(), PerformSTORECombine(), ReplaceCMP_SWAP_64Results(), and llvm::orc::OrcMips32_Base::writeResolverCode().

◆ isConstValidTrue()

static bool isConstValidTrue ( const TargetLowering TLI,
unsigned  ScalarSizeBits,
int64_t  Cst,
bool  IsVector,
bool  IsFP 
)
static

Definition at line 2794 of file CombinerHelper.cpp.

References llvm::isConstTrueVal().

Referenced by llvm::CombinerHelper::matchNotCmp().

◆ littleEndianByteAt()

static unsigned littleEndianByteAt ( const unsigned  ByteWidth,
const unsigned  I 
)
static
Returns
The little endian in-memory byte position of byte I in a ByteWidth bytes wide type.

E.g. Given a 4-byte type x, x[0] -> byte 0

Definition at line 66 of file CombinerHelper.cpp.

References assert(), and I.

Referenced by isBigEndian(), and llvm::CombinerHelper::matchLoadOrCombine().

◆ matchLoadAndBytePosition()

static Optional<std::pair<GZExtLoad *, int64_t> > matchLoadAndBytePosition ( Register  Reg,
unsigned  MemSizeInBits,
const MachineRegisterInfo MRI 
)
static

Helper function for findLoadOffsetsForLoadOrCombine.

Check if Reg is the result of loading a MemSizeInBits wide value, and then moving that value into a specific byte offset.

e.g. x[i] << 24

Returns
The load instruction and the byte offset it is moved into.

Definition at line 3068 of file CombinerHelper.cpp.

References assert(), llvm::MachineRegisterInfo::hasOneNonDBGUse(), llvm::SPII::Load, llvm::MIPatternMatch::m_GShl(), llvm::MIPatternMatch::m_ICst(), llvm::MIPatternMatch::m_OneNonDBGUse(), llvm::MIPatternMatch::m_Reg(), llvm::MIPatternMatch::mi_match(), MRI, llvm::None, Reg, and Shift.

◆ peekThroughBitcast()

static Register peekThroughBitcast ( Register  Reg,
const MachineRegisterInfo MRI 
)
static

Variable Documentation

◆ ForceLegalIndexing

cl::opt<bool> ForceLegalIndexing("force-legal-indexing", cl::Hidden, cl::init(false), cl::desc("Force all indexed operations to be " "legal for the GlobalISel combiner"))
static