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 // TODO: Confirm whether m_FNegOrFSubNegZero is correct.
167 if (isa<CastInst>(V) || match(V, m_Neg(m_Value())) ||
169 return 2;
170
171 return 3;
172 }
173
174 /// Predicate canonicalization reduces the number of patterns that need to be
175 /// matched by other transforms. For example, we may swap the operands of a
176 /// conditional branch or select to create a compare with a canonical
177 /// (inverted) predicate which is then more likely to be matched with other
178 /// values.
180 switch (Pred) {
181 case CmpInst::ICMP_NE:
186 // TODO: There are 16 FCMP predicates. Should others be (not) canonical?
190 return false;
191 default:
192 return true;
193 }
194 }
195
196 /// Add one to a Constant
198 return ConstantExpr::getAdd(C, ConstantInt::get(C->getType(), 1));
199 }
200
201 /// Subtract one from a Constant
203 return ConstantExpr::getSub(C, ConstantInt::get(C->getType(), 1));
204 }
205
207 // a ? b : false and a ? true : b are the canonical form of logical and/or.
208 // This includes !a ? b : false and !a ? true : b. Absorbing the not into
209 // the select by swapping operands would break recognition of this pattern
210 // in other analyses, so don't do that.
215 }
216
217 /// Return nonnull value if V is free to invert under the condition of
218 /// WillInvertAllUses.
219 /// If Builder is nonnull, it will return a simplified ~V.
220 /// If Builder is null, it will return an arbitrary nonnull value (not
221 /// dereferenceable).
222 /// If the inversion will consume instructions, `DoesConsume` will be set to
223 /// true. Otherwise it will be false.
224 LLVM_ABI Value *getFreelyInvertedImpl(Value *V, bool WillInvertAllUses,
225 BuilderTy *Builder, bool &DoesConsume,
226 unsigned Depth);
227
228 Value *getFreelyInverted(Value *V, bool WillInvertAllUses,
229 BuilderTy *Builder, bool &DoesConsume) {
230 DoesConsume = false;
231 return getFreelyInvertedImpl(V, WillInvertAllUses, Builder, DoesConsume,
232 /*Depth*/ 0);
233 }
234
235 Value *getFreelyInverted(Value *V, bool WillInvertAllUses,
237 bool Unused;
238 return getFreelyInverted(V, WillInvertAllUses, Builder, Unused);
239 }
240
241 /// Return true if the specified value is free to invert (apply ~ to).
242 /// This happens in cases where the ~ can be eliminated. If WillInvertAllUses
243 /// is true, work under the assumption that the caller intends to remove all
244 /// uses of V and only keep uses of ~V.
245 ///
246 /// See also: canFreelyInvertAllUsersOf()
247 bool isFreeToInvert(Value *V, bool WillInvertAllUses,
248 bool &DoesConsume) {
249 return getFreelyInverted(V, WillInvertAllUses, /*Builder*/ nullptr,
250 DoesConsume) != nullptr;
251 }
252
253 bool isFreeToInvert(Value *V, bool WillInvertAllUses) {
254 bool Unused;
255 return isFreeToInvert(V, WillInvertAllUses, Unused);
256 }
257
258 /// Given i1 V, can every user of V be freely adapted if V is changed to !V ?
259 /// InstCombine's freelyInvertAllUsersOf() must be kept in sync with this fn.
260 /// NOTE: for Instructions only!
261 ///
262 /// See also: isFreeToInvert()
264 // Look at every user of V.
265 for (Use &U : V->uses()) {
266 if (U.getUser() == IgnoredUser)
267 continue; // Don't consider this user.
268
269 auto *I = cast<Instruction>(U.getUser());
270 switch (I->getOpcode()) {
271 case Instruction::Select:
272 if (U.getOperandNo() != 0) // Only if the value is used as select cond.
273 return false;
275 return false;
276 break;
277 case Instruction::CondBr:
278 assert(U.getOperandNo() == 0 && "Must be branching on that value.");
279 break; // Free to invert by swapping true/false values/destinations.
280 case Instruction::Xor: // Can invert 'xor' if it's a 'not', by ignoring
281 // it.
283 return false; // Not a 'not'.
284 break;
285 default:
286 return false; // Don't know, likely not freely invertible.
287 }
288 // So far all users were free to invert...
289 }
290 return true; // Can freely invert all users!
291 }
292
293 /// Some binary operators require special handling to avoid poison and
294 /// undefined behavior. If a constant vector has undef elements, replace those
295 /// undefs with identity constants if possible because those are always safe
296 /// to execute. If no identity constant exists, replace undef with some other
297 /// safe constant.
298 static Constant *
300 bool IsRHSConstant) {
301 auto *InVTy = cast<FixedVectorType>(In->getType());
302
303 Type *EltTy = InVTy->getElementType();
304 auto *SafeC = ConstantExpr::getBinOpIdentity(Opcode, EltTy, IsRHSConstant);
305 if (!SafeC) {
306 // TODO: Should this be available as a constant utility function? It is
307 // similar to getBinOpAbsorber().
308 if (IsRHSConstant) {
309 switch (Opcode) {
310 case Instruction::SRem: // X % 1 = 0
311 case Instruction::URem: // X %u 1 = 0
312 SafeC = ConstantInt::get(EltTy, 1);
313 break;
314 case Instruction::FRem: // X % 1.0 (doesn't simplify, but it is safe)
315 SafeC = ConstantFP::get(EltTy, 1.0);
316 break;
317 default:
319 "Only rem opcodes have no identity constant for RHS");
320 }
321 } else {
322 switch (Opcode) {
323 case Instruction::Shl: // 0 << X = 0
324 case Instruction::LShr: // 0 >>u X = 0
325 case Instruction::AShr: // 0 >> X = 0
326 case Instruction::SDiv: // 0 / X = 0
327 case Instruction::UDiv: // 0 /u X = 0
328 case Instruction::SRem: // 0 % X = 0
329 case Instruction::URem: // 0 %u X = 0
330 case Instruction::Sub: // 0 - X (doesn't simplify, but it is safe)
331 case Instruction::FSub: // 0.0 - X (doesn't simplify, but it is safe)
332 case Instruction::FDiv: // 0.0 / X (doesn't simplify, but it is safe)
333 case Instruction::FRem: // 0.0 % X = 0
334 SafeC = Constant::getNullValue(EltTy);
335 break;
336 default:
337 llvm_unreachable("Expected to find identity constant for opcode");
338 }
339 }
340 }
341 assert(SafeC && "Must have safe constant for binop");
342 unsigned NumElts = InVTy->getNumElements();
343 SmallVector<Constant *, 16> Out(NumElts);
344 for (unsigned i = 0; i != NumElts; ++i) {
345 Constant *C = In->getAggregateElement(i);
346 Out[i] = isa<UndefValue>(C) ? SafeC : C;
347 }
348 return ConstantVector::get(Out);
349 }
350
351 /// Ignore all operations which only change the sign of a value, returning the
352 /// underlying magnitude value.
354 using namespace llvm::PatternMatch;
355
356 // TODO: Confirm whether m_FNegOrFSubNegZero is correct.
358 match(Val, m_FAbs(m_Value(Val)));
359 match(Val, m_CopySign(m_Value(Val), m_Value()));
360 return Val;
361 }
362
364
365 Module &getModule() const { return *F.getParent(); }
368 DominatorTree &getDominatorTree() const { return DT; }
369 const DataLayout &getDataLayout() const { return DL; }
370 const SimplifyQuery &getSimplifyQuery() const { return SQ; }
376
377 // Call target specific combiners
378 LLVM_ABI std::optional<Instruction *>
379 targetInstCombineIntrinsic(IntrinsicInst &II);
380 LLVM_ABI std::optional<Value *>
381 targetSimplifyDemandedUseBitsIntrinsic(IntrinsicInst &II, APInt DemandedMask,
383 bool &KnownBitsComputed);
384 LLVM_ABI std::optional<Value *> targetSimplifyDemandedVectorEltsIntrinsic(
385 IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts,
386 APInt &UndefElts2, APInt &UndefElts3,
387 std::function<void(Instruction *, unsigned, APInt, APInt &)>
388 SimplifyAndSetOp);
389
390 LLVM_ABI void computeBackEdges();
391 bool isBackEdge(const BasicBlock *From, const BasicBlock *To) {
394 return BackEdges.contains({From, To});
395 }
396
397 /// Inserts an instruction \p New before instruction \p Old
398 ///
399 /// Also adds the new instruction to the worklist and returns \p New so that
400 /// it is suitable for use as the return from the visitation patterns.
402 assert(New && !New->getParent() &&
403 "New instruction already inserted into a basic block!");
404 New->insertBefore(Old); // Insert inst
405 Worklist.add(New);
406 return New;
407 }
408
409 /// Same as InsertNewInstBefore, but also sets the debug loc.
411 New->setDebugLoc(Old->getDebugLoc());
412 return InsertNewInstBefore(New, Old);
413 }
414
415 /// A combiner-aware RAUW-like routine.
416 ///
417 /// This method is to be used when an instruction is found to be dead,
418 /// replaceable with another preexisting expression. Here we add all uses of
419 /// I to the worklist, replace all uses of I with the new value, then return
420 /// I, so that the inst combiner will know that I was modified.
422 // If there are no uses to replace, then we return nullptr to indicate that
423 // no changes were made to the program.
424 if (I.use_empty()) return nullptr;
425
426 Worklist.pushUsersToWorkList(I); // Add all modified instrs to worklist.
427
428 // If we are replacing the instruction with itself, this must be in a
429 // segment of unreachable code, so just clobber the instruction.
430 if (&I == V)
431 V = PoisonValue::get(I.getType());
432
433 LLVM_DEBUG(dbgs() << "IC: Replacing " << I << "\n"
434 << " with " << *V << '\n');
435
436 // If V is a new unnamed instruction, take the name from the old one.
437 if (V->use_empty() && isa<Instruction>(V) && !V->hasName() && I.hasName())
438 V->takeName(&I);
439
440 I.replaceAllUsesWith(V);
441 return &I;
442 }
443
444 /// Replace operand of instruction and add old operand to the worklist.
446 Value *OldOp = I.getOperand(OpNum);
447 I.setOperand(OpNum, V);
448 Worklist.handleUseCountDecrement(OldOp);
449 return &I;
450 }
451
452 /// Replace use and add the previously used value to the worklist.
453 void replaceUse(Use &U, Value *NewValue) {
454 Value *OldOp = U;
455 U = NewValue;
456 Worklist.handleUseCountDecrement(OldOp);
457 }
458
459 /// Combiner aware instruction erasure.
460 ///
461 /// When dealing with an instruction that has side effects or produces a void
462 /// value, we can't rely on DCE to delete the instruction. Instead, visit
463 /// methods should return the value returned by this function.
465
467 const Instruction *CtxI, unsigned Depth = 0) const {
468 llvm::computeKnownBits(V, Known, SQ.getWithInstruction(CtxI), Depth);
469 }
470
472 unsigned Depth = 0) const {
473 return llvm::computeKnownBits(V, SQ.getWithInstruction(CtxI), Depth);
474 }
475
476 bool isKnownToBeAPowerOfTwo(const Value *V, bool OrZero = false,
477 const Instruction *CtxI = nullptr,
478 unsigned Depth = 0) {
479 return llvm::isKnownToBeAPowerOfTwo(V, OrZero, SQ.getWithInstruction(CtxI),
480 Depth);
481 }
482
483 bool MaskedValueIsZero(const Value *V, const APInt &Mask,
484 const Instruction *CtxI = nullptr,
485 unsigned Depth = 0) const {
486 return llvm::MaskedValueIsZero(V, Mask, SQ.getWithInstruction(CtxI), Depth);
487 }
488
489 unsigned ComputeNumSignBits(const Value *Op,
490 const Instruction *CtxI = nullptr,
491 unsigned Depth = 0) const {
492 return llvm::ComputeNumSignBits(Op, DL, &AC, CtxI, &DT, Depth);
493 }
494
496 const Instruction *CtxI = nullptr,
497 unsigned Depth = 0) const {
498 return llvm::ComputeMaxSignificantBits(Op, DL, &AC, CtxI, &DT, Depth);
499 }
500
501 /// Return true if the cast from integer to FP can be proven to be exact
502 /// for all possible inputs (the conversion does not lose any precision).
503 LLVM_ABI bool isKnownExactCastIntToFP(CastInst &I) const;
504 LLVM_ABI bool
505 canBeCastedExactlyIntToFP(Value *V, Type *FPTy, bool IsSigned,
506 const Instruction *CtxI = nullptr) const;
507
509 const Value *RHS,
510 const Instruction *CtxI,
511 bool IsNSW = false) const {
513 LHS, RHS, SQ.getWithInstruction(CtxI), IsNSW);
514 }
515
517 const Instruction *CtxI) const {
519 SQ.getWithInstruction(CtxI));
520 }
521
525 const Instruction *CtxI) const {
527 SQ.getWithInstruction(CtxI));
528 }
529
533 const Instruction *CtxI) const {
535 SQ.getWithInstruction(CtxI));
536 }
537
539 const Value *RHS,
540 const Instruction *CtxI) const {
542 SQ.getWithInstruction(CtxI));
543 }
544
546 const Instruction *CtxI) const {
548 SQ.getWithInstruction(CtxI));
549 }
550
551 virtual bool SimplifyDemandedBits(Instruction *I, unsigned OpNo,
552 const APInt &DemandedMask, KnownBits &Known,
553 const SimplifyQuery &Q,
554 unsigned Depth = 0) = 0;
555
556 bool SimplifyDemandedBits(Instruction *I, unsigned OpNo,
557 const APInt &DemandedMask, KnownBits &Known) {
558 return SimplifyDemandedBits(I, OpNo, DemandedMask, Known,
559 SQ.getWithInstruction(I));
560 }
561
562 virtual Value *
563 SimplifyDemandedVectorElts(Value *V, APInt DemandedElts, APInt &UndefElts,
564 unsigned Depth = 0,
565 bool AllowMultipleUsers = false) = 0;
566
567 LLVM_ABI bool isValidAddrSpaceCast(unsigned FromAS, unsigned ToAS) const;
568};
569
570} // namespace llvm
571
572#undef DEBUG_TYPE
573
574#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:211
#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:44
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:2909
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.
FNeg_match< OpTy, true > m_FNegOrFSubNegZero(const OpTy &X)
Match fneg X or fsub -0.0, X.
auto m_FAbs(const Opnd0 &Op0)
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)