LLVM 24.0.0git
llvm::GISelValueTracking Class Reference

#include "llvm/CodeGen/GlobalISel/GISelValueTracking.h"

Inheritance diagram for llvm::GISelValueTracking:
[legend]

Public Member Functions

 GISelValueTracking (MachineFunction &MF, unsigned MaxDepth=6)
 ~GISelValueTracking () override=default
const MachineFunctiongetMachineFunction () const
const DataLayoutgetDataLayout () const
void computeKnownBitsImpl (Register R, KnownBits &Known, const APInt &DemandedElts, unsigned Depth=0)
unsigned computeNumSignBits (Register R, const APInt &DemandedElts, unsigned Depth=0)
unsigned computeNumSignBits (Register R, unsigned Depth=0)
KnownBits getKnownBits (Register R)
KnownBits getKnownBits (Register R, const APInt &DemandedElts, unsigned Depth=0)
KnownBits getKnownBits (MachineInstr &MI)
APInt getKnownZeroes (Register R)
APInt getKnownOnes (Register R)
bool maskedValueIsZero (Register Val, const APInt &Mask)
bool signBitIsZero (Register Op)
bool isKnownNeverZero (Register R, unsigned Depth=0)
 Return true if the value defined by R is provably never zero.
bool isKnownNeverZero (Register R, const APInt &DemandedElts, unsigned Depth=0)
Align computeKnownAlignment (Register R, unsigned Depth=0)
std::optional< ConstantRangegetValidShiftAmountRange (Register R, const APInt &DemandedElts, unsigned Depth)
 If a G_SHL/G_ASHR/G_LSHR node with shift operand R has shift amounts that are all less than the element bit-width of the shift node, return the valid constant range.
std::optional< uint64_tgetValidMinimumShiftAmount (Register R, const APInt &DemandedElts, unsigned Depth=0)
 If a G_SHL/G_ASHR/G_LSHR node with shift operand R has shift amounts that are all less than the element bit-width of the shift node, return the minimum possible value.
KnownFPClass computeKnownFPClass (Register R, const APInt &DemandedElts, FPClassTest InterestedClasses, unsigned Depth)
 Determine which floating-point classes are valid for V, and return them in KnownFPClass bit sets.
KnownFPClass computeKnownFPClass (Register R, FPClassTest InterestedClasses=fcAllFlags, unsigned Depth=0)
KnownFPClass computeKnownFPClass (Register R, const APInt &DemandedElts, uint32_t Flags, FPClassTest InterestedClasses, unsigned Depth)
 Wrapper to account for known fast math flags at the use instruction.
KnownFPClass computeKnownFPClass (Register R, uint32_t Flags, FPClassTest InterestedClasses, unsigned Depth)
bool isKnownNeverNaN (Register Val, bool SNaN=false)
 Returns true if Val can be assumed to never be a NaN.
bool isKnownNeverSNaN (Register Val)
 Returns true if Val can be assumed to never be a signaling NaN.
void erasingInstr (MachineInstr &MI) override
 An instruction is about to be erased.
void createdInstr (MachineInstr &MI) override
 An instruction has been created and inserted into the function.
void changingInstr (MachineInstr &MI) override
 This instruction is about to be mutated in some way.
void changedInstr (MachineInstr &MI) override
 This instruction was mutated in some way.
Public Member Functions inherited from llvm::GISelChangeObserver
virtual ~GISelChangeObserver ()=default
LLVM_ABI void changingAllUsesOfReg (const MachineRegisterInfo &MRI, Register Reg)
 All the instructions using the given register are being changed.
LLVM_ABI void finishedChangingAllUsesOfReg ()
 All instructions reported as changing by changingAllUsesOfReg() have finished being changed.

Static Public Member Functions

static void computeKnownBitsForAlignment (KnownBits &Known, Align Alignment)

Protected Member Functions

unsigned getMaxDepth () const

Detailed Description

Definition at line 34 of file GISelValueTracking.h.

Constructor & Destructor Documentation

◆ GISelValueTracking()

llvm::GISelValueTracking::GISelValueTracking ( MachineFunction & MF,
unsigned MaxDepth = 6 )

◆ ~GISelValueTracking()

llvm::GISelValueTracking::~GISelValueTracking ( )
overridedefault

Member Function Documentation

◆ changedInstr()

void llvm::GISelValueTracking::changedInstr ( MachineInstr & MI)
inlineoverridevirtual

