LLVM 18.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. | |
template<bool FP, typename Mul2Rhs > | |
static bool | matchesSquareSum (BinaryOperator &I, Mul2Rhs M2Rhs, Value *&A, Value *&B) |
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'. | |
static Instruction * | foldToUnsignedSaturatedAdd (BinaryOperator &I) |
static Instruction * | combineAddSubWithShlAddSub (InstCombiner::BuilderTy &Builder, const BinaryOperator &I) |
static Instruction * | foldAddToAshr (BinaryOperator &Add) |
Try to reduce signed division by power-of-2 to an arithmetic shift right. | |
static Instruction * | factorizeMathWithShlOps (BinaryOperator &I, InstCombiner::BuilderTy &Builder) |
This is a specialization of a more general transform from foldUsingDistributiveLaws. | |
static Instruction * | foldBoxMultiply (BinaryOperator &I) |
Reduce a sequence of masked half-width multiplies to a single multiply. | |
static Instruction * | factorizeLerp (BinaryOperator &I, InstCombiner::BuilderTy &Builder) |
Eliminate an op from a linear interpolation (lerp) pattern. | |
static Instruction * | factorizeFAddFSub (BinaryOperator &I, InstCombiner::BuilderTy &Builder) |
Factor a common operand out of fadd/fsub of fmul/fdiv. | |
static Instruction * | foldSubOfMinMax (BinaryOperator &I, InstCombiner::BuilderTy &Builder) |
static Instruction * | foldFNegIntoConstant (Instruction &I, const DataLayout &DL) |
This eliminates floating-point negation in either 'fneg(X)' or 'fsub(-0.0, X)' form by combining into a constant operand. | |
#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 1172 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 752 of file InstCombineAddSub.cpp.
References Builder, llvm::APInt::countr_zero(), 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 |
Definition at line 1215 of file InstCombineAddSub.cpp.
References A, B, Builder, I, llvm::PatternMatch::m_c_Add(), llvm::PatternMatch::m_Neg(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Shl(), llvm::PatternMatch::m_Value(), and llvm::PatternMatch::match().
Referenced by llvm::InstCombinerImpl::visitAdd().
|
static |
Factor a common operand out of fadd/fsub of fmul/fdiv.
Definition at line 1728 of file InstCombineAddSub.cpp.
References assert(), Builder, llvm::CallingConv::C, 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 1712 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 foldUsingDistributiveLaws.
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 1360 of file InstCombineAddSub.cpp.
References 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 |
Try to reduce signed division by power-of-2 to an arithmetic shift right.
Definition at line 1228 of file InstCombineAddSub.cpp.
References llvm::Add, llvm::APInt::exactLogBase2(), llvm::ConstantInt::get(), llvm::APInt::getSignedMinValue(), llvm::CmpInst::ICMP_UGT, llvm::APInt::isNegative(), llvm::PatternMatch::m_And(), llvm::PatternMatch::m_APInt(), llvm::PatternMatch::m_ICmp(), llvm::PatternMatch::m_Power2(), llvm::PatternMatch::m_SDiv(), llvm::PatternMatch::m_SExt(), llvm::PatternMatch::m_SignMask(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), llvm::SMin, and X.
Referenced by llvm::InstCombinerImpl::visitAdd().
|
static |
Reduce a sequence of masked half-width multiplies to a single multiply.
((XLow * YHigh) + (YLow * XHigh)) << HalfBits) + (XLow * YLow) --> X * Y
Definition at line 1396 of file InstCombineAddSub.cpp.
References llvm::BitWidth, llvm::APInt::getMaxValue(), I, llvm::PatternMatch::m_And(), llvm::PatternMatch::m_c_Add(), llvm::PatternMatch::m_c_Mul(), llvm::PatternMatch::m_CombineOr(), llvm::PatternMatch::m_LShr(), llvm::PatternMatch::m_Mul(), llvm::PatternMatch::m_Shl(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_SpecificInt(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::match(), X, and Y.
Referenced by llvm::InstCombinerImpl::visitAdd().
|
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 2569 of file InstCombineAddSub.cpp.
References llvm::CallingConv::C, llvm::ConstantFoldUnaryOpOperand(), llvm::BinaryOperator::CreateFDivFMF(), llvm::BinaryOperator::CreateFMulFMF(), llvm::BinaryOperator::CreateFSubFMF(), DL, llvm::Instruction::getFastMathFlags(), 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 809 of file InstCombineAddSub.cpp.
References llvm::Add, Builder, llvm::ConstantInt::get(), llvm::APInt::getBitWidth(), llvm::APInt::isNegative(), 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(), llvm::APInt::sge(), llvm::APInt::trunc(), and X.
Referenced by llvm::InstCombinerImpl::visitAdd().
|
static |
Definition at line 2018 of file InstCombineAddSub.cpp.
References Builder, llvm::CallInst::Create(), F, llvm::Intrinsic::getDeclaration(), llvm::getInverseMinMaxIntrinsic(), llvm::Value::hasOneUse(), I, llvm::PatternMatch::m_c_Add(), llvm::PatternMatch::m_NSWSub(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Specific(), llvm::PatternMatch::m_UMin(), llvm::PatternMatch::m_Value(), llvm::PatternMatch::m_ZeroInt(), llvm::PatternMatch::match(), X, and Y.
Referenced by llvm::InstCombinerImpl::visitSub().
|
static |
Definition at line 1190 of file InstCombineAddSub.cpp.
References assert(), llvm::CallingConv::C, 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().
Definition at line 1104 of file InstCombineAddSub.cpp.
References llvm::CallingConv::C, 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().
|
static |
Definition at line 1007 of file InstCombineAddSub.cpp.
References A, B, FP, I, llvm::PatternMatch::m_BinOp(), llvm::PatternMatch::m_c_BinOp(), llvm::PatternMatch::m_CombineOr(), llvm::PatternMatch::m_Deferred(), llvm::PatternMatch::m_OneUse(), llvm::PatternMatch::m_Value(), and llvm::PatternMatch::match().
Definition at line 1064 of file InstCombineAddSub.cpp.
References llvm::CallingConv::C, 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 1082 of file InstCombineAddSub.cpp.
References llvm::CallingConv::C, 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 1125 of file InstCombineAddSub.cpp.
References llvm::APInt::smul_ov(), and llvm::APInt::umul_ov().
Referenced by llvm::InstCombinerImpl::SimplifyAddWithRemainder().