LLVM  9.0.0svn
Macros | Functions
InstCombineSelect.cpp File Reference
#include "InstCombineInternal.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Analysis/AssumptionCache.h"
#include "llvm/Analysis/CmpInstAnalysis.h"
#include "llvm/Analysis/InstructionSimplify.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/InstrTypes.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/Operator.h"
#include "llvm/IR/PatternMatch.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/User.h"
#include "llvm/IR/Value.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/KnownBits.h"
#include "llvm/Transforms/InstCombine/InstCombineWorklist.h"
#include <cassert>
#include <utility>
Include dependency graph for InstCombineSelect.cpp:

Go to the source code of this file.


#define DEBUG_TYPE   "instcombine"


static ValuecreateMinMax (InstCombiner::BuilderTy &Builder, SelectPatternFlavor SPF, Value *A, Value *B)
static InstructionfoldSelectBinOpIdentity (SelectInst &Sel, const TargetLibraryInfo &TLI)
 Replace a select operand based on an equality comparison with the identity constant of a binop. More...
static ValuefoldSelectICmpAnd (SelectInst &Sel, ICmpInst *Cmp, InstCombiner::BuilderTy &Builder)
 This folds: select (icmp eq (and X, C1)), TC, FC iff C1 is a power 2 and the difference between TC and FC is a power-of-2. More...
static unsigned getSelectFoldableOperands (BinaryOperator *I)
 We want to turn code that looks like this: C = or A, B D = select cond, C, A into: C = select cond, B, 0 D = or A, C. More...
static APInt getSelectFoldableConstant (BinaryOperator *I)
 For the same transformation as the previous function, return the identity constant that goes into the select. More...
static bool isSelect01 (const APInt &C1I, const APInt &C2I)
static InstructionfoldSelectICmpAndAnd (Type *SelType, const ICmpInst *Cmp, Value *TVal, Value *FVal, InstCombiner::BuilderTy &Builder)
 We want to turn: (select (icmp eq (and X, Y), 0), (and (lshr X, Z), 1), 1) into: zext (icmp ne i32 (and X, (or Y, (shl 1, Z))), 0) Note: Z may be 0 if lshr is missing. More...
static ValuefoldSelectICmpAndOr (const ICmpInst *IC, Value *TrueVal, Value *FalseVal, InstCombiner::BuilderTy &Builder)
 We want to turn: (select (icmp eq (and X, C1), 0), Y, (or Y, C2)) into: (or (shl (and X, C1), C3), Y) iff: C1 and C2 are both powers of 2 where: C3 = Log(C2) - Log(C1) More...
static ValuecanonicalizeSaturatedSubtract (const ICmpInst *ICI, const Value *TrueVal, const Value *FalseVal, InstCombiner::BuilderTy &Builder)
 Transform patterns such as (a > b) ? a - b : 0 into usub.sat(a, b). More...
static ValuecanonicalizeSaturatedAdd (ICmpInst *Cmp, Value *TVal, Value *FVal, InstCombiner::BuilderTy &Builder)

Macro Definition Documentation


#define DEBUG_TYPE   "instcombine"

Definition at line 47 of file InstCombineSelect.cpp.

Function Documentation

◆ canonicalizeSaturatedAdd()

