LLVM 22.0.0git
PPCLoopInstrFormPrep.cpp
Go to the documentation of this file.
1//===------ PPCLoopInstrFormPrep.cpp - Loop Instr Form Prep Pass ----------===//
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 a pass to prepare loops for ppc preferred addressing
10// modes, leveraging different instruction form. (eg: DS/DQ form, D/DS form with
11// update)
12// Additional PHIs are created for loop induction variables used by load/store
13// instructions so that preferred addressing modes can be used.
14//
15// 1: DS/DQ form preparation, prepare the load/store instructions so that they
16// can satisfy the DS/DQ form displacement requirements.
17// Generically, this means transforming loops like this:
18// for (int i = 0; i < n; ++i) {
19// unsigned long x1 = *(unsigned long *)(p + i + 5);
20// unsigned long x2 = *(unsigned long *)(p + i + 9);
21// }
22//
23// to look like this:
24//
25// unsigned NewP = p + 5;
26// for (int i = 0; i < n; ++i) {
27// unsigned long x1 = *(unsigned long *)(i + NewP);
28// unsigned long x2 = *(unsigned long *)(i + NewP + 4);
29// }
30//
31// 2: D/DS form with update preparation, prepare the load/store instructions so
32// that we can use update form to do pre-increment.
33// Generically, this means transforming loops like this:
34// for (int i = 0; i < n; ++i)
35// array[i] = c;
36//
37// to look like this:
38//
39// T *p = array[-1];
40// for (int i = 0; i < n; ++i)
41// *++p = c;
42//
43// 3: common multiple chains for the load/stores with same offsets in the loop,
44// so that we can reuse the offsets and reduce the register pressure in the
45// loop. This transformation can also increase the loop ILP as now each chain
46// uses its own loop induction add/addi. But this will increase the number of
47// add/addi in the loop.
48//
49// Generically, this means transforming loops like this:
50//
51// char *p;
52// A1 = p + base1
53// A2 = p + base1 + offset
54// B1 = p + base2
55// B2 = p + base2 + offset
56//
57// for (int i = 0; i < n; i++)
58// unsigned long x1 = *(unsigned long *)(A1 + i);
59// unsigned long x2 = *(unsigned long *)(A2 + i)
60// unsigned long x3 = *(unsigned long *)(B1 + i);
61// unsigned long x4 = *(unsigned long *)(B2 + i);
62// }
63//
64// to look like this:
65//
66// A1_new = p + base1 // chain 1
67// B1_new = p + base2 // chain 2, now inside the loop, common offset is
68// // reused.
69//
70// for (long long i = 0; i < n; i+=count) {
71// unsigned long x1 = *(unsigned long *)(A1_new + i);
72// unsigned long x2 = *(unsigned long *)((A1_new + i) + offset);
73// unsigned long x3 = *(unsigned long *)(B1_new + i);
74// unsigned long x4 = *(unsigned long *)((B1_new + i) + offset);
75// }
76//===----------------------------------------------------------------------===//
77
78#include "PPC.h"
79#include "PPCSubtarget.h"
80#include "PPCTargetMachine.h"
84#include "llvm/ADT/Statistic.h"
88#include "llvm/IR/BasicBlock.h"
89#include "llvm/IR/CFG.h"
90#include "llvm/IR/Dominators.h"
91#include "llvm/IR/Instruction.h"
94#include "llvm/IR/IntrinsicsPowerPC.h"
95#include "llvm/IR/Type.h"
96#include "llvm/IR/Value.h"
97#include "llvm/Pass.h"
100#include "llvm/Support/Debug.h"
107#include <cassert>
108#include <cmath>
109#include <utility>
110
111#define DEBUG_TYPE "ppc-loop-instr-form-prep"
112
113using namespace llvm;
114
116 MaxVarsPrep("ppc-formprep-max-vars", cl::Hidden, cl::init(24),
117 cl::desc("Potential common base number threshold per function "
118 "for PPC loop prep"));
119
120static cl::opt<bool> PreferUpdateForm("ppc-formprep-prefer-update",
121 cl::init(true), cl::Hidden,
122 cl::desc("prefer update form when ds form is also a update form"));
123
125 "ppc-formprep-update-nonconst-inc", cl::init(false), cl::Hidden,
126 cl::desc("prepare update form when the load/store increment is a loop "
127 "invariant non-const value."));
128
130 "ppc-formprep-chain-commoning", cl::init(false), cl::Hidden,
131 cl::desc("Enable chain commoning in PPC loop prepare pass."));
132
133// Sum of following 3 per loop thresholds for all loops can not be larger
134// than MaxVarsPrep.
135// now the thresholds for each kind prep are exterimental values on Power9.
136static cl::opt<unsigned> MaxVarsUpdateForm("ppc-preinc-prep-max-vars",
138 cl::desc("Potential PHI threshold per loop for PPC loop prep of update "
139 "form"));
140
141static cl::opt<unsigned> MaxVarsDSForm("ppc-dsprep-max-vars",
143 cl::desc("Potential PHI threshold per loop for PPC loop prep of DS form"));
144
145static cl::opt<unsigned> MaxVarsDQForm("ppc-dqprep-max-vars",
147 cl::desc("Potential PHI threshold per loop for PPC loop prep of DQ form"));
148
149// Commoning chain will reduce the register pressure, so we don't consider about
150// the PHI nodes number.
151// But commoning chain will increase the addi/add number in the loop and also
152// increase loop ILP. Maximum chain number should be same with hardware
153// IssueWidth, because we won't benefit from ILP if the parallel chains number
154// is bigger than IssueWidth. We assume there are 2 chains in one bucket, so
155// there would be 4 buckets at most on P9(IssueWidth is 8).
157 "ppc-chaincommon-max-vars", cl::Hidden, cl::init(4),
158 cl::desc("Bucket number per loop for PPC loop chain common"));
159
160// If would not be profitable if the common base has only one load/store, ISEL
161// should already be able to choose best load/store form based on offset for
162// single load/store. Set minimal profitable value default to 2 and make it as
163// an option.
164static cl::opt<unsigned> DispFormPrepMinThreshold("ppc-dispprep-min-threshold",
166 cl::desc("Minimal common base load/store instructions triggering DS/DQ form "
167 "preparation"));
168
170 "ppc-chaincommon-min-threshold", cl::Hidden, cl::init(4),
171 cl::desc("Minimal common base load/store instructions triggering chain "
172 "commoning preparation. Must be not smaller than 4"));
173
174STATISTIC(PHINodeAlreadyExistsUpdate, "PHI node already in pre-increment form");
175STATISTIC(PHINodeAlreadyExistsDS, "PHI node already in DS form");
176STATISTIC(PHINodeAlreadyExistsDQ, "PHI node already in DQ form");
177STATISTIC(DSFormChainRewritten, "Num of DS form chain rewritten");
178STATISTIC(DQFormChainRewritten, "Num of DQ form chain rewritten");
179STATISTIC(UpdFormChainRewritten, "Num of update form chain rewritten");
180STATISTIC(ChainCommoningRewritten, "Num of commoning chains");
181
182namespace {
183 struct BucketElement {
184 BucketElement(const SCEV *O, Instruction *I) : Offset(O), Instr(I) {}
185 BucketElement(Instruction *I) : Offset(nullptr), Instr(I) {}
186
187 const SCEV *Offset;
189 };
190
191 struct Bucket {
192 Bucket(const SCEV *B, Instruction *I)
193 : BaseSCEV(B), Elements(1, BucketElement(I)) {
194 ChainSize = 0;
195 }
196
197 // The base of the whole bucket.
198 const SCEV *BaseSCEV;
199
200 // All elements in the bucket. In the bucket, the element with the BaseSCEV
201 // has no offset and all other elements are stored as offsets to the
202 // BaseSCEV.
204
205 // The potential chains size. This is used for chain commoning only.
206 unsigned ChainSize;
207
208 // The base for each potential chain. This is used for chain commoning only.
210 };
211
212 // "UpdateForm" is not a real PPC instruction form, it stands for dform
213 // load/store with update like ldu/stdu, or Prefetch intrinsic.
214 // For DS form instructions, their displacements must be multiple of 4.
215 // For DQ form instructions, their displacements must be multiple of 16.
216 enum PrepForm { UpdateForm = 1, DSForm = 4, DQForm = 16, ChainCommoning };
217
218 class PPCLoopInstrFormPrep : public FunctionPass {
219 public:
220 static char ID; // Pass ID, replacement for typeid
221
222 PPCLoopInstrFormPrep(PPCTargetMachine &TM) : FunctionPass(ID), TM(&TM) {}
223
224 void getAnalysisUsage(AnalysisUsage &AU) const override {
229 }
230
231 bool runOnFunction(Function &F) override;
232
233 private:
234 PPCTargetMachine *TM = nullptr;
235 const PPCSubtarget *ST;
236 DominatorTree *DT;
237 LoopInfo *LI;
238 ScalarEvolution *SE;
239 bool PreserveLCSSA;
240 bool HasCandidateForPrepare;
241
242 /// Successful preparation number for Update/DS/DQ form in all inner most
243 /// loops. One successful preparation will put one common base out of loop,
244 /// this may leads to register presure like LICM does.
245 /// Make sure total preparation number can be controlled by option.
246 unsigned SuccPrepCount;
247
248 bool runOnLoop(Loop *L);
249
250 /// Check if required PHI node is already exist in Loop \p L.
251 bool alreadyPrepared(Loop *L, Instruction *MemI,
252 const SCEV *BasePtrStartSCEV,
253 const SCEV *BasePtrIncSCEV, PrepForm Form);
254
255 /// Get the value which defines the increment SCEV \p BasePtrIncSCEV.
256 Value *getNodeForInc(Loop *L, Instruction *MemI,
257 const SCEV *BasePtrIncSCEV);
258
259 /// Common chains to reuse offsets for a loop to reduce register pressure.
260 bool chainCommoning(Loop *L, SmallVector<Bucket, 16> &Buckets);
261
262 /// Find out the potential commoning chains and their bases.
263 bool prepareBasesForCommoningChains(Bucket &BucketChain);
264
265 /// Rewrite load/store according to the common chains.
266 bool rewriteLoadStoresForCommoningChains(
267 Loop *L, Bucket &Bucket, SmallPtrSet<BasicBlock *, 16> &BBChanged);
268
269 /// Collect condition matched(\p isValidCandidate() returns true)
270 /// candidates in Loop \p L.
271 SmallVector<Bucket, 16> collectCandidates(
272 Loop *L,
273 std::function<bool(const Instruction *, Value *, const Type *)>
274 isValidCandidate,
275 std::function<bool(const SCEV *)> isValidDiff,
276 unsigned MaxCandidateNum);
277
278 /// Add a candidate to candidates \p Buckets if diff between candidate and
279 /// one base in \p Buckets matches \p isValidDiff.
280 void addOneCandidate(Instruction *MemI, const SCEV *LSCEV,
282 std::function<bool(const SCEV *)> isValidDiff,
283 unsigned MaxCandidateNum);
284
285 /// Prepare all candidates in \p Buckets for update form.
286 bool updateFormPrep(Loop *L, SmallVector<Bucket, 16> &Buckets);
287
288 /// Prepare all candidates in \p Buckets for displacement form, now for
289 /// ds/dq.
290 bool dispFormPrep(Loop *L, SmallVector<Bucket, 16> &Buckets, PrepForm Form);
291
292 /// Prepare for one chain \p BucketChain, find the best base element and
293 /// update all other elements in \p BucketChain accordingly.
294 /// \p Form is used to find the best base element.
295 /// If success, best base element must be stored as the first element of
296 /// \p BucketChain.
297 /// Return false if no base element found, otherwise return true.
298 bool prepareBaseForDispFormChain(Bucket &BucketChain, PrepForm Form);
299
300 /// Prepare for one chain \p BucketChain, find the best base element and
301 /// update all other elements in \p BucketChain accordingly.
302 /// If success, best base element must be stored as the first element of
303 /// \p BucketChain.
304 /// Return false if no base element found, otherwise return true.
305 bool prepareBaseForUpdateFormChain(Bucket &BucketChain);
306
307 /// Rewrite load/store instructions in \p BucketChain according to
308 /// preparation.
309 bool rewriteLoadStores(Loop *L, Bucket &BucketChain,
311 PrepForm Form);
312
313 /// Rewrite for the base load/store of a chain.
314 std::pair<Instruction *, Instruction *>
315 rewriteForBase(Loop *L, const SCEVAddRecExpr *BasePtrSCEV,
316 Instruction *BaseMemI, bool CanPreInc, PrepForm Form,
317 SCEVExpander &SCEVE, SmallPtrSet<Value *, 16> &DeletedPtrs);
318
319 /// Rewrite for the other load/stores of a chain according to the new \p
320 /// Base.
322 rewriteForBucketElement(std::pair<Instruction *, Instruction *> Base,
323 const BucketElement &Element, Value *OffToBase,
324 SmallPtrSet<Value *, 16> &DeletedPtrs);
325 };
326
327} // end anonymous namespace
328
329char PPCLoopInstrFormPrep::ID = 0;
330static const char *name = "Prepare loop for ppc preferred instruction forms";
331INITIALIZE_PASS_BEGIN(PPCLoopInstrFormPrep, DEBUG_TYPE, name, false, false)
334INITIALIZE_PASS_END(PPCLoopInstrFormPrep, DEBUG_TYPE, name, false, false)
335
336static constexpr StringRef PHINodeNameSuffix = ".phi";
337static constexpr StringRef CastNodeNameSuffix = ".cast";
338static constexpr StringRef GEPNodeIncNameSuffix = ".inc";
339static constexpr StringRef GEPNodeOffNameSuffix = ".off";
340
342 return new PPCLoopInstrFormPrep(TM);
343}
344
345static bool IsPtrInBounds(Value *BasePtr) {
346 Value *StrippedBasePtr = BasePtr;
347 while (BitCastInst *BC = dyn_cast<BitCastInst>(StrippedBasePtr))
348 StrippedBasePtr = BC->getOperand(0);
349 if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(StrippedBasePtr))
350 return GEP->isInBounds();
351
352 return false;
353}
354
355static std::string getInstrName(const Value *I, StringRef Suffix) {
356 assert(I && "Invalid paramater!");
357 if (I->hasName())
358 return (I->getName() + Suffix).str();
359 else
360 return "";
361}
362
364 Type **PtrElementType = nullptr) {
365
366 Value *PtrValue = nullptr;
367 Type *PointerElementType = nullptr;
368
369 if (LoadInst *LMemI = dyn_cast<LoadInst>(MemI)) {
370 PtrValue = LMemI->getPointerOperand();
371 PointerElementType = LMemI->getType();
372 } else if (StoreInst *SMemI = dyn_cast<StoreInst>(MemI)) {
373 PtrValue = SMemI->getPointerOperand();
374 PointerElementType = SMemI->getValueOperand()->getType();
375 } else if (IntrinsicInst *IMemI = dyn_cast<IntrinsicInst>(MemI)) {
376 PointerElementType = Type::getInt8Ty(MemI->getContext());
377 if (IMemI->getIntrinsicID() == Intrinsic::prefetch ||
378 IMemI->getIntrinsicID() == Intrinsic::ppc_vsx_lxvp) {
379 PtrValue = IMemI->getArgOperand(0);
380 } else if (IMemI->getIntrinsicID() == Intrinsic::ppc_vsx_stxvp) {
381 PtrValue = IMemI->getArgOperand(1);
382 }
383 }
384 /*Get ElementType if PtrElementType is not null.*/
385 if (PtrElementType)
386 *PtrElementType = PointerElementType;
387
388 return PtrValue;
389}
390
391bool PPCLoopInstrFormPrep::runOnFunction(Function &F) {
392 if (skipFunction(F))
393 return false;
394
395 LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
396 SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();
397 auto *DTWP = getAnalysisIfAvailable<DominatorTreeWrapperPass>();
398 DT = DTWP ? &DTWP->getDomTree() : nullptr;
399 PreserveLCSSA = mustPreserveAnalysisID(LCSSAID);
400 ST = TM ? TM->getSubtargetImpl(F) : nullptr;
401 SuccPrepCount = 0;
402
403 bool MadeChange = false;
404
405 for (Loop *I : *LI)
406 for (Loop *L : depth_first(I))
407 MadeChange |= runOnLoop(L);
408
409 return MadeChange;
410}
411
412// Finding the minimal(chain_number + reusable_offset_number) is a complicated
413// algorithmic problem.
414// For now, the algorithm used here is simply adjusted to handle the case for
415// manually unrolling cases.
416// FIXME: use a more powerful algorithm to find minimal sum of chain_number and
417// reusable_offset_number for one base with multiple offsets.
418bool PPCLoopInstrFormPrep::prepareBasesForCommoningChains(Bucket &CBucket) {
419 // The minimal size for profitable chain commoning:
420 // A1 = base + offset1
421 // A2 = base + offset2 (offset2 - offset1 = X)
422 // A3 = base + offset3
423 // A4 = base + offset4 (offset4 - offset3 = X)
424 // ======>
425 // base1 = base + offset1
426 // base2 = base + offset3
427 // A1 = base1
428 // A2 = base1 + X
429 // A3 = base2
430 // A4 = base2 + X
431 //
432 // There is benefit because of reuse of offest 'X'.
433
435 "Thredhold can not be smaller than 4!\n");
436 if (CBucket.Elements.size() < ChainCommonPrepMinThreshold)
437 return false;
438
439 // We simply select the FirstOffset as the first reusable offset between each
440 // chain element 1 and element 0.
441 const SCEV *FirstOffset = CBucket.Elements[1].Offset;
442
443 // Figure out how many times above FirstOffset is used in the chain.
444 // For a success commoning chain candidate, offset difference between each
445 // chain element 1 and element 0 must be also FirstOffset.
446 unsigned FirstOffsetReusedCount = 1;
447
448 // Figure out how many times above FirstOffset is used in the first chain.
449 // Chain number is FirstOffsetReusedCount / FirstOffsetReusedCountInFirstChain
450 unsigned FirstOffsetReusedCountInFirstChain = 1;
451
452 unsigned EleNum = CBucket.Elements.size();
453 bool SawChainSeparater = false;
454 for (unsigned j = 2; j != EleNum; ++j) {
455 if (SE->getMinusSCEV(CBucket.Elements[j].Offset,
456 CBucket.Elements[j - 1].Offset) == FirstOffset) {
457 if (!SawChainSeparater)
458 FirstOffsetReusedCountInFirstChain++;
459 FirstOffsetReusedCount++;
460 } else
461 // For now, if we meet any offset which is not FirstOffset, we assume we
462 // find a new Chain.
463 // This makes us miss some opportunities.
464 // For example, we can common:
465 //
466 // {OffsetA, Offset A, OffsetB, OffsetA, OffsetA, OffsetB}
467 //
468 // as two chains:
469 // {{OffsetA, Offset A, OffsetB}, {OffsetA, OffsetA, OffsetB}}
470 // FirstOffsetReusedCount = 4; FirstOffsetReusedCountInFirstChain = 2
471 //
472 // But we fail to common:
473 //
474 // {OffsetA, OffsetB, OffsetA, OffsetA, OffsetB, OffsetA}
475 // FirstOffsetReusedCount = 4; FirstOffsetReusedCountInFirstChain = 1
476
477 SawChainSeparater = true;
478 }
479
480 // FirstOffset is not reused, skip this bucket.
481 if (FirstOffsetReusedCount == 1)
482 return false;
483
484 unsigned ChainNum =
485 FirstOffsetReusedCount / FirstOffsetReusedCountInFirstChain;
486
487 // All elements are increased by FirstOffset.
488 // The number of chains should be sqrt(EleNum).
489 if (!SawChainSeparater)
490 ChainNum = (unsigned)sqrt((double)EleNum);
491
492 CBucket.ChainSize = (unsigned)(EleNum / ChainNum);
493
494 // If this is not a perfect chain(eg: not all elements can be put inside
495 // commoning chains.), skip now.
496 if (CBucket.ChainSize * ChainNum != EleNum)
497 return false;
498
499 if (SawChainSeparater) {
500 // Check that the offset seqs are the same for all chains.
501 for (unsigned i = 1; i < CBucket.ChainSize; i++)
502 for (unsigned j = 1; j < ChainNum; j++)
503 if (CBucket.Elements[i].Offset !=
504 SE->getMinusSCEV(CBucket.Elements[i + j * CBucket.ChainSize].Offset,
505 CBucket.Elements[j * CBucket.ChainSize].Offset))
506 return false;
507 }
508
509 for (unsigned i = 0; i < ChainNum; i++)
510 CBucket.ChainBases.push_back(CBucket.Elements[i * CBucket.ChainSize]);
511
512 LLVM_DEBUG(dbgs() << "Bucket has " << ChainNum << " chains.\n");
513
514 return true;
515}
516
517bool PPCLoopInstrFormPrep::chainCommoning(Loop *L,
518 SmallVector<Bucket, 16> &Buckets) {
519 bool MadeChange = false;
520
521 if (Buckets.empty())
522 return MadeChange;
523
525
526 for (auto &Bucket : Buckets) {
527 if (prepareBasesForCommoningChains(Bucket))
528 MadeChange |= rewriteLoadStoresForCommoningChains(L, Bucket, BBChanged);
529 }
530
531 if (MadeChange)
532 for (auto *BB : BBChanged)
533 DeleteDeadPHIs(BB);
534 return MadeChange;
535}
536
537bool PPCLoopInstrFormPrep::rewriteLoadStoresForCommoningChains(
538 Loop *L, Bucket &Bucket, SmallPtrSet<BasicBlock *, 16> &BBChanged) {
539 bool MadeChange = false;
540
541 assert(Bucket.Elements.size() ==
542 Bucket.ChainBases.size() * Bucket.ChainSize &&
543 "invalid bucket for chain commoning!\n");
544 SmallPtrSet<Value *, 16> DeletedPtrs;
545
546 BasicBlock *Header = L->getHeader();
547 BasicBlock *LoopPredecessor = L->getLoopPredecessor();
548
549 SCEVExpander SCEVE(*SE, Header->getDataLayout(),
550 "loopprepare-chaincommon");
551
552 for (unsigned ChainIdx = 0; ChainIdx < Bucket.ChainBases.size(); ++ChainIdx) {
553 unsigned BaseElemIdx = Bucket.ChainSize * ChainIdx;
554 const SCEV *BaseSCEV =
555 ChainIdx ? SE->getAddExpr(Bucket.BaseSCEV,
556 Bucket.Elements[BaseElemIdx].Offset)
557 : Bucket.BaseSCEV;
558 const SCEVAddRecExpr *BasePtrSCEV = cast<SCEVAddRecExpr>(BaseSCEV);
559
560 // Make sure the base is able to expand.
561 if (!SCEVE.isSafeToExpand(BasePtrSCEV->getStart()))
562 return MadeChange;
563
564 assert(BasePtrSCEV->isAffine() &&
565 "Invalid SCEV type for the base ptr for a candidate chain!\n");
566
567 std::pair<Instruction *, Instruction *> Base = rewriteForBase(
568 L, BasePtrSCEV, Bucket.Elements[BaseElemIdx].Instr,
569 false /* CanPreInc */, ChainCommoning, SCEVE, DeletedPtrs);
570
571 if (!Base.first || !Base.second)
572 return MadeChange;
573
574 // Keep track of the replacement pointer values we've inserted so that we
575 // don't generate more pointer values than necessary.
577 NewPtrs.insert(Base.first);
578
579 for (unsigned Idx = BaseElemIdx + 1; Idx < BaseElemIdx + Bucket.ChainSize;
580 ++Idx) {
581 BucketElement &I = Bucket.Elements[Idx];
583 assert(Ptr && "No pointer operand");
584 if (NewPtrs.count(Ptr))
585 continue;
586
587 const SCEV *OffsetSCEV =
588 BaseElemIdx ? SE->getMinusSCEV(Bucket.Elements[Idx].Offset,
589 Bucket.Elements[BaseElemIdx].Offset)
590 : Bucket.Elements[Idx].Offset;
591
592 // Make sure offset is able to expand. Only need to check one time as the
593 // offsets are reused between different chains.
594 if (!BaseElemIdx)
595 if (!SCEVE.isSafeToExpand(OffsetSCEV))
596 return false;
597
598 Value *OffsetValue = SCEVE.expandCodeFor(
599 OffsetSCEV, OffsetSCEV->getType(), LoopPredecessor->getTerminator());
600
601 Instruction *NewPtr = rewriteForBucketElement(Base, Bucket.Elements[Idx],
602 OffsetValue, DeletedPtrs);
603
604 assert(NewPtr && "Wrong rewrite!\n");
605 NewPtrs.insert(NewPtr);
606 }
607
608 ++ChainCommoningRewritten;
609 }
610
611 // Clear the rewriter cache, because values that are in the rewriter's cache
612 // can be deleted below, causing the AssertingVH in the cache to trigger.
613 SCEVE.clear();
614
615 for (auto *Ptr : DeletedPtrs) {
616 if (Instruction *IDel = dyn_cast<Instruction>(Ptr))
617 BBChanged.insert(IDel->getParent());
619 }
620
621 MadeChange = true;
622 return MadeChange;
623}
624
625// Rewrite the new base according to BasePtrSCEV.
626// bb.loop.preheader:
627// %newstart = ...
628// bb.loop.body:
629// %phinode = phi [ %newstart, %bb.loop.preheader ], [ %add, %bb.loop.body ]
630// ...
631// %add = getelementptr %phinode, %inc
632//
633// First returned instruciton is %phinode (or a type cast to %phinode), caller
634// needs this value to rewrite other load/stores in the same chain.
635// Second returned instruction is %add, caller needs this value to rewrite other
636// load/stores in the same chain.
637std::pair<Instruction *, Instruction *>
638PPCLoopInstrFormPrep::rewriteForBase(Loop *L, const SCEVAddRecExpr *BasePtrSCEV,
639 Instruction *BaseMemI, bool CanPreInc,
640 PrepForm Form, SCEVExpander &SCEVE,
641 SmallPtrSet<Value *, 16> &DeletedPtrs) {
642
643 LLVM_DEBUG(dbgs() << "PIP: Transforming: " << *BasePtrSCEV << "\n");
644
645 assert(BasePtrSCEV->getLoop() == L && "AddRec for the wrong loop?");
646
648 assert(BasePtr && "No pointer operand");
649
650 Type *I8Ty = Type::getInt8Ty(BaseMemI->getParent()->getContext());
651 Type *I8PtrTy =
652 PointerType::get(BaseMemI->getParent()->getContext(),
653 BasePtr->getType()->getPointerAddressSpace());
654
655 bool IsConstantInc = false;
656 const SCEV *BasePtrIncSCEV = BasePtrSCEV->getStepRecurrence(*SE);
657 Value *IncNode = getNodeForInc(L, BaseMemI, BasePtrIncSCEV);
658
659 const SCEVConstant *BasePtrIncConstantSCEV =
660 dyn_cast<SCEVConstant>(BasePtrIncSCEV);
661 if (BasePtrIncConstantSCEV)
662 IsConstantInc = true;
663
664 // No valid representation for the increment.
665 if (!IncNode) {
666 LLVM_DEBUG(dbgs() << "Loop Increasement can not be represented!\n");
667 return std::make_pair(nullptr, nullptr);
668 }
669
670 if (Form == UpdateForm && !IsConstantInc && !EnableUpdateFormForNonConstInc) {
672 dbgs()
673 << "Update form prepare for non-const increment is not enabled!\n");
674 return std::make_pair(nullptr, nullptr);
675 }
676
677 const SCEV *BasePtrStartSCEV = nullptr;
678 if (CanPreInc) {
679 assert(SE->isLoopInvariant(BasePtrIncSCEV, L) &&
680 "Increment is not loop invariant!\n");
681 BasePtrStartSCEV = SE->getMinusSCEV(BasePtrSCEV->getStart(),
682 IsConstantInc ? BasePtrIncConstantSCEV
683 : BasePtrIncSCEV);
684 } else
685 BasePtrStartSCEV = BasePtrSCEV->getStart();
686
687 if (alreadyPrepared(L, BaseMemI, BasePtrStartSCEV, BasePtrIncSCEV, Form)) {
688 LLVM_DEBUG(dbgs() << "Instruction form is already prepared!\n");
689 return std::make_pair(nullptr, nullptr);
690 }
691
692 LLVM_DEBUG(dbgs() << "PIP: New start is: " << *BasePtrStartSCEV << "\n");
693
694 BasicBlock *Header = L->getHeader();
695 unsigned HeaderLoopPredCount = pred_size(Header);
696 BasicBlock *LoopPredecessor = L->getLoopPredecessor();
697
698 PHINode *NewPHI = PHINode::Create(I8PtrTy, HeaderLoopPredCount,
700 NewPHI->insertBefore(Header->getFirstNonPHIIt());
701
702 Value *BasePtrStart = SCEVE.expandCodeFor(BasePtrStartSCEV, I8PtrTy,
703 LoopPredecessor->getTerminator());
704
705 // Note that LoopPredecessor might occur in the predecessor list multiple
706 // times, and we need to add it the right number of times.
707 for (auto *PI : predecessors(Header)) {
708 if (PI != LoopPredecessor)
709 continue;
710
711 NewPHI->addIncoming(BasePtrStart, LoopPredecessor);
712 }
713
714 Instruction *PtrInc = nullptr;
715 Instruction *NewBasePtr = nullptr;
716 if (CanPreInc) {
717 BasicBlock::iterator InsPoint = Header->getFirstInsertionPt();
719 I8Ty, NewPHI, IncNode, getInstrName(BaseMemI, GEPNodeIncNameSuffix),
720 InsPoint);
721 cast<GetElementPtrInst>(PtrInc)->setIsInBounds(IsPtrInBounds(BasePtr));
722 for (auto *PI : predecessors(Header)) {
723 if (PI == LoopPredecessor)
724 continue;
725
726 NewPHI->addIncoming(PtrInc, PI);
727 }
728 if (PtrInc->getType() != BasePtr->getType())
729 NewBasePtr =
730 new BitCastInst(PtrInc, BasePtr->getType(),
731 getInstrName(PtrInc, CastNodeNameSuffix), InsPoint);
732 else
733 NewBasePtr = PtrInc;
734 } else {
735 // Note that LoopPredecessor might occur in the predecessor list multiple
736 // times, and we need to make sure no more incoming value for them in PHI.
737 for (auto *PI : predecessors(Header)) {
738 if (PI == LoopPredecessor)
739 continue;
740
741 // For the latch predecessor, we need to insert a GEP just before the
742 // terminator to increase the address.
743 BasicBlock *BB = PI;
746 I8Ty, NewPHI, IncNode, getInstrName(BaseMemI, GEPNodeIncNameSuffix),
747 InsPoint);
748 cast<GetElementPtrInst>(PtrInc)->setIsInBounds(IsPtrInBounds(BasePtr));
749
750 NewPHI->addIncoming(PtrInc, PI);
751 }
752 PtrInc = NewPHI;
753 if (NewPHI->getType() != BasePtr->getType())
754 NewBasePtr = new BitCastInst(NewPHI, BasePtr->getType(),
756 Header->getFirstInsertionPt());
757 else
758 NewBasePtr = NewPHI;
759 }
760
761 BasePtr->replaceAllUsesWith(NewBasePtr);
762
763 DeletedPtrs.insert(BasePtr);
764
765 return std::make_pair(NewBasePtr, PtrInc);
766}
767
768Instruction *PPCLoopInstrFormPrep::rewriteForBucketElement(
769 std::pair<Instruction *, Instruction *> Base, const BucketElement &Element,
770 Value *OffToBase, SmallPtrSet<Value *, 16> &DeletedPtrs) {
771 Instruction *NewBasePtr = Base.first;
772 Instruction *PtrInc = Base.second;
773 assert((NewBasePtr && PtrInc) && "base does not exist!\n");
774
775 Type *I8Ty = Type::getInt8Ty(PtrInc->getParent()->getContext());
776
777 Value *Ptr = getPointerOperandAndType(Element.Instr);
778 assert(Ptr && "No pointer operand");
779
780 Instruction *RealNewPtr;
781 if (!Element.Offset ||
782 (isa<SCEVConstant>(Element.Offset) &&
783 cast<SCEVConstant>(Element.Offset)->getValue()->isZero())) {
784 RealNewPtr = NewBasePtr;
785 } else {
786 std::optional<BasicBlock::iterator> PtrIP = std::nullopt;
787 if (Instruction *I = dyn_cast<Instruction>(Ptr))
788 PtrIP = I->getIterator();
789
790 if (PtrIP && isa<Instruction>(NewBasePtr) &&
791 cast<Instruction>(NewBasePtr)->getParent() == (*PtrIP)->getParent())
792 PtrIP = std::nullopt;
793 else if (PtrIP && isa<PHINode>(*PtrIP))
794 PtrIP = (*PtrIP)->getParent()->getFirstInsertionPt();
795 else if (!PtrIP)
796 PtrIP = Element.Instr->getIterator();
797
798 assert(OffToBase && "There should be an offset for non base element!\n");
800 I8Ty, PtrInc, OffToBase,
801 getInstrName(Element.Instr, GEPNodeOffNameSuffix));
802 if (PtrIP)
803 NewPtr->insertBefore(*(*PtrIP)->getParent(), *PtrIP);
804 else
805 NewPtr->insertAfter(cast<Instruction>(PtrInc));
807 RealNewPtr = NewPtr;
808 }
809
810 Instruction *ReplNewPtr;
811 if (Ptr->getType() != RealNewPtr->getType()) {
812 ReplNewPtr = new BitCastInst(RealNewPtr, Ptr->getType(),
814 ReplNewPtr->insertAfter(RealNewPtr);
815 } else
816 ReplNewPtr = RealNewPtr;
817
818 Ptr->replaceAllUsesWith(ReplNewPtr);
819 DeletedPtrs.insert(Ptr);
820
821 return ReplNewPtr;
822}
823
824void PPCLoopInstrFormPrep::addOneCandidate(
825 Instruction *MemI, const SCEV *LSCEV, SmallVector<Bucket, 16> &Buckets,
826 std::function<bool(const SCEV *)> isValidDiff, unsigned MaxCandidateNum) {
827 assert((MemI && getPointerOperandAndType(MemI)) &&
828 "Candidate should be a memory instruction.");
829 assert(LSCEV && "Invalid SCEV for Ptr value.");
830
831 bool FoundBucket = false;
832 for (auto &B : Buckets) {
833 if (cast<SCEVAddRecExpr>(B.BaseSCEV)->getStepRecurrence(*SE) !=
834 cast<SCEVAddRecExpr>(LSCEV)->getStepRecurrence(*SE))
835 continue;
836 const SCEV *Diff = SE->getMinusSCEV(LSCEV, B.BaseSCEV);
837 if (isValidDiff(Diff)) {
838 B.Elements.push_back(BucketElement(Diff, MemI));
839 FoundBucket = true;
840 break;
841 }
842 }
843
844 if (!FoundBucket) {
845 if (Buckets.size() == MaxCandidateNum) {
846 LLVM_DEBUG(dbgs() << "Can not prepare more chains, reach maximum limit "
847 << MaxCandidateNum << "\n");
848 return;
849 }
850 Buckets.push_back(Bucket(LSCEV, MemI));
851 }
852}
853
854SmallVector<Bucket, 16> PPCLoopInstrFormPrep::collectCandidates(
855 Loop *L,
856 std::function<bool(const Instruction *, Value *, const Type *)>
857 isValidCandidate,
858 std::function<bool(const SCEV *)> isValidDiff, unsigned MaxCandidateNum) {
860
861 for (const auto &BB : L->blocks())
862 for (auto &J : *BB) {
863 Value *PtrValue = nullptr;
864 Type *PointerElementType = nullptr;
865 PtrValue = getPointerOperandAndType(&J, &PointerElementType);
866
867 if (!PtrValue)
868 continue;
869
870 if (PtrValue->getType()->getPointerAddressSpace())
871 continue;
872
873 if (L->isLoopInvariant(PtrValue))
874 continue;
875
876 const SCEV *LSCEV = SE->getSCEVAtScope(PtrValue, L);
877 const SCEVAddRecExpr *LARSCEV = dyn_cast<SCEVAddRecExpr>(LSCEV);
878 if (!LARSCEV || LARSCEV->getLoop() != L)
879 continue;
880
881 // Mark that we have candidates for preparing.
882 HasCandidateForPrepare = true;
883
884 if (isValidCandidate(&J, PtrValue, PointerElementType))
885 addOneCandidate(&J, LSCEV, Buckets, isValidDiff, MaxCandidateNum);
886 }
887 return Buckets;
888}
889
890bool PPCLoopInstrFormPrep::prepareBaseForDispFormChain(Bucket &BucketChain,
891 PrepForm Form) {
892 // RemainderOffsetInfo details:
893 // key: value of (Offset urem DispConstraint). For DSForm, it can
894 // be [0, 4).
895 // first of pair: the index of first BucketElement whose remainder is equal
896 // to key. For key 0, this value must be 0.
897 // second of pair: number of load/stores with the same remainder.
899
900 for (unsigned j = 0, je = BucketChain.Elements.size(); j != je; ++j) {
901 if (!BucketChain.Elements[j].Offset)
902 RemainderOffsetInfo[0] = std::make_pair(0, 1);
903 else {
904 unsigned Remainder = cast<SCEVConstant>(BucketChain.Elements[j].Offset)
905 ->getAPInt()
906 .urem(Form);
907 if (!RemainderOffsetInfo.contains(Remainder))
908 RemainderOffsetInfo[Remainder] = std::make_pair(j, 1);
909 else
910 RemainderOffsetInfo[Remainder].second++;
911 }
912 }
913 // Currently we choose the most profitable base as the one which has the max
914 // number of load/store with same remainder.
915 // FIXME: adjust the base selection strategy according to load/store offset
916 // distribution.
917 // For example, if we have one candidate chain for DS form preparation, which
918 // contains following load/stores with different remainders:
919 // 1: 10 load/store whose remainder is 1;
920 // 2: 9 load/store whose remainder is 2;
921 // 3: 1 for remainder 3 and 0 for remainder 0;
922 // Now we will choose the first load/store whose remainder is 1 as base and
923 // adjust all other load/stores according to new base, so we will get 10 DS
924 // form and 10 X form.
925 // But we should be more clever, for this case we could use two bases, one for
926 // remainder 1 and the other for remainder 2, thus we could get 19 DS form and
927 // 1 X form.
928 unsigned MaxCountRemainder = 0;
929 for (unsigned j = 0; j < (unsigned)Form; j++)
930 if (auto It = RemainderOffsetInfo.find(j);
931 It != RemainderOffsetInfo.end() &&
932 It->second.second > RemainderOffsetInfo[MaxCountRemainder].second)
933 MaxCountRemainder = j;
934
935 // Abort when there are too few insts with common base.
936 if (RemainderOffsetInfo[MaxCountRemainder].second < DispFormPrepMinThreshold)
937 return false;
938
939 // If the first value is most profitable, no needed to adjust BucketChain
940 // elements as they are substracted the first value when collecting.
941 if (MaxCountRemainder == 0)
942 return true;
943
944 // Adjust load/store to the new chosen base.
945 const SCEV *Offset =
946 BucketChain.Elements[RemainderOffsetInfo[MaxCountRemainder].first].Offset;
947 BucketChain.BaseSCEV = SE->getAddExpr(BucketChain.BaseSCEV, Offset);
948 for (auto &E : BucketChain.Elements) {
949 if (E.Offset)
950 E.Offset = cast<SCEVConstant>(SE->getMinusSCEV(E.Offset, Offset));
951 else
952 E.Offset = cast<SCEVConstant>(SE->getNegativeSCEV(Offset));
953 }
954
955 std::swap(BucketChain.Elements[RemainderOffsetInfo[MaxCountRemainder].first],
956 BucketChain.Elements[0]);
957 return true;
958}
959
960// FIXME: implement a more clever base choosing policy.
961// Currently we always choose an exist load/store offset. This maybe lead to
962// suboptimal code sequences. For example, for one DS chain with offsets
963// {-32769, 2003, 2007, 2011}, we choose -32769 as base offset, and left disp
964// for load/stores are {0, 34772, 34776, 34780}. Though each offset now is a
965// multipler of 4, it cannot be represented by sint16.
966bool PPCLoopInstrFormPrep::prepareBaseForUpdateFormChain(Bucket &BucketChain) {
967 // We have a choice now of which instruction's memory operand we use as the
968 // base for the generated PHI. Always picking the first instruction in each
969 // bucket does not work well, specifically because that instruction might
970 // be a prefetch (and there are no pre-increment dcbt variants). Otherwise,
971 // the choice is somewhat arbitrary, because the backend will happily
972 // generate direct offsets from both the pre-incremented and
973 // post-incremented pointer values. Thus, we'll pick the first non-prefetch
974 // instruction in each bucket, and adjust the recurrence and other offsets
975 // accordingly.
976 for (int j = 0, je = BucketChain.Elements.size(); j != je; ++j) {
977 if (auto *II = dyn_cast<IntrinsicInst>(BucketChain.Elements[j].Instr))
978 if (II->getIntrinsicID() == Intrinsic::prefetch)
979 continue;
980
981 // If we'd otherwise pick the first element anyway, there's nothing to do.
982 if (j == 0)
983 break;
984
985 // If our chosen element has no offset from the base pointer, there's
986 // nothing to do.
987 if (!BucketChain.Elements[j].Offset ||
988 cast<SCEVConstant>(BucketChain.Elements[j].Offset)->isZero())
989 break;
990
991 const SCEV *Offset = BucketChain.Elements[j].Offset;
992 BucketChain.BaseSCEV = SE->getAddExpr(BucketChain.BaseSCEV, Offset);
993 for (auto &E : BucketChain.Elements) {
994 if (E.Offset)
995 E.Offset = cast<SCEVConstant>(SE->getMinusSCEV(E.Offset, Offset));
996 else
997 E.Offset = cast<SCEVConstant>(SE->getNegativeSCEV(Offset));
998 }
999
1000 std::swap(BucketChain.Elements[j], BucketChain.Elements[0]);
1001 break;
1002 }
1003 return true;
1004}
1005
1006bool PPCLoopInstrFormPrep::rewriteLoadStores(
1007 Loop *L, Bucket &BucketChain, SmallPtrSet<BasicBlock *, 16> &BBChanged,
1008 PrepForm Form) {
1009 bool MadeChange = false;
1010
1011 const SCEVAddRecExpr *BasePtrSCEV =
1012 cast<SCEVAddRecExpr>(BucketChain.BaseSCEV);
1013 if (!BasePtrSCEV->isAffine())
1014 return MadeChange;
1015
1016 BasicBlock *Header = L->getHeader();
1017 SCEVExpander SCEVE(*SE, Header->getDataLayout(),
1018 "loopprepare-formrewrite");
1019 if (!SCEVE.isSafeToExpand(BasePtrSCEV->getStart()))
1020 return MadeChange;
1021
1022 SmallPtrSet<Value *, 16> DeletedPtrs;
1023
1024 // For some DS form load/store instructions, it can also be an update form,
1025 // if the stride is constant and is a multipler of 4. Use update form if
1026 // prefer it.
1027 bool CanPreInc = (Form == UpdateForm ||
1028 ((Form == DSForm) &&
1029 isa<SCEVConstant>(BasePtrSCEV->getStepRecurrence(*SE)) &&
1030 !cast<SCEVConstant>(BasePtrSCEV->getStepRecurrence(*SE))
1031 ->getAPInt()
1032 .urem(4) &&
1034
1035 std::pair<Instruction *, Instruction *> Base =
1036 rewriteForBase(L, BasePtrSCEV, BucketChain.Elements.begin()->Instr,
1037 CanPreInc, Form, SCEVE, DeletedPtrs);
1038
1039 if (!Base.first || !Base.second)
1040 return MadeChange;
1041
1042 // Keep track of the replacement pointer values we've inserted so that we
1043 // don't generate more pointer values than necessary.
1045 NewPtrs.insert(Base.first);
1046
1047 for (const BucketElement &BE : llvm::drop_begin(BucketChain.Elements)) {
1048 Value *Ptr = getPointerOperandAndType(BE.Instr);
1049 assert(Ptr && "No pointer operand");
1050 if (NewPtrs.count(Ptr))
1051 continue;
1052
1053 Instruction *NewPtr = rewriteForBucketElement(
1054 Base, BE,
1055 BE.Offset ? cast<SCEVConstant>(BE.Offset)->getValue() : nullptr,
1056 DeletedPtrs);
1057 assert(NewPtr && "wrong rewrite!\n");
1058 NewPtrs.insert(NewPtr);
1059 }
1060
1061 // Clear the rewriter cache, because values that are in the rewriter's cache
1062 // can be deleted below, causing the AssertingVH in the cache to trigger.
1063 SCEVE.clear();
1064
1065 for (auto *Ptr : DeletedPtrs) {
1066 if (Instruction *IDel = dyn_cast<Instruction>(Ptr))
1067 BBChanged.insert(IDel->getParent());
1069 }
1070
1071 MadeChange = true;
1072
1073 SuccPrepCount++;
1074
1075 if (Form == DSForm && !CanPreInc)
1076 DSFormChainRewritten++;
1077 else if (Form == DQForm)
1078 DQFormChainRewritten++;
1079 else if (Form == UpdateForm || (Form == DSForm && CanPreInc))
1080 UpdFormChainRewritten++;
1081
1082 return MadeChange;
1083}
1084
1085bool PPCLoopInstrFormPrep::updateFormPrep(Loop *L,
1086 SmallVector<Bucket, 16> &Buckets) {
1087 bool MadeChange = false;
1088 if (Buckets.empty())
1089 return MadeChange;
1091 for (auto &Bucket : Buckets)
1092 // The base address of each bucket is transformed into a phi and the others
1093 // are rewritten based on new base.
1094 if (prepareBaseForUpdateFormChain(Bucket))
1095 MadeChange |= rewriteLoadStores(L, Bucket, BBChanged, UpdateForm);
1096
1097 if (MadeChange)
1098 for (auto *BB : BBChanged)
1099 DeleteDeadPHIs(BB);
1100 return MadeChange;
1101}
1102
1103bool PPCLoopInstrFormPrep::dispFormPrep(Loop *L,
1104 SmallVector<Bucket, 16> &Buckets,
1105 PrepForm Form) {
1106 bool MadeChange = false;
1107
1108 if (Buckets.empty())
1109 return MadeChange;
1110
1112 for (auto &Bucket : Buckets) {
1113 if (Bucket.Elements.size() < DispFormPrepMinThreshold)
1114 continue;
1115 if (prepareBaseForDispFormChain(Bucket, Form))
1116 MadeChange |= rewriteLoadStores(L, Bucket, BBChanged, Form);
1117 }
1118
1119 if (MadeChange)
1120 for (auto *BB : BBChanged)
1121 DeleteDeadPHIs(BB);
1122 return MadeChange;
1123}
1124
1125// Find the loop invariant increment node for SCEV BasePtrIncSCEV.
1126// bb.loop.preheader:
1127// %start = ...
1128// bb.loop.body:
1129// %phinode = phi [ %start, %bb.loop.preheader ], [ %add, %bb.loop.body ]
1130// ...
1131// %add = add %phinode, %inc ; %inc is what we want to get.
1132//
1133Value *PPCLoopInstrFormPrep::getNodeForInc(Loop *L, Instruction *MemI,
1134 const SCEV *BasePtrIncSCEV) {
1135 // If the increment is a constant, no definition is needed.
1136 // Return the value directly.
1137 if (isa<SCEVConstant>(BasePtrIncSCEV))
1138 return cast<SCEVConstant>(BasePtrIncSCEV)->getValue();
1139
1140 if (!SE->isLoopInvariant(BasePtrIncSCEV, L))
1141 return nullptr;
1142
1143 BasicBlock *BB = MemI->getParent();
1144 if (!BB)
1145 return nullptr;
1146
1147 BasicBlock *LatchBB = L->getLoopLatch();
1148
1149 if (!LatchBB)
1150 return nullptr;
1151
1152 // Run through the PHIs and check their operands to find valid representation
1153 // for the increment SCEV.
1155 for (auto &CurrentPHI : PHIIter) {
1156 PHINode *CurrentPHINode = dyn_cast<PHINode>(&CurrentPHI);
1157 if (!CurrentPHINode)
1158 continue;
1159
1160 if (!SE->isSCEVable(CurrentPHINode->getType()))
1161 continue;
1162
1163 const SCEV *PHISCEV = SE->getSCEVAtScope(CurrentPHINode, L);
1164
1165 const SCEVAddRecExpr *PHIBasePtrSCEV = dyn_cast<SCEVAddRecExpr>(PHISCEV);
1166 if (!PHIBasePtrSCEV)
1167 continue;
1168
1169 const SCEV *PHIBasePtrIncSCEV = PHIBasePtrSCEV->getStepRecurrence(*SE);
1170
1171 if (!PHIBasePtrIncSCEV || (PHIBasePtrIncSCEV != BasePtrIncSCEV))
1172 continue;
1173
1174 // Get the incoming value from the loop latch and check if the value has
1175 // the add form with the required increment.
1176 if (CurrentPHINode->getBasicBlockIndex(LatchBB) < 0)
1177 continue;
1178 if (Instruction *I = dyn_cast<Instruction>(
1179 CurrentPHINode->getIncomingValueForBlock(LatchBB))) {
1180 Value *StrippedBaseI = I;
1181 while (BitCastInst *BC = dyn_cast<BitCastInst>(StrippedBaseI))
1182 StrippedBaseI = BC->getOperand(0);
1183
1184 Instruction *StrippedI = dyn_cast<Instruction>(StrippedBaseI);
1185 if (!StrippedI)
1186 continue;
1187
1188 // LSR pass may add a getelementptr instruction to do the loop increment,
1189 // also search in that getelementptr instruction.
1190 if (StrippedI->getOpcode() == Instruction::Add ||
1191 (StrippedI->getOpcode() == Instruction::GetElementPtr &&
1192 StrippedI->getNumOperands() == 2)) {
1193 if (SE->getSCEVAtScope(StrippedI->getOperand(0), L) == BasePtrIncSCEV)
1194 return StrippedI->getOperand(0);
1195 if (SE->getSCEVAtScope(StrippedI->getOperand(1), L) == BasePtrIncSCEV)
1196 return StrippedI->getOperand(1);
1197 }
1198 }
1199 }
1200 return nullptr;
1201}
1202
1203// In order to prepare for the preferred instruction form, a PHI is added.
1204// This function will check to see if that PHI already exists and will return
1205// true if it found an existing PHI with the matched start and increment as the
1206// one we wanted to create.
1207bool PPCLoopInstrFormPrep::alreadyPrepared(Loop *L, Instruction *MemI,
1208 const SCEV *BasePtrStartSCEV,
1209 const SCEV *BasePtrIncSCEV,
1210 PrepForm Form) {
1211 BasicBlock *BB = MemI->getParent();
1212 if (!BB)
1213 return false;
1214
1215 BasicBlock *PredBB = L->getLoopPredecessor();
1216 BasicBlock *LatchBB = L->getLoopLatch();
1217
1218 if (!PredBB || !LatchBB)
1219 return false;
1220
1221 // Run through the PHIs and see if we have some that looks like a preparation
1223 for (auto & CurrentPHI : PHIIter) {
1224 PHINode *CurrentPHINode = dyn_cast<PHINode>(&CurrentPHI);
1225 if (!CurrentPHINode)
1226 continue;
1227
1228 if (!SE->isSCEVable(CurrentPHINode->getType()))
1229 continue;
1230
1231 const SCEV *PHISCEV = SE->getSCEVAtScope(CurrentPHINode, L);
1232
1233 const SCEVAddRecExpr *PHIBasePtrSCEV = dyn_cast<SCEVAddRecExpr>(PHISCEV);
1234 if (!PHIBasePtrSCEV)
1235 continue;
1236
1237 const SCEVConstant *PHIBasePtrIncSCEV =
1238 dyn_cast<SCEVConstant>(PHIBasePtrSCEV->getStepRecurrence(*SE));
1239 if (!PHIBasePtrIncSCEV)
1240 continue;
1241
1242 if (CurrentPHINode->getNumIncomingValues() == 2) {
1243 if ((CurrentPHINode->getIncomingBlock(0) == LatchBB &&
1244 CurrentPHINode->getIncomingBlock(1) == PredBB) ||
1245 (CurrentPHINode->getIncomingBlock(1) == LatchBB &&
1246 CurrentPHINode->getIncomingBlock(0) == PredBB)) {
1247 if (PHIBasePtrIncSCEV == BasePtrIncSCEV) {
1248 // The existing PHI (CurrentPHINode) has the same start and increment
1249 // as the PHI that we wanted to create.
1250 if ((Form == UpdateForm || Form == ChainCommoning ) &&
1251 PHIBasePtrSCEV->getStart() == BasePtrStartSCEV) {
1252 ++PHINodeAlreadyExistsUpdate;
1253 return true;
1254 }
1255 if (Form == DSForm || Form == DQForm) {
1256 const SCEVConstant *Diff = dyn_cast<SCEVConstant>(
1257 SE->getMinusSCEV(PHIBasePtrSCEV->getStart(), BasePtrStartSCEV));
1258 if (Diff && !Diff->getAPInt().urem(Form)) {
1259 if (Form == DSForm)
1260 ++PHINodeAlreadyExistsDS;
1261 else
1262 ++PHINodeAlreadyExistsDQ;
1263 return true;
1264 }
1265 }
1266 }
1267 }
1268 }
1269 }
1270 return false;
1271}
1272
1273bool PPCLoopInstrFormPrep::runOnLoop(Loop *L) {
1274 bool MadeChange = false;
1275
1276 // Only prep. the inner-most loop
1277 if (!L->isInnermost())
1278 return MadeChange;
1279
1280 // Return if already done enough preparation.
1281 if (SuccPrepCount >= MaxVarsPrep)
1282 return MadeChange;
1283
1284 LLVM_DEBUG(dbgs() << "PIP: Examining: " << *L << "\n");
1285
1286 BasicBlock *LoopPredecessor = L->getLoopPredecessor();
1287 // If there is no loop predecessor, or the loop predecessor's terminator
1288 // returns a value (which might contribute to determining the loop's
1289 // iteration space), insert a new preheader for the loop.
1290 if (!LoopPredecessor ||
1291 !LoopPredecessor->getTerminator()->getType()->isVoidTy()) {
1292 LoopPredecessor = InsertPreheaderForLoop(L, DT, LI, nullptr, PreserveLCSSA);
1293 if (LoopPredecessor)
1294 MadeChange = true;
1295 }
1296 if (!LoopPredecessor) {
1297 LLVM_DEBUG(dbgs() << "PIP fails since no predecessor for current loop.\n");
1298 return MadeChange;
1299 }
1300 // Check if a load/store has update form. This lambda is used by function
1301 // collectCandidates which can collect candidates for types defined by lambda.
1302 auto isUpdateFormCandidate = [&](const Instruction *I, Value *PtrValue,
1303 const Type *PointerElementType) {
1304 assert((PtrValue && I) && "Invalid parameter!");
1305 // There are no update forms for Altivec vector load/stores.
1306 if (ST && ST->hasAltivec() && PointerElementType->isVectorTy())
1307 return false;
1308 // There are no update forms for P10 lxvp/stxvp intrinsic.
1309 auto *II = dyn_cast<IntrinsicInst>(I);
1310 if (II && ((II->getIntrinsicID() == Intrinsic::ppc_vsx_lxvp) ||
1311 II->getIntrinsicID() == Intrinsic::ppc_vsx_stxvp))
1312 return false;
1313 // See getPreIndexedAddressParts, the displacement for LDU/STDU has to
1314 // be 4's multiple (DS-form). For i64 loads/stores when the displacement
1315 // fits in a 16-bit signed field but isn't a multiple of 4, it will be
1316 // useless and possible to break some original well-form addressing mode
1317 // to make this pre-inc prep for it.
1318 if (PointerElementType->isIntegerTy(64)) {
1319 const SCEV *LSCEV = SE->getSCEVAtScope(const_cast<Value *>(PtrValue), L);
1320 const SCEVAddRecExpr *LARSCEV = dyn_cast<SCEVAddRecExpr>(LSCEV);
1321 if (!LARSCEV || LARSCEV->getLoop() != L)
1322 return false;
1323 if (const SCEVConstant *StepConst =
1324 dyn_cast<SCEVConstant>(LARSCEV->getStepRecurrence(*SE))) {
1325 const APInt &ConstInt = StepConst->getValue()->getValue();
1326 if (ConstInt.isSignedIntN(16) && ConstInt.srem(4) != 0)
1327 return false;
1328 }
1329 }
1330 return true;
1331 };
1332
1333 // Check if a load/store has DS form.
1334 auto isDSFormCandidate = [](const Instruction *I, Value *PtrValue,
1335 const Type *PointerElementType) {
1336 assert((PtrValue && I) && "Invalid parameter!");
1337 if (isa<IntrinsicInst>(I))
1338 return false;
1339 return (PointerElementType->isIntegerTy(64)) ||
1340 (PointerElementType->isFloatTy()) ||
1341 (PointerElementType->isDoubleTy()) ||
1342 (PointerElementType->isIntegerTy(32) &&
1343 llvm::any_of(I->users(),
1344 [](const User *U) { return isa<SExtInst>(U); }));
1345 };
1346
1347 // Check if a load/store has DQ form.
1348 auto isDQFormCandidate = [&](const Instruction *I, Value *PtrValue,
1349 const Type *PointerElementType) {
1350 assert((PtrValue && I) && "Invalid parameter!");
1351 // Check if it is a P10 lxvp/stxvp intrinsic.
1352 auto *II = dyn_cast<IntrinsicInst>(I);
1353 if (II)
1354 return II->getIntrinsicID() == Intrinsic::ppc_vsx_lxvp ||
1355 II->getIntrinsicID() == Intrinsic::ppc_vsx_stxvp;
1356 // Check if it is a P9 vector load/store.
1357 return ST && ST->hasP9Vector() && (PointerElementType->isVectorTy());
1358 };
1359
1360 // Check if a load/store is candidate for chain commoning.
1361 // If the SCEV is only with one ptr operand in its start, we can use that
1362 // start as a chain separator. Mark this load/store as a candidate.
1363 auto isChainCommoningCandidate = [&](const Instruction *I, Value *PtrValue,
1364 const Type *PointerElementType) {
1365 const SCEVAddRecExpr *ARSCEV =
1366 cast<SCEVAddRecExpr>(SE->getSCEVAtScope(PtrValue, L));
1367 if (!ARSCEV)
1368 return false;
1369
1370 if (!ARSCEV->isAffine())
1371 return false;
1372
1373 const SCEV *Start = ARSCEV->getStart();
1374
1375 // A single pointer. We can treat it as offset 0.
1376 if (isa<SCEVUnknown>(Start) && Start->getType()->isPointerTy())
1377 return true;
1378
1379 const SCEVAddExpr *ASCEV = dyn_cast<SCEVAddExpr>(Start);
1380
1381 // We need a SCEVAddExpr to include both base and offset.
1382 if (!ASCEV)
1383 return false;
1384
1385 // Make sure there is only one pointer operand(base) and all other operands
1386 // are integer type.
1387 bool SawPointer = false;
1388 for (const SCEV *Op : ASCEV->operands()) {
1389 if (Op->getType()->isPointerTy()) {
1390 if (SawPointer)
1391 return false;
1392 SawPointer = true;
1393 } else if (!Op->getType()->isIntegerTy())
1394 return false;
1395 }
1396
1397 return SawPointer;
1398 };
1399
1400 // Check if the diff is a constant type. This is used for update/DS/DQ form
1401 // preparation.
1402 auto isValidConstantDiff = [](const SCEV *Diff) {
1403 return dyn_cast<SCEVConstant>(Diff) != nullptr;
1404 };
1405
1406 // Make sure the diff between the base and new candidate is required type.
1407 // This is used for chain commoning preparation.
1408 auto isValidChainCommoningDiff = [](const SCEV *Diff) {
1409 assert(Diff && "Invalid Diff!\n");
1410
1411 // Don't mess up previous dform prepare.
1412 if (isa<SCEVConstant>(Diff))
1413 return false;
1414
1415 // A single integer type offset.
1416 if (isa<SCEVUnknown>(Diff) && Diff->getType()->isIntegerTy())
1417 return true;
1418
1419 const SCEVNAryExpr *ADiff = dyn_cast<SCEVNAryExpr>(Diff);
1420 if (!ADiff)
1421 return false;
1422
1423 for (const SCEV *Op : ADiff->operands())
1424 if (!Op->getType()->isIntegerTy())
1425 return false;
1426
1427 return true;
1428 };
1429
1430 HasCandidateForPrepare = false;
1431
1432 LLVM_DEBUG(dbgs() << "Start to prepare for update form.\n");
1433 // Collect buckets of comparable addresses used by loads and stores for update
1434 // form.
1435 SmallVector<Bucket, 16> UpdateFormBuckets = collectCandidates(
1436 L, isUpdateFormCandidate, isValidConstantDiff, MaxVarsUpdateForm);
1437
1438 // Prepare for update form.
1439 if (!UpdateFormBuckets.empty())
1440 MadeChange |= updateFormPrep(L, UpdateFormBuckets);
1441 else if (!HasCandidateForPrepare) {
1442 LLVM_DEBUG(
1443 dbgs()
1444 << "No prepare candidates found, stop praparation for current loop!\n");
1445 // If no candidate for preparing, return early.
1446 return MadeChange;
1447 }
1448
1449 LLVM_DEBUG(dbgs() << "Start to prepare for DS form.\n");
1450 // Collect buckets of comparable addresses used by loads and stores for DS
1451 // form.
1452 SmallVector<Bucket, 16> DSFormBuckets = collectCandidates(
1453 L, isDSFormCandidate, isValidConstantDiff, MaxVarsDSForm);
1454
1455 // Prepare for DS form.
1456 if (!DSFormBuckets.empty())
1457 MadeChange |= dispFormPrep(L, DSFormBuckets, DSForm);
1458
1459 LLVM_DEBUG(dbgs() << "Start to prepare for DQ form.\n");
1460 // Collect buckets of comparable addresses used by loads and stores for DQ
1461 // form.
1462 SmallVector<Bucket, 16> DQFormBuckets = collectCandidates(
1463 L, isDQFormCandidate, isValidConstantDiff, MaxVarsDQForm);
1464
1465 // Prepare for DQ form.
1466 if (!DQFormBuckets.empty())
1467 MadeChange |= dispFormPrep(L, DQFormBuckets, DQForm);
1468
1469 // Collect buckets of comparable addresses used by loads and stores for chain
1470 // commoning. With chain commoning, we reuse offsets between the chains, so
1471 // the register pressure will be reduced.
1472 if (!EnableChainCommoning) {
1473 LLVM_DEBUG(dbgs() << "Chain commoning is not enabled.\n");
1474 return MadeChange;
1475 }
1476
1477 LLVM_DEBUG(dbgs() << "Start to prepare for chain commoning.\n");
1478 SmallVector<Bucket, 16> Buckets =
1479 collectCandidates(L, isChainCommoningCandidate, isValidChainCommoningDiff,
1481
1482 // Prepare for chain commoning.
1483 if (!Buckets.empty())
1484 MadeChange |= chainCommoning(L, Buckets);
1485
1486 return MadeChange;
1487}
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")
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file builds on the ADT/GraphTraits.h file to build generic depth first graph iterator.
Hexagon Common GEP
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
uint64_t IntrinsicInst * II
static cl::opt< unsigned > ChainCommonPrepMinThreshold("ppc-chaincommon-min-threshold", cl::Hidden, cl::init(4), cl::desc("Minimal common base load/store instructions triggering chain " "commoning preparation. Must be not smaller than 4"))
static cl::opt< unsigned > MaxVarsDQForm("ppc-dqprep-max-vars", cl::Hidden, cl::init(8), cl::desc("Potential PHI threshold per loop for PPC loop prep of DQ form"))
static constexpr StringRef GEPNodeOffNameSuffix
static cl::opt< unsigned > DispFormPrepMinThreshold("ppc-dispprep-min-threshold", cl::Hidden, cl::init(2), cl::desc("Minimal common base load/store instructions triggering DS/DQ form " "preparation"))
static Value * getPointerOperandAndType(Value *MemI, Type **PtrElementType=nullptr)
static constexpr StringRef GEPNodeIncNameSuffix
static cl::opt< unsigned > MaxVarsDSForm("ppc-dsprep-max-vars", cl::Hidden, cl::init(3), cl::desc("Potential PHI threshold per loop for PPC loop prep of DS form"))
static std::string getInstrName(const Value *I, StringRef Suffix)
static constexpr StringRef PHINodeNameSuffix
static cl::opt< unsigned > MaxVarsUpdateForm("ppc-preinc-prep-max-vars", cl::Hidden, cl::init(3), cl::desc("Potential PHI threshold per loop for PPC loop prep of update " "form"))
static const char * name
static cl::opt< unsigned > MaxVarsChainCommon("ppc-chaincommon-max-vars", cl::Hidden, cl::init(4), cl::desc("Bucket number per loop for PPC loop chain common"))
#define DEBUG_TYPE
static bool IsPtrInBounds(Value *BasePtr)
static cl::opt< unsigned > MaxVarsPrep("ppc-formprep-max-vars", cl::Hidden, cl::init(24), cl::desc("Potential common base number threshold per function " "for PPC loop prep"))
static cl::opt< bool > PreferUpdateForm("ppc-formprep-prefer-update", cl::init(true), cl::Hidden, cl::desc("prefer update form when ds form is also a update form"))
static cl::opt< bool > EnableChainCommoning("ppc-formprep-chain-commoning", cl::init(false), cl::Hidden, cl::desc("Enable chain commoning in PPC loop prepare pass."))
static constexpr StringRef CastNodeNameSuffix
static cl::opt< bool > EnableUpdateFormForNonConstInc("ppc-formprep-update-nonconst-inc", cl::init(false), cl::Hidden, cl::desc("prepare update form when the load/store increment is a loop " "invariant non-const value."))
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition: PassSupport.h:42
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:44
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:39
This file defines the SmallPtrSet class.
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:167
#define LLVM_DEBUG(...)
Definition: Debug.h:119
Class for arbitrary precision integers.
Definition: APInt.h:78
LLVM_ABI APInt urem(const APInt &RHS) const
Unsigned remainder operation.
Definition: APInt.cpp:1666
bool isSignedIntN(unsigned N) const
Check if this APInt has an N-bits signed integer value.
Definition: APInt.h:435
LLVM_ABI APInt srem(const APInt &RHS) const
Function for signed remainder operation.
Definition: APInt.cpp:1736
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
LLVM Basic Block Representation.
Definition: BasicBlock.h:62
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
Definition: BasicBlock.h:528
InstListType::iterator iterator
Instruction iterators...
Definition: BasicBlock.h:170
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...
Definition: BasicBlock.h:233
This class represents a no-op cast from one type to another.
This class represents an Operation in the Expression.
iterator find(const_arg_type_t< KeyT > Val)
Definition: DenseMap.h:177
iterator end()
Definition: DenseMap.h:87
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
Definition: DenseMap.h:168
Legacy analysis pass which computes a DominatorTree.
Definition: Dominators.h:322
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition: Dominators.h:165
FunctionPass class - This class is used to implement most global optimizations.
Definition: Pass.h:314
virtual bool runOnFunction(Function &F)=0
runOnFunction - Virtual method overriden by subclasses to do the per-function processing of the pass.
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
Definition: Instructions.h:949
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Definition: Instructions.h:973
LLVM_ABI void setIsInBounds(bool b=true)
Set or clear the inbounds flag on this GEP instruction.
Module * getParent()
Get the module that this global value is contained inside of...
Definition: GlobalValue.h:663
LLVM_ABI void insertBefore(InstListType::iterator InsertPos)
Insert an unlinked instruction into a basic block immediately before the specified position.
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
Definition: Instruction.h:312
LLVM_ABI void insertAfter(Instruction *InsertPos)
Insert an unlinked instruction into a basic block immediately after the specified instruction.
A wrapper class for inspecting calls to intrinsic functions.
Definition: IntrinsicInst.h:49
An instruction for reading from memory.
Definition: Instructions.h:180
The legacy pass manager's analysis pass to compute loop information.
Definition: LoopInfo.h:597
Represents a single loop in the control flow graph.
Definition: LoopInfo.h:40
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
Value * getIncomingValueForBlock(const BasicBlock *BB) const
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
int getBasicBlockIndex(const BasicBlock *BB) const
Return the first index of the specified basic block in the value list for this PHI.
unsigned getNumIncomingValues() const
Return the number of incoming edges.
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...
Common code between 32-bit and 64-bit PowerPC targets.
virtual void getAnalysisUsage(AnalysisUsage &) const
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
Definition: Pass.cpp:112
This node represents an addition of some number of SCEVs.
This node represents a polynomial recurrence on the trip count of the specified loop.
const SCEV * getStepRecurrence(ScalarEvolution &SE) const
Constructs and returns the recurrence indicating how much this expression steps by.
bool isAffine() const
Return true if this represents an expression A + B*x where A and B are loop invariant values.
This class represents a constant integer value.
const APInt & getAPInt() const
This class uses information about analyze scalars to rewrite expressions in canonical form.
LLVM_ABI bool isSafeToExpand(const SCEV *S) const
Return true if the given expression is safe to expand in the sense that all materialized values are s...
void clear()
Erase the contents of the InsertedExpressions map so that users trying to expand the same expression ...
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 node is a base class providing common functionality for n'ary operators.
ArrayRef< const SCEV * > operands() const
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 const SCEV * getSCEVAtScope(const SCEV *S, const Loop *L)
Return a SCEV expression for the specified value at the specified scope in the program.
LLVM_ABI bool isLoopInvariant(const SCEV *S, const Loop *L)
Return true if the value of the given SCEV is unchanging in the specified loop.
LLVM_ABI bool isSCEVable(Type *Ty) const
Test if values of the given type are analyzable within the SCEV framework.
LLVM_ABI const SCEV * getMinusSCEV(const SCEV *LHS, const SCEV *RHS, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Return LHS-RHS.
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.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
Definition: SmallPtrSet.h:470
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
Definition: SmallPtrSet.h:401
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:541
bool empty() const
Definition: SmallVector.h:82
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1197
An instruction for storing to memory.
Definition: Instructions.h:296
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:55
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
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
Definition: Type.h:153
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
Definition: Type.h:156
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition: Type.h:240
bool isVoidTy() const
Return true if this is 'void'.
Definition: Type.h:139
Value * getOperand(unsigned i) const
Definition: User.h:232
unsigned getNumOperands() const
Definition: User.h:254
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 LLVMContext & getContext() const
All values hold a context through their type.
Definition: Value.cpp:1098
const ParentTy * getParent() const
Definition: ilist_node.h:34
self_iterator getIterator()
Definition: ilist_node.h:134
A range adaptor for a pair of iterators.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition: CallingConv.h:24
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:444
NodeAddr< InstrNode * > Instr
Definition: RDFGraph.h:389
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Definition: STLExtras.h:338
@ Offset
Definition: DWP.cpp:477
LLVM_ABI BasicBlock * InsertPreheaderForLoop(Loop *L, DominatorTree *DT, LoopInfo *LI, MemorySSAUpdater *MSSAU, bool PreserveLCSSA)
InsertPreheaderForLoop - Once we discover that a loop doesn't have a preheader, this method is called...
LLVM_ABI bool RecursivelyDeleteTriviallyDeadInstructions(Value *V, const TargetLibraryInfo *TLI=nullptr, MemorySSAUpdater *MSSAU=nullptr, std::function< void(Value *)> AboutToDeleteCallback=std::function< void(Value *)>())
If the specified value is a trivially dead instruction, delete it.
Definition: Local.cpp:533
FunctionPass * createPPCLoopInstrFormPrepPass(PPCTargetMachine &TM)
LLVM_ABI char & LCSSAID
Definition: LCSSA.cpp:526
auto pred_size(const MachineBasicBlock *BB)
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1751
LLVM_ABI bool DeleteDeadPHIs(BasicBlock *BB, const TargetLibraryInfo *TLI=nullptr, MemorySSAUpdater *MSSAU=nullptr)
Examine each PHI in the given block and delete it if it is dead.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:207
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition: Casting.h:565
auto predecessors(const MachineBasicBlock *BB)
iterator_range< df_iterator< T > > depth_first(const T &G)
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition: BitVector.h:858