LLVM: lib/CodeGen/ComplexDeinterleavingPass.cpp File Reference (original) (raw)

Go to the source code of this file.

Macros
#define DEBUG_TYPE "complex-deinterleaving"
Functions
STATISTIC (NumComplexTransformations, "Amount of complex patterns transformed")
static bool isInterleavingMask (ArrayRef< int > Mask)
Checks the given mask, and determines whether said mask is interleaving.
static bool isDeinterleavingMask (ArrayRef< int > Mask)
Checks the given mask, and determines whether said mask is deinterleaving.
static bool isNeg (Value *V)
Returns true if the operation is a negation of V, and it works for both integers and floats.
static Value * getNegOperand (Value *V)
Returns the operand for negation operation.
INITIALIZE_PASS_BEGIN (ComplexDeinterleavingLegacyPass, DEBUG_TYPE, "Complex Deinterleaving", false, false) INITIALIZE_PASS_END(ComplexDeinterleavingLegacyPass
static bool isInstructionPairAdd (Instruction *A, Instruction *B)
static bool isInstructionPairMul (Instruction *A, Instruction *B)
static bool isInstructionPotentiallySymmetric (Instruction *I)
static Value * replaceSymmetricNode (IRBuilderBase &B, unsigned Opcode, std::optional< FastMathFlags > Flags, Value *InputA, Value *InputB)

DEBUG_TYPE

#define DEBUG_TYPE "complex-deinterleaving"

ComplexValues

getNegOperand()

INITIALIZE_PASS_BEGIN()

INITIALIZE_PASS_BEGIN ( ComplexDeinterleavingLegacyPass ,
DEBUG_TYPE ,
"Complex Deinterleaving" ,
false ,
false )

isDeinterleavingMask()

Checks the given mask, and determines whether said mask is deinterleaving.

To be deinterleaving, a mask must increment in steps of 2, and either start with 0 or 1. (e.g. an 8x vector deinterleaving mask would be either <0, 2, 4, 6> or <1, 3, 5, 7>).

Definition at line 600 of file ComplexDeinterleavingPass.cpp.

References llvm::Offset.

isInstructionPairAdd()

isInstructionPairMul()

isInstructionPotentiallySymmetric()

isInterleavingMask()

Checks the given mask, and determines whether said mask is interleaving.

To be interleaving, a mask must alternate between i and i + (Length / / 2), and must contain all numbers within the range of [0..Length) (e.g. a 4x vector interleaving mask would be <0, 2, 1, 3>).

Definition at line 585 of file ComplexDeinterleavingPass.cpp.

isNeg()

Returns true if the operation is a negation of V, and it works for both integers and floats.

Definition at line 612 of file ComplexDeinterleavingPass.cpp.

References llvm::PatternMatch::m_FNeg(), llvm::MIPatternMatch::m_Neg(), llvm::PatternMatch::m_Value(), and llvm::PatternMatch::match().

Referenced by DecodeBFLabelOperand(), expandMOVImmSimple(), getNegOperand(), KnuthDiv(), llvm::APIntOps::RoundDoubleToAPInt(), llvm::APInt::roundToDouble(), and llvm::utostr().

replaceSymmetricNode()

STATISTIC()

STATISTIC ( NumComplexTransformations ,
"Amount of complex patterns transformed" )

ComplexDeinterleavingEnabled

cl::opt< bool > ComplexDeinterleavingEnabled("enable-complex-deinterleaving", cl::desc("Enable generation of complex instructions"), cl::init(true), cl::Hidden) ( "enable-complex-deinterleaving" , cl::desc("Enable generation of complex instructions") , cl::init(true) , cl::Hidden ) static

DEBUG_TYPE

Deinterleaving

false