| 
    LLVM 22.0.0git
    
   | 
 
#include "llvm/CodeGen/GlobalISel/CombinerHelper.h"#include "llvm/ADT/APFloat.h"#include "llvm/ADT/STLExtras.h"#include "llvm/ADT/SetVector.h"#include "llvm/ADT/SmallBitVector.h"#include "llvm/Analysis/CmpInstAnalysis.h"#include "llvm/CodeGen/GlobalISel/GISelChangeObserver.h"#include "llvm/CodeGen/GlobalISel/GISelValueTracking.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/Utils.h"#include "llvm/CodeGen/LowLevelTypeUtils.h"#include "llvm/CodeGen/MachineBasicBlock.h"#include "llvm/CodeGen/MachineDominators.h"#include "llvm/CodeGen/MachineInstr.h"#include "llvm/CodeGen/MachineMemOperand.h"#include "llvm/CodeGen/MachineRegisterInfo.h"#include "llvm/CodeGen/Register.h"#include "llvm/CodeGen/RegisterBankInfo.h"#include "llvm/CodeGen/TargetInstrInfo.h"#include "llvm/CodeGen/TargetLowering.h"#include "llvm/CodeGen/TargetOpcodes.h"#include "llvm/IR/ConstantRange.h"#include "llvm/IR/DataLayout.h"#include "llvm/IR/InstrTypes.h"#include "llvm/Support/Casting.h"#include "llvm/Support/DivisionByConstantInfo.h"#include "llvm/Support/ErrorHandling.h"#include "llvm/Support/MathExtras.h"#include "llvm/Target/TargetMachine.h"#include <cmath>#include <optional>#include <tuple>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 Register | buildLogBase2 (Register V, MachineIRBuilder &MIB) | 
| Determines the LogBase2 value for a non-null input value using the transform: LogBase2(V) = (EltBits - 1) - ctlz(V).   | |
| static unsigned | bigEndianByteAt (const unsigned ByteWidth, const unsigned I) | 
| static std::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.   | |
| static unsigned | getExtLoadOpcForExtend (unsigned ExtOpc) | 
| static bool | canFoldInAddressingMode (GLoadStore *MI, const TargetLowering &TLI, MachineRegisterInfo &MRI) | 
| Return true if 'MI' is a load or a store that may be fold it's address operand into the load / store addressing mode.   | |
| static unsigned | getIndexedOpc (unsigned LdStOpc) | 
| static APFloat | constantFoldFpUnary (const MachineInstr &MI, const MachineRegisterInfo &MRI, const APFloat &Val) | 
| static Register | peekThroughBitcast (Register Reg, const MachineRegisterInfo &MRI) | 
| static LLT | getMidVTForTruncRightShiftCombine (LLT ShiftTy, LLT TruncTy) | 
| static bool | isConstValidTrue (const TargetLowering &TLI, unsigned ScalarSizeBits, int64_t Cst, bool IsVector, bool IsFP) | 
| static std::optional< std::pair< GZExtLoad *, int64_t > > | matchLoadAndBytePosition (Register Reg, unsigned MemSizeInBits, const MachineRegisterInfo &MRI) | 
| Helper function for findLoadOffsetsForLoadOrCombine.   | |
| static bool | isContractableFMul (MachineInstr &MI, bool AllowFusionGlobally) | 
Checks if MI is TargetOpcode::G_FMUL and contractable either due to global flags or MachineInstr flags.   | |
| static bool | hasMoreUses (const MachineInstr &MI0, const MachineInstr &MI1, const MachineRegisterInfo &MRI) | 
| static std::optional< unsigned > | getMinUselessShift (KnownBits ValueKB, unsigned Opcode, std::optional< int64_t > &Result) | 
| Return the minimum useless shift amount that results in complete loss of the source value.   | |
| static void | commuteMask (MutableArrayRef< int > Mask, const unsigned NumElems) | 
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")) | 
| static cl::opt< unsigned > | PostIndexUseThreshold ("post-index-use-threshold", cl::Hidden, cl::init(32), cl::desc("Number of uses of a base pointer to check before it is no longer " "considered for post-indexing.")) | 
| #define DEBUG_TYPE "gi-combiner" | 
Definition at line 45 of file CombinerHelper.cpp.
I in a ByteWidth bytes wide type.E.g. Given a 4-byte type x, x[0] -> byte 3
Definition at line 106 of file CombinerHelper.cpp.
Referenced by isBigEndian(), isBigEndian(), and llvm::CombinerHelper::matchLoadOrCombine().
      
  | 
  static | 
Determines the LogBase2 value for a non-null input value using the transform: LogBase2(V) = (EltBits - 1) - ctlz(V).
Definition at line 94 of file CombinerHelper.cpp.
References llvm::sampleprof::Base, llvm::MachineIRBuilder::buildConstant(), llvm::MachineIRBuilder::buildCTLZ(), llvm::MachineIRBuilder::buildSub(), llvm::MachineIRBuilder::getMRI(), llvm::MachineInstrBuilder::getReg(), and MRI.
Referenced by llvm::CombinerHelper::applyUMulHToLShr().
      
  | 
  static | 
Return true if 'MI' is a load or a store that may be fold it's address operand into the load / store addressing mode.
Definition at line 1127 of file CombinerHelper.cpp.
References llvm::TargetLoweringBase::AddrMode::BaseOffs, llvm::getIConstantVRegVal(), llvm::getOpcodeDef(), llvm::getTypeForLLT(), llvm::TargetLoweringBase::AddrMode::HasBaseReg, llvm::TargetLoweringBase::isLegalAddressingMode(), MI, MRI, and llvm::TargetLoweringBase::AddrMode::Scale.
Referenced by shouldCombineToPostInc().
      
  | 
  static | 
