LLVM: lib/Transforms/Utils/LoopConstrainer.cpp Source File (original) (raw)

10

11using namespace llvm;

12

13static const char *ClonedLoopTag = "loop_constrainer.loop.clone";

14

15#define DEBUG_TYPE "loop-constrainer"

16

17

18

21 unsigned LatchBrExitIdx, Loop *L,

25 return false;

26

28 return false;

29

31

32 LLVM_DEBUG(dbgs() << "isSafeDecreasingBound with:\n");

35 LLVM_DEBUG(dbgs() << "BoundSCEV: " << *BoundSCEV << "\n");

37 LLVM_DEBUG(dbgs() << "LatchExitBrIdx: " << LatchBrExitIdx << "\n");

38

40

41

44

47

48 if (LatchBrExitIdx == 1)

50

51 assert(LatchBrExitIdx == 0 && "LatchBrExitIdx should be either 0 or 1");

52

58

59 const SCEV *MinusOne =

61

64}

65

66

67

70 unsigned LatchBrExitIdx, Loop *L,

74 return false;

75

77 return false;

78

79 LLVM_DEBUG(dbgs() << "isSafeIncreasingBound with:\n");

82 LLVM_DEBUG(dbgs() << "BoundSCEV: " << *BoundSCEV << "\n");

84 LLVM_DEBUG(dbgs() << "LatchExitBrIdx: " << LatchBrExitIdx << "\n");

85

87

88

91

94

95 if (LatchBrExitIdx == 1)

97

98 assert(LatchBrExitIdx == 0 && "LatchBrExitIdx should be 0 or 1");

99

105

109}

110

111

112

113

114

116 const Loop &L) {

117 const SCEV *FromBlock =

121 return FromBlock;

122}

123

124std::optional

126 bool AllowUnsignedLatchCond,

127 const char *&FailureReason) {

128 if (!L.isLoopSimplifyForm()) {

129 FailureReason = "loop not in LoopSimplify form";

130 return std::nullopt;

131 }

132

134 assert(Latch && "Simplified loops only have one latch!");

135

137 FailureReason = "loop has already been cloned";

138 return std::nullopt;

139 }

140

141 if (!L.isLoopExiting(Latch)) {

142 FailureReason = "no loop latch";

143 return std::nullopt;

144 }

145

147 BasicBlock *Preheader = L.getLoopPreheader();

148 if (!Preheader) {

149 FailureReason = "no preheader";

150 return std::nullopt;

151 }

152

155 FailureReason = "latch terminator not conditional branch";

156 return std::nullopt;

157 }

158

160

163 FailureReason = "latch terminator branch not conditional on integral icmp";

164 return std::nullopt;

165 }

166

169 FailureReason = "could not compute latch count";

170 return std::nullopt;

171 }

174 "loop variant exit count doesn't make sense!");

175

178 const SCEV *LeftSCEV = SE.getSCEV(LeftValue);

180

182 const SCEV *RightSCEV = SE.getSCEV(RightValue);

183

184

188 std::swap(LeftValue, RightValue);

190 } else {

191 FailureReason = "no add recurrences in the icmp";

192 return std::nullopt;

193 }

194 }

195

196 auto HasNoSignedWrap = [&](const SCEVAddRecExpr *AR) {

198 return true;

199

203

206 if (ExtendAfterOp) {

208 const SCEV *ExtendedStep =

210

211 bool NoSignedWrap = ExtendAfterOp->getStart() == ExtendedStart &&

213

214 if (NoSignedWrap)

215 return true;

216 }

217

218

220 };

221

222

223

224

227 FailureReason = "LHS in cmp is not an AddRec for this loop";

228 return std::nullopt;

229 }

231 FailureReason = "LHS in icmp not induction variable";

232 return std::nullopt;

233 }

234 const SCEV *StepRec = IndVarBase->getStepRecurrence(SE);

236 FailureReason = "LHS in icmp not induction variable";

237 return std::nullopt;

238 }

240

242 FailureReason = "LHS in icmp needs nsw for equality predicates";

243 return std::nullopt;

