LLVM  4.0.0
Macros | Typedefs | Functions
InstCombineVectorOps.cpp File Reference
#include "InstCombineInternal.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/Analysis/InstructionSimplify.h"
#include "llvm/Analysis/VectorUtils.h"
#include "llvm/IR/PatternMatch.h"
Include dependency graph for InstCombineVectorOps.cpp:

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "instcombine"
 

Typedefs

typedef std::pair< Value
*, Value * > 
ShuffleOps
 We are building a shuffle to create V, which is a sequence of insertelement, extractelement pairs. More...
 

Functions

static bool cheapToScalarize (Value *V, bool isConstant)
 Return true if the value is cheaper to scalarize than it is to leave as a vector operation. More...
 
static bool collectSingleShuffleElements (Value *V, Value *LHS, Value *RHS, SmallVectorImpl< Constant * > &Mask)
 If V is a shuffle of values that ONLY returns elements from either LHS or RHS, return the shuffle mask and true. More...
 
static void replaceExtractElements (InsertElementInst *InsElt, ExtractElementInst *ExtElt, InstCombiner &IC)
 If we have insertion into a vector that is wider than the vector that we are extracting from, try to widen the source vector to allow a single shufflevector to replace one or more insert/extract pairs. More...
 
static ShuffleOps collectShuffleElements (Value *V, SmallVectorImpl< Constant * > &Mask, Value *PermittedRHS, InstCombiner &IC)
 
static bool isShuffleEquivalentToSelect (ShuffleVectorInst &Shuf)
 
static InstructionfoldInsSequenceIntoBroadcast (InsertElementInst &InsElt)
 
static InstructionfoldConstantInsEltIntoShuffle (InsertElementInst &InsElt)
 insertelt (shufflevector X, CVec, Mask|insertelt X, C1, CIndex1), C, CIndex –> shufflevector X, CVec', Mask' More...
 
static bool CanEvaluateShuffled (Value *V, ArrayRef< int > Mask, unsigned Depth=5)
 Return true if we can evaluate the specified expression tree if the vector elements were shuffled in a different order. More...
 
static ValuebuildNew (Instruction *I, ArrayRef< Value * > NewOps)
 Rebuild a new instruction just like 'I' but with the new operands given. More...
 
static void recognizeIdentityMask (const SmallVectorImpl< int > &Mask, bool &isLHSID, bool &isRHSID)
 
static bool isShuffleExtractingFromLHS (ShuffleVectorInst &SVI, SmallVector< int, 16 > &Mask)
 

Macro Definition Documentation

#define DEBUG_TYPE   "instcombine"

Definition at line 23 of file InstCombineVectorOps.cpp.

Typedef Documentation

typedef std::pair<Value *, Value *> ShuffleOps

We are building a shuffle to create V, which is a sequence of insertelement, extractelement pairs.

If PermittedRHS is set, then we must either use it or not rely on the second vector source. Return a std::pair containing the left and right vectors of the proposed shuffle (or 0), and set the Mask parameter as required.

Note: we intentionally don't try to fold earlier shuffles since they have often been chosen carefully to be efficiently implementable on the target.

Definition at line 456 of file InstCombineVectorOps.cpp.

Function Documentation

static Value* buildNew ( Instruction I,
ArrayRef< Value * >  NewOps 
)
static
static bool CanEvaluateShuffled ( Value V,
ArrayRef< int >  Mask,
unsigned  Depth = 5 
)
static
static bool cheapToScalarize ( Value V,
bool  isConstant 
)
static

Return true if the value is cheaper to scalarize than it is to leave as a vector operation.

isConstant indicates whether we're extracting one known element. If false we're extracting a variable index.

Definition at line 28 of file InstCombineVectorOps.cpp.

References C, llvm::dyn_cast(), llvm::Instruction::getOpcode(), llvm::User::getOperand(), llvm::Value::getType(), llvm::Type::getVectorNumElements(), llvm::Value::hasOneUse(), I, i, and llvm::SPII::Load.

Referenced by llvm::InstCombiner::visitExtractElementInst().

static ShuffleOps collectShuffleElements ( Value V,
SmallVectorImpl< Constant * > &  Mask,
Value PermittedRHS,
InstCombiner IC 
)
static
static bool collectSingleShuffleElements ( Value V,
Value LHS,
Value RHS,
SmallVectorImpl< Constant * > &  Mask 
)
static
static Instruction* foldConstantInsEltIntoShuffle ( InsertElementInst InsElt)
static
static Instruction* foldInsSequenceIntoBroadcast ( InsertElementInst InsElt)
static
static bool isShuffleEquivalentToSelect ( ShuffleVectorInst Shuf)
static
static bool isShuffleExtractingFromLHS ( ShuffleVectorInst SVI,
SmallVector< int, 16 > &  Mask 
)
static
static void recognizeIdentityMask ( const SmallVectorImpl< int > &  Mask,
bool isLHSID,
bool isRHSID 
)
static
static void replaceExtractElements ( InsertElementInst InsElt,
ExtractElementInst ExtElt,
InstCombiner IC 
)
static