Definition at line 8290 of file CombinerHelper.cpp.
References I.
Referenced by llvm::CombinerHelper::matchShuffleDisjointMask().
      
  | 
  static | 
Definition at line 1668 of file CombinerHelper.cpp.
References llvm::getFltSemanticForLLT(), llvm::APFloat::getSemantics(), llvm::APFloatBase::IEEEdouble(), llvm_unreachable, llvm::log2(), MI, MRI, and llvm::APFloatBase::rmNearestTiesToEven.
Referenced by llvm::CombinerHelper::applyCombineConstantFoldFpUnary().
Definition at line 704 of file CombinerHelper.cpp.
References llvm_unreachable.
Referenced by llvm::CombinerHelper::applyCombineExtendingLoads(), and llvm::CombinerHelper::matchCombineExtendingLoads().
Definition at line 1148 of file CombinerHelper.cpp.
References llvm_unreachable.
Referenced by llvm::CombinerHelper::applyCombineIndexedLoadStore().
Definition at line 2674 of file CombinerHelper.cpp.
References llvm::LLT::changeElementSize(), and llvm::LLT::getScalarSizeInBits().
Referenced by llvm::CombinerHelper::matchCombineTruncOfShift().
      
  | 
  static | 
Return the minimum useless shift amount that results in complete loss of the source value.
Return std::nullopt when it cannot determine a value.
Definition at line 7021 of file CombinerHelper.cpp.
References assert(), llvm::KnownBits::countMinLeadingOnes(), llvm::KnownBits::countMinLeadingZeros(), llvm::KnownBits::countMinTrailingZeros(), llvm::KnownBits::getBitWidth(), llvm::KnownBits::isNegative(), and llvm::KnownBits::isNonNegative().
Referenced by llvm::CombinerHelper::matchShiftsTooBig().
      
  | 
  static | 
Definition at line 6118 of file CombinerHelper.cpp.
References llvm::MachineInstr::getOperand(), llvm::MachineOperand::getReg(), and MRI.
Referenced by llvm::CombinerHelper::matchCombineFAddFMAFMulToFMadOrFMA(), llvm::CombinerHelper::matchCombineFAddFMulToFMadOrFMA(), llvm::CombinerHelper::matchCombineFAddFpExtFMulToFMadOrFMA(), llvm::CombinerHelper::matchCombineFAddFpExtFMulToFMadOrFMAAggressive(), and llvm::CombinerHelper::matchCombineFSubFMulToFMadOrFMA().
      
  | 
  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.
| MemOffset2Idx | maps memory offsets to address offsets. | 
| LowestIdx | is the lowest index in MemOffset2Idx. | 
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 129 of file CombinerHelper.cpp.
References assert(), bigEndianByteAt(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::find(), littleEndianByteAt(), and llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::size().
Referenced by llvm::BuildVectorSDNode::BuildVectorSDNode(), collectInsertionElements(), createGPRPairNodei64(), llvm::SelectionDAG::getConstant(), llvm::CombinerHelper::matchLoadOrCombine(), PerformSTORECombine(), llvm::LegalizerHelper::reduceLoadStoreWidth(), ReplaceCMP_SWAP_64Results(), llvm::TargetLowering::scalarizeVectorLoad(), llvm::TargetLowering::scalarizeVectorStore(), llvm::wholeprogramdevirt::VirtualCallTarget::VirtualCallTarget(), and llvm::orc::OrcMips32_Base::writeResolverCode().
      
  | 
  static | 
Definition at line 3459 of file CombinerHelper.cpp.
References llvm::isConstTrueVal().
Referenced by llvm::CombinerHelper::matchNotCmp().
      
  | 
  static | 
Checks if MI is TargetOpcode::G_FMUL and contractable either due to global flags or MachineInstr flags. 
Definition at line 6112 of file CombinerHelper.cpp.
References llvm::MachineInstr::FmContract, and MI.
Referenced by llvm::CombinerHelper::matchCombineFAddFMAFMulToFMadOrFMA(), llvm::CombinerHelper::matchCombineFAddFMulToFMadOrFMA(), llvm::CombinerHelper::matchCombineFAddFpExtFMulToFMadOrFMA(), llvm::CombinerHelper::matchCombineFAddFpExtFMulToFMadOrFMAAggressive(), llvm::CombinerHelper::matchCombineFSubFMulToFMadOrFMA(), llvm::CombinerHelper::matchCombineFSubFNegFMulToFMadOrFMA(), llvm::CombinerHelper::matchCombineFSubFpExtFMulToFMadOrFMA(), and llvm::CombinerHelper::matchCombineFSubFpExtFNegFMulToFMadOrFMA().
I in a ByteWidth bytes wide type.E.g. Given a 4-byte type x, x[0] -> byte 0
Definition at line 87 of file CombinerHelper.cpp.
Referenced by isBigEndian(), isBigEndian(), and llvm::CombinerHelper::matchLoadOrCombine().
      
  | 
  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
Definition at line 3933 of file CombinerHelper.cpp.
References assert(), llvm::getOpcodeDef(), llvm::MIPatternMatch::m_GShl(), llvm::MIPatternMatch::m_ICst(), llvm::MIPatternMatch::m_OneNonDBGUse(), llvm::MIPatternMatch::m_Reg(), llvm::MIPatternMatch::mi_match(), MRI, and Reg.
      
  | 
  static | 
Definition at line 2238 of file CombinerHelper.cpp.
References llvm::MIPatternMatch::m_GBitcast(), llvm::MIPatternMatch::m_Reg(), llvm::MIPatternMatch::mi_match(), MRI, and Reg.
Referenced by llvm::CombinerHelper::matchCombineUnmergeMergeToPlainValues().
      
  | 
  static | 
      
  | 
  static |