244 }

245

247 bool IsIncreasing = !StepCI->isNegative();

253

254 const SCEV *FixedRightSCEV = nullptr;

255

256

257

259 if (L.contains(I->getParent()))

260 FixedRightSCEV = RightSCEV;

261

262 if (IsIncreasing) {

263 bool DecreasedRightValueByOne = false;

264 if (StepCI->isOne()) {

265

267

268

269

270

271

272

276 else

279

280

281

282

283

287 RightSCEV =

289 DecreasedRightValueByOne = true;

290 } else if (cannotBeMinInLoop(RightSCEV, &L, SE, true)) {

292 RightSCEV =

294 DecreasedRightValueByOne = true;

295 }

296 }

297 }

298

301 bool FoundExpectedPred =

303

304 if (!FoundExpectedPred) {

305 FailureReason = "expected icmp slt semantically, found something else";

306 return std::nullopt;

307 }

308

311 FailureReason = "unsigned latch conditions are explicitly prohibited";

312 return std::nullopt;

313 }

314

317 FailureReason = "Unsafe loop bounds";

318 return std::nullopt;

319 }

321

322

323 if (!DecreasedRightValueByOne)

324 FixedRightSCEV =

326 } else {

327 assert(!DecreasedRightValueByOne &&

328 "Right value can be decreased only for LatchBrExitIdx == 0!");

329 }

330 } else {

331 bool IncreasedRightValueByOne = false;

333

335

336

337

338

339

340

343

344

345

346

347

352 IncreasedRightValueByOne = true;

353 } else if (cannotBeMaxInLoop(RightSCEV, &L, SE, true)) {

356 IncreasedRightValueByOne = true;

357 }

358 }

359 }

360

363

364 bool FoundExpectedPred =

366

367 if (!FoundExpectedPred) {

368 FailureReason = "expected icmp sgt semantically, found something else";

369 return std::nullopt;

370 }

371

374

376 FailureReason = "unsigned latch conditions are explicitly prohibited";

377 return std::nullopt;

378 }

379

382 FailureReason = "Unsafe bounds";

383 return std::nullopt;

384 }

385

387

388

389 if (!IncreasedRightValueByOne)

390 FixedRightSCEV =

392 } else {

393 assert(!IncreasedRightValueByOne &&

394 "Right value can be increased only for LatchBrExitIdx == 0!");

395 }

396 }

398

399 assert(!L.contains(LatchExit) && "expected an exit block!");

400 SCEVExpander Expander(SE, "loop-constrainer");

402

403 if (FixedRightSCEV)

404 RightValue =

406

408 IndVarStartV->setName("indvar.start");

409

411

412 Result.Tag = "main";

413 Result.Header = Header;

414 Result.Latch = Latch;

415 Result.LatchBr = LatchBr;

418 Result.IndVarStart = IndVarStartV;

419 Result.IndVarStep = StepCI;

420 Result.IndVarBase = LeftValue;

421 Result.IndVarIncreasing = IsIncreasing;

422 Result.LoopExitAt = RightValue;

425

426 FailureReason = nullptr;

427

428 return Result;

429}

430

431

432

434

435

436 LLVMContext &Context = L.getHeader()->getContext();

437

440 Context, {MDString::get(Context, "llvm.loop.unroll.disable")});

444 Context,

445 {MDString::get(Context, "llvm.loop.vectorize.enable"), FalseVal});

447 Context, {MDString::get(Context, "llvm.loop.licm_versioning.disable")});

449 Context,

450 {MDString::get(Context, "llvm.loop.distribute.enable"), FalseVal});

452 MDNode::get(Context, {Dummy, DisableUnroll, DisableVectorize,

453 DisableLICMVersioning, DisableDistribution});

454

456 L.setLoopID(NewLoopID);

457}

458

463 : F(*L.getHeader()->getParent()), Ctx(L.getHeader()->getContext()), SE(SE),

464 DT(DT), LI(LI), LPMAddNewLoop(LPMAddNewLoop), OriginalLoop(L), RangeTy(T),

465 MainLoopStructure(LS), SR(SR) {}