This instruction was mutated in some way.

Implements llvm::GISelChangeObserver.

Definition at line 167 of file GISelValueTracking.h.

References MI.

◆ changingInstr()

void llvm::GISelValueTracking::changingInstr ( MachineInstr & MI)
inlineoverridevirtual

This instruction is about to be mutated in some way.

Implements llvm::GISelChangeObserver.

Definition at line 166 of file GISelValueTracking.h.

References MI.

◆ computeKnownAlignment()

Align GISelValueTracking::computeKnownAlignment ( Register R,
unsigned Depth = 0 )
Returns
The known alignment for the pointer-like value R.

Definition at line 56 of file GISelValueTracking.cpp.

References computeKnownAlignment(), llvm::Depth, and MI.

Referenced by computeKnownAlignment().

◆ computeKnownBitsForAlignment()

void llvm::GISelValueTracking::computeKnownBitsForAlignment ( KnownBits & Known,
Align Alignment )
inlinestatic

Definition at line 105 of file GISelValueTracking.h.

References llvm::Known, and llvm::Log2().

◆ computeKnownBitsImpl()

void GISelValueTracking::computeKnownBitsImpl ( Register R,
KnownBits & Known,
const APInt & DemandedElts,
unsigned Depth = 0 )

Definition at line 212 of file GISelValueTracking.cpp.

References llvm::KnownBits::abds(), llvm::KnownBits::abdu(), AbstractManglingParser< Derived, Alloc >::NumOps, llvm::KnownBits::add(), llvm::KnownBits::anyext(), llvm::KnownBits::anyextOrTrunc(), llvm::KnownBits::ashr(), assert(), llvm::KnownBits::avgCeilS(), llvm::KnownBits::avgCeilU(), llvm::KnownBits::avgFloorS(), llvm::KnownBits::avgFloorU(), llvm::bit_width(), llvm::BitWidth, llvm::cast(), llvm::APInt::clearBit(), llvm::KnownBits::computeForAddCarry(), llvm::computeKnownBitsFromRangeMetadata(), computeKnownBitsImpl(), computeNumSignBits(), llvm::APInt::countl_zero(), llvm::KnownBits::countMaxLeadingZeros(), llvm::KnownBits::countMaxPopulation(), llvm::KnownBits::countMaxTrailingZeros(), llvm::Depth, llvm::drop_begin(), dumpResult(), llvm::enumerate(), llvm::APInt::extractBits(), llvm::extractBits(), llvm::KnownBits::extractBits(), F, llvm::KnownBits::fshl(), llvm::KnownBits::fshr(), llvm::APInt::getAllOnes(), llvm::APInt::getBitWidth(), llvm::LLT::getElementCount(), llvm::MachineFunction::getFunction(), llvm::getIConstantVRegVal(), llvm::GExtractVectorElement::getIndexReg(), llvm::details::FixedOrScalableQuantity< LeafTy, ValueTy >::getKnownMinValue(), llvm::APInt::getLowBitsSet(), getMachineFunction(), getMaxDepth(), llvm::MachineMemOperand::getMemoryType(), llvm::LLT::getNumElements(), llvm::APInt::getOneBitSet(), llvm::MachineMemOperand::getRanges(), getReg(), llvm::LLT::getScalarSizeInBits(), llvm::LLT::getScalarType(), llvm::getShuffleDemandedElts(), llvm::ConstantRange::getUnsignedMax(), llvm::GExtractVectorElement::getVectorReg(), llvm::getVScaleRange(), I, llvm::isConstantOrConstantSplatVector(), llvm::MachineInstr::IsExact, llvm::LLT::isFixedVector(), llvm::APInt::isPowerOf2(), llvm::LLT::isScalableVector(), llvm::isUIntN(), llvm::LLT::isValid(), llvm::LLT::isVector(), llvm::Register::isVirtual(), llvm::Known, LLVM_DEBUG, llvm::Log2_64(), llvm::APInt::logBase2(), llvm::KnownBits::lshr(), llvm::KnownBits::makeConstant(), MI, llvm::KnownBits::mul(), llvm::KnownBits::mulhs(), llvm::KnownBits::mulhu(), llvm::MachineInstr::NoSWrap, llvm::MachineInstr::NoUWrap, Range, llvm::KnownBits::sadd_sat(), llvm::KnownBits::sdiv(), llvm::KnownBits::setAllZero(), llvm::KnownBits::sext(), llvm::APInt::shl(), llvm::KnownBits::shl(), llvm::KnownBits::smax(), llvm::KnownBits::smin(), llvm::KnownBits::srem(), llvm::KnownBits::ssub_sat(), llvm::KnownBits::sub(), llvm::KnownBits::trunc(), llvm::KnownBits::uadd_sat(), llvm::KnownBits::udiv(), llvm::KnownBits::umax(), llvm::KnownBits::umin(), llvm::APInt::umul_ov(), umul_ov(), llvm::KnownBits::urem(), llvm::KnownBits::usub_sat(), llvm::TargetLoweringBase::ZeroOrOneBooleanContent, llvm::APInt::zext(), llvm::KnownBits::zext(), and llvm::KnownBits::zextOrTrunc().

