LLVM 24.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 /// IRBuilder inserter that adds new instructions to the worklist and new
51 /// assumptions to the AssumptionCache.
52 class IRBuilderInstCombineInserter final : public IRBuilderDefaultInserter {
53 InstCombiner &IC;
54
55 public:
56 IRBuilderInstCombineInserter(InstCombiner &IC) : IC(IC) {}
57
58 LLVM_ABI void InsertHelper(Instruction *I, const Twine &Name,
59 BasicBlock::iterator InsertPt) const;
60 };
61
62 /// Only used to call target specific intrinsic combining.
63 /// It must **NOT** be used for any other purpose, as InstCombine is a
64 /// target-independent canonicalization transform.
65 TargetTransformInfo &TTIForTargetIntrinsicsOnly;
66
67public:
68 /// An IRBuilder that automatically inserts new instructions into the
69 /// worklist.
72
73protected:
74 /// A worklist of the instructions that need to be simplified.
76
78
79 // Mode in which we are running the combiner.
80 const bool MinimizeSize;
81
83
84 // Required analyses.
88 const DataLayout &DL;
95
97
98 bool MadeIRChange = false;
99
100 /// Edges that are known to never be taken.
102
103 /// Order of predecessors to canonicalize phi nodes towards.
105
106 /// Backedges, used to avoid pushing instructions across backedges in cases
107 /// where this may result in infinite combine loops. For irreducible loops
108 /// this picks an arbitrary backedge.
110 bool ComputedBackEdges = false;
111
112 /// Source for annotation metadata, used by the IRBuilder inserter.
114
115public:
121 const DataLayout &DL,
123 : TTIForTargetIntrinsicsOnly(TTI),
125 IRBuilderInstCombineInserter(*this)),
126 Worklist(Worklist), F(F), MinimizeSize(F.hasMinSize()), AA(AA), AC(AC),
127 TLI(TLI), DT(DT), DL(DL),
128 SQ(DL, &TLI, &DT, &AC, nullptr, /*UseInstrInfo*/ true,
129 /*CanUseUndef*/ true, &DC),
130 ORE(ORE), BFI(BFI), BPI(BPI), PSI(PSI), RPOT(RPOT) {}
131
132 virtual ~InstCombiner() = default;
133
134 /// Return the source operand of a potentially bitcasted value while
135 /// optionally checking if it has one use. If there is no bitcast or the one
136 /// use check is not met, return the input value itself.
137 static Value *peekThroughBitcast(Value *V, bool OneUseOnly = false) {
138 if (auto *BitCast = dyn_cast<BitCastInst>(V))
139 if (!OneUseOnly || BitCast->hasOneUse())
140 return BitCast->getOperand(0);
141
142 // V is not a bitcast or V has more than one use and OneUseOnly is true.
143 return V;
144 }
145
146 /// Assign a complexity or rank value to LLVM Values. This is used to reduce
147 /// the amount of pattern matching needed for compares and commutative
148 /// instructions. For example, if we have:
149 /// icmp ugt X, Constant
150 /// or
151 /// xor (add X, Constant), cast Z
152 ///
153 /// We do not have to consider the commuted variants of these patterns because
154 /// canonicalization based on complexity guarantees the above ordering.
155 ///
156 /// This routine maps IR values to various complexity ranks:
157 /// 0 -> undef
158 /// 1 -> Constants
159 /// 2 -> Cast and (f)neg/not instructions
160 /// 3 -> Other instructions and arguments
161 static unsigned getComplexity(Value *V) {
162 if (isa<Constant>(V))
163 return isa<UndefValue>(V) ? 0 : 1;
164
165 using namespace llvm::PatternMatch;
166 if (isa<CastInst>(V) || match(V, m_Neg(m_Value())) ||
167 match(V, m_Not(m_Value())) || match(V, m_FNeg(m_Value())))
168 return 2;
169
170 return 3;
171 }
172
173 /// Predicate canonicalization reduces the number of patterns that need to be
174 /// matched by other transforms. For example, we may swap the operands of a
175 /// conditional branch or select to create a compare with a canonical
176 /// (inverted) predicate which is then more likely to be matched with other
177 /// values.
179 switch (Pred) {
180 case CmpInst::ICMP_NE:
185 // TODO: There are 16 FCMP predicates. Should others be (not) canonical?
189 return false;
190 default:
191 return true;
192 }
193 }
194
195 /// Add one to a Constant
197 return ConstantExpr::getAdd(C, ConstantInt::get(C->getType(), 1));
198 }
199
200 /// Subtract one from a Constant
202 return ConstantExpr::getSub(C, ConstantInt::get(C->getType(), 1));
203 }
204
206 // a ? b : false and a ? true : b are the canonical form of logical and/or.
207 // This includes !a ? b : false and !a ? true : b. Absorbing the not into
208 // the select by swapping operands would break recognition of this pattern
209 // in other analyses, so don't do that.
214 }
215
216 /// Return nonnull value if V is free to invert under the condition of
217 /// WillInvertAllUses.
218 /// If Builder is nonnull, it will return a simplified ~V.
219 /// If Builder is null, it will return an arbitrary nonnull value (not
220 /// dereferenceable).
221 /// If the inversion will consume instructions, `DoesConsume` will be set to
222 /// true. Otherwise it will be false.
223 LLVM_ABI Value *getFreelyInvertedImpl(Value *V, bool WillInvertAllUses,
224 BuilderTy *Builder, bool &DoesConsume,
225 unsigned Depth);
226
227 Value *getFreelyInverted(Value *V, bool WillInvertAllUses,
228 BuilderTy *Builder, bool &DoesConsume) {
229 DoesConsume = false;
230 return getFreelyInvertedImpl(V, WillInvertAllUses, Builder, DoesConsume,
231 /*Depth*/ 0);
232 }
233
234 Value *getFreelyInverted(Value *V, bool WillInvertAllUses,
236 bool Unused;
237 return getFreelyInverted(V, WillInvertAllUses, Builder, Unused);
238 }
239
240 /// Return true if the specified value is free to invert (apply ~ to).
241 /// This happens in cases where the ~ can be eliminated. If WillInvertAllUses
242 /// is true, work under the assumption that the caller intends to remove all
243 /// uses of V and only keep uses of ~V.
244 ///
245 /// See also: canFreelyInvertAllUsersOf()
246 bool isFreeToInvert(Value *V, bool WillInvertAllUses,
247 bool &DoesConsume) {
248 return getFreelyInverted(V, WillInvertAllUses, /*Builder*/ nullptr,
249 DoesConsume) != nullptr;
250 }
251
252 bool isFreeToInvert(Value *V, bool WillInvertAllUses) {
253 bool Unused;
254 return isFreeToInvert(V, WillInvertAllUses, Unused);
255 }
256
257 /// Given i1 V, can every user of V be freely adapted if V is changed to !V ?
258 /// InstCombine's freelyInvertAllUsersOf() must be kept in sync with this fn.
259 /// NOTE: for Instructions only!
260 ///
261 /// See also: isFreeToInvert()
263 // Look at every user of V.
264 for (Use &U : V->uses()) {
265 if (U.getUser() == IgnoredUser)
266 continue; // Don't consider this user.
267
268 auto *I = cast<Instruction>(U.getUser());
269 switch (I->getOpcode()) {
270 case Instruction::Select:
271 if (U.getOperandNo() != 0) // Only if the value is used as select cond.
272 return false;
274 return false;
275 break;
276 case Instruction::CondBr:
277 assert(U.getOperandNo() == 0 && "Must be branching on that value.");
278 break; // Free to invert by swapping true/false values/destinations.
279 case Instruction::Xor: // Can invert 'xor' if it's a 'not', by ignoring
280 // it.
282 return false; // Not a 'not'.
283 break;
284 default:
285 return false; // Don't know, likely not freely invertible.
286 }
287 // So far all users were free to invert...
288 }
289 return true; // Can freely invert all users!
290 }
291
292 /// Some binary operators require special handling to avoid poison and
293 /// undefined behavior. If a constant vector has undef elements, replace those
294 /// undefs with identity constants if possible because those are always safe
295 /// to execute. If no identity constant exists, replace undef with some other
296 /// safe constant.
297 static Constant *
299 bool IsRHSConstant) {
300 auto *InVTy = cast<FixedVectorType>(In->getType());
301
302 Type *EltTy = InVTy->getElementType();
303 auto *SafeC = ConstantExpr::getBinOpIdentity(Opcode, EltTy, IsRHSConstant);
304 if (!SafeC) {
305 // TODO: Should this be available as a constant utility function? It is
306 // similar to getBinOpAbsorber().
307 if (IsRHSConstant) {
308 switch (Opcode) {
309 case Instruction::SRem: // X % 1 = 0
310 case Instruction::URem: // X %u 1 = 0
311 SafeC = ConstantInt::get(EltTy, 1);
312 break;
313 case Instruction::FRem: // X % 1.0 (doesn't simplify, but it is safe)
314 SafeC = ConstantFP::get(EltTy, 1.0);
315 break;
316 default:
318 "Only rem opcodes have no identity constant for RHS");
319 }
320 } else {
321 switch (Opcode) {
322 case Instruction::Shl: // 0 << X = 0
323 case Instruction::LShr: // 0 >>u X = 0
324 case Instruction::AShr: // 0 >> X = 0
325 case Instruction::SDiv: // 0 / X = 0
326 case Instruction::UDiv: // 0 /u X = 0
327 case Instruction::SRem: // 0 % X = 0
328 case Instruction::URem: // 0 %u X = 0
329 case Instruction::Sub: // 0 - X (doesn't simplify, but it is safe)
330 case Instruction::FSub: // 0.0 - X (doesn't simplify, but it is safe)
331 case Instruction::FDiv: // 0.0 / X (doesn't simplify, but it is safe)
332 case Instruction::FRem: // 0.0 % X = 0
333 SafeC = Constant::getNullValue(EltTy);
334 break;
335 default:
336 llvm_unreachable("Expected to find identity constant for opcode");
337 }
338 }
339 }
340 assert(SafeC && "Must have safe constant for binop");
341 unsigned NumElts = InVTy->getNumElements();
342 SmallVector<Constant *, 16> Out(NumElts);
343 for (unsigned i = 0; i != NumElts; ++i) {
344 Constant *C = In->getAggregateElement(i);
345 Out[i] = isa<UndefValue>(C) ? SafeC : C;
346 }
347 return ConstantVector::get(Out);
348 }
349
350 /// Ignore all operations which only change the sign of a value, returning the
351 /// underlying magnitude value.
353 using namespace llvm::PatternMatch;
354
355 match(Val, m_FNeg(m_Value(Val)));
356 match(Val, m_FAbs(m_Value(Val)));
357 match(Val, m_CopySign(m_Value(Val), m_Value()));
358 return Val;
359 }
360
362
363 Module &getModule() const { return *F.getParent(); }
366 DominatorTree &getDominatorTree() const { return DT; }
367 const DataLayout &getDataLayout() const { return DL; }
368 const SimplifyQuery &getSimplifyQuery() const { return SQ; }
374
375 // Call target specific combiners
376 LLVM_ABI std::optional<Instruction *>
377 targetInstCombineIntrinsic(IntrinsicInst &II);
378 LLVM_ABI std::optional<Value *>
379 targetSimplifyDemandedUseBitsIntrinsic(IntrinsicInst &II, APInt DemandedMask,
381 bool &KnownBitsComputed);
382 LLVM_ABI std::optional<Value *> targetSimplifyDemandedVectorEltsIntrinsic(
383 IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts,
384 APInt &UndefElts2, APInt &UndefElts3,
385 std::function<void(Instruction *, unsigned, APInt, APInt &)>
386 SimplifyAndSetOp);
387
388 LLVM_ABI void computeBackEdges();
389 bool isBackEdge(const BasicBlock *From, const BasicBlock *To) {
392 return BackEdges.contains({From, To});
393 }
394
395 /// Inserts an instruction \p New before instruction \p Old
396 ///
397 /// Also adds the new instruction to the worklist and returns \p New so that
398 /// it is suitable for use as the return from the visitation patterns.
400 assert(New && !New->getParent() &&
401 "New instruction already inserted into a basic block!");
402 New->insertBefore(Old); // Insert inst
403 Worklist.add(New);
404 return New;
405 }
406
407 /// Same as InsertNewInstBefore, but also sets the debug loc.
409 New->setDebugLoc(Old->getDebugLoc());
410 return InsertNewInstBefore(New, Old);
411 }
412
413 /// A combiner-aware RAUW-like routine.
414 ///
415 /// This method is to be used when an instruction is found to be dead,
416 /// replaceable with another preexisting expression. Here we add all uses of
417 /// I to the worklist, replace all uses of I with the new value, then return
418 /// I, so that the inst combiner will know that I was modified.
420 // If there are no uses to replace, then we return nullptr to indicate that
421 // no changes were made to the program.
422 if (I.use_empty()) return nullptr;
423
424 Worklist.pushUsersToWorkList(I); // Add all modified instrs to worklist.
425
426 // If we are replacing the instruction with itself, this must be in a
427 // segment of unreachable code, so just clobber the instruction.
428 if (&I == V)
429 V = PoisonValue::get(I.getType());
430
431 LLVM_DEBUG(dbgs() << "IC: Replacing " << I << "\n"
432 << " with " << *V << '\n');
433
434 // If V is a new unnamed instruction, take the name from the old one.
435 if (V->use_empty() && isa<Instruction>(V) && !V->hasName() && I.hasName())
436 V->takeName(&I);
437
438 I.replaceAllUsesWith(V);
439 return &I;
440 }
441
442 /// Replace operand of instruction and add old operand to the worklist.
444 Value *OldOp = I.getOperand(OpNum);
445 I.setOperand(OpNum, V);
446 Worklist.handleUseCountDecrement(OldOp);
447 return &I;
448 }
449
450 /// Replace use and add the previously used value to the worklist.
451 void replaceUse(Use &U, Value *NewValue) {
452 Value *OldOp = U;
453 U = NewValue;
454 Worklist.handleUseCountDecrement(OldOp);
455 }
456
457 /// Combiner aware instruction erasure.
458 ///
459 /// When dealing with an instruction that has side effects or produces a void
460 /// value, we can't rely on DCE to delete the instruction. Instead, visit
461 /// methods should return the value returned by this function.
463
465 const Instruction *CtxI, unsigned Depth = 0) const {
466 llvm::computeKnownBits(V, Known, SQ.getWithInstruction(CtxI), Depth);
467 }
468
470 unsigned Depth = 0) const {
471 return llvm::computeKnownBits(V, SQ.getWithInstruction(CtxI), Depth);
472 }
473
474 bool isKnownToBeAPowerOfTwo(const Value *V, bool OrZero = false,
475 const Instruction *CtxI = nullptr,
476 unsigned Depth = 0) {
477 return llvm::isKnownToBeAPowerOfTwo(V, OrZero, SQ.getWithInstruction(CtxI),
478 Depth);
479 }
480
481 bool MaskedValueIsZero(const Value *V, const APInt &Mask,
482 const Instruction *CtxI = nullptr,
483 unsigned Depth = 0) const {
484 return llvm::MaskedValueIsZero(V, Mask, SQ.getWithInstruction(CtxI), Depth);
485 }
486
487 unsigned ComputeNumSignBits(const Value *Op,
488 const Instruction *CtxI = nullptr,
489 unsigned Depth = 0) const {
490 return llvm::ComputeNumSignBits(Op, DL, &AC, CtxI, &DT, Depth);
491 }
492
494 const Instruction *CtxI = nullptr,
495 unsigned Depth = 0) const {
496 return llvm::ComputeMaxSignificantBits(Op, DL, &AC, CtxI, &DT, Depth);
497 }
498
499 /// Return true if the cast from integer to FP can be proven to be exact
500 /// for all possible inputs (the conversion does not lose any precision).
501 LLVM_ABI bool isKnownExactCastIntToFP(CastInst &I) const;
502 LLVM_ABI bool
503 canBeCastedExactlyIntToFP(Value *V, Type *FPTy, bool IsSigned,
504 const Instruction *CtxI = nullptr) const;
505
507 const Value *RHS,
508 const Instruction *CtxI,
509 bool IsNSW = false) const {
511 LHS, RHS, SQ.getWithInstruction(CtxI), IsNSW);
512 }
513
515 const Instruction *CtxI) const {
517 SQ.getWithInstruction(CtxI));
518 }
519
523 const Instruction *CtxI) const {
525 SQ.getWithInstruction(CtxI));
526 }
527
531 const Instruction *CtxI) const {
533 SQ.getWithInstruction(CtxI));
534 }
535
537 const Value *RHS,
538 const Instruction *CtxI) const {
540 SQ.getWithInstruction(CtxI));
541 }
542
544 const Instruction *CtxI) const {
546 SQ.getWithInstruction(CtxI));
547 }
548
549 virtual bool SimplifyDemandedBits(Instruction *I, unsigned OpNo,
550 const APInt &DemandedMask, KnownBits &Known,
551 const SimplifyQuery &Q,
552 unsigned Depth = 0) = 0;
553
554 bool SimplifyDemandedBits(Instruction *I, unsigned OpNo,
555 const APInt &DemandedMask, KnownBits &Known) {
556 return SimplifyDemandedBits(I, OpNo, DemandedMask, Known,
557 SQ.getWithInstruction(I));
558 }
559
560 virtual Value *
561 SimplifyDemandedVectorElts(Value *V, APInt DemandedElts, APInt &UndefElts,
562 unsigned Depth = 0,
563 bool AllowMultipleUsers = false) = 0;
564
565 LLVM_ABI bool isValidAddrSpaceCast(unsigned FromAS, unsigned ToAS) const;
566};
567
568} // namespace llvm
569
570#undef DEBUG_TYPE
571
572#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static const Function * getParent(const Value *V)
IRBuilder< TargetFolder, NoSanitizeInserter > BuilderTy
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
#define LLVM_ABI
Definition Compiler.h:215
#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
Value * RHS
Value * LHS
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:122
This provides the default implementation of the IRBuilder 'InsertHelper' method that is called whenev...
Definition IRBuilder.h:62
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition IRBuilder.h:2918
SimplifyQuery SQ
OverflowResult computeOverflowForSignedMul(const Value *LHS, const Value *RHS, const Instruction *CtxI) const
const DataLayout & getDataLayout() const
bool isFreeToInvert(Value *V, bool WillInvertAllUses)
virtual Instruction * eraseInstFromFunction(Instruction &I)=0
Combiner aware instruction erasure.
Module & getModule() const
bool isFreeToInvert(Value *V, bool WillInvertAllUses, bool &DoesConsume)
Return true if the specified value is free to invert (apply ~ to).
DominatorTree & getDominatorTree() const
virtual ~InstCombiner()=default
BlockFrequencyInfo * BFI
static unsigned getComplexity(Value *V)
Assign a complexity or rank value to LLVM Values.
unsigned ComputeMaxSignificantBits(const Value *Op, const Instruction *CtxI=nullptr, unsigned Depth=0) const
bool isKnownToBeAPowerOfTwo(const Value *V, bool OrZero=false, const Instruction *CtxI=nullptr, unsigned Depth=0)
SmallDenseMap< BasicBlock *, SmallVector< BasicBlock * >, 8 > PredOrder
Order of predecessors to canonicalize phi nodes towards.
TargetLibraryInfo & TLI
TargetLibraryInfo & getTargetLibraryInfo() 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.
static bool shouldAvoidAbsorbingNotIntoSelect(const SelectInst &SI)
static Constant * SubOne(Constant *C)
Subtract one from a Constant.
OverflowResult computeOverflowForUnsignedSub(const Value *LHS, const Value *RHS, const Instruction *CtxI) const
void replaceUse(Use &U, Value *NewValue)
Replace use and add the previously used value to the worklist.
static bool isCanonicalPredicate(CmpPredicate Pred)
Predicate canonicalization reduces the number of patterns that need to be matched by other transforms...
Instruction * AnnotationMetadataSource
Source for annotation metadata, used by the IRBuilder inserter.
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)
InstCombiner(InstructionWorklist &Worklist, 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)
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
unsigned ComputeNumSignBits(const Value *Op, const Instruction *CtxI=nullptr, unsigned Depth=0) const
bool MaskedValueIsZero(const Value *V, const APInt &Mask, const Instruction *CtxI=nullptr, unsigned Depth=0) const
const bool MinimizeSize
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...
IRBuilder< TargetFolder, IRBuilderInstCombineInserter > BuilderTy
An IRBuilder that automatically inserts new instructions into the worklist.
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)
OverflowResult computeOverflowForSignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const Instruction *CtxI) const
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...
KnownBits computeKnownBits(const Value *V, const Instruction *CtxI, unsigned Depth=0) const
Instruction * replaceOperand(Instruction &I, unsigned OpNum, Value *V)
Replace operand of instruction and add old operand to the worklist.
OverflowResult computeOverflowForUnsignedMul(const Value *LHS, const Value *RHS, const Instruction *CtxI, bool IsNSW=false) const
OverflowResult computeOverflowForSignedSub(const Value *LHS, const Value *RHS, const Instruction *CtxI) 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.
ProfileSummaryInfo * getProfileSummaryInfo() const
OptimizationRemarkEmitter & getOptimizationRemarkEmitter() const
ProfileSummaryInfo * PSI
SmallDenseSet< std::pair< BasicBlock *, BasicBlock * >, 8 > DeadEdges
Edges that are known to never be taken.
OverflowResult computeOverflowForUnsignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const Instruction *CtxI) const
AssumptionCache & getAssumptionCache() const
OptimizationRemarkEmitter & ORE
LLVM_ABI bool isValidAddrSpaceCast(unsigned FromAS, unsigned ToAS) const
void computeKnownBits(const Value *V, KnownBits &Known, const Instruction *CtxI, unsigned Depth=0) const
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.
InstructionWorklist - This is the worklist management logic for InstCombine and other simplification ...
A wrapper class for inspecting calls to intrinsic functions.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
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:293
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
TargetFolder - Create constants with target dependent folding.
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.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
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:382
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
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_CopySign(const Opnd0 &Op0, const Opnd1 &Op1)
auto m_Value()
Match an arbitrary value and ignore it.
auto m_FAbs(const Opnd0 &Op0)
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'.
This is an optimization pass for GlobalISel generic memory operations.
@ Known
Known to have no common set bits.
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 void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CtxI=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 unsigned ComputeNumSignBits(const Value *Op, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CtxI=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 unsigned ComputeMaxSignificantBits(const Value *Op, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CtxI=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 bool isKnownToBeAPowerOfTwo(const Value *V, const DataLayout &DL, bool OrZero=false, AssumptionCache *AC=nullptr, const Instruction *CtxI=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.
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 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 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 OverflowResult computeOverflowForUnsignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const SimplifyQuery &SQ)