466

467void LoopConstrainer::cloneLoop(LoopConstrainer::ClonedLoop &Result,

468 const char *Tag) const {

471 Result.Blocks.push_back(Clone);

472 Result.Map[BB] = Clone;

473 }

474

475 auto GetClonedValue = [&Result](Value *V) {

476 assert(V && "null values not in domain!");

477 auto It = Result.Map.find(V);

478 if (It == Result.Map.end())

479 return V;

480 return static_cast<Value *>(It->second);

481 };

482

483 auto *ClonedLatch =

484 cast(GetClonedValue(OriginalLoop.getLoopLatch()));

485 ClonedLatch->getTerminator()->setMetadata(ClonedLoopTag,

487

488 Result.Structure = MainLoopStructure.map(GetClonedValue);

490

491 for (unsigned i = 0, e = Result.Blocks.size(); i != e; ++i) {

493 BasicBlock *OriginalBB = OriginalLoop.getBlocks()[i];

494

495 assert(Result.Map[OriginalBB] == ClonedBB && "invariant!");

496

497 for (Instruction &I : *ClonedBB)

500

501

502

503

504

505 for (auto *SBB : successors(OriginalBB)) {

506 if (OriginalLoop.contains(SBB))

507 continue;

508

509 for (PHINode &PN : SBB->phis()) {

510 Value *OldIncoming = PN.getIncomingValueForBlock(OriginalBB);

511 PN.addIncoming(GetClonedValue(OldIncoming), ClonedBB);

512 SE.forgetLcssaPhiWithNewPredecessor(&OriginalLoop, &PN);

513 }

514 }

515 }

516}

517

518LoopConstrainer::RewrittenRangeInfo LoopConstrainer::changeIterationSpaceEnd(

520 BasicBlock *ContinuationBlock) const {

521

522

523

524

525

526

527

528

529

530

531

532

533

534

535

536

537

538

539

540

541

542

543

544

545

546

547

548

549

550

551

552

553

554

555

556

557

558

559

560

561

562

563

564

565

566

567

568

569

570

571

572

573

574

575

576

577

578

579

580

581

582

583

584

585

586

587

588

589

590

591

592 RewrittenRangeInfo RRI;

593

594 BasicBlock *BBInsertLocation = LS.Latch->getNextNode();

596 &F, BBInsertLocation);

598 BBInsertLocation);

599

601 bool Increasing = LS.IndVarIncreasing;

602 bool IsSignedPredicate = LS.IsSignedPredicate;

603

605 auto NoopOrExt = [&](Value *V) {

606 if (V->getType() == RangeTy)

607 return V;

608 return IsSignedPredicate ? B.CreateSExt(V, RangeTy, "wide." + V->getName())

609 : B.CreateZExt(V, RangeTy, "wide." + V->getName());

610 };

611

612

613 Value *EnterLoopCond = nullptr;

614 auto Pred =

615 Increasing

617 : (IsSignedPredicate ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT);

618 Value *IndVarStart = NoopOrExt(LS.IndVarStart);

619 EnterLoopCond = B.CreateICmp(Pred, IndVarStart, ExitSubloopAt);

620

621 B.CreateCondBr(EnterLoopCond, LS.Header, RRI.PseudoExit);

623

624 LS.LatchBr->setSuccessor(LS.LatchBrExitIdx, RRI.ExitSelector);

625 B.SetInsertPoint(LS.LatchBr);

626 Value *IndVarBase = NoopOrExt(LS.IndVarBase);

627 Value *TakeBackedgeLoopCond = B.CreateICmp(Pred, IndVarBase, ExitSubloopAt);

628

629 Value *CondForBranch = LS.LatchBrExitIdx == 1

630 ? TakeBackedgeLoopCond

631 : B.CreateNot(TakeBackedgeLoopCond);

632

633 LS.LatchBr->setCondition(CondForBranch);

634

635 B.SetInsertPoint(RRI.ExitSelector);

636

637

638

639

640 Value *LoopExitAt = NoopOrExt(LS.LoopExitAt);

