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