24 case ICmpInst::ICMP_UGT:
return 1;
25 case ICmpInst::ICMP_SGT:
return 1;
26 case ICmpInst::ICMP_EQ:
return 2;
27 case ICmpInst::ICMP_UGE:
return 3;
28 case ICmpInst::ICMP_SGE:
return 3;
29 case ICmpInst::ICMP_ULT:
return 4;
30 case ICmpInst::ICMP_SLT:
return 4;
31 case ICmpInst::ICMP_NE:
return 5;
32 case ICmpInst::ICMP_ULE:
return 6;
33 case ICmpInst::ICMP_SLE:
return 6;
46 case 1: Pred = Sign ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT;
break;
47 case 2: Pred = ICmpInst::ICMP_EQ;
break;
48 case 3: Pred = Sign ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_UGE;
break;
49 case 4: Pred = Sign ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT;
break;
50 case 5: Pred = ICmpInst::ICMP_NE;
break;
51 case 6: Pred = Sign ? ICmpInst::ICMP_SLE : ICmpInst::ICMP_ULE;
break;
67 assert(FCmpInst::FCMP_FALSE <= Pred && Pred <= FCmpInst::FCMP_TRUE &&
68 "Unexpected FCmp predicate!");
69 if (Pred == FCmpInst::FCMP_FALSE)
71 if (Pred == FCmpInst::FCMP_TRUE)
76std::optional<DecomposedBitTest>
78 bool LookThruTrunc,
bool AllowNonZeroC,
80 using namespace PatternMatch;
87 bool Inverted =
false;
90 Pred = ICmpInst::getInversePredicate(Pred);
95 if (ICmpInst::isSigned(Pred) ?
C.isMaxSignedValue() :
C.isMaxValue())
98 Pred = ICmpInst::getStrictPredicate(Pred);
105 case ICmpInst::ICMP_SLT: {
110 Result.Pred = ICmpInst::ICMP_NE;
117 Result.Mask = -FlippedSign;
119 Result.Pred = ICmpInst::ICMP_EQ;
125 Result.Mask = FlippedSign;
127 Result.Pred = ICmpInst::ICMP_NE;
133 case ICmpInst::ICMP_ULT: {
135 if (
C.isPowerOf2()) {
138 Result.Pred = ICmpInst::ICMP_EQ;
143 if (
C.isNegatedPowerOf2()) {
146 Result.Pred = ICmpInst::ICMP_NE;
152 case ICmpInst::ICMP_EQ:
153 case ICmpInst::ICMP_NE: {
169 if (!AllowNonZeroC && !Result.C.isZero())
173 Result.Pred = ICmpInst::getInversePredicate(Result.Pred);
178 Result.Mask = Result.Mask.zext(
X->getType()->getScalarSizeInBits());
179 Result.C = Result.C.zext(
X->getType()->getScalarSizeInBits());
191 using namespace PatternMatch;
192 if (
auto *ICmp = dyn_cast<ICmpInst>(
Cond)) {
194 if (!ICmp->getOperand(0)->getType()->isIntOrIntVectorTy())
197 ICmp->getPredicate(), LookThruTrunc,
198 AllowNonZeroC, DecomposeAnd);
201 if (
Cond->getType()->isIntOrIntVectorTy(1) &&
206 unsigned BitWidth =
X->getType()->getScalarSizeInBits();
209 Result.Pred = isa<TruncInst>(
Cond) ? ICmpInst::ICMP_NE : ICmpInst::ICMP_EQ;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
const SmallVectorImpl< MachineOperand > & Cond
Class for arbitrary precision integers.
bool isNegatedPowerOf2() const
Check if this APInt's negated value is a power of two greater than zero.
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
This is an important base class in LLVM.
static bool isGE(Predicate P)
Return true if the predicate is SGE or UGE.
static bool isGT(Predicate P)
Return true if the predicate is SGT or UGT.
bool isEquality() const
Return true if this predicate is either EQ or NE.
static bool isLE(Predicate P)
Return true if the predicate is SLE or ULE.
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM Value Representation.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
BinaryOp_match< SrcTy, SpecificConstantMatch, TargetOpcode::G_XOR, true > m_Not(const SrcTy &&Src)
Matches a register not-ed by a G_XOR.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
CastInst_match< OpTy, TruncInst > m_Trunc(const OpTy &Op)
Matches Trunc.
bool match(Val *V, const Pattern &P)
apint_match m_APIntAllowPoison(const APInt *&Res)
Match APInt while allowing poison in splat vector constants.
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
This is an optimization pass for GlobalISel generic memory operations.
Constant * getPredForFCmpCode(unsigned Code, Type *OpTy, CmpInst::Predicate &Pred)
This is the complement of getFCmpCode.
bool predicatesFoldable(CmpInst::Predicate P1, CmpInst::Predicate P2)
Return true if both predicates match sign or if at least one of them is an equality comparison (which...
std::optional< DecomposedBitTest > decomposeBitTest(Value *Cond, bool LookThroughTrunc=true, bool AllowNonZeroC=false, bool DecomposeAnd=false)
Decompose an icmp into the form ((X & Mask) pred C) if possible.
constexpr unsigned BitWidth
unsigned getICmpCode(CmpInst::Predicate Pred)
Encode a icmp predicate into a three bit mask.
std::optional< DecomposedBitTest > decomposeBitTestICmp(Value *LHS, Value *RHS, CmpInst::Predicate Pred, bool LookThroughTrunc=true, bool AllowNonZeroC=false, bool DecomposeAnd=false)
Decompose an icmp into the form ((X & Mask) pred C) if possible.
Constant * getPredForICmpCode(unsigned Code, bool Sign, Type *OpTy, CmpInst::Predicate &Pred)
This is the complement of getICmpCode.
Represents the operation icmp (X & Mask) pred C, where pred can only be eq or ne.