641 Value *IterationsLeft = B.CreateICmp(Pred, IndVarBase, LoopExitAt);

642 B.CreateCondBr(IterationsLeft, RRI.PseudoExit, LS.LatchExit);

643

644 BranchInst *BranchToContinuation =

646

647

648

649

650 for (PHINode &PN : LS.Header->phis()) {

651 PHINode *NewPHI = PHINode::Create(PN.getType(), 2, PN.getName() + ".copy",

653

654 NewPHI->addIncoming(PN.getIncomingValueForBlock(Preheader), Preheader);

655 NewPHI->addIncoming(PN.getIncomingValueForBlock(LS.Latch),

656 RRI.ExitSelector);

657 RRI.PHIValuesAtPseudoExit.push_back(NewPHI);

658 }

659

662 RRI.IndVarEnd->addIncoming(IndVarStart, Preheader);

663 RRI.IndVarEnd->addIncoming(IndVarBase, RRI.ExitSelector);

664

665

666

667 LS.LatchExit->replacePhiUsesWith(LS.Latch, RRI.ExitSelector);

668

669 return RRI;

670}

671

672void LoopConstrainer::rewriteIncomingValuesForPHIs(

674 const LoopConstrainer::RewrittenRangeInfo &RRI) const {

675 unsigned PHIIndex = 0;

676 for (PHINode &PN : LS.Header->phis())

677 PN.setIncomingValueForBlock(ContinuationBlock,

678 RRI.PHIValuesAtPseudoExit[PHIIndex++]);

679

680 LS.IndVarStart = RRI.IndVarEnd;

681}

682

685 const char *Tag) const {

688

689 LS.Header->replacePhiUsesWith(OldPreheader, Preheader);

690

691 return Preheader;

692}

693

695 Loop *ParentLoop = OriginalLoop.getParentLoop();

696 if (!ParentLoop)

697 return;

698

699 for (BasicBlock *BB : BBs)

701}

702

703Loop *LoopConstrainer::createClonedLoopStructure(Loop *Original, Loop *Parent,

705 bool IsSubloop) {

706 Loop &New = *LI.AllocateLoop();

707 if (Parent)

709 else

710 LI.addTopLevelLoop(&New);

711 LPMAddNewLoop(&New, IsSubloop);

712

713

714 for (auto *BB : Original->blocks())

715 if (LI.getLoopFor(BB) == Original)

717

718

719 for (Loop *SubLoop : *Original)

720 createClonedLoopStructure(SubLoop, &New, VM, true);

721

722 return &New;

723}

724

726 BasicBlock *Preheader = OriginalLoop.getLoopPreheader();

727 assert(Preheader != nullptr && "precondition!");

728

729 OriginalPreheader = Preheader;

730 MainLoopPreheader = Preheader;

731 bool IsSignedPredicate = MainLoopStructure.IsSignedPredicate;

732 bool Increasing = MainLoopStructure.IndVarIncreasing;

734

735 SCEVExpander Expander(SE, "loop-constrainer");

736 Instruction *InsertPt = OriginalPreheader->getTerminator();

737

738

739

740

741 ClonedLoop PreLoop, PostLoop;

742 bool NeedsPreLoop =

743 Increasing ? SR.LowLimit.has_value() : SR.HighLimit.has_value();

744 bool NeedsPostLoop =

745 Increasing ? SR.HighLimit.has_value() : SR.LowLimit.has_value();

746

747 Value *ExitPreLoopAt = nullptr;

748 Value *ExitMainLoopAt = nullptr;

751

752 if (NeedsPreLoop) {

753 const SCEV *ExitPreLoopAtSCEV = nullptr;

754

755 if (Increasing)

756 ExitPreLoopAtSCEV = *SR.LowLimit;

758 IsSignedPredicate))

759 ExitPreLoopAtSCEV = SE.getAddExpr(*SR.HighLimit, MinusOneS);

760 else {

761 LLVM_DEBUG(dbgs() << "could not prove no-overflow when computing "

762 << "preloop exit limit. HighLimit = "

763 << *(*SR.HighLimit) << "\n");

764 return false;

765 }

