LLVM 23.0.0git
InstCombiner.h
Go to the documentation of this file.
1//===- InstCombiner.h - InstCombine implementation --------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8/// \file
9///
10/// This file provides the interface for the instcombine pass implementation.
11/// The interface is used for generic transformations in this folder and
12/// target specific combinations in the targets.
13/// The visitor implementation is in \c InstCombinerImpl in
14/// \c InstCombineInternal.h.
15///
16//===----------------------------------------------------------------------===//
17
18#ifndef LLVM_TRANSFORMS_INSTCOMBINE_INSTCOMBINER_H
19#define LLVM_TRANSFORMS_INSTCOMBINE_INSTCOMBINER_H
20
26#include "llvm/IR/IRBuilder.h"
29#include "llvm/Support/Debug.h"
31#include <cassert>
32
33#define DEBUG_TYPE "instcombine"
35
36namespace llvm {
37
38class AAResults;
39class AssumptionCache;
40class OptimizationRemarkEmitter;
41class ProfileSummaryInfo;
42class TargetLibraryInfo;
43class TargetTransformInfo;
44
45/// The core instruction combiner logic.
46///
47/// This class provides both the logic to recursively visit instructions and
48/// combine them.
50 /// Only used to call target specific intrinsic combining.
51 /// It must **NOT** be used for any other purpose, as InstCombine is a
52 /// target-independent canonicalization transform.
53 TargetTransformInfo &TTIForTargetIntrinsicsOnly;
54
55public:
56 /// Maximum size of array considered when transforming.
58
59 /// An IRBuilder that automatically inserts new instructions into the
60 /// worklist.
63
64protected:
65 /// A worklist of the instructions that need to be simplified.
67
69
70 // Mode in which we are running the combiner.
71 const bool MinimizeSize;
72
74
75 // Required analyses.
79 const DataLayout &DL;
86
88
89 bool MadeIRChange = false;
90
91 /// Edges that are known to never be taken.
93
94 /// Order of predecessors to canonicalize phi nodes towards.
96
97 /// Backedges, used to avoid pushing instructions across backedges in cases
98 /// where this may result in infinite combine loops. For irreducible loops
99 /// this picks an arbitrary backedge.
101 bool ComputedBackEdges = false;
102
103public:
116
117 virtual ~InstCombiner() = default;
118
119 /// Return the source operand of a potentially bitcasted value while
120 /// optionally checking if it has one use. If there is no bitcast or the one
121 /// use check is not met, return the input value itself.
122 static Value *peekThroughBitcast(Value *V, bool OneUseOnly = false) {
123 if (auto *BitCast = dyn_cast<BitCastInst>(V))
124 if (!OneUseOnly || BitCast->hasOneUse())
125 return BitCast->getOperand(0);
126
127 // V is not a bitcast or V has more than one use and OneUseOnly is true.
128 return V;
129 }
130
131 /// Assign a complexity or rank value to LLVM Values. This is used to reduce
132 /// the amount of pattern matching needed for compares and commutative
133 /// instructions. For example, if we have:
134 /// icmp ugt X, Constant
135 /// or
136 /// xor (add X, Constant), cast Z
137 ///
138 /// We do not have to consider the commuted variants of these patterns because
139 /// canonicalization based on complexity guarantees the above ordering.
140 ///
141 /// This routine maps IR values to various complexity ranks:
142 /// 0 -> undef
143 /// 1 -> Constants
144 /// 2 -> Cast and (f)neg/not instructions
145 /// 3 -> Other instructions and arguments
146 static unsigned getComplexity(Value *V) {
147 if (isa<Constant>(V))
148 return isa<UndefValue>(V) ? 0 : 1;
149
150 using namespace llvm::PatternMatch;
151 if (isa<CastInst>(V) || match(V, m_Neg(m_Value())) ||
152 match(V, m_Not(m_Value())) || match(V, m_FNeg(m_Value())))
153 return 2;
154
155 return 3;
156 }
157
158 /// Predicate canonicalization reduces the number of patterns that need to be
159 /// matched by other transforms. For example, we may swap the operands of a
160 /// conditional branch or select to create a compare with a canonical
161 /// (inverted) predicate which is then more likely to be matched with other
162 /// values.
164 switch (Pred) {
165 case CmpInst::ICMP_NE:
170 // TODO: There are 16 FCMP predicates. Should others be (not) canonical?
174 return false;
175 default:
176 return true;
177 }
178 }
179
180 /// Add one to a Constant
182 return ConstantExpr::getAdd(C, ConstantInt::get(C->getType(), 1));
183 }
184
185 /// Subtract one from a Constant
187 return ConstantExpr::getSub(C, ConstantInt::get(C->getType(), 1));
188 }
189
191 // a ? b : false and a ? true : b are the canonical form of logical and/or.
192 // This includes !a ? b : false and !a ? true : b. Absorbing the not into
193 // the select by swapping operands would break recognition of this pattern
194 // in other analyses, so don't do that.
199 }
200
201 /// Return nonnull value if V is free to invert under the condition of
202 /// WillInvertAllUses.
203 /// If Builder is nonnull, it will return a simplified ~V.
204 /// If Builder is null, it will return an arbitrary nonnull value (not
205 /// dereferenceable).
206 /// If the inversion will consume instructions, `DoesConsume` will be set to
207 /// true. Otherwise it will be false.
208 LLVM_ABI Value *getFreelyInvertedImpl(Value *V, bool WillInvertAllUses,
209 BuilderTy *Builder, bool &DoesConsume,
210 unsigned Depth);
211
212 Value *getFreelyInverted(Value *V, bool WillInvertAllUses,
213 BuilderTy *Builder, bool &DoesConsume) {
214 DoesConsume = false;
215 return getFreelyInvertedImpl(V, WillInvertAllUses, Builder, DoesConsume,
216 /*Depth*/ 0);
217 }
218
219 Value *getFreelyInverted(Value *V, bool WillInvertAllUses,
221 bool Unused;
222 return getFreelyInverted(V, WillInvertAllUses, Builder, Unused);
223 }
224
225 /// Return true if the specified value is free to invert (apply ~ to).
226 /// This happens in cases where the ~ can be eliminated. If WillInvertAllUses
227 /// is true, work under the assumption that the caller intends to remove all
228 /// uses of V and only keep uses of ~V.
229 ///
230 /// See also: canFreelyInvertAllUsersOf()
231 bool isFreeToInvert(Value *V, bool WillInvertAllUses,
232 bool &DoesConsume) {
233 return getFreelyInverted(V, WillInvertAllUses, /*Builder*/ nullptr,
234 DoesConsume) != nullptr;
235 }
236
237 bool isFreeToInvert(Value *V, bool WillInvertAllUses) {
238 bool Unused;
239 return isFreeToInvert(V, WillInvertAllUses, Unused);
240 }
241
242 /// Given i1 V, can every user of V be freely adapted if V is changed to !V ?
243 /// InstCombine's freelyInvertAllUsersOf() must be kept in sync with this fn.
244 /// NOTE: for Instructions only!
245 ///
246 /// See also: isFreeToInvert()
248 // Look at every user of V.
249 for (Use &U : V->uses()) {
250 if (U.getUser() == IgnoredUser)
251 continue; // Don't consider this user.
252
253 auto *I = cast<Instruction>(U.getUser());
254 switch (I->getOpcode()) {
255 case Instruction::Select:
256 if (U.getOperandNo() != 0) // Only if the value is used as select cond.
257 return false;
259 return false;
260 break;
261 case Instruction::CondBr:
262 assert(U.getOperandNo() == 0 && "Must be branching on that value.");
263 break; // Free to invert by swapping true/false values/destinations.
264 case Instruction::Xor: // Can invert 'xor' if it's a 'not', by ignoring
265 // it.
267 return false; // Not a 'not'.
268 break;
269 default:
270 return false; // Don't know, likely not freely invertible.
271 }
272 // So far all users were free to invert...
273 }
274 return true; // Can freely invert all users!
275 }
276
277 /// Some binary operators require special handling to avoid poison and
278 /// undefined behavior. If a constant vector has undef elements, replace those
279 /// undefs with identity constants if possible because those are always safe
280 /// to execute. If no identity constant exists, replace undef with some other
281 /// safe constant.
282 static Constant *
284 bool IsRHSConstant) {
285 auto *InVTy = cast<FixedVectorType>(In->getType());
286
287 Type *EltTy = InVTy->getElementType();
288 auto *SafeC = ConstantExpr::getBinOpIdentity(Opcode, EltTy, IsRHSConstant);
289 if (!SafeC) {
290 // TODO: Should this be available as a constant utility function? It is
291 // similar to getBinOpAbsorber().
292 if (IsRHSConstant) {
293 switch (Opcode) {
294 case Instruction::SRem: // X % 1 = 0
295 case Instruction::URem: // X %u 1 = 0
296 SafeC = ConstantInt::get(EltTy, 1);
297 break;
298 case Instruction::FRem: // X % 1.0 (doesn't simplify, but it is safe)
299 SafeC = ConstantFP::get(EltTy, 1.0);
300 break;
301 default:
303 "Only rem opcodes have no identity constant for RHS");
304 }
305 } else {
306 switch (Opcode) {
307 case Instruction::Shl: // 0 << X = 0
308 case Instruction::LShr: // 0 >>u X = 0
309 case Instruction::AShr: // 0 >> X = 0
310 case Instruction::SDiv: // 0 / X = 0
311 case Instruction::UDiv: // 0 /u X = 0
312 case Instruction::SRem: // 0 % X = 0
313 case Instruction::URem: // 0 %u X = 0
314 case Instruction::Sub: // 0 - X (doesn't simplify, but it is safe)
315 case Instruction::FSub: // 0.0 - X (doesn't simplify, but it is safe)
316 case Instruction::FDiv: // 0.0 / X (doesn't simplify, but it is safe)
317 case Instruction::FRem: // 0.0 % X = 0
318 SafeC = Constant::getNullValue(EltTy);
319 break;
320 default:
321 llvm_unreachable("Expected to find identity constant for opcode");
322 }
323 }
324 }
325 assert(SafeC && "Must have safe constant for binop");
326 unsigned NumElts = InVTy->getNumElements();
327 SmallVector<Constant *, 16> Out(NumElts);
328 for (unsigned i = 0; i != NumElts; ++i) {
329 Constant *C = In->getAggregateElement(i);
330 Out[i] = isa<UndefValue>(C) ? SafeC : C;
331 }
332 return ConstantVector::get(Out);
333 }
334
335 /// Ignore all operations which only change the sign of a value, returning the
336 /// underlying magnitude value.
338 using namespace llvm::PatternMatch;
339
340 match(Val, m_FNeg(m_Value(Val)));
341 match(Val, m_FAbs(m_Value(Val)));
342 match(Val, m_CopySign(m_Value(Val), m_Value()));
343 return Val;
344 }
345
347
350 DominatorTree &getDominatorTree() const { return DT; }
351 const DataLayout &getDataLayout() const { return DL; }
352 const SimplifyQuery &getSimplifyQuery() const { return SQ; }
358
359 // Call target specific combiners
360 LLVM_ABI std::optional<Instruction *>
361 targetInstCombineIntrinsic(IntrinsicInst &II);
362 LLVM_ABI std::optional<Value *>
363 targetSimplifyDemandedUseBitsIntrinsic(IntrinsicInst &II, APInt DemandedMask,
364 KnownBits &Known,
365 bool &KnownBitsComputed);
366 LLVM_ABI std::optional<Value *> targetSimplifyDemandedVectorEltsIntrinsic(
367 IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts,
368 APInt &UndefElts2, APInt &UndefElts3,
369 std::function<void(Instruction *, unsigned, APInt, APInt &)>
370 SimplifyAndSetOp);
371
372 LLVM_ABI void computeBackEdges();
373 bool isBackEdge(const BasicBlock *From, const BasicBlock *To) {
376 return BackEdges.contains({From, To});
377 }
378
379 /// Inserts an instruction \p New before instruction \p Old
380 ///
381 /// Also adds the new instruction to the worklist and returns \p New so that
382 /// it is suitable for use as the return from the visitation patterns.
384 assert(New && !New->getParent() &&
385 "New instruction already inserted into a basic block!");
386 New->insertBefore(Old); // Insert inst
387 Worklist.add(New);
388 return New;
389 }
390
391 /// Same as InsertNewInstBefore, but also sets the debug loc.
393 New->setDebugLoc(Old->getDebugLoc());
394 return InsertNewInstBefore(New, Old);
395 }
396
397 /// A combiner-aware RAUW-like routine.
398 ///
399 /// This method is to be used when an instruction is found to be dead,
400 /// replaceable with another preexisting expression. Here we add all uses of
401 /// I to the worklist, replace all uses of I with the new value, then return
402 /// I, so that the inst combiner will know that I was modified.
404 // If there are no uses to replace, then we return nullptr to indicate that
405 // no changes were made to the program.
406 if (I.use_empty()) return nullptr;
407
408 Worklist.pushUsersToWorkList(I); // Add all modified instrs to worklist.
409
410 // If we are replacing the instruction with itself, this must be in a
411 // segment of unreachable code, so just clobber the instruction.
412 if (&I == V)
413 V = PoisonValue::get(I.getType());
414
415 LLVM_DEBUG(dbgs() << "IC: Replacing " << I << "\n"
416 << " with " << *V << '\n');
417
418 // If V is a new unnamed instruction, take the name from the old one.
419 if (V->use_empty() && isa<Instruction>(V) && !V->hasName() && I.hasName())
420 V->takeName(&I);
421
422 I.replaceAllUsesWith(V);
423 return &I;
424 }
425
426 /// Replace operand of instruction and add old operand to the worklist.
428 Value *OldOp = I.getOperand(OpNum);
429 I.setOperand(OpNum, V);
430 Worklist.handleUseCountDecrement(OldOp);
431 return &I;
432 }
433
434 /// Replace use and add the previously used value to the worklist.
435 void replaceUse(Use &U, Value *NewValue) {
436 Value *OldOp = U;
437 U = NewValue;
438 Worklist.handleUseCountDecrement(OldOp);
439 }
440
441 /// Combiner aware instruction erasure.
442 ///
443 /// When dealing with an instruction that has side effects or produces a void
444 /// value, we can't rely on DCE to delete the instruction. Instead, visit
445 /// methods should return the value returned by this function.
447
448 void computeKnownBits(const Value *V, KnownBits &Known,
449 const Instruction *CxtI, unsigned Depth = 0) const {
450 llvm::computeKnownBits(V, Known, SQ.getWithInstruction(CxtI), Depth);
451 }
452
454 unsigned Depth = 0) const {
455 return llvm::computeKnownBits(V, SQ.getWithInstruction(CxtI), Depth);
456 }
457
458 bool isKnownToBeAPowerOfTwo(const Value *V, bool OrZero = false,
459 const Instruction *CxtI = nullptr,
460 unsigned Depth = 0) {
461 return llvm::isKnownToBeAPowerOfTwo(V, OrZero, SQ.getWithInstruction(CxtI),
462 Depth);
463 }
464
465 bool MaskedValueIsZero(const Value *V, const APInt &Mask,
466 const Instruction *CxtI = nullptr,
467 unsigned Depth = 0) const {
468 return llvm::MaskedValueIsZero(V, Mask, SQ.getWithInstruction(CxtI), Depth);
469 }
470
471 unsigned ComputeNumSignBits(const Value *Op,
472 const Instruction *CxtI = nullptr,
473 unsigned Depth = 0) const {
474 return llvm::ComputeNumSignBits(Op, DL, &AC, CxtI, &DT, Depth);
475 }
476
478 const Instruction *CxtI = nullptr,
479 unsigned Depth = 0) const {
480 return llvm::ComputeMaxSignificantBits(Op, DL, &AC, CxtI, &DT, Depth);
481 }
482
483 /// Return true if the cast from integer to FP can be proven to be exact
484 /// for all possible inputs (the conversion does not lose any precision).
485 LLVM_ABI bool isKnownExactCastIntToFP(CastInst &I) const;
486 LLVM_ABI bool
487 canBeCastedExactlyIntToFP(Value *V, Type *FPTy, bool IsSigned,
488 const Instruction *CxtI = nullptr) const;
489
491 const Value *RHS,
492 const Instruction *CxtI,
493 bool IsNSW = false) const {
495 LHS, RHS, SQ.getWithInstruction(CxtI), IsNSW);
496 }
497
499 const Instruction *CxtI) const {
500 return llvm::computeOverflowForSignedMul(LHS, RHS,
501 SQ.getWithInstruction(CxtI));
502 }
503
506 const WithCache<const Value *> &RHS,
507 const Instruction *CxtI) const {
509 SQ.getWithInstruction(CxtI));
510 }
511
514 const WithCache<const Value *> &RHS,
515 const Instruction *CxtI) const {
516 return llvm::computeOverflowForSignedAdd(LHS, RHS,
517 SQ.getWithInstruction(CxtI));
518 }
519
521 const Value *RHS,
522 const Instruction *CxtI) const {
524 SQ.getWithInstruction(CxtI));
525 }
526
528 const Instruction *CxtI) const {
529 return llvm::computeOverflowForSignedSub(LHS, RHS,
530 SQ.getWithInstruction(CxtI));
531 }
532
533 virtual bool SimplifyDemandedBits(Instruction *I, unsigned OpNo,
534 const APInt &DemandedMask, KnownBits &Known,
535 const SimplifyQuery &Q,
536 unsigned Depth = 0) = 0;
537
538 bool SimplifyDemandedBits(Instruction *I, unsigned OpNo,
539 const APInt &DemandedMask, KnownBits &Known) {
540 return SimplifyDemandedBits(I, OpNo, DemandedMask, Known,
541 SQ.getWithInstruction(I));
542 }
543
544 virtual Value *
545 SimplifyDemandedVectorElts(Value *V, APInt DemandedElts, APInt &UndefElts,
546 unsigned Depth = 0,
547 bool AllowMultipleUsers = false) = 0;
548
549 LLVM_ABI bool isValidAddrSpaceCast(unsigned FromAS, unsigned ToAS) const;
550};
551
552} // namespace llvm
553
554#undef DEBUG_TYPE
555
556#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define LLVM_ABI
Definition Compiler.h:213
#define LLVM_LIBRARY_VISIBILITY
Definition Compiler.h:137
#define I(x, y, z)
Definition MD5.cpp:57
uint64_t IntrinsicInst * II
This file builds on the ADT/GraphTraits.h file to build a generic graph post order iterator.
#define LLVM_DEBUG(...)
Definition Debug.h:119
Class for arbitrary precision integers.
Definition APInt.h:78
A cache of @llvm.assume calls within a function.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Analysis providing branch probability information.
This is the base class for all instructions that perform data casts.
Definition InstrTypes.h:512
@ ICMP_SLE
signed less or equal
Definition InstrTypes.h:770
@ FCMP_OGE
0 0 1 1 True if ordered and greater than or equal
Definition InstrTypes.h:745
@ ICMP_UGE
unsigned greater or equal
Definition InstrTypes.h:764
@ FCMP_ONE
0 1 1 0 True if ordered and operands are unequal
Definition InstrTypes.h:748
@ FCMP_OLE
0 1 0 1 True if ordered and less than or equal
Definition InstrTypes.h:747
@ ICMP_NE
not equal
Definition InstrTypes.h:762
@ ICMP_SGE
signed greater or equal
Definition InstrTypes.h:768
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:766
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
static LLVM_ABI Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getAdd(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getBinOpIdentity(unsigned Opcode, Type *Ty, bool AllowRHSConstant=false, bool NSZ=false)
Return the identity constant for a binary opcode.
static LLVM_ABI Constant * get(ArrayRef< Constant * > V)
This is an important base class in LLVM.
Definition Constant.h:43
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:159
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition IRBuilder.h:2858
OverflowResult computeOverflowForSignedSub(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
SimplifyQuery SQ
const DataLayout & getDataLayout() const
unsigned ComputeMaxSignificantBits(const Value *Op, const Instruction *CxtI=nullptr, unsigned Depth=0) const
bool isFreeToInvert(Value *V, bool WillInvertAllUses)
virtual Instruction * eraseInstFromFunction(Instruction &I)=0
Combiner aware instruction erasure.
IRBuilder< TargetFolder, IRBuilderCallbackInserter > BuilderTy
An IRBuilder that automatically inserts new instructions into the worklist.
bool isFreeToInvert(Value *V, bool WillInvertAllUses, bool &DoesConsume)
Return true if the specified value is free to invert (apply ~ to).
DominatorTree & getDominatorTree() const
OverflowResult computeOverflowForUnsignedMul(const Value *LHS, const Value *RHS, const Instruction *CxtI, bool IsNSW=false) const
virtual ~InstCombiner()=default
BlockFrequencyInfo * BFI
static unsigned getComplexity(Value *V)
Assign a complexity or rank value to LLVM Values.
SmallDenseMap< BasicBlock *, SmallVector< BasicBlock * >, 8 > PredOrder
Order of predecessors to canonicalize phi nodes towards.
TargetLibraryInfo & TLI
TargetLibraryInfo & getTargetLibraryInfo() const
unsigned ComputeNumSignBits(const Value *Op, const Instruction *CxtI=nullptr, unsigned Depth=0) const
BlockFrequencyInfo * getBlockFrequencyInfo() const
Instruction * InsertNewInstBefore(Instruction *New, BasicBlock::iterator Old)
Inserts an instruction New before instruction Old.
Instruction * replaceInstUsesWith(Instruction &I, Value *V)
A combiner-aware RAUW-like routine.
uint64_t MaxArraySizeForCombine
Maximum size of array considered when transforming.
static bool shouldAvoidAbsorbingNotIntoSelect(const SelectInst &SI)
OverflowResult computeOverflowForSignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const Instruction *CxtI) const
static Constant * SubOne(Constant *C)
Subtract one from a Constant.
void replaceUse(Use &U, Value *NewValue)
Replace use and add the previously used value to the worklist.
OverflowResult computeOverflowForUnsignedSub(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
static bool isCanonicalPredicate(CmpPredicate Pred)
Predicate canonicalization reduces the number of patterns that need to be matched by other transforms...
InstructionWorklist & Worklist
A worklist of the instructions that need to be simplified.
Instruction * InsertNewInstWith(Instruction *New, BasicBlock::iterator Old)
Same as InsertNewInstBefore, but also sets the debug loc.
BranchProbabilityInfo * BPI
bool SimplifyDemandedBits(Instruction *I, unsigned OpNo, const APInt &DemandedMask, KnownBits &Known)
virtual bool SimplifyDemandedBits(Instruction *I, unsigned OpNo, const APInt &DemandedMask, KnownBits &Known, const SimplifyQuery &Q, unsigned Depth=0)=0
ReversePostOrderTraversal< BasicBlock * > & RPOT
const DataLayout & DL
DomConditionCache DC
const bool MinimizeSize
void computeKnownBits(const Value *V, KnownBits &Known, const Instruction *CxtI, unsigned Depth=0) const
virtual Value * SimplifyDemandedVectorElts(Value *V, APInt DemandedElts, APInt &UndefElts, unsigned Depth=0, bool AllowMultipleUsers=false)=0
static Value * peekThroughBitcast(Value *V, bool OneUseOnly=false)
Return the source operand of a potentially bitcasted value while optionally checking if it has one us...
KnownBits computeKnownBits(const Value *V, const Instruction *CxtI, unsigned Depth=0) const
bool canFreelyInvertAllUsersOf(Instruction *V, Value *IgnoredUser)
Given i1 V, can every user of V be freely adapted if V is changed to !V ?
Value * getFreelyInverted(Value *V, bool WillInvertAllUses, BuilderTy *Builder)
AssumptionCache & AC
void addToWorklist(Instruction *I)
LLVM_ABI Value * getFreelyInvertedImpl(Value *V, bool WillInvertAllUses, BuilderTy *Builder, bool &DoesConsume, unsigned Depth)
Return nonnull value if V is free to invert under the condition of WillInvertAllUses.
static Value * stripSignOnlyFPOps(Value *Val)
Ignore all operations which only change the sign of a value, returning the underlying magnitude value...
SmallDenseSet< std::pair< const BasicBlock *, const BasicBlock * >, 8 > BackEdges
Backedges, used to avoid pushing instructions across backedges in cases where this may result in infi...
Instruction * replaceOperand(Instruction &I, unsigned OpNum, Value *V)
Replace operand of instruction and add old operand to the worklist.
bool MaskedValueIsZero(const Value *V, const APInt &Mask, const Instruction *CxtI=nullptr, unsigned Depth=0) const
DominatorTree & DT
static Constant * getSafeVectorConstantForBinop(BinaryOperator::BinaryOps Opcode, Constant *In, bool IsRHSConstant)
Some binary operators require special handling to avoid poison and undefined behavior.
OverflowResult computeOverflowForSignedMul(const Value *LHS, const Value *RHS, const Instruction *CxtI) const
ProfileSummaryInfo * getProfileSummaryInfo() const
OptimizationRemarkEmitter & getOptimizationRemarkEmitter() const
ProfileSummaryInfo * PSI
SmallDenseSet< std::pair< BasicBlock *, BasicBlock * >, 8 > DeadEdges
Edges that are known to never be taken.
BuilderTy & Builder
AssumptionCache & getAssumptionCache() const
OptimizationRemarkEmitter & ORE
LLVM_ABI bool isValidAddrSpaceCast(unsigned FromAS, unsigned ToAS) const
OverflowResult computeOverflowForUnsignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const Instruction *CxtI) const
InstCombiner(InstructionWorklist &Worklist, BuilderTy &Builder, Function &F, AAResults *AA, AssumptionCache &AC, TargetLibraryInfo &TLI, TargetTransformInfo &TTI, DominatorTree &DT, OptimizationRemarkEmitter &ORE, BlockFrequencyInfo *BFI, BranchProbabilityInfo *BPI, ProfileSummaryInfo *PSI, const DataLayout &DL, ReversePostOrderTraversal< BasicBlock * > &RPOT)
Value * getFreelyInverted(Value *V, bool WillInvertAllUses, BuilderTy *Builder, bool &DoesConsume)
const SimplifyQuery & getSimplifyQuery() const
bool isBackEdge(const BasicBlock *From, const BasicBlock *To)
static Constant * AddOne(Constant *C)
Add one to a Constant.
bool isKnownToBeAPowerOfTwo(const Value *V, bool OrZero=false, const Instruction *CxtI=nullptr, unsigned Depth=0)
InstructionWorklist - This is the worklist management logic for InstCombine and other simplification ...
A wrapper class for inspecting calls to intrinsic functions.
The optimization diagnostic interface.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Analysis providing profile information.
This class represents the LLVM 'select' instruction.
Implements a dense probed hash-table based set with some number of buckets stored inline.
Definition DenseSet.h:301
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Provides information about what library functions are available for the current target.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM Value Representation.
Definition Value.h:75
iterator_range< use_iterator > uses()
Definition Value.h:380
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
BinaryOp_match< SpecificConstantMatch, SrcTy, TargetOpcode::G_SUB > m_Neg(const SrcTy &&Src)
Matches a register negated by a G_SUB.
BinaryOp_match< SrcTy, SpecificConstantMatch, TargetOpcode::G_XOR, true > m_Not(const SrcTy &&Src)
Matches a register not-ed by a G_XOR.
LogicalOp_match< LHS, RHS, Instruction::And > m_LogicalAnd(const LHS &L, const RHS &R)
Matches L && R either in the form of L & R or L ?
bool match(Val *V, const Pattern &P)
auto m_Value()
Match an arbitrary value and ignore it.
FNeg_match< OpTy > m_FNeg(const OpTy &X)
Match 'fneg X' as 'fsub -0.0, X'.
LogicalOp_match< LHS, RHS, Instruction::Or > m_LogicalOr(const LHS &L, const RHS &R)
Matches L || R either in the form of L | R or L ?
BinaryOp_match< cst_pred_ty< is_all_ones >, ValTy, Instruction::Xor, true > m_Not(const ValTy &V)
Matches a 'Not' as 'xor V, -1' or 'xor -1, V'.
m_Intrinsic_Ty< Opnd0 >::Ty m_FAbs(const Opnd0 &Op0)
m_Intrinsic_Ty< Opnd0, Opnd1 >::Ty m_CopySign(const Opnd0 &Op0, const Opnd1 &Op1)
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
LLVM_ABI bool MaskedValueIsZero(const Value *V, const APInt &Mask, const SimplifyQuery &SQ, unsigned Depth=0)
Return true if 'V & Mask' is known to be zero.
LLVM_ABI OverflowResult computeOverflowForUnsignedMul(const Value *LHS, const Value *RHS, const SimplifyQuery &SQ, bool IsNSW=false)
LLVM_ABI OverflowResult computeOverflowForSignedSub(const Value *LHS, const Value *RHS, const SimplifyQuery &SQ)
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
LLVM_ABI OverflowResult computeOverflowForSignedMul(const Value *LHS, const Value *RHS, const SimplifyQuery &SQ)
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
TargetTransformInfo TTI
LLVM_ABI OverflowResult computeOverflowForSignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const SimplifyQuery &SQ)
DWARFExpression::Operation Op
LLVM_ABI unsigned ComputeNumSignBits(const Value *Op, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Return the number of times the sign bit of the register is replicated into the other bits.
LLVM_ABI OverflowResult computeOverflowForUnsignedSub(const Value *LHS, const Value *RHS, const SimplifyQuery &SQ)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI unsigned ComputeMaxSignificantBits(const Value *Op, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Get the upper bound on bit size for this Value Op as a signed integer.
LLVM_ABI OverflowResult computeOverflowForUnsignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const SimplifyQuery &SQ)
LLVM_ABI bool isKnownToBeAPowerOfTwo(const Value *V, const DataLayout &DL, bool OrZero=false, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Return true if the given value is known to have exactly one bit set when defined.