LLVM
15.0.0git
|
#include "InstCombineInternal.h"
#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Analysis/InstructionSimplify.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/IR/Constant.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/InstrTypes.h"
#include "llvm/IR/Instruction.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/Operator.h"
#include "llvm/IR/PatternMatch.h"
#include "llvm/IR/Type.h"
#include "llvm/IR/Value.h"
#include "llvm/Support/AlignOf.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/KnownBits.h"
#include "llvm/Transforms/InstCombine/InstCombiner.h"
#include <cassert>
#include <utility>
Go to the source code of this file.
Macros | |
#define | DEBUG_TYPE "instcombine" |
Functions | |
static Value * | checkForNegativeOperand (BinaryOperator &I, InstCombiner::BuilderTy &Builder) |
static Instruction * | foldNoWrapAdd (BinaryOperator &Add, InstCombiner::BuilderTy &Builder) |
Wrapping flags may allow combining constants separated by an extend. More... | |
static bool | MatchMul (Value *E, Value *&Op, APInt &C) |
static bool | MatchRem (Value *E, Value *&Op, APInt &C, bool &IsSigned) |
static bool | MatchDiv (Value *E, Value *&Op, APInt &C, bool IsSigned) |
static bool | MulWillOverflow (APInt &C0, APInt &C1, bool IsSigned) |
static Instruction * | canonicalizeLowbitMask (BinaryOperator &I, InstCombiner::BuilderTy &Builder) |
Fold (1 << NBits) - 1 Into: ~(-(1 << NBits)) Because a 'not' is better for bit-tracking analysis and other transforms than an 'add'. More... | |
static Instruction * | foldToUnsignedSaturatedAdd (BinaryOperator &I) |
static Instruction * | factorizeMathWithShlOps (BinaryOperator &I, InstCombiner::BuilderTy &Builder) |
This is a specialization of a more general transform from SimplifyUsingDistributiveLaws. More... | |
static Instruction * | factorizeLerp (BinaryOperator &I, InstCombiner::BuilderTy &Builder) |
Eliminate an op from a linear interpolation (lerp) pattern. More... | |
static Instruction * | factorizeFAddFSub (BinaryOperator &I, InstCombiner::BuilderTy &Builder) |
Factor a common operand out of fadd/fsub of fmul/fdiv. More... | |
static Instruction * | foldFNegIntoConstant (Instruction &I) |
This eliminates floating-point negation in either 'fneg(X)' or 'fsub(-0.0, X)' form by combining into a constant operand. More... | |
static Instruction * | hoistFNegAboveFMulFDiv (Instruction &I, InstCombiner::BuilderTy &Builder) |
#define DEBUG_TYPE "instcombine" |
Definition at line 39 of file InstCombineAddSub.cpp.
|
static |
Fold (1 << NBits) - 1 Into: ~(-(1 << NBits)) Because a 'not' is better for bit-tracking analysis and other transforms than an 'add'.
The new shl is always nsw, and is nuw if old and
was.
Definition at line 1095 of file InstCombineAddSub.cpp.
References Builder, llvm::BinaryOperator::CreateNot(), llvm::Constant::getAllOnesValue(), llvm::Value::getType(), I, llvm::PatternMatch::m_Add(), llvm::PatternMatch::m_AllOnes(), llvm::PatternMatch::m_One(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Shl(), llvm::PatternMatch::m_Value(), and llvm::PatternMatch::match().
Referenced by llvm::InstCombinerImpl::visitAdd().
|
static |
Definition at line 753 of file InstCombineAddSub.cpp.
References Builder, C1, llvm::Value::hasOneUse(), I, LHS, llvm::PatternMatch::m_Add(), llvm::PatternMatch::m_And(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_One(), llvm::PatternMatch::m_Or(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_Xor(), llvm::PatternMatch::match(), RHS, std::swap(), X, and Y.
Referenced by llvm::InstCombinerImpl::visitAdd().
|
static |
Factor a common operand out of fadd/fsub of fmul/fdiv.
Definition at line 1486 of file InstCombineAddSub.cpp.
References assert(), Builder, llvm::BinaryOperator::CreateFDivFMF(), llvm::BinaryOperator::CreateFMulFMF(), factorizeLerp(), llvm::Value::hasOneUse(), I, llvm::PatternMatch::m_APFloat(), llvm::PatternMatch::m_c_FMul(), llvm::PatternMatch::m_FDiv(), llvm::PatternMatch::m_FMul(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), X, and Y.
Referenced by llvm::InstCombinerImpl::visitFAdd(), and llvm::InstCombinerImpl::visitFSub().
|
static |
Eliminate an op from a linear interpolation (lerp) pattern.
Definition at line 1470 of file InstCombineAddSub.cpp.
References Builder, llvm::BinaryOperator::CreateFAddFMF(), I, llvm::PatternMatch::m_c_FAdd(), llvm::PatternMatch::m_c_FMul(), llvm::PatternMatch::m_Deferred(), llvm::PatternMatch::m_FPOne(), llvm::PatternMatch::m_FSub(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), X, and Y.
Referenced by factorizeFAddFSub().
|
static |
This is a specialization of a more general transform from SimplifyUsingDistributiveLaws.
If that code can be made to work optimally for multi-use cases or propagating nsw/nuw, then we would not need this.
Definition at line 1239 of file InstCombineAddSub.cpp.
References llvm::MCID::Add, assert(), Builder, I, llvm::PatternMatch::m_Shl(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), X, and Y.
Referenced by llvm::InstCombinerImpl::visitAdd(), and llvm::InstCombinerImpl::visitSub().
|
static |
This eliminates floating-point negation in either 'fneg(X)' or 'fsub(-0.0, X)' form by combining into a constant operand.
Definition at line 2221 of file InstCombineAddSub.cpp.
References llvm::BinaryOperator::CreateFDivFMF(), llvm::BinaryOperator::CreateFMulFMF(), llvm::BinaryOperator::CreateFSubFMF(), llvm::Instruction::getFastMathFlags(), llvm::ConstantExpr::getFNeg(), I, llvm::PatternMatch::m_Constant(), llvm::PatternMatch::m_FAdd(), llvm::PatternMatch::m_FDiv(), llvm::PatternMatch::m_FMul(), llvm::PatternMatch::m_FNeg(), llvm::PatternMatch::m_Instruction(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), llvm::FastMathFlags::noInfs(), llvm::FastMathFlags::noSignedZeros(), llvm::Instruction::setHasNoInfs(), llvm::Instruction::setHasNoSignedZeros(), and X.
Referenced by llvm::InstCombinerImpl::visitFNeg(), and llvm::InstCombinerImpl::visitFSub().
|
static |
Wrapping flags may allow combining constants separated by an extend.
Definition at line 810 of file InstCombineAddSub.cpp.
References Builder, C1, CreateAdd(), llvm::ConstantInt::get(), llvm::ConstantExpr::getAdd(), llvm::APInt::getBitWidth(), llvm::ConstantExpr::getSExt(), llvm::ConstantExpr::getZExt(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_Constant(), llvm::PatternMatch::m_NSWAdd(), llvm::PatternMatch::m_NUWAdd(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_SExt(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_ZExt(), llvm::PatternMatch::match(), llvm::APInt::sext(), and X.
Referenced by llvm::InstCombinerImpl::visitAdd().
|
static |
Definition at line 1113 of file InstCombineAddSub.cpp.
References llvm::MCID::Add, assert(), llvm::CallInst::Create(), llvm::ConstantInt::get(), llvm::Intrinsic::getDeclaration(), I, llvm::PatternMatch::m_Add(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_c_Add(), llvm::PatternMatch::m_c_UMin(), llvm::PatternMatch::m_Deferred(), llvm::PatternMatch::m_Not(), llvm::PatternMatch::m_UMin(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), X, and Y.
Referenced by llvm::InstCombinerImpl::visitAdd().
|
static |
Definition at line 2261 of file InstCombineAddSub.cpp.
References Builder, llvm::BinaryOperator::CreateFDivFMF(), llvm::BinaryOperator::CreateFMulFMF(), I, llvm::PatternMatch::m_FDiv(), llvm::PatternMatch::m_FMul(), llvm::PatternMatch::m_FNeg(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), X, and Y.
Referenced by llvm::InstCombinerImpl::visitFNeg(), and llvm::InstCombinerImpl::visitFSub().
Definition at line 1027 of file InstCombineAddSub.cpp.
References E, llvm::APInt::getBitWidth(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_LShr(), llvm::PatternMatch::m_SDiv(), llvm::PatternMatch::m_UDiv(), llvm::PatternMatch::m_Value(), and llvm::PatternMatch::match().
Referenced by llvm::InstCombinerImpl::SimplifyAddWithRemainder().
Definition at line 987 of file InstCombineAddSub.cpp.
References E, llvm::APInt::getBitWidth(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_Mul(), llvm::PatternMatch::m_Shl(), llvm::PatternMatch::m_Value(), and llvm::PatternMatch::match().
Referenced by llvm::InstCombinerImpl::SimplifyAddWithRemainder().
Definition at line 1005 of file InstCombineAddSub.cpp.
References E, llvm::PatternMatch::m_And(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_SRem(), llvm::PatternMatch::m_URem(), llvm::PatternMatch::m_Value(), and llvm::PatternMatch::match().
Referenced by llvm::InstCombinerImpl::SimplifyAddWithRemainder().
Definition at line 1048 of file InstCombineAddSub.cpp.
References C1, llvm::APInt::smul_ov(), and llvm::APInt::umul_ov().
Referenced by llvm::InstCombinerImpl::SimplifyAddWithRemainder().