766

767 if (!Expander.isSafeToExpandAt(ExitPreLoopAtSCEV, InsertPt)) {

768 LLVM_DEBUG(dbgs() << "could not prove that it is safe to expand the"

769 << " preloop exit limit " << *ExitPreLoopAtSCEV

770 << " at block " << InsertPt->getParent()->getName()

771 << "\n");

772 return false;

773 }

774

775 ExitPreLoopAt = Expander.expandCodeFor(ExitPreLoopAtSCEV, IVTy, InsertPt);

776 ExitPreLoopAt->setName("exit.preloop.at");

777 }

778

779 if (NeedsPostLoop) {

780 const SCEV *ExitMainLoopAtSCEV = nullptr;

781

782 if (Increasing)

783 ExitMainLoopAtSCEV = *SR.HighLimit;

785 IsSignedPredicate))

786 ExitMainLoopAtSCEV = SE.getAddExpr(*SR.LowLimit, MinusOneS);

787 else {

788 LLVM_DEBUG(dbgs() << "could not prove no-overflow when computing "

789 << "mainloop exit limit. LowLimit = "

790 << *(*SR.LowLimit) << "\n");

791 return false;

792 }

793

794 if (!Expander.isSafeToExpandAt(ExitMainLoopAtSCEV, InsertPt)) {

795 LLVM_DEBUG(dbgs() << "could not prove that it is safe to expand the"

796 << " main loop exit limit " << *ExitMainLoopAtSCEV

797 << " at block " << InsertPt->getParent()->getName()

798 << "\n");

799 return false;

800 }

801

802 ExitMainLoopAt = Expander.expandCodeFor(ExitMainLoopAtSCEV, IVTy, InsertPt);

803 ExitMainLoopAt->setName("exit.mainloop.at");

804 }

805

806

807

808 if (NeedsPreLoop)

809 cloneLoop(PreLoop, "preloop");

810 if (NeedsPostLoop)

811 cloneLoop(PostLoop, "postloop");

812

813 RewrittenRangeInfo PreLoopRRI;

814

815 if (NeedsPreLoop) {

817 PreLoop.Structure.Header);

818

819 MainLoopPreheader =

820 createPreheader(MainLoopStructure, Preheader, "mainloop");

821 PreLoopRRI = changeIterationSpaceEnd(PreLoop.Structure, Preheader,

822 ExitPreLoopAt, MainLoopPreheader);

823 rewriteIncomingValuesForPHIs(MainLoopStructure, MainLoopPreheader,

824 PreLoopRRI);

825 }

826

827 BasicBlock *PostLoopPreheader = nullptr;

828 RewrittenRangeInfo PostLoopRRI;

829

830 if (NeedsPostLoop) {

831 PostLoopPreheader =

832 createPreheader(PostLoop.Structure, Preheader, "postloop");

833 PostLoopRRI = changeIterationSpaceEnd(MainLoopStructure, MainLoopPreheader,

834 ExitMainLoopAt, PostLoopPreheader);

835 rewriteIncomingValuesForPHIs(PostLoop.Structure, PostLoopPreheader,

836 PostLoopRRI);

837 }

838

840 MainLoopPreheader != Preheader ? MainLoopPreheader : nullptr;

841 BasicBlock *NewBlocks[] = {PostLoopPreheader, PreLoopRRI.PseudoExit,

842 PreLoopRRI.ExitSelector, PostLoopRRI.PseudoExit,

843 PostLoopRRI.ExitSelector, NewMainLoopPreheader};

844

845

846

847 auto NewBlocksEnd =

848 std::remove(std::begin(NewBlocks), std::end(NewBlocks), nullptr);

849

850 addToParentLoopIfNeeded(ArrayRef(std::begin(NewBlocks), NewBlocksEnd));

851

852 DT.recalculate(F);

853

854

855

856

857

858 Loop *PreL = nullptr, *PostL = nullptr;

859 if (!PreLoop.Blocks.empty()) {

860 PreL = createClonedLoopStructure(&OriginalLoop,

861 OriginalLoop.getParentLoop(), PreLoop.Map,

862 false);

863 }

