LLVM  mainline
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 "llvm/Transforms/Utils/Local.h"
Include dependency graph for InstCombineAndOrXor.cpp:

Go to the source code of this file.

Defines

#define DEBUG_TYPE   "instcombine"

Enumerations

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
}
 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. More...

Functions

static Valuedyn_castNotVal (Value *V)
static unsigned getFCmpCode (FCmpInst::Predicate CC, bool &isOrdered)
 Similar to getICmpCode but for FCmpInst.
static ValuegetNewICmpValue (bool Sign, unsigned Code, Value *LHS, Value *RHS, InstCombiner::BuilderTy *Builder)
 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.
static ValuegetFCmpValue (bool isordered, unsigned code, Value *LHS, Value *RHS, InstCombiner::BuilderTy *Builder)
 This is the complement of getFCmpCode, which turns an opcode and two operands into either a FCmp instruction.
static bool isRunOfOnes (ConstantInt *Val, uint32_t &MB, uint32_t &ME)
 Returns true iff Val consists of one contiguous run of 1s with any number of 0s on either side.
static unsigned getTypeOfMaskedICmp (Value *A, Value *B, Value *C, ICmpInst::Predicate SCC)
 Return the set of pattern classes (from MaskedICmpType) that (icmp SCC (A & B), C) satisfies.
static unsigned conjugateICmpMask (unsigned Mask)
 Convert an analysis of a masked ICmp into its equivalent if all boolean operations had the opposite sense.
static bool decomposeBitTestICmp (const ICmpInst *I, ICmpInst::Predicate &Pred, Value *&X, Value *&Y, Value *&Z)
 Decompose an icmp into the form ((X & Y) pred Z) if possible.
static unsigned foldLogOpOfMaskedICmpsHelper (Value *&A, Value *&B, Value *&C, Value *&D, Value *&E, ICmpInst *LHS, ICmpInst *RHS, ICmpInst::Predicate &LHSCC, ICmpInst::Predicate &RHSCC)
 Handle (icmp(A & B) ==/!= C) &/| (icmp(A & D) ==/!= E) Return the set of pattern classes (from MaskedICmpType) that both LHS and RHS satisfy.
static ValuefoldLogOpOfMaskedICmps (ICmpInst *LHS, ICmpInst *RHS, bool IsAnd, llvm::InstCombiner::BuilderTy *Builder)
 Try to fold (icmp(A & B) ==/!= C) &/| (icmp(A & D) ==/!= E) into a single (icmp(A & X) ==/!= Y).
static InstructionmatchDeMorgansLaws (BinaryOperator &I, InstCombiner::BuilderTy *Builder)
 Match De Morgan's Laws: (~A & ~B) == (~(A | B)) (~A | ~B) == (~(A & B))
static InstructionMatchSelectFromAndOr (Value *A, Value *B, Value *C, Value *D)
 We have an expression of the form (A&C)|(B&D).

Define Documentation

#define DEBUG_TYPE   "instcombine"

Definition at line 24 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)

Enumerator:
FoldMskICmp_AMask_AllOnes 
FoldMskICmp_AMask_NotAllOnes 
FoldMskICmp_BMask_AllOnes 
FoldMskICmp_BMask_NotAllOnes 
FoldMskICmp_Mask_AllZeroes 
FoldMskICmp_Mask_NotAllZeroes 
FoldMskICmp_AMask_Mixed 
FoldMskICmp_AMask_NotMixed 
FoldMskICmp_BMask_Mixed 
FoldMskICmp_BMask_NotMixed 

Definition at line 438 of file InstCombineAndOrXor.cpp.


Function Documentation

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 524 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]
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]

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 72 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 isRunOfOnes ( ConstantInt Val,
uint32_t &  MB,
uint32_t &  ME 
) [static]

Returns true iff Val consists of one contiguous run of 1s with any number of 0s on either side.

The 1s are allowed to wrap from LSB to MSB, so 0x000FFF0, 0x0000FFFF, and 0xFF0000FF are all runs. 0x0F0F0000 is not, since all 1s are not contiguous.

Definition at line 348 of file InstCombineAndOrXor.cpp.

References llvm::APInt::getActiveBits(), llvm::IntegerType::getBitWidth(), llvm::ConstantInt::getType(), llvm::ConstantInt::getValue(), and llvm::APIntOps::isShiftedMask().

static Instruction* matchDeMorgansLaws ( BinaryOperator I,
InstCombiner::BuilderTy Builder 
) [static]
static Instruction* MatchSelectFromAndOr ( Value A,
Value B,
Value C,
Value D 
) [static]

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 1579 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().