static Value* canonicalizeSaturatedAdd ( ICmpInst Cmp,
Value TVal,
Value FVal,
InstCombiner::BuilderTy Builder 

Definition at line 687 of file InstCombineSelect.cpp.

References llvm::MCID::Add, assert(), B, C, canonicalizeSaturatedSubtract(), llvm::Instruction::clone(), CreateAdd(), llvm::IRBuilder< T, Inserter >::CreateAnd(), llvm::IRBuilderBase::CreateBinaryIntrinsic(), llvm::IRBuilder< T, Inserter >::CreateFNeg(), llvm::IRBuilder< T, Inserter >::CreateICmp(), createMinMax(), llvm::IRBuilder< T, Inserter >::CreateNeg(), llvm::IRBuilder< T, Inserter >::CreateNot(), llvm::IRBuilder< T, Inserter >::CreateOr(), llvm::IRBuilder< T, Inserter >::CreateSelect(), llvm::IRBuilder< T, Inserter >::CreateZExtOrTrunc(), llvm::dyn_cast(), llvm::SelectPatternResult::Flavor, foldSelectICmpAnd(), foldSelectICmpAndAnd(), foldSelectICmpAndOr(), llvm::ConstantInt::get(), llvm::CallBase::getArgOperand(), llvm::SelectInst::getCondition(), llvm::Value::getContext(), llvm::ConstantInt::getFalse(), llvm::SelectInst::getFalseValue(), llvm::Instruction::getFastMathFlags(), llvm::getInverseMinMaxFlavor(), llvm::getMinMaxPred(), llvm::Value::getName(), llvm::Constant::getNullValue(), llvm::Instruction::getOpcode(), llvm::User::getOperand(), llvm::Instruction::getParent(), llvm::CmpInst::getPredicate(), llvm::Type::getScalarSizeInBits(), llvm::Type::getScalarType(), llvm::ConstantExpr::getSExt(), llvm::APInt::getSignedMinValue(), llvm::CmpInst::getSwappedPredicate(), llvm::ConstantInt::getTrue(), llvm::SelectInst::getTrueValue(), llvm::Value::getType(), llvm::ConstantExpr::getZExt(), llvm::Value::hasNUses(), llvm::Value::hasNUsesOrMore(), llvm::Value::hasOneUse(), I, llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, llvm::CmpInst::ICMP_SGT, llvm::CmpInst::ICMP_SLT, llvm::CmpInst::ICMP_UGT, llvm::CmpInst::ICMP_ULT, llvm::IRBuilder< T, Inserter >::Insert(), llvm::ICmpInst::isEquality(), llvm::Type::isFPOrFPVectorTy(), llvm::IsFreeToInvert(), llvm::isKnownNegation(), llvm::SelectPatternResult::isMinOrMax(), llvm::CmpInst::isUnsigned(), llvm::Type::isVectorTy(), llvm::PatternMatch::m_Add(), llvm::PatternMatch::m_AllOnes(), llvm::PatternMatch::m_And(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_c_Add(), llvm::PatternMatch::m_Constant(), llvm::PatternMatch::m_Instruction(), llvm::PatternMatch::m_Neg(), llvm::PatternMatch::m_Not(), llvm::PatternMatch::m_One(), llvm::PatternMatch::m_Power2(), llvm::PatternMatch::m_SExt(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_SpecificInt(), llvm::PatternMatch::m_Trunc(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_Xor(), llvm::PatternMatch::m_Zero(), llvm::PatternMatch::m_ZeroInt(), llvm::PatternMatch::m_ZExt(), llvm::PatternMatch::match(), llvm::matchSelectPattern(), llvm::Instruction::moveBefore(), llvm::User::replaceUsesOfWith(), llvm::CallBase::setArgOperand(), llvm::SelectInst::setCondition(), llvm::SelectInst::setFalseValue(), llvm::Instruction::setFastMathFlags(), llvm::User::setOperand(), llvm::CmpInst::setPredicate(), llvm::SelectInst::setTrueValue(), llvm::APInt::sge(), llvm::APInt::sgt(), SI, llvm::APInt::sle(), llvm::APInt::slt(), llvm::SPF_ABS, llvm::SPF_NABS, llvm::SPF_SMAX, llvm::SPF_SMIN, llvm::SPF_UMAX, llvm::SPF_UMIN, std::swap(), llvm::Instruction::swapProfMetadata(), llvm::APInt::uge(), llvm::APInt::ugt(), llvm::APInt::ule(), llvm::APInt::ult(), X, and Y.

◆ canonicalizeSaturatedSubtract()

static Value* canonicalizeSaturatedSubtract ( const ICmpInst ICI,
const Value TrueVal,
const Value FalseVal,
InstCombiner::BuilderTy Builder 

◆ createMinMax()

static Value* createMinMax ( InstCombiner::BuilderTy Builder,
SelectPatternFlavor  SPF,
Value A,
Value B 

◆ foldSelectBinOpIdentity()

static Instruction* foldSelectBinOpIdentity ( SelectInst Sel,
const TargetLibraryInfo TLI 

◆ foldSelectICmpAnd()

static Value* foldSelectICmpAnd ( SelectInst Sel,
ICmpInst Cmp,
InstCombiner::BuilderTy Builder 

◆ foldSelectICmpAndAnd()

static Instruction* foldSelectICmpAndAnd ( Type SelType,
const ICmpInst Cmp,
Value TVal,
Value FVal,
InstCombiner::BuilderTy Builder 

◆ foldSelectICmpAndOr()

static Value* foldSelectICmpAndOr ( const ICmpInst IC,
Value TrueVal,
Value FalseVal,
InstCombiner::BuilderTy Builder 

◆ getSelectFoldableConstant()

static APInt getSelectFoldableConstant ( BinaryOperator I)

◆ getSelectFoldableOperands()

static unsigned getSelectFoldableOperands ( BinaryOperator I)

We want to turn code that looks like this: C = or A, B D = select cond, C, A into: C = select cond, B, 0 D = or A, C.

Assuming that the specified instruction is an operand to the select, return a bitmask indicating which operands of this instruction are foldable if they equal the other incoming value of the select.

Definition at line 243 of file InstCombineSelect.cpp.

References llvm::MCID::Add, and llvm::BinaryOperator::getOpcode().

Referenced by isSelect01().

◆ isSelect01()

static bool isSelect01 ( const APInt C1I,
const APInt C2I