864

865 if (!PostLoop.Blocks.empty()) {

866 PostL =

867 createClonedLoopStructure(&OriginalLoop, OriginalLoop.getParentLoop(),

868 PostLoop.Map, false);

869 }

870

871

872 auto CanonicalizeLoop = [&](Loop *L, bool IsOriginalLoop) {

874 simplifyLoop(L, &DT, &LI, &SE, nullptr, nullptr, true);

875

876

877 if (!IsOriginalLoop)

879 };

880 if (PreL)

881 CanonicalizeLoop(PreL, false);

882 if (PostL)

883 CanonicalizeLoop(PostL, false);

884 CanonicalizeLoop(&OriginalLoop, true);

885

886

887

888

889

890

891

892

894 if (IsSignedPredicate)

896 ->setHasNoSignedWrap(true);

897

898

899

900

901

902

903

904

905

906

907

908 return true;

909}

assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")

static const Function * getParent(const Value *V)

static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")

static const char * ClonedLoopTag

Definition LoopConstrainer.cpp:13

static const SCEV * getNarrowestLatchMaxTakenCountEstimate(ScalarEvolution &SE, const Loop &L)

Returns estimate for max latch taken count of the loop of the narrowest available type.

Definition LoopConstrainer.cpp:115

static bool isSafeDecreasingBound(const SCEV *Start, const SCEV *BoundSCEV, const SCEV *Step, ICmpInst::Predicate Pred, unsigned LatchBrExitIdx, Loop *L, ScalarEvolution &SE)

Given a loop with an deccreasing induction variable, is it possible to safely calculate the bounds of...

Definition LoopConstrainer.cpp:19

static void DisableAllLoopOptsOnLoop(Loop &L)

Definition LoopConstrainer.cpp:433

static bool isSafeIncreasingBound(const SCEV *Start, const SCEV *BoundSCEV, const SCEV *Step, ICmpInst::Predicate Pred, unsigned LatchBrExitIdx, Loop *L, ScalarEvolution &SE)

Given a loop with an increasing induction variable, is it possible to safely calculate the bounds of ...

Definition LoopConstrainer.cpp:68

Class for arbitrary precision integers.

static APInt getMaxValue(unsigned numBits)

Gets maximum unsigned value of APInt for specific bit width.

static APInt getSignedMaxValue(unsigned numBits)

Gets maximum signed value of APInt for a specific bit width.

static APInt getMinValue(unsigned numBits)

Gets minimum unsigned value of APInt for a specific bit width.

static APInt getSignedMinValue(unsigned numBits)

Gets minimum signed value of APInt for a specific bit width.

ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...

LLVM Basic Block Representation.

static BasicBlock * Create(LLVMContext &Context, const Twine &Name="", Function *Parent=nullptr, BasicBlock *InsertBefore=nullptr)

Creates a new BasicBlock.

const Instruction * getTerminator() const LLVM_READONLY

Returns the terminator instruction if the block is well formed or null if the block is not well forme...

Conditional or Unconditional Branch instruction.

static BranchInst * Create(BasicBlock *IfTrue, InsertPosition InsertBefore=nullptr)

Predicate

This enumeration lists the possible predicates for CmpInst subclasses.

@ ICMP_SLT

signed less than

@ ICMP_UGT

unsigned greater than

@ ICMP_SGT

signed greater than

@ ICMP_ULT

unsigned less than

Predicate getSwappedPredicate() const

For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.

Predicate getPredicate() const

Return the predicate for this instruction.

This is the shared class of boolean and integer constants.

bool isMinusOne() const

This function will return true iff every bit in this constant is set to true.

bool isOne() const

This is just a convenience method to make client code smaller for a common case.

bool isZero() const

This is just a convenience method to make client code smaller for a common code.

const APInt & getValue() const

Return the constant as an APInt value reference.

Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.

This instruction compares its operands according to the predicate given to the constructor.

static bool isEquality(Predicate P)

Return true if this predicate is either EQ or NE.