Referenced by llvm::SITargetLowering::computeKnownBitsForTargetInstr(), computeKnownBitsImpl(), getKnownBits(), and knownBitsForSBFE().

◆ computeKnownFPClass() [1/4]

KnownFPClass GISelValueTracking::computeKnownFPClass ( Register R,
const APInt & DemandedElts,
FPClassTest InterestedClasses,
unsigned Depth )

Determine which floating-point classes are valid for V, and return them in KnownFPClass bit sets.

This function is defined on values with floating-point type, values vectors of floating-point type, and arrays of floating-point type. InterestedClasses is a compile time optimization hint for which floating point classes should be queried. Queries not specified in InterestedClasses should be reliable if they are determined during the query.

Definition at line 2063 of file GISelValueTracking.cpp.

References llvm::Depth.

◆ computeKnownFPClass() [2/4]

KnownFPClass GISelValueTracking::computeKnownFPClass ( Register R,
const APInt & DemandedElts,
uint32_t Flags,
FPClassTest InterestedClasses,
unsigned Depth )

Wrapper to account for known fast math flags at the use instruction.

Definition at line 2078 of file GISelValueTracking.cpp.

References llvm::Depth, llvm::fcInf, llvm::fcNan, llvm::MachineInstr::FmNoInfs, and llvm::MachineInstr::FmNoNans.

◆ computeKnownFPClass() [3/4]

KnownFPClass GISelValueTracking::computeKnownFPClass ( Register R,
FPClassTest InterestedClasses = fcAllFlags,
unsigned Depth = 0 )

Definition at line 2071 of file GISelValueTracking.cpp.

References llvm::Depth, and llvm::Known.

◆ computeKnownFPClass() [4/4]

KnownFPClass GISelValueTracking::computeKnownFPClass ( Register R,
uint32_t Flags,
FPClassTest InterestedClasses,
unsigned Depth )

Definition at line 2096 of file GISelValueTracking.cpp.

References llvm::Depth, and llvm::APInt::getAllOnes().

◆ computeNumSignBits() [1/2]

◆ computeNumSignBits() [2/2]

unsigned GISelValueTracking::computeNumSignBits ( Register R,
unsigned Depth = 0 )

◆ createdInstr()

void llvm::GISelValueTracking::createdInstr ( MachineInstr & MI)
inlineoverridevirtual

An instruction has been created and inserted into the function.

Note that the instruction might not be a fully fledged instruction at this point and won't be if the MachineFunction::Delegate is calling it. This is because the delegate only sees the construction of the MachineInstr before operands have been added.

Implements llvm::GISelChangeObserver.

Definition at line 165 of file GISelValueTracking.h.

References MI.

◆ erasingInstr()

void llvm::GISelValueTracking::erasingInstr ( MachineInstr & MI)
inlineoverridevirtual

An instruction is about to be erased.

Implements llvm::GISelChangeObserver.

Definition at line 164 of file GISelValueTracking.h.

References MI.

◆ getDataLayout()

const DataLayout & llvm::GISelValueTracking::getDataLayout ( ) const
inline

Definition at line 65 of file GISelValueTracking.h.

Referenced by computeNumSignBits().

◆ getKnownBits() [1/3]

KnownBits GISelValueTracking::getKnownBits ( MachineInstr & MI)

Definition at line 78 of file GISelValueTracking.cpp.

References assert(), getKnownBits(), and MI.

◆ getKnownBits() [2/3]

◆ getKnownBits() [3/3]

KnownBits GISelValueTracking::getKnownBits ( Register R,
const APInt & DemandedElts,
unsigned Depth = 0 )

Definition at line 94 of file GISelValueTracking.cpp.

