LLVM API Documentation

Defines | Enumerations | Functions
InstCombineAndOrXor.cpp File Reference
#include "InstCombineInternal.h"
#include "llvm/Analysis/InstructionSimplify.h"
#include "llvm/IR/ConstantRange.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/PatternMatch.h"
#include "llvm/Transforms/Utils/CmpInstAnalysis.h"
Include dependency graph for InstCombineAndOrXor.cpp:

Go to the source code of this file.


#define DEBUG_TYPE   "instcombine"


enum  MaskedICmpType {
  FoldMskICmp_AMask_AllOnes = 1, FoldMskICmp_AMask_NotAllOnes = 2, FoldMskICmp_BMask_AllOnes = 4, FoldMskICmp_BMask_NotAllOnes = 8,
  FoldMskICmp_Mask_AllZeroes = 16, FoldMskICmp_Mask_NotAllZeroes = 32, FoldMskICmp_AMask_Mixed = 64, FoldMskICmp_AMask_NotMixed = 128,
  FoldMskICmp_BMask_Mixed = 256, FoldMskICmp_BMask_NotMixed = 512


static bool isFreeToInvert (Value *V)
static Valuedyn_castNotVal (Value *V)
static unsigned getFCmpCode (FCmpInst::Predicate CC, bool &isOrdered)
static ValuegetNewICmpValue (bool Sign, unsigned Code, Value *LHS, Value *RHS, InstCombiner::BuilderTy *Builder)
static ValuegetFCmpValue (bool isordered, unsigned code, Value *LHS, Value *RHS, InstCombiner::BuilderTy *Builder)
static bool isRunOfOnes (ConstantInt *Val, uint32_t &MB, uint32_t &ME)
static unsigned getTypeOfMaskedICmp (Value *A, Value *B, Value *C, ICmpInst::Predicate SCC)
static unsigned conjugateICmpMask (unsigned Mask)
static bool decomposeBitTestICmp (const ICmpInst *I, ICmpInst::Predicate &Pred, Value *&X, Value *&Y, Value *&Z)
static unsigned foldLogOpOfMaskedICmpsHelper (Value *&A, Value *&B, Value *&C, Value *&D, Value *&E, ICmpInst *LHS, ICmpInst *RHS, ICmpInst::Predicate &LHSCC, ICmpInst::Predicate &RHSCC)
static ValuefoldLogOpOfMaskedICmps (ICmpInst *LHS, ICmpInst *RHS, bool IsAnd, llvm::InstCombiner::BuilderTy *Builder)
static bool CollectBSwapParts (Value *V, int OverallLeftShift, uint32_t ByteMask, SmallVectorImpl< Value * > &ByteValues)
static InstructionMatchSelectFromAndOr (Value *A, Value *B, Value *C, Value *D)

Define Documentation

#define DEBUG_TYPE   "instcombine"

Definition at line 23 of file InstCombineAndOrXor.cpp.

Enumeration Type Documentation

enum for classifying (icmp eq (A & B), C) and (icmp ne (A & B), C) One of A and B is considered the mask, the other the value. This is described as the "AMask" or "BMask" part of the enum. If the enum contains only "Mask", then both A and B can be considered masks. If A is the mask, then it was proven, that (A & C) == C. This is trivial if C == A, or C == 0. If both A and C are constants, this proof is also easy. For the following explanations we assume that A is the mask. The part "AllOnes" declares, that the comparison is true only if (A & B) == A, or all bits of A are set in B. Example: (icmp eq (A & 3), 3) -> FoldMskICmp_AMask_AllOnes The part "AllZeroes" declares, that the comparison is true only if (A & B) == 0, or all bits of A are cleared in B. Example: (icmp eq (A & 3), 0) -> FoldMskICmp_Mask_AllZeroes The part "Mixed" declares, that (A & B) == C and C might or might not contain any number of one bits and zero bits. Example: (icmp eq (A & 3), 1) -> FoldMskICmp_AMask_Mixed The Part "Not" means, that in above descriptions "==" should be replaced by "!=". Example: (icmp ne (A & 3), 3) -> FoldMskICmp_AMask_NotAllOnes If the mask A contains a single bit, then the following is equivalent: (icmp eq (A & B), A) equals (icmp ne (A & B), 0) (icmp ne (A & B), A) equals (icmp eq (A & B), 0)


Definition at line 456 of file InstCombineAndOrXor.cpp.

Function Documentation

static bool CollectBSwapParts ( Value V,
int  OverallLeftShift,
uint32_t  ByteMask,
SmallVectorImpl< Value * > &  ByteValues 
) [static]

CollectBSwapParts - Analyze the specified subexpression and see if it is capable of providing pieces of a bswap. The subexpression provides pieces of a bswap if it is proven that each of the non-zero bytes in the output of the expression came from the corresponding "byte swapped" byte in some other value. For example, if the current subexpression is "(shl i32 %X, 24)" then we know that the expression deposits the low byte of X into the high byte of the bswap result and that all other bytes are zero. This expression is accepted, the high byte of ByteValues is set to X to indicate a correct match.

This function returns true if the match was unsuccessful and false if so. On entry to the function the "OverallLeftShift" is a signed integer value indicating the number of bytes that the subexpression is later shifted. For example, if the expression is later right shifted by 16 bits, the OverallLeftShift value would be -2 on entry. This is used to specify which byte of ByteValues is actually being set.

Similarly, ByteMask is a bitmask where a bit is clear if its corresponding byte is masked to zero by a user. For example, in (X & 255), X will be processed with a bytemask of 1. Because bytemask is 32-bits, this limits this function to working on up to 32-byte (256 bit) values. ByteMask is always in the local (OverallLeftShift) coordinate space.

Definition at line 1552 of file InstCombineAndOrXor.cpp.

References llvm::APIntOps::And(), llvm::countTrailingZeros(), llvm::Instruction::getOpcode(), llvm::User::getOperand(), llvm::Type::getPrimitiveSizeInBits(), llvm::Value::getType(), llvm::Instruction::isLogicalShift(), llvm::isPowerOf2_32(), llvm::APIntOps::Or(), and llvm::SmallVectorTemplateCommon< T, typename >::size().

static unsigned conjugateICmpMask ( unsigned  Mask) [static]

Convert an analysis of a masked ICmp into its equivalent if all boolean operations had the opposite sense. Since each "NotXXX" flag (recording !=) is adjacent to the corresponding normal flag (recording ==), this just involves swapping those bits over.

Definition at line 542 of file InstCombineAndOrXor.cpp.

References FoldMskICmp_AMask_AllOnes, FoldMskICmp_AMask_Mixed, FoldMskICmp_AMask_NotAllOnes, FoldMskICmp_AMask_NotMixed, FoldMskICmp_BMask_AllOnes, FoldMskICmp_BMask_Mixed, FoldMskICmp_BMask_NotAllOnes, FoldMskICmp_BMask_NotMixed, FoldMskICmp_Mask_AllZeroes, and FoldMskICmp_Mask_NotAllZeroes.

Referenced by foldLogOpOfMaskedICmps().

static bool decomposeBitTestICmp ( const ICmpInst I,
ICmpInst::Predicate &  Pred,
Value *&  X,
Value *&  Y,
Value *&  Z 
) [static]
static Value* dyn_castNotVal ( Value V) [inline, static]
static Value* foldLogOpOfMaskedICmps ( ICmpInst LHS,
ICmpInst RHS,
bool  IsAnd,
llvm::InstCombiner::BuilderTy Builder 
) [static]
static unsigned foldLogOpOfMaskedICmpsHelper ( Value *&  A,
Value *&  B,
Value *&  C,
Value *&  D,
Value *&  E,
ICmpInst LHS,
ICmpInst RHS,
ICmpInst::Predicate &  LHSCC,
ICmpInst::Predicate &  RHSCC 
) [static]

foldLogOpOfMaskedICmpsHelper: handle (icmp(A & B) ==/!= C) &/| (icmp(A & D) ==/!= E) return the set of pattern classes (from MaskedICmpType) that both LHS and RHS satisfy

Definition at line 609 of file InstCombineAndOrXor.cpp.

References decomposeBitTestICmp(), llvm::Constant::getAllOnesValue(), llvm::User::getOperand(), llvm::Value::getType(), getTypeOfMaskedICmp(), llvm::ICmpInst::isEquality(), llvm::Type::isIntegerTy(), llvm::Type::isVectorTy(), llvm::PatternMatch::m_And(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), and R2.

Referenced by foldLogOpOfMaskedICmps().

static unsigned getFCmpCode ( FCmpInst::Predicate  CC,
bool isOrdered 
) [static]
static Value* getFCmpValue ( bool  isordered,
unsigned  code,
Value LHS,
Value RHS,
InstCombiner::BuilderTy Builder 
) [static]
static Value* getNewICmpValue ( bool  Sign,
unsigned  Code,
Value LHS,
Value RHS,
InstCombiner::BuilderTy Builder 
) [static]

getNewICmpValue - This is the complement of getICmpCode, which turns an opcode and two operands into either a constant true or false, or a brand new ICmp instruction. The sign is passed in to determine which kind of predicate to use in the new icmp instruction.

Definition at line 89 of file InstCombineAndOrXor.cpp.

References llvm::IRBuilder< preserveNames, T, Inserter >::CreateICmp(), and llvm::getICmpValue().

Referenced by llvm::InstCombiner::FoldAndOfICmps(), llvm::InstCombiner::FoldOrOfICmps(), and llvm::InstCombiner::visitXor().

static unsigned getTypeOfMaskedICmp ( Value A,
Value B,
Value C,
ICmpInst::Predicate  SCC 
) [static]
static bool isFreeToInvert ( Value V) [inline, static]

isFreeToInvert - Return true if the specified value is free to invert (apply ~ to). This happens in cases where the ~ can be eliminated.

Definition at line 27 of file InstCombineAndOrXor.cpp.

References llvm::BinaryOperator::isNot().

Referenced by dyn_castNotVal(), and llvm::InstCombiner::visitXor().

static bool isRunOfOnes ( ConstantInt Val,
uint32_t &  MB,
uint32_t &  ME 
) [static]
static Instruction* MatchSelectFromAndOr ( Value A,
Value B,
Value C,
Value D 
) [static]

MatchSelectFromAndOr - We have an expression of the form (A&C)|(B&D). Check If A is (cond?-1:0) and either B or D is ~(cond?-1,0) or (cond?0,-1), then we can simplify this expression to "cond ? C : D or B".

Definition at line 1686 of file InstCombineAndOrXor.cpp.

References llvm::SelectInst::Create(), llvm::Value::getType(), llvm::Type::isIntegerTy(), llvm::PatternMatch::m_Not(), llvm::PatternMatch::m_SExt(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), and llvm::PatternMatch::match().

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