LLVM_ABI InstListType::iterator eraseFromParent()

This method unlinks 'this' from the containing basic block and deletes it.

Class to represent integer types.

static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)

This static method is the primary way of constructing an IntegerType.

This is an important class for using LLVM in a threaded context.

void addBasicBlockToLoop(BlockT *NewBB, LoopInfoBase< BlockT, LoopT > &LI)

This method is used by other analyses to update loop information.

iterator_range< block_iterator > blocks() const

void addChildLoop(LoopT *NewChild)

Add the specified loop to be a child of this loop.

ArrayRef< BlockT * > getBlocks() const

Get a list of the basic blocks which make up this loop.

LoopConstrainer(Loop &L, LoopInfo &LI, function_ref< void(Loop *, bool)> LPMAddNewLoop, const LoopStructure &LS, ScalarEvolution &SE, DominatorTree &DT, Type *T, SubRanges SR)

Definition LoopConstrainer.cpp:459

bool run()

Definition LoopConstrainer.cpp:725

Represents a single loop in the control flow graph.

LLVM_ABI void replaceOperandWith(unsigned I, Metadata *New)

Replace a specific operand.

static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)

static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)

void addIncoming(Value *V, BasicBlock *BB)

Add an incoming value to the end of the PHI list.

static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)

Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...

This node represents a polynomial recurrence on the trip count of the specified loop.

const SCEV * getStart() const

const SCEV * getStepRecurrence(ScalarEvolution &SE) const

Constructs and returns the recurrence indicating how much this expression steps by.

This class represents a constant integer value.

This class uses information about analyze scalars to rewrite expressions in canonical form.

LLVM_ABI bool isSafeToExpandAt(const SCEV *S, const Instruction *InsertionPoint) const

Return true if the given expression is safe to expand in the sense that all materialized values are d...

LLVM_ABI Value * expandCodeFor(const SCEV *SH, Type *Ty, BasicBlock::iterator I)

Insert code to directly compute the specified SCEV expression into the program.

This class represents an analyzed expression in the program.

LLVM_ABI Type * getType() const

Return the LLVM type of this SCEV expression.

The main scalar evolution driver.

LLVM_ABI const SCEV * getNegativeSCEV(const SCEV *V, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap)

Return the SCEV object corresponding to -V.

LLVM_ABI bool isKnownNegative(const SCEV *S)

Test if the given expression is known to be negative.

LLVM_ABI bool isLoopEntryGuardedByCond(const Loop *L, CmpPredicate Pred, const SCEV *LHS, const SCEV *RHS)

Test whether entry to the loop is protected by a conditional between LHS and RHS.

LLVM_ABI const SCEV * getConstant(ConstantInt *V)

LLVM_ABI const SCEV * getSCEV(Value *V)

Return a SCEV expression for the full generality of the specified expression.

const SCEV * getOne(Type *Ty)

Return a SCEV for the constant 1 of a specific type.

LLVM_ABI LoopDisposition getLoopDisposition(const SCEV *S, const Loop *L)

Return the "disposition" of the given SCEV with respect to the given loop.

LLVM_ABI const SCEV * getMinusSCEV(const SCEV *LHS, const SCEV *RHS, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)

Return LHS-RHS.

@ LoopInvariant

The SCEV is loop-invariant.

LLVM_ABI bool isAvailableAtLoopEntry(const SCEV *S, const Loop *L)

Determine if the SCEV can be evaluated at loop's entry.

LLVM_ABI const SCEV * getExitCount(const Loop *L, const BasicBlock *ExitingBlock, ExitCountKind Kind=Exact)

Return the number of times the backedge executes before the given exit would be taken; if not exactly...

LLVM_ABI const SCEV * getSignExtendExpr(const SCEV *Op, Type *Ty, unsigned Depth=0)

@ SymbolicMaximum

An expression which provides an upper bound on the exact trip count.

LLVM_ABI const SCEV * applyLoopGuards(const SCEV *Expr, const Loop *L)

Try to apply information from loop guards for L to Expr.

LLVM_ABI const SCEV * getAddExpr(SmallVectorImpl< const SCEV * > &Ops, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)