References computeKnownBitsImpl(), llvm::Depth, and llvm::Known.

◆ getKnownOnes()

APInt GISelValueTracking::getKnownOnes ( Register R)

Definition at line 164 of file GISelValueTracking.cpp.

References getKnownBits(), and llvm::KnownBits::One.

◆ getKnownZeroes()

APInt GISelValueTracking::getKnownZeroes ( Register R)

Definition at line 160 of file GISelValueTracking.cpp.

References getKnownBits(), and llvm::KnownBits::Zero.

◆ getMachineFunction()

const MachineFunction & llvm::GISelValueTracking::getMachineFunction ( ) const
inline

◆ getMaxDepth()

unsigned llvm::GISelValueTracking::getMaxDepth ( ) const
inlineprotected

◆ getValidMinimumShiftAmount()

std::optional< uint64_t > GISelValueTracking::getValidMinimumShiftAmount ( Register R,
const APInt & DemandedElts,
unsigned Depth = 0 )

If a G_SHL/G_ASHR/G_LSHR node with shift operand R has shift amounts that are all less than the element bit-width of the shift node, return the minimum possible value.

Definition at line 2662 of file GISelValueTracking.cpp.

References llvm::Depth, and getValidShiftAmountRange().

Referenced by computeNumSignBits().

◆ getValidShiftAmountRange()

std::optional< ConstantRange > GISelValueTracking::getValidShiftAmountRange ( Register R,
const APInt & DemandedElts,
unsigned Depth )

If a G_SHL/G_ASHR/G_LSHR node with shift operand R has shift amounts that are all less than the element bit-width of the shift node, return the valid constant range.

Definition at line 2612 of file GISelValueTracking.cpp.

References assert(), llvm::BitWidth, llvm::Depth, llvm::ConstantRange::fromKnownBits(), getKnownBits(), llvm::KnownBits::getMaxValue(), I, MI, llvm::APInt::uge(), llvm::APInt::ugt(), and llvm::APInt::ult().

Referenced by computeNumSignBits(), and getValidMinimumShiftAmount().

◆ isKnownNeverNaN()

bool GISelValueTracking::isKnownNeverNaN ( Register Val,
bool SNaN = false )

Returns true if Val can be assumed to never be a NaN.

If SNaN is true, this returns whether Val can be assumed to never be a signaling NaN.

Definition at line 2104 of file GISelValueTracking.cpp.

References DefMI, llvm::fcNan, llvm::fcSNan, llvm::MachineInstr::FmNoNans, llvm::KnownFPClass::isKnownNever(), and llvm::KnownFPClass::isKnownNeverNaN().

Referenced by isKnownNeverSNaN().

◆ isKnownNeverSNaN()

bool llvm::GISelValueTracking::isKnownNeverSNaN ( Register Val)
inline

Returns true if Val can be assumed to never be a signaling NaN.

Definition at line 161 of file GISelValueTracking.h.

References isKnownNeverNaN().

◆ isKnownNeverZero() [1/2]

◆ isKnownNeverZero() [2/2]

bool GISelValueTracking::isKnownNeverZero ( Register R,
unsigned Depth = 0 )

Return true if the value defined by R is provably never zero.

DemandedElts selects the vector elements that must be proven nonzero. For scalar values this is a one-bit mask. The overload without DemandedElts demands every fixed-vector element, or the scalar value to be non-zero.

Definition at line 108 of file GISelValueTracking.cpp.

References llvm::Depth, llvm::APInt::getAllOnes(), and isKnownNeverZero().

Referenced by isKnownNeverZero(), and isKnownNeverZero().

◆ maskedValueIsZero()

bool llvm::GISelValueTracking::maskedValueIsZero ( Register Val,
const APInt & Mask )
inline
Returns
true if 'V & Mask' is known to be zero in DemandedElts. We use this predicate to simplify operations downstream. Mask is known to be zero for bits that V cannot have.

Definition at line 87 of file GISelValueTracking.h.

References getKnownBits().

Referenced by llvm::AMDGPU::getBaseWithConstantOffset(), and signBitIsZero().

◆ signBitIsZero()

bool GISelValueTracking::signBitIsZero ( Register Op)
Returns
true if the sign bit of Op is known to be zero. We use this predicate to simplify operations downstream.

Definition at line 102 of file GISelValueTracking.cpp.

References llvm::BitWidth, llvm::APInt::getSignMask(), and maskedValueIsZero().


The documentation for this class was generated from the following files: