LLVM 23.0.0git
CorrelatedValuePropagation.cpp
Go to the documentation of this file.
1//===- CorrelatedValuePropagation.cpp - Propagate CFG-derived info --------===//
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// This file implements the Correlated Value Propagation pass.
10//
11//===----------------------------------------------------------------------===//
12
16#include "llvm/ADT/Statistic.h"
22#include "llvm/IR/Attributes.h"
23#include "llvm/IR/BasicBlock.h"
24#include "llvm/IR/CFG.h"
25#include "llvm/IR/Constant.h"
27#include "llvm/IR/Constants.h"
29#include "llvm/IR/Function.h"
30#include "llvm/IR/IRBuilder.h"
31#include "llvm/IR/InstrTypes.h"
32#include "llvm/IR/Instruction.h"
35#include "llvm/IR/MDBuilder.h"
36#include "llvm/IR/Operator.h"
37#include "llvm/IR/PassManager.h"
40#include "llvm/IR/Type.h"
41#include "llvm/IR/Value.h"
44#include <cassert>
45#include <optional>
46#include <utility>
47
48using namespace llvm;
49
50#define DEBUG_TYPE "correlated-value-propagation"
51
52STATISTIC(NumPhis, "Number of phis propagated");
53STATISTIC(NumPhiCommon, "Number of phis deleted via common incoming value");
54STATISTIC(NumSelects, "Number of selects propagated");
55STATISTIC(NumCmps, "Number of comparisons propagated");
56STATISTIC(NumReturns, "Number of return values propagated");
57STATISTIC(NumDeadCases, "Number of switch cases removed");
58STATISTIC(NumSDivSRemsNarrowed,
59 "Number of sdivs/srems whose width was decreased");
60STATISTIC(NumSDivs, "Number of sdiv converted to udiv");
61STATISTIC(NumUDivURemsNarrowed,
62 "Number of udivs/urems whose width was decreased");
63STATISTIC(NumAShrsConverted, "Number of ashr converted to lshr");
64STATISTIC(NumAShrsRemoved, "Number of ashr removed");
65STATISTIC(NumSRems, "Number of srem converted to urem");
66STATISTIC(NumSExt, "Number of sext converted to zext");
67STATISTIC(NumSIToFP, "Number of sitofp converted to uitofp");
68STATISTIC(NumSICmps, "Number of signed icmp preds simplified to unsigned");
69STATISTIC(NumAnd, "Number of ands removed");
70STATISTIC(NumNW, "Number of no-wrap deductions");
71STATISTIC(NumNSW, "Number of no-signed-wrap deductions");
72STATISTIC(NumNUW, "Number of no-unsigned-wrap deductions");
73STATISTIC(NumAddNW, "Number of no-wrap deductions for add");
74STATISTIC(NumAddNSW, "Number of no-signed-wrap deductions for add");
75STATISTIC(NumAddNUW, "Number of no-unsigned-wrap deductions for add");
76STATISTIC(NumSubNW, "Number of no-wrap deductions for sub");
77STATISTIC(NumSubNSW, "Number of no-signed-wrap deductions for sub");
78STATISTIC(NumSubNUW, "Number of no-unsigned-wrap deductions for sub");
79STATISTIC(NumMulNW, "Number of no-wrap deductions for mul");
80STATISTIC(NumMulNSW, "Number of no-signed-wrap deductions for mul");
81STATISTIC(NumMulNUW, "Number of no-unsigned-wrap deductions for mul");
82STATISTIC(NumShlNW, "Number of no-wrap deductions for shl");
83STATISTIC(NumShlNSW, "Number of no-signed-wrap deductions for shl");
84STATISTIC(NumShlNUW, "Number of no-unsigned-wrap deductions for shl");
85STATISTIC(NumAbs, "Number of llvm.abs intrinsics removed");
86STATISTIC(NumOverflows, "Number of overflow checks removed");
87STATISTIC(NumSaturating,
88 "Number of saturating arithmetics converted to normal arithmetics");
89STATISTIC(NumNonNull, "Number of function pointer arguments marked non-null");
90STATISTIC(NumCmpIntr, "Number of llvm.[us]cmp intrinsics removed");
91STATISTIC(NumMinMax, "Number of llvm.[us]{min,max} intrinsics removed");
92STATISTIC(NumSMinMax,
93 "Number of llvm.s{min,max} intrinsics simplified to unsigned");
94STATISTIC(NumUDivURemsNarrowedExpanded,
95 "Number of bound udiv's/urem's expanded");
96STATISTIC(NumNNeg, "Number of zext/uitofp non-negative deductions");
97
99 if (Constant *C = LVI->getConstant(V, At))
100 return C;
101
102 // TODO: The following really should be sunk inside LVI's core algorithm, or
103 // at least the outer shims around such.
104 auto *C = dyn_cast<CmpInst>(V);
105 if (!C)
106 return nullptr;
107
108 Value *Op0 = C->getOperand(0);
109 Constant *Op1 = dyn_cast<Constant>(C->getOperand(1));
110 if (!Op1)
111 return nullptr;
112
113 return LVI->getPredicateAt(C->getPredicate(), Op0, Op1, At,
114 /*UseBlockValue=*/false);
115}
116
118 if (S->getType()->isVectorTy() || isa<Constant>(S->getCondition()))
119 return false;
120
121 bool Changed = false;
122 for (Use &U : make_early_inc_range(S->uses())) {
123 auto *I = cast<Instruction>(U.getUser());
124 Constant *C;
125 if (auto *PN = dyn_cast<PHINode>(I))
126 C = LVI->getConstantOnEdge(S->getCondition(), PN->getIncomingBlock(U),
127 I->getParent(), I);
128 else
129 C = getConstantAt(S->getCondition(), I, LVI);
130
132 if (!CI)
133 continue;
134
135 U.set(CI->isOne() ? S->getTrueValue() : S->getFalseValue());
136 Changed = true;
137 ++NumSelects;
138 }
139
140 if (Changed && S->use_empty())
141 S->eraseFromParent();
142
143 return Changed;
144}
145
146/// Try to simplify a phi with constant incoming values that match the edge
147/// values of a non-constant value on all other edges:
148/// bb0:
149/// %isnull = icmp eq i8* %x, null
150/// br i1 %isnull, label %bb2, label %bb1
151/// bb1:
152/// br label %bb2
153/// bb2:
154/// %r = phi i8* [ %x, %bb1 ], [ null, %bb0 ]
155/// -->
156/// %r = %x
158 DominatorTree *DT) {
159 // Collect incoming constants and initialize possible common value.
161 Value *CommonValue = nullptr;
162 for (unsigned i = 0, e = P->getNumIncomingValues(); i != e; ++i) {
163 Value *Incoming = P->getIncomingValue(i);
164 if (auto *IncomingConstant = dyn_cast<Constant>(Incoming)) {
165 IncomingConstants.push_back(std::make_pair(IncomingConstant, i));
166 } else if (!CommonValue) {
167 // The potential common value is initialized to the first non-constant.
168 CommonValue = Incoming;
169 } else if (Incoming != CommonValue) {
170 // There can be only one non-constant common value.
171 return false;
172 }
173 }
174
175 if (!CommonValue || IncomingConstants.empty())
176 return false;
177
178 // The common value must be valid in all incoming blocks.
179 BasicBlock *ToBB = P->getParent();
180 if (auto *CommonInst = dyn_cast<Instruction>(CommonValue))
181 if (!DT->dominates(CommonInst, ToBB))
182 return false;
183
184 // We have a phi with exactly 1 variable incoming value and 1 or more constant
185 // incoming values. See if all constant incoming values can be mapped back to
186 // the same incoming variable value.
187 for (auto &IncomingConstant : IncomingConstants) {
188 Constant *C = IncomingConstant.first;
189 BasicBlock *IncomingBB = P->getIncomingBlock(IncomingConstant.second);
190 if (C != LVI->getConstantOnEdge(CommonValue, IncomingBB, ToBB, P))
191 return false;
192 }
193
194 // LVI only guarantees that the value matches a certain constant if the value
195 // is not poison. Make sure we don't replace a well-defined value with poison.
196 // This is usually satisfied due to a prior branch on the value.
197 if (!isGuaranteedNotToBePoison(CommonValue, nullptr, P, DT))
198 return false;
199
200 // All constant incoming values map to the same variable along the incoming
201 // edges of the phi. The phi is unnecessary.
202 P->replaceAllUsesWith(CommonValue);
203 P->eraseFromParent();
204 ++NumPhiCommon;
205 return true;
206}
207
209 BasicBlock *From, BasicBlock *To,
210 Instruction *CxtI) {
211 if (Constant *C = LVI->getConstantOnEdge(Incoming, From, To, CxtI))
212 return C;
213
214 // Look if the incoming value is a select with a scalar condition for which
215 // LVI can tells us the value. In that case replace the incoming value with
216 // the appropriate value of the select. This often allows us to remove the
217 // select later.
219 if (!SI)
220 return nullptr;
221
222 // Once LVI learns to handle vector types, we could also add support
223 // for vector type constants that are not all zeroes or all ones.
224 Value *Condition = SI->getCondition();
225 if (!Condition->getType()->isVectorTy()) {
226 if (Constant *C = LVI->getConstantOnEdge(Condition, From, To, CxtI)) {
227 if (C->isOneValue())
228 return SI->getTrueValue();
229 if (C->isNullValue())
230 return SI->getFalseValue();
231 }
232 }
233
234 // Look if the select has a constant but LVI tells us that the incoming
235 // value can never be that constant. In that case replace the incoming
236 // value with the other value of the select. This often allows us to
237 // remove the select later.
238
239 // The "false" case
240 if (auto *C = dyn_cast<Constant>(SI->getFalseValue()))
241 if (auto *Res = dyn_cast_or_null<ConstantInt>(
242 LVI->getPredicateOnEdge(ICmpInst::ICMP_EQ, SI, C, From, To, CxtI));
243 Res && Res->isZero())
244 return SI->getTrueValue();
245
246 // The "true" case,
247 // similar to the select "false" case, but try the select "true" value
248 if (auto *C = dyn_cast<Constant>(SI->getTrueValue()))
249 if (auto *Res = dyn_cast_or_null<ConstantInt>(
250 LVI->getPredicateOnEdge(ICmpInst::ICMP_EQ, SI, C, From, To, CxtI));
251 Res && Res->isZero())
252 return SI->getFalseValue();
253
254 return nullptr;
255}
256
258 const SimplifyQuery &SQ) {
259 bool Changed = false;
260
261 BasicBlock *BB = P->getParent();
262 for (unsigned i = 0, e = P->getNumIncomingValues(); i < e; ++i) {
263 Value *Incoming = P->getIncomingValue(i);
264 if (isa<Constant>(Incoming)) continue;
265
266 Value *V = getValueOnEdge(LVI, Incoming, P->getIncomingBlock(i), BB, P);
267 if (V) {
268 P->setIncomingValue(i, V);
269 Changed = true;
270 }
271 }
272
273 if (Value *V = simplifyInstruction(P, SQ)) {
274 P->replaceAllUsesWith(V);
275 P->eraseFromParent();
276 Changed = true;
277 }
278
279 if (!Changed)
280 Changed = simplifyCommonValuePhi(P, LVI, DT);
281
282 if (Changed)
283 ++NumPhis;
284
285 return Changed;
286}
287
288static bool processICmp(ICmpInst *Cmp, LazyValueInfo *LVI) {
289 // Only for signed relational comparisons of integers.
290 if (!Cmp->getOperand(0)->getType()->isIntOrIntVectorTy())
291 return false;
292
293 if (!Cmp->isSigned() && (!Cmp->isUnsigned() || Cmp->hasSameSign()))
294 return false;
295
296 bool Changed = false;
297
298 ConstantRange CR1 = LVI->getConstantRangeAtUse(Cmp->getOperandUse(0),
299 /*UndefAllowed=*/false),
300 CR2 = LVI->getConstantRangeAtUse(Cmp->getOperandUse(1),
301 /*UndefAllowed=*/false);
302
303 if (Cmp->isSigned()) {
304 ICmpInst::Predicate UnsignedPred =
306 Cmp->getPredicate(), CR1, CR2);
307
308 if (UnsignedPred == ICmpInst::Predicate::BAD_ICMP_PREDICATE)
309 return false;
310
311 ++NumSICmps;
312 Cmp->setPredicate(UnsignedPred);
313 Changed = true;
314 }
315
317 Cmp->setSameSign();
318 Changed = true;
319 }
320
321 return Changed;
322}
323
324/// See if LazyValueInfo's ability to exploit edge conditions or range
325/// information is sufficient to prove this comparison. Even for local
326/// conditions, this can sometimes prove conditions instcombine can't by
327/// exploiting range information.
328static bool constantFoldCmp(CmpInst *Cmp, LazyValueInfo *LVI) {
329 Value *Op0 = Cmp->getOperand(0);
330 Value *Op1 = Cmp->getOperand(1);
331 Constant *Res = LVI->getPredicateAt(Cmp->getPredicate(), Op0, Op1, Cmp,
332 /*UseBlockValue=*/true);
333 if (!Res)
334 return false;
335
336 ++NumCmps;
337 Cmp->replaceAllUsesWith(Res);
338 Cmp->eraseFromParent();
339 return true;
340}
341
342static bool processCmp(CmpInst *Cmp, LazyValueInfo *LVI) {
343 if (constantFoldCmp(Cmp, LVI))
344 return true;
345
346 if (auto *ICmp = dyn_cast<ICmpInst>(Cmp))
347 if (processICmp(ICmp, LVI))
348 return true;
349
350 return false;
351}
352
353/// Simplify a switch instruction by removing cases which can never fire. If the
354/// uselessness of a case could be determined locally then constant propagation
355/// would already have figured it out. Instead, walk the predecessors and
356/// statically evaluate cases based on information available on that edge. Cases
357/// that cannot fire no matter what the incoming edge can safely be removed. If
358/// a case fires on every incoming edge then the entire switch can be removed
359/// and replaced with a branch to the case destination.
361 DominatorTree *DT) {
362 DomTreeUpdater DTU(*DT, DomTreeUpdater::UpdateStrategy::Lazy);
363 Value *Cond = I->getCondition();
364 BasicBlock *BB = I->getParent();
365
366 // Analyse each switch case in turn.
367 bool Changed = false;
368 DenseMap<BasicBlock*, int> SuccessorsCount;
369 for (auto *Succ : successors(BB))
370 SuccessorsCount[Succ]++;
371
372 { // Scope for SwitchInstProfUpdateWrapper. It must not live during
373 // ConstantFoldTerminator() as the underlying SwitchInst can be changed.
375 ConstantRange CR =
376 LVI->getConstantRangeAtUse(I->getOperandUse(0), /*UndefAllowed=*/false);
377 unsigned ReachableCaseCount = 0;
378
379 for (auto CI = SI->case_begin(), CE = SI->case_end(); CI != CE;) {
380 ConstantInt *Case = CI->getCaseValue();
381 std::optional<bool> Predicate = std::nullopt;
382 if (!CR.contains(Case->getValue()))
383 Predicate = false;
384 else if (CR.isSingleElement() &&
385 *CR.getSingleElement() == Case->getValue())
386 Predicate = true;
387 if (!Predicate) {
388 // Handle missing cases, e.g., the range has a hole.
391 /* UseBlockValue=*/true));
392 if (Res && Res->isZero())
393 Predicate = false;
394 else if (Res && Res->isOne())
395 Predicate = true;
396 }
397
398 if (Predicate && !*Predicate) {
399 // This case never fires - remove it.
400 BasicBlock *Succ = CI->getCaseSuccessor();
401 Succ->removePredecessor(BB);
402 CI = SI.removeCase(CI);
403 CE = SI->case_end();
404
405 // The condition can be modified by removePredecessor's PHI simplification
406 // logic.
407 Cond = SI->getCondition();
408
409 ++NumDeadCases;
410 Changed = true;
411 if (--SuccessorsCount[Succ] == 0)
413 continue;
414 }
415 if (Predicate && *Predicate) {
416 // This case always fires. Arrange for the switch to be turned into an
417 // unconditional branch by replacing the switch condition with the case
418 // value.
419 SI->setCondition(Case);
420 NumDeadCases += SI->getNumCases();
421 Changed = true;
422 break;
423 }
424
425 // Increment the case iterator since we didn't delete it.
426 ++CI;
427 ++ReachableCaseCount;
428 }
429
430 // The default dest is unreachable if all cases are covered.
431 if (!SI->defaultDestUnreachable() &&
432 !CR.isSizeLargerThan(ReachableCaseCount)) {
433 BasicBlock *DefaultDest = SI->getDefaultDest();
434 BasicBlock *NewUnreachableBB =
435 BasicBlock::Create(BB->getContext(), "default.unreachable",
436 BB->getParent(), DefaultDest);
437 auto *UI = new UnreachableInst(BB->getContext(), NewUnreachableBB);
438 UI->setDebugLoc(DebugLoc::getTemporary());
439
440 DefaultDest->removePredecessor(BB);
441 SI->setDefaultDest(NewUnreachableBB);
442
443 if (SuccessorsCount[DefaultDest] == 1)
444 DTU.applyUpdates({{DominatorTree::Delete, BB, DefaultDest}});
445 DTU.applyUpdates({{DominatorTree::Insert, BB, NewUnreachableBB}});
446
447 ++NumDeadCases;
448 Changed = true;
449 }
450 }
451
452 if (Changed)
453 // If the switch has been simplified to the point where it can be replaced
454 // by a branch then do so now.
455 ConstantFoldTerminator(BB, /*DeleteDeadConditions = */ false,
456 /*TLI = */ nullptr, &DTU);
457 return Changed;
458}
459
460// See if we can prove that the given binary op intrinsic will not overflow.
462 ConstantRange LRange =
463 LVI->getConstantRangeAtUse(BO->getOperandUse(0), /*UndefAllowed*/ false);
464 ConstantRange RRange =
465 LVI->getConstantRangeAtUse(BO->getOperandUse(1), /*UndefAllowed*/ false);
467 BO->getBinaryOp(), RRange, BO->getNoWrapKind());
468 return NWRegion.contains(LRange);
469}
470
472 bool NewNSW, bool NewNUW) {
473 Statistic *OpcNW, *OpcNSW, *OpcNUW;
474 switch (Opcode) {
475 case Instruction::Add:
476 OpcNW = &NumAddNW;
477 OpcNSW = &NumAddNSW;
478 OpcNUW = &NumAddNUW;
479 break;
480 case Instruction::Sub:
481 OpcNW = &NumSubNW;
482 OpcNSW = &NumSubNSW;
483 OpcNUW = &NumSubNUW;
484 break;
485 case Instruction::Mul:
486 OpcNW = &NumMulNW;
487 OpcNSW = &NumMulNSW;
488 OpcNUW = &NumMulNUW;
489 break;
490 case Instruction::Shl:
491 OpcNW = &NumShlNW;
492 OpcNSW = &NumShlNSW;
493 OpcNUW = &NumShlNUW;
494 break;
495 default:
496 llvm_unreachable("Will not be called with other binops");
497 }
498
499 auto *Inst = dyn_cast<Instruction>(V);
500 if (NewNSW) {
501 ++NumNW;
502 ++*OpcNW;
503 ++NumNSW;
504 ++*OpcNSW;
505 if (Inst)
506 Inst->setHasNoSignedWrap();
507 }
508 if (NewNUW) {
509 ++NumNW;
510 ++*OpcNW;
511 ++NumNUW;
512 ++*OpcNUW;
513 if (Inst)
514 Inst->setHasNoUnsignedWrap();
515 }
516}
517
518static bool processBinOp(BinaryOperator *BinOp, LazyValueInfo *LVI);
519
520// See if @llvm.abs argument is alays positive/negative, and simplify.
521// Notably, INT_MIN can belong to either range, regardless of the NSW,
522// because it is negation-invariant.
524 Value *X = II->getArgOperand(0);
525 bool IsIntMinPoison = cast<ConstantInt>(II->getArgOperand(1))->isOne();
526 APInt IntMin = APInt::getSignedMinValue(X->getType()->getScalarSizeInBits());
528 II->getOperandUse(0), /*UndefAllowed*/ IsIntMinPoison);
529
530 // Is X in [0, IntMin]? NOTE: INT_MIN is fine!
531 if (Range.icmp(CmpInst::ICMP_ULE, IntMin)) {
532 ++NumAbs;
533 II->replaceAllUsesWith(X);
534 II->eraseFromParent();
535 return true;
536 }
537
538 // Is X in [IntMin, 0]? NOTE: INT_MIN is fine!
539 if (Range.getSignedMax().isNonPositive()) {
541 Value *NegX = B.CreateNeg(X, II->getName(),
542 /*HasNSW=*/IsIntMinPoison);
543 ++NumAbs;
544 II->replaceAllUsesWith(NegX);
545 II->eraseFromParent();
546
547 // See if we can infer some no-wrap flags.
548 if (auto *BO = dyn_cast<BinaryOperator>(NegX))
549 processBinOp(BO, LVI);
550
551 return true;
552 }
553
554 // Argument's range crosses zero.
555 // Can we at least tell that the argument is never INT_MIN?
556 if (!IsIntMinPoison && !Range.contains(IntMin)) {
557 ++NumNSW;
558 ++NumSubNSW;
559 II->setArgOperand(1, ConstantInt::getTrue(II->getContext()));
560 return true;
561 }
562 return false;
563}
564
566 ConstantRange LHS_CR =
567 LVI->getConstantRangeAtUse(CI->getOperandUse(0), /*UndefAllowed*/ false);
568 ConstantRange RHS_CR =
569 LVI->getConstantRangeAtUse(CI->getOperandUse(1), /*UndefAllowed*/ false);
570
571 if (LHS_CR.icmp(CI->getGTPredicate(), RHS_CR)) {
572 ++NumCmpIntr;
573 CI->replaceAllUsesWith(ConstantInt::get(CI->getType(), 1));
574 CI->eraseFromParent();
575 return true;
576 }
577 if (LHS_CR.icmp(CI->getLTPredicate(), RHS_CR)) {
578 ++NumCmpIntr;
580 CI->eraseFromParent();
581 return true;
582 }
583 if (LHS_CR.icmp(ICmpInst::ICMP_EQ, RHS_CR)) {
584 ++NumCmpIntr;
585 CI->replaceAllUsesWith(ConstantInt::get(CI->getType(), 0));
586 CI->eraseFromParent();
587 return true;
588 }
589
590 return false;
591}
592
593// See if this min/max intrinsic always picks it's one specific operand.
594// If not, check whether we can canonicalize signed minmax into unsigned version
598 /*UndefAllowed*/ false);
600 /*UndefAllowed*/ false);
601 if (LHS_CR.icmp(Pred, RHS_CR)) {
602 ++NumMinMax;
603 MM->replaceAllUsesWith(MM->getLHS());
604 MM->eraseFromParent();
605 return true;
606 }
607 if (RHS_CR.icmp(Pred, LHS_CR)) {
608 ++NumMinMax;
609 MM->replaceAllUsesWith(MM->getRHS());
610 MM->eraseFromParent();
611 return true;
612 }
613
614 if (MM->isSigned() &&
616 RHS_CR)) {
617 ++NumSMinMax;
618 IRBuilder<> B(MM);
619 MM->replaceAllUsesWith(B.CreateBinaryIntrinsic(
620 MM->getIntrinsicID() == Intrinsic::smin ? Intrinsic::umin
621 : Intrinsic::umax,
622 MM->getLHS(), MM->getRHS()));
623 MM->eraseFromParent();
624 return true;
625 }
626
627 return false;
628}
629
630// Rewrite this with.overflow intrinsic as non-overflowing.
632 IRBuilder<> B(WO);
633 Instruction::BinaryOps Opcode = WO->getBinaryOp();
634 bool NSW = WO->isSigned();
635 bool NUW = !WO->isSigned();
636
637 Value *NewOp =
638 B.CreateBinOp(Opcode, WO->getLHS(), WO->getRHS(), WO->getName());
639 setDeducedOverflowingFlags(NewOp, Opcode, NSW, NUW);
640
642 Constant *Struct = ConstantStruct::get(ST,
643 { PoisonValue::get(ST->getElementType(0)),
644 ConstantInt::getFalse(ST->getElementType(1)) });
645 Value *NewI = B.CreateInsertValue(Struct, NewOp, 0);
646 WO->replaceAllUsesWith(NewI);
647 WO->eraseFromParent();
648 ++NumOverflows;
649
650 // See if we can infer the other no-wrap too.
651 if (auto *BO = dyn_cast<BinaryOperator>(NewOp))
652 processBinOp(BO, LVI);
653
654 return true;
655}
656
658 Instruction::BinaryOps Opcode = SI->getBinaryOp();
659 bool NSW = SI->isSigned();
660 bool NUW = !SI->isSigned();
662 Opcode, SI->getLHS(), SI->getRHS(), SI->getName(), SI->getIterator());
663 BinOp->setDebugLoc(SI->getDebugLoc());
664 setDeducedOverflowingFlags(BinOp, Opcode, NSW, NUW);
665
666 SI->replaceAllUsesWith(BinOp);
667 SI->eraseFromParent();
668 ++NumSaturating;
669
670 // See if we can infer the other no-wrap too.
671 if (auto *BO = dyn_cast<BinaryOperator>(BinOp))
672 processBinOp(BO, LVI);
673
674 return true;
675}
676
677/// Infer nonnull attributes for the arguments at the specified callsite.
678static bool processCallSite(CallBase &CB, LazyValueInfo *LVI) {
679
680 if (CB.getIntrinsicID() == Intrinsic::abs) {
682 }
683
684 if (auto *CI = dyn_cast<CmpIntrinsic>(&CB)) {
685 return processCmpIntrinsic(CI, LVI);
686 }
687
688 if (auto *MM = dyn_cast<MinMaxIntrinsic>(&CB)) {
689 return processMinMaxIntrinsic(MM, LVI);
690 }
691
692 if (auto *WO = dyn_cast<WithOverflowInst>(&CB)) {
693 if (willNotOverflow(WO, LVI))
694 return processOverflowIntrinsic(WO, LVI);
695 }
696
697 if (auto *SI = dyn_cast<SaturatingInst>(&CB)) {
698 if (willNotOverflow(SI, LVI))
699 return processSaturatingInst(SI, LVI);
700 }
701
702 bool Changed = false;
703
704 // Deopt bundle operands are intended to capture state with minimal
705 // perturbance of the code otherwise. If we can find a constant value for
706 // any such operand and remove a use of the original value, that's
707 // desireable since it may allow further optimization of that value (e.g. via
708 // single use rules in instcombine). Since deopt uses tend to,
709 // idiomatically, appear along rare conditional paths, it's reasonable likely
710 // we may have a conditional fact with which LVI can fold.
711 if (auto DeoptBundle = CB.getOperandBundle(LLVMContext::OB_deopt)) {
712 for (const Use &ConstU : DeoptBundle->Inputs) {
713 Use &U = const_cast<Use&>(ConstU);
714 Value *V = U.get();
715 if (V->getType()->isVectorTy()) continue;
716 if (isa<Constant>(V)) continue;
717
718 Constant *C = LVI->getConstant(V, &CB);
719 if (!C) continue;
720 U.set(C);
721 Changed = true;
722 }
723 }
724
726 unsigned ArgNo = 0;
727
728 for (Value *V : CB.args()) {
729 PointerType *Type = dyn_cast<PointerType>(V->getType());
730 // Try to mark pointer typed parameters as non-null. We skip the
731 // relatively expensive analysis for constants which are obviously either
732 // null or non-null to start with.
733 if (Type && !CB.paramHasAttr(ArgNo, Attribute::NonNull) &&
734 !isa<Constant>(V))
737 /*UseBlockValue=*/false));
738 Res && Res->isZero())
739 ArgNos.push_back(ArgNo);
740 ArgNo++;
741 }
742
743 assert(ArgNo == CB.arg_size() && "Call arguments not processed correctly.");
744
745 if (ArgNos.empty())
746 return Changed;
747
748 NumNonNull += ArgNos.size();
749 AttributeList AS = CB.getAttributes();
750 LLVMContext &Ctx = CB.getContext();
751 AS = AS.addParamAttribute(Ctx, ArgNos,
752 Attribute::get(Ctx, Attribute::NonNull));
753 CB.setAttributes(AS);
754
755 return true;
756}
757
759
760static Domain getDomain(const ConstantRange &CR) {
761 if (CR.isAllNonNegative())
762 return Domain::NonNegative;
764 return Domain::NonPositive;
765 return Domain::Unknown;
766}
767
768/// Try to shrink a sdiv/srem's width down to the smallest power of two that's
769/// sufficient to contain its operands.
770static bool narrowSDivOrSRem(BinaryOperator *Instr, const ConstantRange &LCR,
771 const ConstantRange &RCR) {
772 assert(Instr->getOpcode() == Instruction::SDiv ||
773 Instr->getOpcode() == Instruction::SRem);
774
775 // Find the smallest power of two bitwidth that's sufficient to hold Instr's
776 // operands.
777 unsigned OrigWidth = Instr->getType()->getScalarSizeInBits();
778
779 // What is the smallest bit width that can accommodate the entire value ranges
780 // of both of the operands?
781 unsigned MinSignedBits =
782 std::max(LCR.getMinSignedBits(), RCR.getMinSignedBits());
783
784 // sdiv/srem is UB if divisor is -1 and divident is INT_MIN, so unless we can
785 // prove that such a combination is impossible, we need to bump the bitwidth.
786 if (RCR.contains(APInt::getAllOnes(OrigWidth)) &&
787 LCR.contains(APInt::getSignedMinValue(MinSignedBits).sext(OrigWidth)))
788 ++MinSignedBits;
789
790 // Don't shrink below 8 bits wide.
791 unsigned NewWidth = std::max<unsigned>(PowerOf2Ceil(MinSignedBits), 8);
792
793 // NewWidth might be greater than OrigWidth if OrigWidth is not a power of
794 // two.
795 if (NewWidth >= OrigWidth)
796 return false;
797
798 ++NumSDivSRemsNarrowed;
799 IRBuilder<> B{Instr};
800 auto *TruncTy = Instr->getType()->getWithNewBitWidth(NewWidth);
801 auto *LHS = B.CreateTruncOrBitCast(Instr->getOperand(0), TruncTy,
802 Instr->getName() + ".lhs.trunc");
803 auto *RHS = B.CreateTruncOrBitCast(Instr->getOperand(1), TruncTy,
804 Instr->getName() + ".rhs.trunc");
805 auto *BO = B.CreateBinOp(Instr->getOpcode(), LHS, RHS, Instr->getName());
806 auto *Sext = B.CreateSExt(BO, Instr->getType(), Instr->getName() + ".sext");
807 if (auto *BinOp = dyn_cast<BinaryOperator>(BO))
808 if (BinOp->getOpcode() == Instruction::SDiv)
809 BinOp->setIsExact(Instr->isExact());
810
811 Instr->replaceAllUsesWith(Sext);
812 Instr->eraseFromParent();
813 return true;
814}
815
816static bool expandUDivOrURem(BinaryOperator *Instr, const ConstantRange &XCR,
817 const ConstantRange &YCR) {
818 Type *Ty = Instr->getType();
819 assert(Instr->getOpcode() == Instruction::UDiv ||
820 Instr->getOpcode() == Instruction::URem);
821 bool IsRem = Instr->getOpcode() == Instruction::URem;
822
823 Value *X = Instr->getOperand(0);
824 Value *Y = Instr->getOperand(1);
825
826 // X u/ Y -> 0 iff X u< Y
827 // X u% Y -> X iff X u< Y
828 if (XCR.icmp(ICmpInst::ICMP_ULT, YCR)) {
829 Instr->replaceAllUsesWith(IsRem ? X : Constant::getNullValue(Ty));
830 Instr->eraseFromParent();
831 ++NumUDivURemsNarrowedExpanded;
832 return true;
833 }
834
835 // Given
836 // R = X u% Y
837 // We can represent the modulo operation as a loop/self-recursion:
838 // urem_rec(X, Y):
839 // Z = X - Y
840 // if X u< Y
841 // ret X
842 // else
843 // ret urem_rec(Z, Y)
844 // which isn't better, but if we only need a single iteration
845 // to compute the answer, this becomes quite good:
846 // R = X < Y ? X : X - Y iff X u< 2*Y (w/ unsigned saturation)
847 // Now, we do not care about all full multiples of Y in X, they do not change
848 // the answer, thus we could rewrite the expression as:
849 // X* = X - (Y * |_ X / Y _|)
850 // R = X* % Y
851 // so we don't need the *first* iteration to return, we just need to
852 // know *which* iteration will always return, so we could also rewrite it as:
853 // X* = X - (Y * |_ X / Y _|)
854 // R = X* % Y iff X* u< 2*Y (w/ unsigned saturation)
855 // but that does not seem profitable here.
856
857 // Even if we don't know X's range, the divisor may be so large, X can't ever
858 // be 2x larger than that. I.e. if divisor is always negative.
859 if (!XCR.icmp(ICmpInst::ICMP_ULT, YCR.uadd_sat(YCR)) && !YCR.isAllNegative())
860 return false;
861
862 IRBuilder<> B(Instr);
863 Value *ExpandedOp;
864 if (XCR.icmp(ICmpInst::ICMP_UGE, YCR)) {
865 // If X is between Y and 2*Y the result is known.
866 if (IsRem)
867 ExpandedOp = B.CreateNUWSub(X, Y);
868 else
869 ExpandedOp = ConstantInt::get(Instr->getType(), 1);
870 } else if (IsRem) {
871 // NOTE: this transformation introduces two uses of X,
872 // but it may be undef so we must freeze it first.
873 Value *FrozenX = X;
875 FrozenX = B.CreateFreeze(X, X->getName() + ".frozen");
876 Value *FrozenY = Y;
878 FrozenY = B.CreateFreeze(Y, Y->getName() + ".frozen");
879 auto *AdjX = B.CreateNUWSub(FrozenX, FrozenY, Instr->getName() + ".urem");
880 auto *Cmp = B.CreateICmp(ICmpInst::ICMP_ULT, FrozenX, FrozenY,
881 Instr->getName() + ".cmp");
882 ExpandedOp =
883 B.CreateSelectWithUnknownProfile(Cmp, FrozenX, AdjX, DEBUG_TYPE);
884 } else {
885 auto *Cmp =
886 B.CreateICmp(ICmpInst::ICMP_UGE, X, Y, Instr->getName() + ".cmp");
887 ExpandedOp = B.CreateZExt(Cmp, Ty, Instr->getName() + ".udiv");
888 }
889 ExpandedOp->takeName(Instr);
890 Instr->replaceAllUsesWith(ExpandedOp);
891 Instr->eraseFromParent();
892 ++NumUDivURemsNarrowedExpanded;
893 return true;
894}
895
896/// Try to shrink a udiv/urem's width down to the smallest power of two that's
897/// sufficient to contain its operands.
898static bool narrowUDivOrURem(BinaryOperator *Instr, const ConstantRange &XCR,
899 const ConstantRange &YCR) {
900 assert(Instr->getOpcode() == Instruction::UDiv ||
901 Instr->getOpcode() == Instruction::URem);
902
903 // Find the smallest power of two bitwidth that's sufficient to hold Instr's
904 // operands.
905
906 // What is the smallest bit width that can accommodate the entire value ranges
907 // of both of the operands?
908 unsigned MaxActiveBits = std::max(XCR.getActiveBits(), YCR.getActiveBits());
909 // Don't shrink below 8 bits wide.
910 unsigned NewWidth = std::max<unsigned>(PowerOf2Ceil(MaxActiveBits), 8);
911
912 // NewWidth might be greater than OrigWidth if OrigWidth is not a power of
913 // two.
914 if (NewWidth >= Instr->getType()->getScalarSizeInBits())
915 return false;
916
917 ++NumUDivURemsNarrowed;
918 IRBuilder<> B{Instr};
919 auto *TruncTy = Instr->getType()->getWithNewBitWidth(NewWidth);
920 auto *LHS = B.CreateTruncOrBitCast(Instr->getOperand(0), TruncTy,
921 Instr->getName() + ".lhs.trunc");
922 auto *RHS = B.CreateTruncOrBitCast(Instr->getOperand(1), TruncTy,
923 Instr->getName() + ".rhs.trunc");
924 auto *BO = B.CreateBinOp(Instr->getOpcode(), LHS, RHS, Instr->getName());
925 auto *Zext = B.CreateZExt(BO, Instr->getType(), Instr->getName() + ".zext");
926 if (auto *BinOp = dyn_cast<BinaryOperator>(BO))
927 if (BinOp->getOpcode() == Instruction::UDiv)
928 BinOp->setIsExact(Instr->isExact());
929
930 Instr->replaceAllUsesWith(Zext);
931 Instr->eraseFromParent();
932 return true;
933}
934
936 assert(Instr->getOpcode() == Instruction::UDiv ||
937 Instr->getOpcode() == Instruction::URem);
938 ConstantRange XCR = LVI->getConstantRangeAtUse(Instr->getOperandUse(0),
939 /*UndefAllowed*/ false);
940 // Allow undef for RHS, as we can assume it is division by zero UB.
941 ConstantRange YCR = LVI->getConstantRangeAtUse(Instr->getOperandUse(1),
942 /*UndefAllowed*/ true);
943 if (expandUDivOrURem(Instr, XCR, YCR))
944 return true;
945
946 return narrowUDivOrURem(Instr, XCR, YCR);
947}
948
949static bool processSRem(BinaryOperator *SDI, const ConstantRange &LCR,
950 const ConstantRange &RCR, LazyValueInfo *LVI) {
951 assert(SDI->getOpcode() == Instruction::SRem);
952
953 if (LCR.abs().icmp(CmpInst::ICMP_ULT, RCR.abs())) {
954 SDI->replaceAllUsesWith(SDI->getOperand(0));
955 SDI->eraseFromParent();
956 return true;
957 }
958
959 struct Operand {
960 Value *V;
961 Domain D;
962 };
963 std::array<Operand, 2> Ops = {{{SDI->getOperand(0), getDomain(LCR)},
964 {SDI->getOperand(1), getDomain(RCR)}}};
965 if (Ops[0].D == Domain::Unknown || Ops[1].D == Domain::Unknown)
966 return false;
967
968 // We know domains of both of the operands!
969 ++NumSRems;
970
971 // We need operands to be non-negative, so negate each one that isn't.
972 for (Operand &Op : Ops) {
973 if (Op.D == Domain::NonNegative)
974 continue;
975 auto *BO = BinaryOperator::CreateNeg(Op.V, Op.V->getName() + ".nonneg",
976 SDI->getIterator());
977 BO->setDebugLoc(SDI->getDebugLoc());
978 Op.V = BO;
979 }
980
981 auto *URem = BinaryOperator::CreateURem(Ops[0].V, Ops[1].V, SDI->getName(),
982 SDI->getIterator());
983 URem->setDebugLoc(SDI->getDebugLoc());
984
985 auto *Res = URem;
986
987 // If the divident was non-positive, we need to negate the result.
988 if (Ops[0].D == Domain::NonPositive) {
989 Res = BinaryOperator::CreateNeg(Res, Res->getName() + ".neg",
990 SDI->getIterator());
991 Res->setDebugLoc(SDI->getDebugLoc());
992 }
993
994 SDI->replaceAllUsesWith(Res);
995 SDI->eraseFromParent();
996
997 // Try to simplify our new urem.
998 processUDivOrURem(URem, LVI);
999
1000 return true;
1001}
1002
1003/// See if LazyValueInfo's ability to exploit edge conditions or range
1004/// information is sufficient to prove the signs of both operands of this SDiv.
1005/// If this is the case, replace the SDiv with a UDiv. Even for local
1006/// conditions, this can sometimes prove conditions instcombine can't by
1007/// exploiting range information.
1008static bool processSDiv(BinaryOperator *SDI, const ConstantRange &LCR,
1009 const ConstantRange &RCR, LazyValueInfo *LVI) {
1010 assert(SDI->getOpcode() == Instruction::SDiv);
1011
1012 // Check whether the division folds to a constant.
1013 ConstantRange DivCR = LCR.sdiv(RCR);
1014 if (const APInt *Elem = DivCR.getSingleElement()) {
1015 SDI->replaceAllUsesWith(ConstantInt::get(SDI->getType(), *Elem));
1016 SDI->eraseFromParent();
1017 return true;
1018 }
1019
1020 struct Operand {
1021 Value *V;
1022 Domain D;
1023 };
1024 std::array<Operand, 2> Ops = {{{SDI->getOperand(0), getDomain(LCR)},
1025 {SDI->getOperand(1), getDomain(RCR)}}};
1026 if (Ops[0].D == Domain::Unknown || Ops[1].D == Domain::Unknown)
1027 return false;
1028
1029 // We know domains of both of the operands!
1030 ++NumSDivs;
1031
1032 // We need operands to be non-negative, so negate each one that isn't.
1033 for (Operand &Op : Ops) {
1034 if (Op.D == Domain::NonNegative)
1035 continue;
1036 auto *BO = BinaryOperator::CreateNeg(Op.V, Op.V->getName() + ".nonneg",
1037 SDI->getIterator());
1038 BO->setDebugLoc(SDI->getDebugLoc());
1039 Op.V = BO;
1040 }
1041
1042 auto *UDiv = BinaryOperator::CreateUDiv(Ops[0].V, Ops[1].V, SDI->getName(),
1043 SDI->getIterator());
1044 UDiv->setDebugLoc(SDI->getDebugLoc());
1045 UDiv->setIsExact(SDI->isExact());
1046
1047 auto *Res = UDiv;
1048
1049 // If the operands had two different domains, we need to negate the result.
1050 if (Ops[0].D != Ops[1].D) {
1051 Res = BinaryOperator::CreateNeg(Res, Res->getName() + ".neg",
1052 SDI->getIterator());
1053 Res->setDebugLoc(SDI->getDebugLoc());
1054 }
1055
1056 SDI->replaceAllUsesWith(Res);
1057 SDI->eraseFromParent();
1058
1059 // Try to simplify our new udiv.
1060 processUDivOrURem(UDiv, LVI);
1061
1062 return true;
1063}
1064
1066 assert(Instr->getOpcode() == Instruction::SDiv ||
1067 Instr->getOpcode() == Instruction::SRem);
1068 ConstantRange LCR =
1069 LVI->getConstantRangeAtUse(Instr->getOperandUse(0), /*AllowUndef*/ false);
1070 // Allow undef for RHS, as we can assume it is division by zero UB.
1071 ConstantRange RCR =
1072 LVI->getConstantRangeAtUse(Instr->getOperandUse(1), /*AlloweUndef*/ true);
1073 if (Instr->getOpcode() == Instruction::SDiv)
1074 if (processSDiv(Instr, LCR, RCR, LVI))
1075 return true;
1076
1077 if (Instr->getOpcode() == Instruction::SRem) {
1078 if (processSRem(Instr, LCR, RCR, LVI))
1079 return true;
1080 }
1081
1082 return narrowSDivOrSRem(Instr, LCR, RCR);
1083}
1084
1086 ConstantRange LRange =
1087 LVI->getConstantRangeAtUse(SDI->getOperandUse(0), /*UndefAllowed*/ false);
1088 unsigned OrigWidth = SDI->getType()->getScalarSizeInBits();
1089 ConstantRange NegOneOrZero =
1090 ConstantRange(APInt(OrigWidth, (uint64_t)-1, true), APInt(OrigWidth, 1));
1091 if (NegOneOrZero.contains(LRange)) {
1092 // ashr of -1 or 0 never changes the value, so drop the whole instruction
1093 ++NumAShrsRemoved;
1094 SDI->replaceAllUsesWith(SDI->getOperand(0));
1095 SDI->eraseFromParent();
1096 return true;
1097 }
1098
1099 if (!LRange.isAllNonNegative())
1100 return false;
1101
1102 ++NumAShrsConverted;
1103 auto *BO = BinaryOperator::CreateLShr(SDI->getOperand(0), SDI->getOperand(1),
1104 "", SDI->getIterator());
1105 BO->takeName(SDI);
1106 BO->setDebugLoc(SDI->getDebugLoc());
1107 BO->setIsExact(SDI->isExact());
1108 SDI->replaceAllUsesWith(BO);
1109 SDI->eraseFromParent();
1110
1111 return true;
1112}
1113
1114static bool processSExt(SExtInst *SDI, LazyValueInfo *LVI) {
1115 const Use &Base = SDI->getOperandUse(0);
1116 if (!LVI->getConstantRangeAtUse(Base, /*UndefAllowed*/ false)
1118 return false;
1119
1120 ++NumSExt;
1121 auto *ZExt = CastInst::CreateZExtOrBitCast(Base, SDI->getType(), "",
1122 SDI->getIterator());
1123 ZExt->takeName(SDI);
1124 ZExt->setDebugLoc(SDI->getDebugLoc());
1125 ZExt->setNonNeg();
1126 SDI->replaceAllUsesWith(ZExt);
1127 SDI->eraseFromParent();
1128
1129 return true;
1130}
1131
1133 if (I->hasNonNeg())
1134 return false;
1135
1136 const Use &Base = I->getOperandUse(0);
1137 if (!LVI->getConstantRangeAtUse(Base, /*UndefAllowed*/ false)
1139 return false;
1140
1141 ++NumNNeg;
1142 I->setNonNeg();
1143
1144 return true;
1145}
1146
1147static bool processZExt(ZExtInst *ZExt, LazyValueInfo *LVI) {
1149}
1150
1151static bool processUIToFP(UIToFPInst *UIToFP, LazyValueInfo *LVI) {
1153}
1154
1155static bool processSIToFP(SIToFPInst *SIToFP, LazyValueInfo *LVI) {
1156 const Use &Base = SIToFP->getOperandUse(0);
1157 if (!LVI->getConstantRangeAtUse(Base, /*UndefAllowed*/ false)
1159 return false;
1160
1161 ++NumSIToFP;
1162 auto *UIToFP = CastInst::Create(Instruction::UIToFP, Base, SIToFP->getType(),
1163 "", SIToFP->getIterator());
1164 UIToFP->takeName(SIToFP);
1165 UIToFP->setDebugLoc(SIToFP->getDebugLoc());
1166 UIToFP->setNonNeg();
1167 SIToFP->replaceAllUsesWith(UIToFP);
1168 SIToFP->eraseFromParent();
1169
1170 return true;
1171}
1172
1173static bool processBinOp(BinaryOperator *BinOp, LazyValueInfo *LVI) {
1174 using OBO = OverflowingBinaryOperator;
1175
1176 bool NSW = BinOp->hasNoSignedWrap();
1177 bool NUW = BinOp->hasNoUnsignedWrap();
1178 if (NSW && NUW)
1179 return false;
1180
1181 Instruction::BinaryOps Opcode = BinOp->getOpcode();
1182 ConstantRange LRange = LVI->getConstantRangeAtUse(BinOp->getOperandUse(0),
1183 /*UndefAllowed=*/false);
1184 ConstantRange RRange = LVI->getConstantRangeAtUse(BinOp->getOperandUse(1),
1185 /*UndefAllowed=*/false);
1186
1187 bool Changed = false;
1188 bool NewNUW = false, NewNSW = false;
1189 if (!NUW) {
1191 Opcode, RRange, OBO::NoUnsignedWrap);
1192 NewNUW = NUWRange.contains(LRange);
1193 Changed |= NewNUW;
1194 }
1195 if (!NSW) {
1197 Opcode, RRange, OBO::NoSignedWrap);
1198 NewNSW = NSWRange.contains(LRange);
1199 Changed |= NewNSW;
1200 }
1201
1202 setDeducedOverflowingFlags(BinOp, Opcode, NewNSW, NewNUW);
1203
1204 return Changed;
1205}
1206
1207static bool processAnd(BinaryOperator *BinOp, LazyValueInfo *LVI) {
1208 using namespace llvm::PatternMatch;
1209
1210 // Pattern match (and lhs, C) where C includes a superset of bits which might
1211 // be set in lhs. This is a common truncation idiom created by instcombine.
1212 const Use &LHS = BinOp->getOperandUse(0);
1213 const APInt *RHS;
1214 if (!match(BinOp->getOperand(1), m_LowBitMask(RHS)))
1215 return false;
1216
1217 // We can only replace the AND with LHS based on range info if the range does
1218 // not include undef.
1219 ConstantRange LRange =
1220 LVI->getConstantRangeAtUse(LHS, /*UndefAllowed=*/false);
1221 if (!LRange.getUnsignedMax().ule(*RHS))
1222 return false;
1223
1224 BinOp->replaceAllUsesWith(LHS);
1225 BinOp->eraseFromParent();
1226 NumAnd++;
1227 return true;
1228}
1229
1230static bool processTrunc(TruncInst *TI, LazyValueInfo *LVI) {
1231 if (TI->hasNoSignedWrap() && TI->hasNoUnsignedWrap())
1232 return false;
1233
1235 LVI->getConstantRangeAtUse(TI->getOperandUse(0), /*UndefAllowed=*/false);
1236 uint64_t DestWidth = TI->getDestTy()->getScalarSizeInBits();
1237 bool Changed = false;
1238
1239 if (!TI->hasNoUnsignedWrap()) {
1240 if (Range.getActiveBits() <= DestWidth) {
1241 TI->setHasNoUnsignedWrap(true);
1242 ++NumNUW;
1243 Changed = true;
1244 }
1245 }
1246
1247 if (!TI->hasNoSignedWrap()) {
1248 if (Range.getMinSignedBits() <= DestWidth) {
1249 TI->setHasNoSignedWrap(true);
1250 ++NumNSW;
1251 Changed = true;
1252 }
1253 }
1254
1255 return Changed;
1256}
1257
1259 const SimplifyQuery &SQ) {
1260 bool FnChanged = false;
1261 std::optional<ConstantRange> RetRange;
1262 if (F.hasExactDefinition() && F.getReturnType()->isIntOrIntVectorTy())
1263 RetRange =
1264 ConstantRange::getEmpty(F.getReturnType()->getScalarSizeInBits());
1265
1266 // Visiting in a pre-order depth-first traversal causes us to simplify early
1267 // blocks before querying later blocks (which require us to analyze early
1268 // blocks). Eagerly simplifying shallow blocks means there is strictly less
1269 // work to do for deep blocks. This also means we don't visit unreachable
1270 // blocks.
1271 for (BasicBlock *BB : depth_first(&F.getEntryBlock())) {
1272 bool BBChanged = false;
1274 switch (II.getOpcode()) {
1275 case Instruction::Select:
1276 BBChanged |= processSelect(cast<SelectInst>(&II), LVI);
1277 break;
1278 case Instruction::PHI:
1279 BBChanged |= processPHI(cast<PHINode>(&II), LVI, DT, SQ);
1280 break;
1281 case Instruction::ICmp:
1282 case Instruction::FCmp:
1283 BBChanged |= processCmp(cast<CmpInst>(&II), LVI);
1284 break;
1285 case Instruction::Call:
1286 case Instruction::Invoke:
1287 BBChanged |= processCallSite(cast<CallBase>(II), LVI);
1288 break;
1289 case Instruction::SRem:
1290 case Instruction::SDiv:
1291 BBChanged |= processSDivOrSRem(cast<BinaryOperator>(&II), LVI);
1292 break;
1293 case Instruction::UDiv:
1294 case Instruction::URem:
1295 BBChanged |= processUDivOrURem(cast<BinaryOperator>(&II), LVI);
1296 break;
1297 case Instruction::AShr:
1298 BBChanged |= processAShr(cast<BinaryOperator>(&II), LVI);
1299 break;
1300 case Instruction::SExt:
1301 BBChanged |= processSExt(cast<SExtInst>(&II), LVI);
1302 break;
1303 case Instruction::ZExt:
1304 BBChanged |= processZExt(cast<ZExtInst>(&II), LVI);
1305 break;
1306 case Instruction::UIToFP:
1307 BBChanged |= processUIToFP(cast<UIToFPInst>(&II), LVI);
1308 break;
1309 case Instruction::SIToFP:
1310 BBChanged |= processSIToFP(cast<SIToFPInst>(&II), LVI);
1311 break;
1312 case Instruction::Add:
1313 case Instruction::Sub:
1314 case Instruction::Mul:
1315 case Instruction::Shl:
1316 BBChanged |= processBinOp(cast<BinaryOperator>(&II), LVI);
1317 break;
1318 case Instruction::And:
1319 BBChanged |= processAnd(cast<BinaryOperator>(&II), LVI);
1320 break;
1321 case Instruction::Trunc:
1322 BBChanged |= processTrunc(cast<TruncInst>(&II), LVI);
1323 break;
1324 }
1325 }
1326
1327 Instruction *Term = BB->getTerminator();
1328 switch (Term->getOpcode()) {
1329 case Instruction::Switch:
1330 BBChanged |= processSwitch(cast<SwitchInst>(Term), LVI, DT);
1331 break;
1332 case Instruction::Ret: {
1333 auto *RI = cast<ReturnInst>(Term);
1334 // Try to determine the return value if we can. This is mainly here to
1335 // simplify the writing of unit tests, but also helps to enable IPO by
1336 // constant folding the return values of callees.
1337 auto *RetVal = RI->getReturnValue();
1338 if (!RetVal) break; // handle "ret void"
1339 if (RetRange && !RetRange->isFullSet())
1340 RetRange =
1341 RetRange->unionWith(LVI->getConstantRange(RetVal, RI,
1342 /*UndefAllowed=*/false));
1343
1344 if (isa<Constant>(RetVal)) break; // nothing to do
1345 if (auto *C = getConstantAt(RetVal, RI, LVI)) {
1346 ++NumReturns;
1347 RI->replaceUsesOfWith(RetVal, C);
1348 BBChanged = true;
1349 }
1350 }
1351 }
1352
1353 FnChanged |= BBChanged;
1354 }
1355
1356 // Infer range attribute on return value.
1357 if (RetRange && !RetRange->isFullSet()) {
1358 Attribute RangeAttr = F.getRetAttribute(Attribute::Range);
1359 if (RangeAttr.isValid())
1360 RetRange = RetRange->intersectWith(RangeAttr.getRange());
1361 // Don't add attribute for constant integer returns to reduce noise. These
1362 // are propagated across functions by IPSCCP.
1363 if (!RetRange->isEmptySet() && !RetRange->isSingleElement()) {
1364 F.addRangeRetAttr(*RetRange);
1365 FnChanged = true;
1366 }
1367 }
1368 return FnChanged;
1369}
1370
1375
1376 bool Changed = runImpl(F, LVI, DT, getBestSimplifyQuery(AM, F));
1377
1379 if (!Changed) {
1381 } else {
1382#if defined(EXPENSIVE_CHECKS)
1383 assert(DT->verify(DominatorTree::VerificationLevel::Full));
1384#else
1385 assert(DT->verify(DominatorTree::VerificationLevel::Fast));
1386#endif // EXPENSIVE_CHECKS
1387
1390 }
1391
1392 // Keeping LVI alive is expensive, both because it uses a lot of memory, and
1393 // because invalidating values in LVI is expensive. While CVP does preserve
1394 // LVI, we know that passes after JumpThreading+CVP will not need the result
1395 // of this analysis, so we forcefully discard it early.
1397 return PA;
1398}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file contains the simple types necessary to represent the attributes associated with functions a...
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static bool processICmp(ICmpInst *Cmp, LazyValueInfo *LVI)
static bool processAnd(BinaryOperator *BinOp, LazyValueInfo *LVI)
static bool processOverflowIntrinsic(WithOverflowInst *WO, LazyValueInfo *LVI)
static bool processSDivOrSRem(BinaryOperator *Instr, LazyValueInfo *LVI)
static bool expandUDivOrURem(BinaryOperator *Instr, const ConstantRange &XCR, const ConstantRange &YCR)
static bool constantFoldCmp(CmpInst *Cmp, LazyValueInfo *LVI)
See if LazyValueInfo's ability to exploit edge conditions or range information is sufficient to prove...
static bool processSaturatingInst(SaturatingInst *SI, LazyValueInfo *LVI)
static Value * getValueOnEdge(LazyValueInfo *LVI, Value *Incoming, BasicBlock *From, BasicBlock *To, Instruction *CxtI)
static bool narrowUDivOrURem(BinaryOperator *Instr, const ConstantRange &XCR, const ConstantRange &YCR)
Try to shrink a udiv/urem's width down to the smallest power of two that's sufficient to contain its ...
static bool willNotOverflow(BinaryOpIntrinsic *BO, LazyValueInfo *LVI)
static bool processSelect(SelectInst *S, LazyValueInfo *LVI)
static bool runImpl(Function &F, LazyValueInfo *LVI, DominatorTree *DT, const SimplifyQuery &SQ)
static void setDeducedOverflowingFlags(Value *V, Instruction::BinaryOps Opcode, bool NewNSW, bool NewNUW)
static bool processMinMaxIntrinsic(MinMaxIntrinsic *MM, LazyValueInfo *LVI)
static bool processBinOp(BinaryOperator *BinOp, LazyValueInfo *LVI)
static bool simplifyCommonValuePhi(PHINode *P, LazyValueInfo *LVI, DominatorTree *DT)
Try to simplify a phi with constant incoming values that match the edge values of a non-constant valu...
static bool processSRem(BinaryOperator *SDI, const ConstantRange &LCR, const ConstantRange &RCR, LazyValueInfo *LVI)
static Domain getDomain(const ConstantRange &CR)
static bool processPHI(PHINode *P, LazyValueInfo *LVI, DominatorTree *DT, const SimplifyQuery &SQ)
static bool processTrunc(TruncInst *TI, LazyValueInfo *LVI)
static bool processUDivOrURem(BinaryOperator *Instr, LazyValueInfo *LVI)
static bool processCmpIntrinsic(CmpIntrinsic *CI, LazyValueInfo *LVI)
static bool processSDiv(BinaryOperator *SDI, const ConstantRange &LCR, const ConstantRange &RCR, LazyValueInfo *LVI)
See if LazyValueInfo's ability to exploit edge conditions or range information is sufficient to prove...
static bool processAShr(BinaryOperator *SDI, LazyValueInfo *LVI)
static bool processZExt(ZExtInst *ZExt, LazyValueInfo *LVI)
static bool narrowSDivOrSRem(BinaryOperator *Instr, const ConstantRange &LCR, const ConstantRange &RCR)
Try to shrink a sdiv/srem's width down to the smallest power of two that's sufficient to contain its ...
static bool processSIToFP(SIToFPInst *SIToFP, LazyValueInfo *LVI)
static bool processSExt(SExtInst *SDI, LazyValueInfo *LVI)
static bool processPossibleNonNeg(PossiblyNonNegInst *I, LazyValueInfo *LVI)
static bool processSwitch(SwitchInst *I, LazyValueInfo *LVI, DominatorTree *DT)
Simplify a switch instruction by removing cases which can never fire.
static bool processUIToFP(UIToFPInst *UIToFP, LazyValueInfo *LVI)
static Constant * getConstantAt(Value *V, Instruction *At, LazyValueInfo *LVI)
static bool processCmp(CmpInst *Cmp, LazyValueInfo *LVI)
static bool processAbsIntrinsic(IntrinsicInst *II, LazyValueInfo *LVI)
static bool processCallSite(CallBase &CB, LazyValueInfo *LVI)
Infer nonnull attributes for the arguments at the specified callsite.
This file builds on the ADT/GraphTraits.h file to build generic depth first graph iterator.
static bool runImpl(Function &F, const TargetLowering &TLI, const LibcallLoweringInfo &Libcalls, AssumptionCache *AC)
#define DEBUG_TYPE
This is the interface for a simple mod/ref and alias analysis over globals.
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
This header defines various interfaces for pass management in LLVM.
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
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
#define P(N)
This file contains the declarations for profiling metadata utility functions.
const SmallVectorImpl< MachineOperand > & Cond
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
Value * RHS
Value * LHS
Class for arbitrary precision integers.
Definition APInt.h:78
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
Definition APInt.h:235
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:220
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
Definition APInt.h:1157
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:201
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Functions, function parameters, and return types can have attributes to indicate how they should be t...
Definition Attributes.h:105
LLVM_ABI const ConstantRange & getRange() const
Returns the value of the range attribute.
static LLVM_ABI Attribute get(LLVMContext &Context, AttrKind Kind, uint64_t Val=0)
Return a uniquified Attribute object.
bool isValid() const
Return true if the attribute is any kind of attribute.
Definition Attributes.h:261
LLVM Basic Block Representation.
Definition BasicBlock.h:62
const Function * getParent() const
Return the enclosing method, or null if none.
Definition BasicBlock.h:213
static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)
Creates a new BasicBlock.
Definition BasicBlock.h:206
LLVM_ABI LLVMContext & getContext() const
Get the context in which this basic block lives.
LLVM_ABI void removePredecessor(BasicBlock *Pred, bool KeepOneInputPHIs=false)
Update PHI nodes in this BasicBlock before removal of predecessor Pred.
This class represents an intrinsic that is based on a binary operation.
LLVM_ABI unsigned getNoWrapKind() const
Returns one of OBO::NoSignedWrap or OBO::NoUnsignedWrap.
LLVM_ABI bool isSigned() const
Whether the intrinsic is signed or unsigned.
LLVM_ABI Instruction::BinaryOps getBinaryOp() const
Returns the binary operation underlying the intrinsic.
static LLVM_ABI BinaryOperator * CreateNeg(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Helper functions to construct and inspect unary operations (NEG and NOT) via binary operators SUB and...
BinaryOps getOpcode() const
Definition InstrTypes.h:374
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
std::optional< OperandBundleUse > getOperandBundle(StringRef Name) const
Return an operand bundle by name, if present.
LLVM_ABI bool paramHasAttr(unsigned ArgNo, Attribute::AttrKind Kind) const
Determine whether the argument or parameter has the given attribute.
void setAttributes(AttributeList A)
Set the attributes for this call.
LLVM_ABI Intrinsic::ID getIntrinsicID() const
Returns the intrinsic ID of the intrinsic called or Intrinsic::not_intrinsic if the called function i...
iterator_range< User::op_iterator > args()
Iteration adapter for range-for loops.
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
static LLVM_ABI CastInst * CreateZExtOrBitCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a ZExt or BitCast cast instruction.
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
Type * getDestTy() const
Return the destination type, as a convenience.
Definition InstrTypes.h:617
This class is the base class for the comparison instructions.
Definition InstrTypes.h:664
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:676
@ ICMP_SLE
signed less or equal
Definition InstrTypes.h:706
@ ICMP_UGE
unsigned greater or equal
Definition InstrTypes.h:700
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:701
@ ICMP_ULE
unsigned less or equal
Definition InstrTypes.h:702
Predicate getNonStrictPredicate() const
For example, SGT -> SGE, SLT -> SLE, ULT -> ULE, UGT -> UGE.
Definition InstrTypes.h:871
This class represents a ucmp/scmp intrinsic.
static CmpInst::Predicate getGTPredicate(Intrinsic::ID ID)
static CmpInst::Predicate getLTPredicate(Intrinsic::ID ID)
This is the shared class of boolean and integer constants.
Definition Constants.h:87
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static ConstantInt * getSigned(IntegerType *Ty, int64_t V, bool ImplicitTrunc=false)
Return a ConstantInt with the specified value for the specified type.
Definition Constants.h:135
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:159
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
This class represents a range of values.
LLVM_ABI unsigned getActiveBits() const
Compute the maximal number of active bits needed to represent every value in this range.
static LLVM_ABI CmpInst::Predicate getEquivalentPredWithFlippedSignedness(CmpInst::Predicate Pred, const ConstantRange &CR1, const ConstantRange &CR2)
If the comparison between constant ranges this and Other is insensitive to the signedness of the comp...
const APInt * getSingleElement() const
If this set contains a single element, return it, otherwise return null.
LLVM_ABI bool isAllNegative() const
Return true if all values in this range are negative.
LLVM_ABI bool icmp(CmpInst::Predicate Pred, const ConstantRange &Other) const
Does the predicate Pred hold between ranges this and Other?
LLVM_ABI bool isSizeLargerThan(uint64_t MaxSize) const
Compare set size of this range with Value.
LLVM_ABI ConstantRange abs(bool IntMinIsPoison=false) const
Calculate absolute value range.
LLVM_ABI ConstantRange uadd_sat(const ConstantRange &Other) const
Perform an unsigned saturating addition of two constant ranges.
bool isSingleElement() const
Return true if this set contains exactly one member.
LLVM_ABI bool isAllNonNegative() const
Return true if all values in this range are non-negative.
LLVM_ABI ConstantRange sdiv(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a signed division of a value in th...
LLVM_ABI bool contains(const APInt &Val) const
Return true if the specified value is in the set.
LLVM_ABI APInt getUnsignedMax() const
Return the largest unsigned value contained in the ConstantRange.
static LLVM_ABI bool areInsensitiveToSignednessOfICmpPredicate(const ConstantRange &CR1, const ConstantRange &CR2)
Return true iff CR1 ult CR2 is equivalent to CR1 slt CR2.
static LLVM_ABI ConstantRange makeGuaranteedNoWrapRegion(Instruction::BinaryOps BinOp, const ConstantRange &Other, unsigned NoWrapKind)
Produce the largest range containing all X such that "X BinOp Y" is guaranteed not to wrap (overflow)...
LLVM_ABI unsigned getMinSignedBits() const
Compute the maximal number of bits needed to represent every value in this signed range.
uint32_t getBitWidth() const
Get the bit width of this ConstantRange.
static LLVM_ABI Constant * get(StructType *T, 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.
static DebugLoc getTemporary()
Definition DebugLoc.h:160
Analysis pass which computes a DominatorTree.
Definition Dominators.h:283
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:164
LLVM_ABI bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
void applyUpdatesPermissive(ArrayRef< UpdateT > Updates)
Submit updates to all available trees.
void applyUpdates(ArrayRef< UpdateT > Updates)
Submit updates to all available trees.
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:2787
LLVM_ABI bool hasNoUnsignedWrap() const LLVM_READONLY
Determine whether the no unsigned wrap flag is set.
LLVM_ABI bool hasNoSignedWrap() const LLVM_READONLY
Determine whether the no signed wrap flag is set.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI bool isExact() const LLVM_READONLY
Determine whether the exact flag is set.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
A wrapper class for inspecting calls to intrinsic functions.
Intrinsic::ID getIntrinsicID() const
Return the intrinsic ID of this intrinsic.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
Analysis to compute lazy value information.
This pass computes, caches, and vends lazy value constraint information.
ConstantRange getConstantRangeAtUse(const Use &U, bool UndefAllowed)
Return the ConstantRange constraint that is known to hold for the value at a specific use-site.
ConstantRange getConstantRange(Value *V, Instruction *CxtI, bool UndefAllowed)
Return the ConstantRange constraint that is known to hold for the specified value at the specified in...
Constant * getPredicateOnEdge(CmpInst::Predicate Pred, Value *V, Constant *C, BasicBlock *FromBB, BasicBlock *ToBB, Instruction *CxtI=nullptr)
Determine whether the specified value comparison with a constant is known to be true or false on the ...
Constant * getConstantOnEdge(Value *V, BasicBlock *FromBB, BasicBlock *ToBB, Instruction *CxtI=nullptr)
Determine whether the specified value is known to be a constant on the specified edge.
Constant * getConstant(Value *V, Instruction *CxtI)
Determine whether the specified value is known to be a constant at the specified instruction.
Constant * getPredicateAt(CmpInst::Predicate Pred, Value *V, Constant *C, Instruction *CxtI, bool UseBlockValue)
Determine whether the specified value comparison with a constant is known to be true or false at the ...
This class represents min/max intrinsics.
Value * getLHS() const
Value * getRHS() const
static ICmpInst::Predicate getPredicate(Intrinsic::ID ID)
Returns the comparison predicate underlying the intrinsic.
static bool isSigned(Intrinsic::ID ID)
Whether the intrinsic is signed or unsigned.
Utility class for integer operators which may exhibit overflow - Add, Sub, Mul, and Shl.
Definition Operator.h:78
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Instruction that can have a nneg flag (zext/uitofp).
Definition InstrTypes.h:639
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
PreservedAnalyses & abandon()
Mark an analysis as abandoned.
Definition Analysis.h:171
PreservedAnalyses & preserve()
Mark an analysis as preserved.
Definition Analysis.h:132
This class represents a sign extension of integer types.
This class represents a cast from signed integer to floating point.
Represents a saturating add/sub intrinsic.
This class represents the LLVM 'select' instruction.
const Value * getFalseValue() const
const Value * getCondition() const
const Value * getTrueValue() const
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Class to represent struct types.
A wrapper class to simplify modification of SwitchInst cases along with their prof branch_weights met...
Multiway switch.
This class represents a truncation of integer types.
void setHasNoSignedWrap(bool B)
void setHasNoUnsignedWrap(bool B)
bool hasNoSignedWrap() const
Test whether this operation is known to never undergo signed overflow, aka the nsw property.
bool hasNoUnsignedWrap() const
Test whether this operation is known to never undergo unsigned overflow, aka the nuw property.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:273
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:230
This class represents a cast unsigned integer to floating point.
This function has undefined behavior.
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
const Use & getOperandUse(unsigned i) const
Definition User.h:220
Value * getOperand(unsigned i) const
Definition User.h:207
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition Value.cpp:553
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:259
bool use_empty() const
Definition Value.h:346
iterator_range< use_iterator > uses()
Definition Value.h:380
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
Definition Value.cpp:322
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition Value.cpp:403
Represents an op.with.overflow intrinsic.
This class represents zero extension of integer types.
self_iterator getIterator()
Definition ilist_node.h:123
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
cst_pred_ty< is_lowbit_mask > m_LowBitMask()
Match an integer or vector with only the low bit(s) set.
bool match(Val *V, const Pattern &P)
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
LLVM_ABI bool ConstantFoldTerminator(BasicBlock *BB, bool DeleteDeadConditions=false, const TargetLibraryInfo *TLI=nullptr, DomTreeUpdater *DTU=nullptr)
If a terminator instruction is predicated on a constant value, convert it into an unconditional branc...
Definition Local.cpp:134
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
auto successors(const MachineBasicBlock *BB)
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition STLExtras.h:634
LLVM_ABI bool isGuaranteedNotToBeUndef(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Returns true if V cannot be undef, but may be poison.
uint64_t PowerOf2Ceil(uint64_t A)
Returns the power of two which is greater than or equal to the given value.
Definition MathExtras.h:385
LLVM_ABI Value * simplifyInstruction(Instruction *I, const SimplifyQuery &Q)
See if we can compute a simplified version of this instruction.
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
NoopStatistic Statistic
Definition Statistic.h:162
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
DWARFExpression::Operation Op
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
iterator_range< df_iterator< T > > depth_first(const T &G)
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI bool isGuaranteedNotToBePoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Returns true if V cannot be poison, but may be undef.
LLVM_ABI const SimplifyQuery getBestSimplifyQuery(Pass &, Function &)
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
Incoming for lane maks phi as machine instruction, incoming register Reg and incoming block Block are...