Get a canonical add expression, or something simpler if possible.

const SCEV * getSymbolicMaxBackedgeTakenCount(const Loop *L)

When successful, this returns a SCEV that is greater than or equal to (i.e.

Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...

The instances of the Type class are immutable: once they are created, they are never changed.

static LLVM_ABI IntegerType * getInt1Ty(LLVMContext &C)

LLVM_ABI bool replaceUsesOfWith(Value *From, Value *To)

Replace uses of one Value with another.

Value * getOperand(unsigned i) const

LLVM Value Representation.

Type * getType() const

All values are typed, get the type of this value.

LLVM_ABI void setName(const Twine &Name)

Change the name of the value.

An efficient, type-erasing, non-owning reference to a callable.

const ParentTy * getParent() const

self_iterator getIterator()

@ BasicBlock

Various leaf nodes.

This is an optimization pass for GlobalISel generic memory operations.

LLVM_ABI bool simplifyLoop(Loop *L, DominatorTree *DT, LoopInfo *LI, ScalarEvolution *SE, AssumptionCache *AC, MemorySSAUpdater *MSSAU, bool PreserveLCSSA)

Simplify each loop in a loop nest recursively.

FunctionAddr VTableAddr Value

LLVM_ABI BasicBlock * CloneBasicBlock(const BasicBlock *BB, ValueToValueMapTy &VMap, const Twine &NameSuffix="", Function *F=nullptr, ClonedCodeInfo *CodeInfo=nullptr, bool MapAtoms=true)

Return a copy of the specified basic block, but without embedding the block into a particular functio...

decltype(auto) dyn_cast(const From &Val)

dyn_cast - Return the argument parameter cast to the specified type.

auto successors(const MachineBasicBlock *BB)

LLVM_ABI bool formLCSSARecursively(Loop &L, const DominatorTree &DT, const LoopInfo *LI, ScalarEvolution *SE)

Put a loop nest into LCSSA form.

LLVM_ABI bool cannotBeMaxInLoop(const SCEV *S, const Loop *L, ScalarEvolution &SE, bool Signed)

Returns true if S is defined and never is equal to signed/unsigned max.

@ RF_IgnoreMissingLocals

If this flag is set, the remapper ignores missing function-local entries (Argument,...

@ RF_NoModuleLevelChanges

If this flag is set, the remapper knows that only local values within a function (such as an instruct...

LLVM_ABI raw_ostream & dbgs()

dbgs() - This returns a reference to a raw_ostream for debugging messages.

bool isa(const From &Val)

isa - Return true if the parameter to the template is an instance of one of the template type argu...

IRBuilder(LLVMContext &, FolderTy, InserterTy, MDNode *, ArrayRef< OperandBundleDef >) -> IRBuilder< FolderTy, InserterTy >

void RemapInstruction(Instruction *I, ValueToValueMapTy &VM, RemapFlags Flags=RF_None, ValueMapTypeRemapper *TypeMapper=nullptr, ValueMaterializer *Materializer=nullptr, const MetadataPredicate *IdentityMD=nullptr)

Convert the instruction operands from referencing the current values into those specified by VM.

ArrayRef(const T &OneElt) -> ArrayRef< T >

constexpr unsigned BitWidth

ValueMap< const Value *, WeakTrackingVH > ValueToValueMapTy

decltype(auto) cast(const From &Val)

cast - Return the argument parameter cast to the specified type.

LLVM_ABI bool cannotBeMinInLoop(const SCEV *S, const Loop *L, ScalarEvolution &SE, bool Signed)

Returns true if S is defined and never is equal to signed/unsigned min.

LLVM_ABI bool isKnownNonNegativeInLoop(const SCEV *S, const Loop *L, ScalarEvolution &SE)

Returns true if we can prove that S is defined and always non-negative in loop L.

void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)

Implement std::swap in terms of BitVector swap.

static std::optional< LoopStructure > parseLoopStructure(ScalarEvolution &, Loop &, bool, const char *&)

Definition LoopConstrainer.cpp:125