LLVM 24.0.0git
InstCombineInternal.h
Go to the documentation of this file.
1//===- InstCombineInternal.h - InstCombine pass internals -------*- 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//
9/// \file
10///
11/// This file provides internal interfaces used to implement the InstCombine.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_LIB_TRANSFORMS_INSTCOMBINE_INSTCOMBINEINTERNAL_H
16#define LLVM_LIB_TRANSFORMS_INSTCOMBINE_INSTCOMBINEINTERNAL_H
17
20#include "llvm/ADT/Statistic.h"
24#include "llvm/IR/IRBuilder.h"
25#include "llvm/IR/InstVisitor.h"
28#include "llvm/IR/Value.h"
29#include "llvm/Support/Debug.h"
34#include <cassert>
35
36#define DEBUG_TYPE "instcombine"
38
39// Let's guesstimate that most often we will end up visiting/producing
40// fairly small number of new instructions.
41static constexpr unsigned NegatorMaxNodesSSO = 16;
42
43namespace llvm {
44
45class AAResults;
46class APInt;
47class AssumptionCache;
48class BlockFrequencyInfo;
49class DataLayout;
50class DominatorTree;
51class GEPOperator;
52class GlobalVariable;
53class OptimizationRemarkEmitter;
54class ProfileSummaryInfo;
55class TargetLibraryInfo;
56class User;
57
58/// Enum to specify how shift operations should be evaluated in
59/// canEvaluateShifted.
60/// Lossy: Allows lossy transformations
61/// Signed: Requires lossless transformation, using ashr to restore for shl,
62/// or represents ashr handling for right shifts
63/// Unsigned: Requires lossless transformation, using lshr to restore for shl,
64/// or represents lshr handling for right shifts
66
68 : public InstCombiner,
69 public InstVisitor<InstCombinerImpl, Instruction *> {
70public:
82
83 ~InstCombinerImpl() override = default;
84
85 const InstCombineCLOptions &CLOpts;
86
87 /// Perform early cleanup and prepare the InstCombine worklist.
89
90 /// Run the combiner over the entire worklist until it is empty.
91 ///
92 /// \returns true if the IR is changed.
93 bool run();
94
95 // Visitation implementation - Implement instruction combining for different
96 // instruction types. The semantics are as follows:
97 // Return Value:
98 // null - No change was made
99 // I - Change was made, I is still valid, I may be dead though
100 // otherwise - Change was made, replace I with returned instruction
101 //
106 Value *LHS, Value *RHS, Type *Ty, bool isNUW);
123 Value *simplifyRangeCheck(CmpPredicate PredL, Value *LHS0, Value *LHS1,
124 CmpPredicate PredR, Value *RHS0, Value *RHS1,
125 Instruction *CtxI, bool Inverted);
134 BinaryOperator *Sh0, const SimplifyQuery &SQ,
135 bool AnalyzeForSignBitExtraction = false);
139 BinaryOperator &OldAShr);
163 template <typename FPToIntTy> Instruction *foldItoFPtoI(FPToIntTy &FI);
170
177 Instruction *visitFree(CallInst &FI, Value *FreedOp);
200 bool freezeOtherUses(FreezeInst &FI);
203
204 /// Specify what to return for unhandled instructions.
206
207 /// True when DB dominates all uses of DI except UI.
208 /// UI must be in the same block as DI.
209 /// The routine checks that the DI parent and DB are different.
210 bool dominatesAllUses(const Instruction *DI, const Instruction *UI,
211 const BasicBlock *DB) const;
212
213 /// Try to replace select with select operand SIOpd in SI-ICmp sequence.
214 bool replacedSelectWithOperand(SelectInst *SI, const ICmpInst *Icmp,
215 const unsigned SIOpd);
216
217 LoadInst *combineLoadToNewType(LoadInst &LI, Type *NewTy,
218 const Twine &Suffix = "");
219
220 /// Check if fmul \p MulVal, +0.0 will yield +0.0 (or signed zero is
221 /// ignorable).
223 const Instruction *CtxI) const;
224
225 std::optional<std::pair<Intrinsic::ID, SmallVector<Value *, 3>>>
227
228private:
229 bool annotateAnyAllocSite(CallBase &Call, const TargetLibraryInfo *TLI);
230 bool isDesirableIntType(unsigned BitWidth) const;
231 bool shouldChangeType(unsigned FromBitWidth, unsigned ToBitWidth) const;
232 bool shouldChangeType(Type *From, Type *To) const;
233 Value *dyn_castNegVal(Value *V) const;
234
235 /// Classify whether a cast is worth optimizing.
236 ///
237 /// This is a helper to decide whether the simplification of
238 /// logic(cast(A), cast(B)) to cast(logic(A, B)) should be performed.
239 ///
240 /// \param CI The cast we are interested in.
241 ///
242 /// \return true if this cast actually results in any code being generated and
243 /// if it cannot already be eliminated by some other transformation.
244 bool shouldOptimizeCast(CastInst *CI);
245
246 /// Try to optimize a sequence of instructions checking if an operation
247 /// on LHS and RHS overflows.
248 ///
249 /// If this overflow check is done via one of the overflow check intrinsics,
250 /// then CtxI has to be the call instruction calling that intrinsic. If this
251 /// overflow check is done by arithmetic followed by a compare, then CtxI has
252 /// to be the arithmetic instruction.
253 ///
254 /// If a simplification is possible, stores the simplified result of the
255 /// operation in OperationResult and result of the overflow check in
256 /// OverflowResult, and return true. If no simplification is possible,
257 /// returns false.
258 bool OptimizeOverflowCheck(Instruction::BinaryOps BinaryOp, bool IsSigned,
259 Value *LHS, Value *RHS,
260 Instruction &CtxI, Value *&OperationResult,
262
263 Instruction *visitCallBase(CallBase &Call);
264 Instruction *tryOptimizeCall(CallInst *CI);
265 bool transformConstExprCastCall(CallBase &Call);
266 Instruction *transformCallThroughTrampoline(CallBase &Call,
267 IntrinsicInst &Tramp);
268
269 /// Try to optimize a call to the result of a ptrauth intrinsic, potentially
270 /// into the ptrauth call bundle:
271 /// - call(ptrauth.resign(p)), ["ptrauth"()] -> call p, ["ptrauth"()]
272 /// - call(ptrauth.sign(p)), ["ptrauth"()] -> call p
273 /// as long as the key/discriminator are the same in sign and auth-bundle,
274 /// and we don't change the key in the bundle (to a potentially-invalid key.)
275 Instruction *foldPtrAuthIntrinsicCallee(CallBase &Call);
276
277 /// Try to optimize a call to a ptrauth constant, into its ptrauth bundle:
278 /// call(ptrauth(f)), ["ptrauth"()] -> call f
279 /// as long as the key/discriminator are the same in constant and bundle.
280 Instruction *foldPtrAuthConstantCallee(CallBase &Call);
281
282 // Return (a, b) if (LHS, RHS) is known to be (a, b) or (b, a).
283 // Otherwise, return std::nullopt
284 // Currently it matches:
285 // - LHS = (select c, a, b), RHS = (select c, b, a)
286 // - LHS = (phi [a, BB0], [b, BB1]), RHS = (phi [b, BB0], [a, BB1])
287 // - LHS = min(a, b), RHS = max(a, b)
288 std::optional<std::pair<Value *, Value *>> matchSymmetricPair(Value *LHS,
289 Value *RHS);
290
291 Value *simplifyMaskedLoad(IntrinsicInst &II);
292 Instruction *simplifyMaskedStore(IntrinsicInst &II);
293 Instruction *simplifyMaskedGather(IntrinsicInst &II);
294 Instruction *simplifyMaskedScatter(IntrinsicInst &II);
295
296 /// Transform (zext icmp) to bitwise / integer operations in order to
297 /// eliminate it.
298 ///
299 /// \param ICI The icmp of the (zext icmp) pair we are interested in.
300 /// \parem CI The zext of the (zext icmp) pair we are interested in.
301 ///
302 /// \return null if the transformation cannot be performed. If the
303 /// transformation can be performed the new instruction that replaces the
304 /// (zext icmp) pair will be returned.
305 Instruction *transformZExtICmp(ICmpInst *Cmp, ZExtInst &Zext);
306
307 Instruction *transformSExtICmp(ICmpInst *Cmp, SExtInst &Sext);
308
309 bool willNotOverflowSignedAdd(const WithCache<const Value *> &LHS,
311 const Instruction &CtxI) const {
312 return computeOverflowForSignedAdd(LHS, RHS, &CtxI) ==
314 }
315
316 bool willNotOverflowUnsignedAdd(const WithCache<const Value *> &LHS,
318 const Instruction &CtxI) const {
319 return computeOverflowForUnsignedAdd(LHS, RHS, &CtxI) ==
321 }
322
323 bool willNotOverflowAdd(const Value *LHS, const Value *RHS,
324 const Instruction &CtxI, bool IsSigned) const {
325 return IsSigned ? willNotOverflowSignedAdd(LHS, RHS, CtxI)
326 : willNotOverflowUnsignedAdd(LHS, RHS, CtxI);
327 }
328
329 bool willNotOverflowSignedSub(const Value *LHS, const Value *RHS,
330 const Instruction &CtxI) const {
331 return computeOverflowForSignedSub(LHS, RHS, &CtxI) ==
332 OverflowResult::NeverOverflows;
333 }
334
335 bool willNotOverflowUnsignedSub(const Value *LHS, const Value *RHS,
336 const Instruction &CtxI) const {
337 return computeOverflowForUnsignedSub(LHS, RHS, &CtxI) ==
338 OverflowResult::NeverOverflows;
339 }
340
341 bool willNotOverflowSub(const Value *LHS, const Value *RHS,
342 const Instruction &CtxI, bool IsSigned) const {
343 return IsSigned ? willNotOverflowSignedSub(LHS, RHS, CtxI)
344 : willNotOverflowUnsignedSub(LHS, RHS, CtxI);
345 }
346
347 bool willNotOverflowSignedMul(const Value *LHS, const Value *RHS,
348 const Instruction &CtxI) const {
349 return computeOverflowForSignedMul(LHS, RHS, &CtxI) ==
350 OverflowResult::NeverOverflows;
351 }
352
353 bool willNotOverflowUnsignedMul(const Value *LHS, const Value *RHS,
354 const Instruction &CtxI,
355 bool IsNSW = false) const {
356 return computeOverflowForUnsignedMul(LHS, RHS, &CtxI, IsNSW) ==
357 OverflowResult::NeverOverflows;
358 }
359
360 bool willNotOverflowMul(const Value *LHS, const Value *RHS,
361 const Instruction &CtxI, bool IsSigned) const {
362 return IsSigned ? willNotOverflowSignedMul(LHS, RHS, CtxI)
363 : willNotOverflowUnsignedMul(LHS, RHS, CtxI);
364 }
365
366 bool willNotOverflow(BinaryOperator::BinaryOps Opcode, const Value *LHS,
367 const Value *RHS, const Instruction &CtxI,
368 bool IsSigned) const {
369 switch (Opcode) {
370 case Instruction::Add: return willNotOverflowAdd(LHS, RHS, CtxI, IsSigned);
371 case Instruction::Sub: return willNotOverflowSub(LHS, RHS, CtxI, IsSigned);
372 case Instruction::Mul: return willNotOverflowMul(LHS, RHS, CtxI, IsSigned);
373 default: llvm_unreachable("Unexpected opcode for overflow query");
374 }
375 }
376
377 Value *EmitGEPOffset(GEPOperator *GEP, bool RewriteGEP = false);
378 /// Emit sum of multiple GEP offsets. The GEPs are processed in reverse
379 /// order.
380 Value *EmitGEPOffsets(ArrayRef<GEPOperator *> GEPs, GEPNoWrapFlags NW,
381 Type *IdxTy, bool RewriteGEPs);
382 Instruction *scalarizePHI(ExtractElementInst &EI, PHINode *PN);
383 Instruction *foldBitcastExtElt(ExtractElementInst &ExtElt);
384 Instruction *foldCastedBitwiseLogic(BinaryOperator &I);
385 Instruction *foldFBinOpOfIntCasts(BinaryOperator &I);
386 // Should only be called by `foldFBinOpOfIntCasts`.
387 Instruction *foldFBinOpOfIntCastsFromSign(
388 BinaryOperator &BO, bool OpsFromSigned, std::array<Value *, 2> IntOps,
389 Constant *Op1FpC, SmallVectorImpl<WithCache<const Value *>> &OpsKnown);
390 Instruction *foldBinopOfSextBoolToSelect(BinaryOperator &I);
391 Instruction *narrowBinOp(TruncInst &Trunc);
392 Instruction *narrowMaskedBinOp(BinaryOperator &And);
393 Instruction *narrowMathIfNoOverflow(BinaryOperator &I);
394 Instruction *narrowFunnelShift(TruncInst &Trunc);
395 Instruction *optimizeBitCastFromPhi(CastInst &CI, PHINode *PN);
396 Instruction *matchSAddSubSat(IntrinsicInst &MinMax1);
397 Instruction *foldNot(BinaryOperator &I);
398 Instruction *foldBinOpOfDisplacedShifts(BinaryOperator &I);
399
400 /// Determine if a pair of casts can be replaced by a single cast.
401 ///
402 /// \param CI1 The first of a pair of casts.
403 /// \param CI2 The second of a pair of casts.
404 ///
405 /// \return 0 if the cast pair cannot be eliminated, otherwise returns an
406 /// Instruction::CastOps value for a cast that can replace the pair, casting
407 /// CI1->getSrcTy() to CI2->getDstTy().
408 ///
409 /// \see CastInst::isEliminableCastPair
410 Instruction::CastOps isEliminableCastPair(const CastInst *CI1,
411 const CastInst *CI2);
412 Value *simplifyIntToPtrRoundTripCast(Value *Val);
413
414 Value *foldAndOrOfICmps(Value *LHS, Value *RHS, Instruction &I, bool IsAnd,
415 bool IsLogical = false);
416 Value *foldXorOfICmps(ICmpInst *LHS, ICmpInst *RHS, BinaryOperator &Xor);
417
418 Value *foldEqOfParts(Value *Cmp0, Value *Cmp1, bool IsAnd);
419
420 Value *foldAndOrOfICmpsUsingRanges(CmpPredicate PredL, Value *LHS0,
421 Value *LHS1, bool LHSOneUse,
422 CmpPredicate PredR, Value *RHS0,
423 Value *RHS1, bool RHSOneUse, bool IsAnd);
424
425 /// Optimize (fcmp)&(fcmp) or (fcmp)|(fcmp).
426 /// NOTE: Unlike most of instcombine, this returns a Value which should
427 /// already be inserted into the function.
428 Value *foldLogicOfFCmps(FCmpInst *LHS, FCmpInst *RHS, bool IsAnd,
429 bool IsLogicalSelect = false);
430
431 Instruction *foldLogicOfIsFPClass(BinaryOperator &Operator, Value *LHS,
432 Value *RHS);
433
434 Value *foldBooleanAndOr(Value *LHS, Value *RHS, Instruction &I, bool IsAnd,
435 bool IsLogical);
436
437 Value *reassociateBooleanAndOr(Value *LHS, Value *X, Value *Y, Instruction &I,
438 bool IsAnd, bool RHSIsLogical);
439
440 Value *foldDisjointOr(Value *LHS, Value *RHS);
441
442 Value *reassociateDisjointOr(Value *LHS, Value *RHS);
443
445 canonicalizeConditionalNegationViaMathToSelect(BinaryOperator &i);
446
447 Value *matchSelectFromAndOr(Value *A, Value *B, Value *C, Value *D,
448 bool InvertFalseVal = false);
449 Value *getSelectCondition(Value *A, Value *B, bool ABIsTheSame);
450
451 bool canEvaluateShifted(Value *V, unsigned NumBits, bool IsLeftShift,
452 ShiftSemantics Semantics, Instruction *CtxI);
453 Value *getShiftedValue(Value *V, unsigned NumBits, bool IsLeftShift,
454 ShiftSemantics Semantics);
455
456 Instruction *foldLShrOverflowBit(BinaryOperator &I);
457 Instruction *foldExtractOfOverflowIntrinsic(ExtractValueInst &EV);
458 Instruction *foldIntrinsicWithOverflowCommon(IntrinsicInst *II);
459 Instruction *foldIntrinsicIsFPClass(IntrinsicInst &II);
460 Instruction *foldFPSignBitOps(BinaryOperator &I);
461 Instruction *foldFDivConstantDivisor(BinaryOperator &I);
462
463 // Optimize one of these forms:
464 // and i1 Op, SI / select i1 Op, i1 SI, i1 false (if IsAnd = true)
465 // or i1 Op, SI / select i1 Op, i1 true, i1 SI (if IsAnd = false)
466 // into simplier select instruction using isImpliedCondition.
467 Instruction *foldAndOrOfSelectUsingImpliedCond(Value *Op, SelectInst &SI,
468 bool IsAnd);
469
470 /// Given that \p CondVal is known to be \p CondIsTrue, try to simplify
471 /// \p SI to one of its arms.
472 Value *simplifyNestedSelectsUsingImpliedCond(SelectInst &SI, Value *CondVal,
473 bool CondIsTrue);
474
475 Instruction *hoistFNegAboveFMulFDiv(Value *FNegOp, Instruction &FMFSource);
476
477 /// Simplify \p V given that it is known to be non-null.
478 /// Returns the simplified value if possible, otherwise returns nullptr.
479 /// If \p UseProvenance is true, the simplification will use provenance-based
480 /// reasoning (if the pointer is known to be dereferenceable in an
481 /// address-space where null is not defined).
482 Value *simplifyNonNullOperand(Value *V, bool UseProvenance,
483 unsigned Depth = 0);
484
485 /// Create `select C, S1, S2`. Use only when the profile cannot be calculated
486 /// from existing profile metadata: if the Function has profiles, this will
487 /// set the profile of this select to "unknown".
488 SelectInst *
489 createSelectInstWithUnknownProfile(Value *C, Value *S1, Value *S2,
490 const Twine &NameStr = "",
491 InsertPosition InsertBefore = nullptr) {
492 auto *Sel = SelectInst::Create(C, S1, S2, NameStr, InsertBefore, nullptr);
494 return Sel;
495 }
496
497public:
498 /// Create and insert the idiom we use to indicate a block is unreachable
499 /// without having to rewrite the CFG from within InstCombine.
501 auto &Ctx = InsertAt->getContext();
502 auto *SI = new StoreInst(ConstantInt::getTrue(Ctx),
504 /*isVolatile*/ false, Align(1));
505 InsertNewInstWith(SI, InsertAt->getIterator());
506 }
507
508 /// Combiner aware instruction erasure.
509 ///
510 /// When dealing with an instruction that has side effects or produces a void
511 /// value, we can't rely on DCE to delete the instruction. Instead, visit
512 /// methods should return the value returned by this function.
514 LLVM_DEBUG(dbgs() << "IC: ERASE " << I << '\n');
515 assert(I.use_empty() && "Cannot erase instruction that is used!");
517
518 // Make sure that we reprocess all operands now that we reduced their
519 // use counts.
520 SmallVector<Value *> Ops(I.operands());
521 Worklist.remove(&I);
522 DC.removeValue(&I);
523 I.eraseFromParent();
524 for (Value *Op : Ops)
525 Worklist.handleUseCountDecrement(Op);
526 MadeIRChange = true;
527 return nullptr; // Don't do anything with FI
528 }
529
530 OverflowResult computeOverflow(
531 Instruction::BinaryOps BinaryOp, bool IsSigned,
532 Value *LHS, Value *RHS, Instruction *CtxI) const;
533
534 /// Performs a few simplifications for operators which are associative
535 /// or commutative.
536 bool SimplifyAssociativeOrCommutative(BinaryOperator &I);
537
538 /// If InnerVal1 and OuterVal form a symmetric pair, and "op" is commutative:
539 /// "(InnerVal0 op InnerVal1) op OuterVal" ==> "(X op' Y) op InnerVal0".
540 /// "OuterVal op (InnerVal0 op InnerVal1)" ==> "InnerVal0 op (X op' Y)".
541 /// X and Y are the inputs to the symmetric pair. "op'" indicates that
542 /// InnerOp will have its poison-generating flags dropped.
543 bool tryReassociateAndFoldSymmetricPair(BinaryOperator &OuterOp,
544 BinaryOperator &InnerOp,
545 Value *InnerVal0, Value *InnerVal1,
546 Value *OuterVal);
547
548 /// Tries to simplify binary operations which some other binary
549 /// operation distributes over.
550 ///
551 /// It does this by either by factorizing out common terms (eg "(A*B)+(A*C)"
552 /// -> "A*(B+C)") or expanding out if this results in simplifications (eg: "A
553 /// & (B | C) -> (A&B) | (A&C)" if this is a win). Returns the simplified
554 /// value, or null if it didn't simplify.
555 Value *foldUsingDistributiveLaws(BinaryOperator &I);
556
557 /// Tries to simplify add operations using the definition of remainder.
558 ///
559 /// The definition of remainder is X % C = X - (X / C ) * C. The add
560 /// expression X % C0 + (( X / C0 ) % C1) * C0 can be simplified to
561 /// X % (C0 * C1)
562 Value *SimplifyAddWithRemainder(BinaryOperator &I);
563
564 // Binary Op helper for select operations where the expression can be
565 // efficiently reorganized.
566 Value *SimplifySelectsFeedingBinaryOp(BinaryOperator &I, Value *LHS,
567 Value *RHS);
568
569 // If `I` has operand `(ctpop (not x))`, fold `I` with `(sub nuw nsw
570 // BitWidth(x), (ctpop x))`.
571 Instruction *tryFoldInstWithCtpopWithNot(Instruction *I);
572
573 // (Binop1 (Binop2 (logic_shift X, C), C1), (logic_shift Y, C))
574 // -> (logic_shift (Binop1 (Binop2 X, inv_logic_shift(C1, C)), Y), C)
575 // (Binop1 (Binop2 (logic_shift X, Amt), Mask), (logic_shift Y, Amt))
576 // -> (BinOp (logic_shift (BinOp X, Y)), Mask)
577 Instruction *foldBinOpShiftWithShift(BinaryOperator &I);
578
579 /// Tries to simplify binops of select and cast of the select condition.
580 ///
581 /// (Binop (cast C), (select C, T, F))
582 /// -> (select C, C0, C1)
583 Instruction *foldBinOpOfSelectAndCastOfSelectCondition(BinaryOperator &I);
584 /// Fold both forms of the div_ceil idiom:
585 /// (add (udiv X, Y), (zext (icmp ne (urem X, Y), 0)))
586 /// -> (udiv (add nuw X, Y-1), Y)
587 /// (add (zext (udiv X, Y)), (zext (icmp ne (urem X, Y), 0)))
588 /// -> (zext (udiv (add nuw X, Y-1), Y))
589 Instruction *foldDivCeil(BinaryOperator &I);
590
591 /// This tries to simplify binary operations by factorizing out common terms
592 /// (e. g. "(A*B)+(A*C)" -> "A*(B+C)").
593 Value *tryFactorizationFolds(BinaryOperator &I);
594
595 /// Match a select chain which produces one of three values based on whether
596 /// the LHS is less than, equal to, or greater than RHS respectively.
597 /// Return true if we matched a three way compare idiom. The LHS, RHS, Less,
598 /// Equal and Greater values are saved in the matching process and returned to
599 /// the caller.
600 bool matchThreeWayIntCompare(SelectInst *SI, Value *&LHS, Value *&RHS,
601 ConstantInt *&Less, ConstantInt *&Equal,
602 ConstantInt *&Greater);
603
604 /// Attempts to replace I with a simpler value based on the demanded
605 /// bits.
606 Value *SimplifyDemandedUseBits(Instruction *I, const APInt &DemandedMask,
607 KnownBits &Known, const SimplifyQuery &Q,
608 unsigned Depth = 0);
610 bool SimplifyDemandedBits(Instruction *I, unsigned Op,
611 const APInt &DemandedMask, KnownBits &Known,
612 const SimplifyQuery &Q,
613 unsigned Depth = 0) override;
614
615 /// Helper routine of SimplifyDemandedUseBits. It computes KnownZero/KnownOne
616 /// bits. It also tries to handle simplifications that can be done based on
617 /// DemandedMask, but without modifying the Instruction.
618 Value *SimplifyMultipleUseDemandedBits(Instruction *I,
619 const APInt &DemandedMask,
621 const SimplifyQuery &Q,
622 unsigned Depth = 0);
623
624 /// Helper routine of SimplifyDemandedUseBits. It tries to simplify demanded
625 /// bit for "r1 = shr x, c1; r2 = shl r1, c2" instruction sequence.
626 Value *simplifyShrShlDemandedBits(
627 Instruction *Shr, const APInt &ShrOp1, Instruction *Shl,
628 const APInt &ShlOp1, const APInt &DemandedMask, KnownBits &Known);
629
630 /// Tries to simplify operands to an integer instruction based on its
631 /// demanded bits.
632 bool SimplifyDemandedInstructionBits(Instruction &Inst);
633 bool SimplifyDemandedInstructionBits(Instruction &Inst, KnownBits &Known);
634
635 Value *SimplifyDemandedVectorElts(Value *V, APInt DemandedElts,
636 APInt &PoisonElts, unsigned Depth = 0,
637 bool AllowMultipleUsers = false) override;
638
639 /// Attempts to replace V with a simpler value based on the demanded
640 /// floating-point classes
641 Value *SimplifyDemandedUseFPClass(Instruction *I, FPClassTest DemandedMask,
643 unsigned Depth = 0);
644 Value *SimplifyMultipleUseDemandedFPClass(Instruction *I,
645 FPClassTest DemandedMask,
647 const SimplifyQuery &Q,
648 unsigned Depth);
649
650 bool SimplifyDemandedFPClass(Instruction *I, unsigned Op,
651 FPClassTest DemandedMask, KnownFPClass &Known,
652 const SimplifyQuery &Q, unsigned Depth = 0);
653
654 bool SimplifyDemandedInstructionFPClass(Instruction &Inst);
655
656 /// Common transforms for add / disjoint or
657 Instruction *foldAddLikeCommutative(Value *LHS, Value *RHS, bool NSW,
658 bool NUW);
659
660 /// Canonicalize the position of binops relative to shufflevector.
661 Instruction *foldVectorBinop(BinaryOperator &Inst);
665 VectorType *NewCTy);
666
667 /// Given a binary operator, cast instruction, or select which has a PHI node
668 /// as operand #0, see if we can fold the instruction into the PHI (which is
669 /// only possible if all operands to the PHI are constants).
671 bool AllowMultipleUses = false);
672
673 /// Try to fold binary operators whose operands are simple interleaved
674 /// recurrences to a single recurrence. This is a common pattern in reduction
675 /// operations.
676 /// Example:
677 /// %phi1 = phi [init1, %BB1], [%op1, %BB2]
678 /// %phi2 = phi [init2, %BB1], [%op2, %BB2]
679 /// %op1 = binop %phi1, constant1
680 /// %op2 = binop %phi2, constant2
681 /// %rdx = binop %op1, %op2
682 /// -->
683 /// %phi_combined = phi [init_combined, %BB1], [%op_combined, %BB2]
684 /// %rdx_combined = binop %phi_combined, constant_combined
686
687 /// For a binary operator with 2 phi operands, try to hoist the binary
688 /// operation before the phi. This can result in fewer instructions in
689 /// patterns where at least one set of phi operands simplifies.
690 /// Example:
691 /// BB3: binop (phi [X, BB1], [C1, BB2]), (phi [Y, BB1], [C2, BB2])
692 /// -->
693 /// BB1: BO = binop X, Y
694 /// BB3: phi [BO, BB1], [(binop C1, C2), BB2]
696
697 /// Given an instruction with a select as one operand and a constant as the
698 /// other operand, try to fold the binary operator into the select arguments.
699 /// This also works for Cast instructions, which obviously do not have a
700 /// second operand.
702 bool FoldWithMultiUse = false,
703 bool SimplifyBothArms = false);
704
706
707 /// This is a convenience wrapper function for the above two functions.
709
711
714
715 /// Try to rotate an operation below a PHI node, using PHI nodes for
716 /// its operands.
725
726 /// If the phi is within a phi web, which is formed by the def-use chain
727 /// of phis and all the phis in the web are only used in the other phis.
728 /// In this case, these phis are dead and we will remove all of them.
729 bool foldDeadPhiWeb(PHINode &PN);
730
731 /// If an integer typed PHI has only one use which is an IntToPtr operation,
732 /// replace the PHI with an existing pointer typed PHI if it exists. Otherwise
733 /// insert a new pointer typed PHI and replace the original one.
735
736 /// Helper function for FoldPHIArgXIntoPHI() to set debug location for the
737 /// folded operation.
739
742 Instruction &I);
744 const ICmpInst &I);
745 bool foldAllocaCmp(AllocaInst *Alloca);
749 Instruction &CtxI,
750 ConstantInt *AndCst = nullptr);
752 Constant *RHSC);
757
766 const APInt &C);
767 /// Match Op0 Pred Op1 on binops with a removable common operand.
769 Value *&LHS, Value *&RHS,
770 const SimplifyQuery &Q);
779
781
783 const APInt &C);
785 ConstantInt *C);
787 const APInt &C);
789 const SimplifyQuery &Q);
791 const APInt &C);
793 const APInt &C);
795 const APInt &C);
797 const APInt &C);
799 const APInt &C);
801 const APInt &C);
803 const APInt &C);
805 const APInt &C);
807 const APInt &C);
809 const APInt &C);
811 const APInt &C);
813 const APInt &C1);
815 const APInt &C1, const APInt &C2);
817 const APInt &C);
819 const APInt &C2);
821 const APInt &C2);
822
824 BinaryOperator *BO,
825 const APInt &C);
827 BinaryOperator *BO,
828 const APInt &C);
830 const APInt &C);
832 const APInt &C);
836 ICmpInst &CtxI);
837
838 // Helpers of visitSelectInst().
847 Value *A, Value *B, Instruction &Outer,
851 Value *FalseVal);
853
855
857 unsigned Depth = 0);
858
859 Value *insertRangeTest(Value *V, const APInt &Lo, const APInt &Hi,
860 bool isSigned, bool Inside);
862
863 /// Given an initial instruction, check to see if it is the root of a
864 /// bswap/bitreverse idiom. If so, return the equivalent bswap/bitreverse
865 /// intrinsic.
867 bool MatchBitReversals);
868
871
873
874 bool tryToSinkInstruction(Instruction *I, BasicBlock *DestBlock);
876 Instruction *I, BasicBlock::iterator InsertPos, BasicBlock *SrcBlock,
878
880 void addDeadEdge(BasicBlock *From, BasicBlock *To,
886 void freelyInvertAllUsersOf(Value *V, Value *IgnoredUser = nullptr);
887
888 /// Take the exact integer log2 of the value. If DoFold is true, create the
889 /// actual instructions, otherwise return a non-null dummy value. Return
890 /// nullptr on failure. Note, if DoFold is true the caller must ensure that
891 /// takeLog2 will succeed, otherwise it may create stray instructions.
892 Value *takeLog2(Value *Op, unsigned Depth, bool AssumeNonZero, bool DoFold);
893
894 Value *tryGetLog2(Value *Op, bool AssumeNonZero) {
895 if (takeLog2(Op, /*Depth=*/0, AssumeNonZero, /*DoFold=*/false))
896 return takeLog2(Op, /*Depth=*/0, AssumeNonZero, /*DoFold=*/true);
897 return nullptr;
898 }
899};
900
901class Negator final {
902 /// Top-to-bottom, def-to-use negated instruction tree we produced.
904
906 BuilderTy Builder;
907
908 const DominatorTree &DT;
909
910 const bool IsTrulyNegation;
911
912 const unsigned MaxDepth;
913
914 SmallDenseMap<Value *, Value *> NegationsCache;
915
916 Negator(Module &M, const DominatorTree &DT, bool IsTrulyNegation,
917 unsigned MaxDepth);
918
919#if LLVM_ENABLE_STATS
920 unsigned NumValuesVisitedInThisNegator = 0;
921 ~Negator();
922#endif
923
924 using Result = std::pair<ArrayRef<Instruction *> /*NewInstructions*/,
925 Value * /*NegatedRoot*/>;
926
927 std::array<Value *, 2> getSortedOperandsOfBinOp(Instruction *I);
928
929 [[nodiscard]] Value *visitImpl(Value *V, bool IsNSW, unsigned Depth);
930
931 [[nodiscard]] Value *negate(Value *V, bool IsNSW, unsigned Depth);
932
933 /// Recurse depth-first and attempt to sink the negation.
934 /// FIXME: use worklist?
935 [[nodiscard]] std::optional<Result> run(Value *Root, bool IsNSW);
936
937 Negator(const Negator &) = delete;
938 Negator(Negator &&) = delete;
939 Negator &operator=(const Negator &) = delete;
940 Negator &operator=(Negator &&) = delete;
941
942public:
943 /// Attempt to negate \p Root. Retuns nullptr if negation can't be performed,
944 /// otherwise returns negated value.
945 [[nodiscard]] static Value *Negate(bool LHSIsZero, bool IsNSW, Value *Root,
946 InstCombinerImpl &IC);
947};
948
950 /// Common base pointer.
951 Value *Ptr = nullptr;
952 /// LHS GEPs until common base.
954 /// RHS GEPs until common base.
956 /// LHS GEP NoWrapFlags until common base.
958 /// RHS GEP NoWrapFlags until common base.
960
962
963 /// Whether expanding the GEP chains is expensive.
964 bool isExpensive() const;
965};
966
967} // end namespace llvm
968
969#undef DEBUG_TYPE
970
971#endif // LLVM_LIB_TRANSFORMS_INSTCOMBINE_INSTCOMBINEINTERNAL_H
SDValue Pred
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
constexpr LLT S1
AMDGPU Register Bank Select
#define X(NUM, ENUM, NAME)
Definition ELF.h:665
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static bool foldICmpWithDominatingICmp(CmpInst *Cmp, const TargetLowering &TLI, bool EnableICmpEqToICmpSt)
For pattern like:
#define LLVM_LIBRARY_VISIBILITY
Definition Compiler.h:137
static bool isSigned(unsigned Opcode)
#define DEBUG_TYPE
Hexagon Common GEP
IRTranslator LLVM IR MI
static constexpr unsigned NegatorMaxNodesSSO
This file provides the interface for the instcombine pass implementation.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
uint64_t IntrinsicInst * II
StandardInstrumentations SI(Mod->getContext(), Debug, VerifyEach)
This file builds on the ADT/GraphTraits.h file to build a generic graph post order iterator.
This file contains the declarations for profiling metadata utility functions.
SmallVector< MachineOperand, 4 > Cond
int64_t C1
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define LLVM_DEBUG(...)
Definition Debug.h:119
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static OverflowResult computeOverflowForSignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const AddOperator *Add, const SimplifyQuery &SQ)
Value * RHS
Value * LHS
static const uint32_t IV[8]
Definition blake3_impl.h:83
Class for arbitrary precision integers.
Definition APInt.h:78
This class represents a conversion between pointers from one address space to another.
an instruction to allocate memory on the stack
This class represents any memset intrinsic.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
A cache of @llvm.assume calls within a function.
an instruction that atomically reads a memory location, combines it with another value,...
LLVM Basic Block Representation.
Definition BasicBlock.h:62
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
This class represents a no-op cast from one type to another.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Analysis providing branch probability information.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
CallBr instruction, tracking function calls that may not return control but instead transfer it to a ...
This class represents a function call, abstracting a target machine's calling convention.
This is the base class for all instructions that perform data casts.
Definition InstrTypes.h:512
This class is the base class for the comparison instructions.
Definition InstrTypes.h:728
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:740
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
Conditional Branch instruction.
This is the shared class of boolean and integer constants.
Definition Constants.h:87
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
This is an important base class in LLVM.
Definition Constant.h:44
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 instruction extracts a single (scalar) element from a VectorType value.
This instruction extracts a struct member or array element value from an aggregate value.
This instruction compares its operands according to the predicate given to the constructor.
This class represents a cast from floating point to signed integer.
This class represents a cast from floating point to unsigned integer.
This class represents a truncation of floating point types.
Convenience struct for specifying and reasoning about fast-math flags.
Definition FMF.h:23
An instruction for ordering other memory operations.
This class represents a freeze function that returns random concrete value if an operand is either a ...
Represents flags for the getelementptr instruction/expression.
static GEPNoWrapFlags all()
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
This instruction compares its operands according to the predicate given to the constructor.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition IRBuilder.h:2949
This instruction inserts a single (scalar) element into a VectorType value.
This instruction inserts a struct field of array element value into an aggregate value.
Instruction * visitMul(BinaryOperator &I)
Instruction * foldICmpShrConstant(ICmpInst &Cmp, BinaryOperator *Shr, const APInt &C)
Fold icmp ({al}shr X, Y), C.
Instruction * foldICmpWithZextOrSext(ICmpInst &ICmp)
Instruction * visitBitExtractInst(BitExtractInst &BE)
Instruction * foldICmpSelectConstant(ICmpInst &Cmp, SelectInst *Select, ConstantInt *C)
Instruction * foldICmpSRemConstant(ICmpInst &Cmp, BinaryOperator *UDiv, const APInt &C)
Instruction * foldSelectToCmp(SelectInst &SI)
Instruction * visitAdd(BinaryOperator &I)
Instruction * visitCondBrInst(CondBrInst &BI)
bool fmulByZeroIsZero(Value *MulVal, FastMathFlags FMF, const Instruction *CtxI) const
Check if fmul MulVal, +0.0 will yield +0.0 (or signed zero is ignorable).
Instruction * foldICmpBinOpWithConstant(ICmpInst &Cmp, BinaryOperator *BO, const APInt &C)
Fold an icmp with BinaryOp and constant operand: icmp Pred BO, C.
Instruction * foldICmpOrConstant(ICmpInst &Cmp, BinaryOperator *Or, const APInt &C)
Fold icmp (or X, Y), C.
Instruction * canonicalizeCondSignextOfHighBitExtractToSignextHighBitExtract(BinaryOperator &I)
Instruction * foldICmpTruncWithTruncOrExt(ICmpInst &Cmp, const SimplifyQuery &Q)
Fold icmp (trunc nuw/nsw X), (trunc nuw/nsw Y).
Instruction * visitLShr(BinaryOperator &I)
Instruction * foldBinOpIntoSelectOrPhi(BinaryOperator &I)
This is a convenience wrapper function for the above two functions.
Instruction * visitUDiv(BinaryOperator &I)
Instruction * visitOr(BinaryOperator &I)
Instruction * foldSignBitTest(ICmpInst &I)
Fold equality-comparison between zero and any (maybe truncated) right-shift by one-less-than-bitwidth...
Instruction * foldSelectEqualityTest(SelectInst &SI)
Instruction * visitZExt(ZExtInst &Zext)
Instruction * visitGEPOfGEP(GetElementPtrInst &GEP, GEPOperator *Src)
Instruction * foldSelectValueEquivalence(SelectInst &SI, CmpInst &CI)
Instruction * visitAddrSpaceCast(AddrSpaceCastInst &CI)
Instruction * foldExtractionOfVectorDeinterleave(ZExtInst &RootZExt)
Instruction * foldPHIArgInsertValueInstructionIntoPHI(PHINode &PN)
If we have something like phi [insertvalue(a,b,0), insertvalue(c,d,0)], turn this into a phi[a,...
~InstCombinerImpl() override=default
Instruction * visitSExt(SExtInst &Sext)
Instruction * visitUnreachableInst(UnreachableInst &I)
Instruction * visitURem(BinaryOperator &I)
Instruction * foldSquareSumInt(BinaryOperator &I)
Instruction * foldOpIntoPhi(Instruction &I, PHINode *PN, bool AllowMultipleUses=false)
Given a binary operator, cast instruction, or select which has a PHI node as operand #0,...
Value * insertRangeTest(Value *V, const APInt &Lo, const APInt &Hi, bool isSigned, bool Inside)
Emit a computation of: (V >= Lo && V < Hi) if Inside is true, otherwise (V < Lo || V >= Hi).
void handleUnreachableFrom(Instruction *I, SmallVectorImpl< BasicBlock * > &Worklist)
Instruction * foldICmpBinOp(ICmpInst &Cmp, const SimplifyQuery &SQ)
Try to fold icmp (binop), X or icmp X, (binop).
Instruction * foldVectorSelect(SelectInst &Sel)
Instruction * visitFreeze(FreezeInst &I)
Instruction * foldICmpSubConstant(ICmpInst &Cmp, BinaryOperator *Sub, const APInt &C)
Fold icmp (sub X, Y), C.
Instruction * foldSelectShuffle(ShuffleVectorInst &Shuf)
Try to fold shuffles that are the equivalent of a vector select.
Instruction * visitLoadInst(LoadInst &LI)
Value * takeLog2(Value *Op, unsigned Depth, bool AssumeNonZero, bool DoFold)
Take the exact integer log2 of the value.
Instruction * visitFPToSI(FPToSIInst &FI)
Instruction * foldICmpWithClamp(ICmpInst &Cmp, Value *X, MinMaxIntrinsic *Min)
Match and fold patterns like: icmp eq/ne X, min(max(X, Lo), Hi) which represents a range check and ca...
Instruction * foldICmpInstWithConstantNotInt(ICmpInst &Cmp)
Handle icmp with constant (but not simple integer constant) RHS.
Instruction * visitAtomicRMWInst(AtomicRMWInst &SI)
Instruction * visitSRem(BinaryOperator &I)
Instruction * foldSPFofSPF(Instruction *Inner, SelectPatternFlavor SPF1, Value *A, Value *B, Instruction &Outer, SelectPatternFlavor SPF2, Value *C)
Instruction * visitTrunc(TruncInst &CI)
bool matchCommonBinOpOperands(Value *Op0, Value *Op1, CmpInst::Predicate Pred, Value *&LHS, Value *&RHS, const SimplifyQuery &Q)
Match Op0 Pred Op1 on binops with a removable common operand.
Instruction * foldBinOpSelectBinOp(BinaryOperator &Op)
In some cases it is beneficial to fold a select into a binary operator.
Instruction * foldICmpShlConstConst(ICmpInst &I, Value *ShAmt, const APInt &C1, const APInt &C2)
Handle "(icmp eq/ne (shl AP2, A), AP1)" -> (icmp eq/ne A, TrailingZeros(AP1) - TrailingZeros(AP2)).
Instruction * foldSquareSumFP(BinaryOperator &I)
Value * reassociateShiftAmtsOfTwoSameDirectionShifts(BinaryOperator *Sh0, const SimplifyQuery &SQ, bool AnalyzeForSignBitExtraction=false)
Instruction * foldSelectOpOp(SelectInst &SI, Instruction *TI, Instruction *FI)
We have (select c, TI, FI), and we know that TI and FI have the same opcode.
Instruction * visitUIToFP(CastInst &CI)
Instruction * foldPHIArgBinOpIntoPHI(PHINode &PN)
If we have something like phi [add (a,b), add(a,c)] and if a/b/c and the adds all have a single user,...
void handlePotentiallyDeadBlocks(SmallVectorImpl< BasicBlock * > &Worklist)
bool sinkNotIntoLogicalOp(Instruction &I)
Instruction * foldICmpEqIntrinsicWithConstant(ICmpInst &ICI, IntrinsicInst *II, const APInt &C)
Fold an equality icmp with LLVM intrinsic and constant operand.
Instruction * visitPtrToInt(PtrToIntInst &CI)
bool prepareWorklist(Function &F)
Perform early cleanup and prepare the InstCombine worklist.
Instruction * foldSelectIntrinsic(SelectInst &SI)
This transforms patterns of the form: select cond, intrinsic(x, ...), intrinsic(y,...
std::optional< std::pair< Intrinsic::ID, SmallVector< Value *, 3 > > > convertOrOfShiftsToFunnelShift(Instruction &Or)
Instruction * visitFDiv(BinaryOperator &I)
Instruction * FoldOpIntoSelect(Instruction &Op, SelectInst *SI, bool FoldWithMultiUse=false, bool SimplifyBothArms=false)
Given an instruction with a select as one operand and a constant as the other operand,...
Instruction * SimplifyAnyMemSet(AnyMemSetInst *MI)
bool simplifyDivRemOfSelectWithZeroOp(BinaryOperator &I)
Fold a divide or remainder with a select instruction divisor when one of the select operands is zero.
Instruction * foldItoFPtoI(FPToIntTy &FI)
fpto{s/u}i.sat --> X or zext(X) or sext(X) or trunc(X) This is safe if the intermediate type has enou...
Instruction * visitSIToFP(CastInst &CI)
Instruction * visitSub(BinaryOperator &I)
Instruction * visitAShr(BinaryOperator &I)
bool replaceInInstruction(Value *V, Value *Old, Value *New, unsigned Depth=0)
Instruction * visitFree(CallInst &FI, Value *FreedOp)
Instruction * visitInsertValueInst(InsertValueInst &IV)
Try to find redundant insertvalue instructions, like the following ones: %0 = insertvalue { i8,...
Instruction * visitAnd(BinaryOperator &I)
Value * foldMultiplicationOverflowCheck(ICmpInst &Cmp)
Fold (-1 u/ x) u< y ((x * y) ?
Instruction * visitCallBrInst(CallBrInst &CBI)
Instruction * visitExtractValueInst(ExtractValueInst &EV)
Instruction * visitInsertElementInst(InsertElementInst &IE)
void handlePotentiallyDeadSuccessors(BasicBlock *BB, BasicBlock *LiveSucc)
Instruction * commonCastTransforms(CastInst &CI)
Implement the transforms common to all CastInst visitors.
Instruction * foldICmpWithConstant(ICmpInst &Cmp)
Fold icmp Pred X, C.
CmpInst * canonicalizeICmpPredicate(CmpInst &I)
If we have a comparison with a non-canonical predicate, if we can update all the users,...
Instruction * foldBinopWithRecurrence(BinaryOperator &BO)
Try to fold binary operators whose operands are simple interleaved recurrences to a single recurrence...
Instruction * eraseInstFromFunction(Instruction &I) override
Combiner aware instruction erasure.
Instruction * foldICmpWithZero(ICmpInst &Cmp)
Instruction * visitExtractElementInst(ExtractElementInst &EI)
Instruction * commonIDivRemTransforms(BinaryOperator &I)
Common integer divide/remainder transforms.
Value * foldReversedIntrinsicOperands(IntrinsicInst *II)
If all arguments of the intrinsic are reverses, try to pull the reverse after the intrinsic.
Instruction * visitPHINode(PHINode &PN)
Instruction * foldICmpBinOpEqualityWithConstant(ICmpInst &Cmp, BinaryOperator *BO, const APInt &C)
Fold an icmp equality instruction with binary operator LHS and constant RHS: icmp eq/ne BO,...
Instruction * foldPHIArgOpIntoPHI(PHINode &PN)
Try to rotate an operation below a PHI node, using PHI nodes for its operands.
Instruction * visitLandingPadInst(LandingPadInst &LI)
Instruction * foldICmpUsingBoolRange(ICmpInst &I)
If one operand of an icmp is effectively a bool (value range of {0,1}), then try to reduce patterns b...
Instruction * foldICmpWithTrunc(ICmpInst &Cmp)
Instruction * foldCmpSelectOfConstants(CmpInst &I)
Fold fcmp/icmp pred (select C1, TV1, FV1), (select C2, TV2, FV2) where all true/false values are cons...
Instruction * foldICmpIntrinsicWithConstant(ICmpInst &ICI, IntrinsicInst *II, const APInt &C)
Fold an icmp with LLVM intrinsic and constant operand: icmp Pred II, C.
Instruction * visitFPTrunc(FPTruncInst &CI)
Instruction * visitStoreInst(StoreInst &SI)
const InstCombineCLOptions & CLOpts
Value * tryGetLog2(Value *Op, bool AssumeNonZero)
Instruction * foldPHIArgZextsIntoPHI(PHINode &PN)
TODO: This function could handle other cast types, but then it might require special-casing a cast fr...
Instruction * foldSelectInstWithICmp(SelectInst &SI, ICmpInst *ICI)
Instruction * visitFenceInst(FenceInst &FI)
Value * foldPtrToIntOrAddrOfGEP(Type *IntTy, Value *Ptr)
Instruction * visitFCmpInst(FCmpInst &I)
Value * OptimizePointerDifference(Value *LHS, Value *RHS, Type *Ty, bool isNUW)
Optimize pointer differences into the same array into a size.
Instruction * visitBitCast(BitCastInst &CI)
Instruction * visitReturnInst(ReturnInst &RI)
bool sinkNotIntoOtherHandOfLogicalOp(Instruction &I)
Instruction * commonIDivTransforms(BinaryOperator &I)
This function implements the transforms common to both integer division instructions (udiv and sdiv).
Instruction * foldICmpUsingKnownBits(ICmpInst &Cmp)
Try to fold the comparison based on range information we can get by checking whether bits are known t...
Instruction * foldICmpDivConstant(ICmpInst &Cmp, BinaryOperator *Div, const APInt &C)
Fold icmp ({su}div X, Y), C.
Instruction * foldIRemByPowerOfTwoToBitTest(ICmpInst &I)
If we have: icmp eq/ne (urem/srem x, y), 0 iff y is a power-of-two, we can replace this with a bit te...
Instruction * foldFCmpIntToFPConst(FCmpInst &I, Instruction *LHSI, Constant *RHSC)
Fold fcmp ([us]itofp x, cst) if possible.
Instruction * visitShl(BinaryOperator &I)
Instruction * visitSwitchInst(SwitchInst &SI)
Instruction * foldICmpUDivConstant(ICmpInst &Cmp, BinaryOperator *UDiv, const APInt &C)
Fold icmp (udiv X, Y), C.
Instruction * visitBitInsertInst(BitInsertInst &BI)
Instruction * visitFAdd(BinaryOperator &I)
Instruction * foldBinopWithPhiOperands(BinaryOperator &BO)
For a binary operator with 2 phi operands, try to hoist the binary operation before the phi.
Instruction * visitIntToPtr(IntToPtrInst &CI)
Instruction * foldICmpAddOpConst(Value *X, const APInt &C, CmpPredicate Pred)
Fold "icmp pred (X+C), X".
Instruction * foldICmpWithCastOp(ICmpInst &ICmp)
Handle icmp (cast x), (cast or constant).
Instruction * visitFPToUI(FPToUIInst &FI)
Instruction * foldICmpTruncConstant(ICmpInst &Cmp, TruncInst *Trunc, const APInt &C)
Fold icmp (trunc X), C.
bool mergeStoreIntoSuccessor(StoreInst &SI)
Try to transform: if () { *P = v1; } else { *P = v2 } or: *P = v1; if () { *P = v2; }...
Instruction * visitPtrToAddr(PtrToAddrInst &CI)
Instruction * visitInstruction(Instruction &I)
Specify what to return for unhandled instructions.
Instruction * foldSelectIntoOp(SelectInst &SI, Value *, Value *)
Try to fold the select into one of the operands to allow further optimization.
Instruction * foldCmpLoadFromIndexedGlobal(LoadInst *LI, GetElementPtrInst *GEP, CmpPredicate Pred, Constant *RHSC, Instruction &CtxI, ConstantInt *AndCst=nullptr)
This is called when we see this pattern: cmp pred (load (gep GV, ...)), cmpcst where GV is a global v...
Instruction * foldShuffledIntrinsicOperands(IntrinsicInst *II)
If all arguments of the intrinsic are unary shuffles with the same mask, try to shuffle after the int...
Instruction * foldICmpAddConstant(ICmpInst &Cmp, BinaryOperator *Add, const APInt &C)
Fold icmp (add X, Y), C.
Instruction * foldICmpMulConstant(ICmpInst &Cmp, BinaryOperator *Mul, const APInt &C)
Fold icmp (mul X, Y), C.
Instruction * visitInvokeInst(InvokeInst &II)
Instruction * foldICmpCommutative(CmpPredicate Pred, Value *Op0, Value *Op1, ICmpInst &CtxI)
Instruction * foldVariableSignZeroExtensionOfVariableHighBitExtract(BinaryOperator &OldAShr)
Instruction * visitUncondBrInst(UncondBrInst &BI)
Instruction * commonShiftTransforms(BinaryOperator &I)
Instruction * visitFRem(BinaryOperator &I)
Instruction * foldPHIArgLoadIntoPHI(PHINode &PN)
Instruction * foldICmpXorConstant(ICmpInst &Cmp, BinaryOperator *Xor, const APInt &C)
Fold icmp (xor X, Y), C.
Instruction * FoldOrOfLogicalAnds(Value *Op0, Value *Op1)
Instruction * foldSelectICmp(CmpPredicate Pred, SelectInst *SI, Value *RHS, const ICmpInst &I)
bool foldIntegerTypedPHI(PHINode &PN)
If an integer typed PHI has only one use which is an IntToPtr operation, replace the PHI with an exis...
Instruction * foldICmpInstWithConstantAllowPoison(ICmpInst &Cmp, const APInt &C)
Try to fold integer comparisons with a constant operand: icmp Pred X, C where X is some kind of instr...
bool foldDeadPhiWeb(PHINode &PN)
If the phi is within a phi web, which is formed by the def-use chain of phis and all the phis in the ...
InstCombinerImpl(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, const InstCombineCLOptions &CLOpts)
Instruction * foldIsMultipleOfAPowerOfTwo(ICmpInst &Cmp)
Fold icmp eq (num + mask) & ~mask, num to icmp eq (and num, mask), 0 Where mask is a low bit mask.
Instruction * visitXor(BinaryOperator &I)
Value * foldSelectWithConstOpToBinOp(ICmpInst *Cmp, Value *TrueVal, Value *FalseVal)
Value * EvaluateInDifferentType(Value *V, Type *Ty, bool isSigned)
Given an expression that CanEvaluateTruncated or CanEvaluateSExtd returns true for,...
Instruction * simplifyBinOpSplats(ShuffleVectorInst &SVI)
void CreateNonTerminatorUnreachable(Instruction *InsertAt)
Create and insert the idiom we use to indicate a block is unreachable without having to rewrite the C...
Instruction * foldICmpAndShift(ICmpInst &Cmp, BinaryOperator *And, const APInt &C1, const APInt &C2)
Fold icmp (and (sh X, Y), C2), C1.
Value * pushFreezeToPreventPoisonFromPropagating(FreezeInst &FI)
Instruction * foldICmpBinOpWithConstantViaTruthTable(ICmpInst &Cmp, BinaryOperator *BO, const APInt &C)
Instruction * foldICmpInstWithConstant(ICmpInst &Cmp)
Try to fold integer comparisons with a constant operand: icmp Pred X, C where X is some kind of instr...
Instruction * visitSelectInst(SelectInst &SI)
Value * simplifyRangeCheck(CmpPredicate PredL, Value *LHS0, Value *LHS1, CmpPredicate PredR, Value *RHS0, Value *RHS1, Instruction *CtxI, bool Inverted)
Try to fold a signed range checked with lower bound 0 to an unsigned icmp.
Instruction * foldICmpXorShiftConst(ICmpInst &Cmp, BinaryOperator *Xor, const APInt &C)
For power-of-2 C: ((X s>> ShiftC) ^ X) u< C --> (X + C) u< (C << 1) ((X s>> ShiftC) ^ X) u> (C - 1) -...
Instruction * foldPHIArgIntToPtrToPHI(PHINode &PN)
Instruction * visitFPExt(CastInst &CI)
Instruction * foldICmpShlConstant(ICmpInst &Cmp, BinaryOperator *Shl, const APInt &C)
Fold icmp (shl X, Y), C.
Instruction * visitFMul(BinaryOperator &I)
Instruction * foldSelectOfBools(SelectInst &SI)
Instruction * foldSelectExtConst(SelectInst &Sel)
Instruction * foldAddWithConstant(BinaryOperator &Add)
Instruction * foldICmpAndConstant(ICmpInst &Cmp, BinaryOperator *And, const APInt &C)
Fold icmp (and X, Y), C.
bool run()
Run the combiner over the entire worklist until it is empty.
Instruction * foldFMulReassoc(BinaryOperator &I)
Instruction * SliceUpIllegalIntegerPHI(PHINode &PN)
This is an integer PHI and we know that it has an illegal type: see if it is only used by trunc or tr...
Instruction * foldAggregateConstructionIntoAggregateReuse(InsertValueInst &OrigIVI)
Look for chain of insertvalue's that fully define an aggregate, and trace back the values inserted,...
Instruction * foldICmpEquality(ICmpInst &Cmp)
bool removeInstructionsBeforeUnreachable(Instruction &I)
Instruction * foldPHIArgGEPIntoPHI(PHINode &PN)
Instruction * foldICmpWithMinMax(Instruction &I, MinMaxIntrinsic *MinMax, Value *Z, CmpPredicate Pred)
Fold icmp Pred min|max(X, Y), Z.
Instruction * visitShuffleVectorInst(ShuffleVectorInst &SVI)
Instruction * FoldShiftByConstant(Value *Op0, Constant *Op1, BinaryOperator &I)
void tryToSinkInstructionDbgVariableRecords(Instruction *I, BasicBlock::iterator InsertPos, BasicBlock *SrcBlock, BasicBlock *DestBlock, SmallVectorImpl< DbgVariableRecord * > &DPUsers)
bool foldAllocaCmp(AllocaInst *Alloca)
void addDeadEdge(BasicBlock *From, BasicBlock *To, SmallVectorImpl< BasicBlock * > &Worklist)
void PHIArgMergedDebugLoc(Instruction *Inst, PHINode &PN)
Helper function for FoldPHIArgXIntoPHI() to set debug location for the folded operation.
Instruction * visitVAEndInst(VAEndInst &I)
Instruction * matchBSwapOrBitReverse(Instruction &I, bool MatchBSwaps, bool MatchBitReversals)
Given an initial instruction, check to see if it is the root of a bswap/bitreverse idiom.
Constant * unshuffleConstant(ArrayRef< int > ShMask, Constant *C, VectorType *NewCTy)
Find a constant NewC that has property: shuffle(NewC, poison, ShMask) = C for lanes that select NewC.
Instruction * visitAllocSite(Instruction &FI)
Instruction * visitICmpInst(ICmpInst &I)
Instruction * SimplifyAnyMemTransfer(AnyMemTransferInst *MI)
Instruction * visitGetElementPtrInst(GetElementPtrInst &GEP)
Instruction * foldPowiReassoc(BinaryOperator &I)
Instruction * foldFreezeIntoRecurrence(FreezeInst &I, PHINode *PN)
Instruction * visitSDiv(BinaryOperator &I)
bool tryToSinkInstruction(Instruction *I, BasicBlock *DestBlock)
Try to move the specified instruction from its current block into the beginning of DestBlock,...
Instruction * foldPHIArgExtractValueInstructionIntoPHI(PHINode &PN)
If we have something like phi [extractvalue(a,0), extractvalue(b,0)], turn this into a phi[a,...
Instruction * foldICmpShrConstConst(ICmpInst &I, Value *ShAmt, const APInt &C1, const APInt &C2)
Handle "(icmp eq/ne (ashr/lshr AP2, A), AP1)" -> (icmp eq/ne A, Log2(AP2/AP1)) -> (icmp eq/ne A,...
bool freezeOtherUses(FreezeInst &FI)
Instruction * visitFNeg(UnaryOperator &I)
void freelyInvertAllUsersOf(Value *V, Value *IgnoredUser=nullptr)
Freely adapt every user of V as-if V was changed to !V.
Instruction * commonIRemTransforms(BinaryOperator &I)
This function implements the transforms common to both integer remainder instructions (urem and srem)...
Instruction * visitAllocaInst(AllocaInst &AI)
Instruction * visitCallInst(CallInst &CI)
CallInst simplification.
Instruction * foldICmpAndConstConst(ICmpInst &Cmp, BinaryOperator *And, const APInt &C1)
Fold icmp (and X, C2), C1.
Instruction * visitFSub(BinaryOperator &I)
Instruction * foldICmpBitCast(ICmpInst &Cmp)
Instruction * foldGEPICmp(GEPOperator *GEPLHS, Value *RHS, CmpPredicate Cond, Instruction &I)
Fold comparisons between a GEP instruction and something else.
SimplifyQuery SQ
BlockFrequencyInfo * BFI
TargetLibraryInfo & TLI
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
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
AssumptionCache & AC
DominatorTree & DT
ProfileSummaryInfo * PSI
OptimizationRemarkEmitter & ORE
Base class for instruction visitors.
Definition InstVisitor.h:78
InstructionWorklist - This is the worklist management logic for InstCombine and other simplification ...
This class represents a cast from an integer to a pointer.
A wrapper class for inspecting calls to intrinsic functions.
Invoke instruction.
The landingpad instruction holds all of the information necessary to generate correct exception handl...
An instruction for reading from memory.
This class represents min/max intrinsics.
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:68
static Value * Negate(bool LHSIsZero, bool IsNSW, Value *Root, InstCombinerImpl &IC)
Attempt to negate Root.
The optimization diagnostic interface.
static PointerType * getUnqual(LLVMContext &C)
This constructs an opaque pointer to an object in the default address space (address space zero).
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 a cast from a pointer to an address (non-capturing ptrtoint).
This class represents a cast from a pointer to an integer.
Return a value (possibly void), from a function.
This class represents a sign extension of integer types.
This class represents the LLVM 'select' instruction.
This instruction constructs a fixed permutation of two input vectors.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
Multiway switch.
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.
This class represents a truncation of integer types.
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
Unconditional Branch instruction.
This function has undefined behavior.
This represents the llvm.va_end intrinsic.
LLVM Value Representation.
Definition Value.h:75
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:260
Base class of all SIMD vector types.
This class represents zero extension of integer types.
self_iterator getIterator()
Definition ilist_node.h:123
CallInst * Call
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
This is an optimization pass for GlobalISel generic memory operations.
ShiftSemantics
Enum to specify how shift operations should be evaluated in canEvaluateShifted.
@ NeverOverflows
Never overflows.
@ Known
Known to have no common set bits.
LLVM_ABI void setExplicitlyUnknownBranchWeightsIfProfiled(Instruction &I, StringRef PassName, const Function *F=nullptr)
Like setExplicitlyUnknownBranchWeights(...), but only sets unknown branch weights in the new instruct...
LLVM_ABI void salvageDebugInfo(const MachineRegisterInfo &MRI, MachineInstr &MI)
Assuming the instruction MI is going to be deleted, attempt to salvage debug users of MI by writing t...
Definition Utils.cpp:1837
@ BinaryOp
One of the operands is a binary op.
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)
SelectPatternFlavor
Specific patterns of select instructions we can match.
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
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)
TargetTransformInfo TTI
@ Mul
Product of integers.
@ Xor
Bitwise or logical XOR of integers.
@ Sub
Subtraction of integers.
@ Add
Sum of integers.
DWARFExpression::Operation Op
constexpr unsigned BitWidth
LLVM_ABI OverflowResult computeOverflowForUnsignedSub(const Value *LHS, const Value *RHS, const SimplifyQuery &SQ)
LLVM_ABI OverflowResult computeOverflowForUnsignedAdd(const WithCache< const Value * > &LHS, const WithCache< const Value * > &RHS, const SimplifyQuery &SQ)
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
Value * Ptr
Common base pointer.
SmallVector< GEPOperator * > RHSGEPs
RHS GEPs until common base.
GEPNoWrapFlags LHSNW
LHS GEP NoWrapFlags until common base.
GEPNoWrapFlags RHSNW
RHS GEP NoWrapFlags until common base.
SmallVector< GEPOperator * > LHSGEPs
LHS GEPs until common base.
bool isExpensive() const
Whether expanding the GEP chains is expensive.
static CommonPointerBase compute(Value *LHS, Value *RHS)
Matching combinators.