LLVM 22.0.0git
ComplexDeinterleavingPass.cpp File Reference

Go to the source code of this file.

Classes

struct  llvm::DenseMapInfo< ComplexValue >

Namespaces

namespace  llvm
 This is an optimization pass for GlobalISel generic memory operations.

Macros

#define DEBUG_TYPE   "complex-deinterleaving"

Typedefs

typedef SmallVector< struct ComplexValue, 2 > ComplexValues

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 ValuegetNegOperand (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 ValuereplaceSymmetricNode (IRBuilderBase &B, unsigned Opcode, std::optional< FastMathFlags > Flags, Value *InputA, Value *InputB)

Variables

static cl::opt< boolComplexDeinterleavingEnabled ("enable-complex-deinterleaving", cl::desc("Enable generation of complex instructions"), cl::init(true), cl::Hidden)
 DEBUG_TYPE
Complex Deinterleaving
Complex false

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "complex-deinterleaving"

Definition at line 82 of file ComplexDeinterleavingPass.cpp.

Typedef Documentation

◆ ComplexValues

typedef SmallVector<struct ComplexValue, 2> ComplexValues

Definition at line 127 of file ComplexDeinterleavingPass.cpp.

Function Documentation

◆ getNegOperand()

Value * getNegOperand ( Value * V)
static

Returns the operand for negation operation.

Definition at line 618 of file ComplexDeinterleavingPass.cpp.

References assert(), llvm::cast(), I, and isNeg().

◆ INITIALIZE_PASS_BEGIN()

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

References DEBUG_TYPE.

◆ isDeinterleavingMask()

bool isDeinterleavingMask ( ArrayRef< int > Mask)
static

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 602 of file ComplexDeinterleavingPass.cpp.

References llvm::Offset.

◆ isInstructionPairAdd()

bool isInstructionPairAdd ( Instruction * A,
Instruction * B )
static

Definition at line 918 of file ComplexDeinterleavingPass.cpp.

References A(), and B().

◆ isInstructionPairMul()

◆ isInstructionPotentiallySymmetric()

bool isInstructionPotentiallySymmetric ( Instruction * I)
static

Definition at line 935 of file ComplexDeinterleavingPass.cpp.

References I.

◆ isInterleavingMask()

bool isInterleavingMask ( ArrayRef< int > Mask)
static

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 587 of file ComplexDeinterleavingPass.cpp.

◆ isNeg()

bool isNeg ( Value * V)
static

◆ replaceSymmetricNode()

Value * replaceSymmetricNode ( IRBuilderBase & B,
unsigned Opcode,
std::optional< FastMathFlags > Flags,
Value * InputA,
Value * InputB )
static

Definition at line 2283 of file ComplexDeinterleavingPass.cpp.

References B(), llvm::cast(), I, and llvm_unreachable.

◆ STATISTIC()

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

Variable Documentation

◆ 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

DEBUG_TYPE

Definition at line 533 of file ComplexDeinterleavingPass.cpp.

◆ Deinterleaving

Complex Deinterleaving

Definition at line 534 of file ComplexDeinterleavingPass.cpp.

◆ false

Complex false

Definition at line 534 of file ComplexDeinterleavingPass.cpp.