LLVM 22.0.0git
GVNSink.cpp
Go to the documentation of this file.
1//===- GVNSink.cpp - sink expressions into successors ---------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9/// \file GVNSink.cpp
10/// This pass attempts to sink instructions into successors, reducing static
11/// instruction count and enabling if-conversion.
12///
13/// We use a variant of global value numbering to decide what can be sunk.
14/// Consider:
15///
16/// [ %a1 = add i32 %b, 1 ] [ %c1 = add i32 %d, 1 ]
17/// [ %a2 = xor i32 %a1, 1 ] [ %c2 = xor i32 %c1, 1 ]
18/// \ /
19/// [ %e = phi i32 %a2, %c2 ]
20/// [ add i32 %e, 4 ]
21///
22///
23/// GVN would number %a1 and %c1 differently because they compute different
24/// results - the VN of an instruction is a function of its opcode and the
25/// transitive closure of its operands. This is the key property for hoisting
26/// and CSE.
27///
28/// What we want when sinking however is for a numbering that is a function of
29/// the *uses* of an instruction, which allows us to answer the question "if I
30/// replace %a1 with %c1, will it contribute in an equivalent way to all
31/// successive instructions?". The PostValueTable class in GVN provides this
32/// mapping.
33//
34//===----------------------------------------------------------------------===//
35
36#include "llvm/ADT/ArrayRef.h"
37#include "llvm/ADT/DenseMap.h"
38#include "llvm/ADT/DenseSet.h"
39#include "llvm/ADT/Hashing.h"
41#include "llvm/ADT/STLExtras.h"
44#include "llvm/ADT/Statistic.h"
46#include "llvm/IR/BasicBlock.h"
47#include "llvm/IR/CFG.h"
48#include "llvm/IR/Constants.h"
49#include "llvm/IR/Function.h"
50#include "llvm/IR/InstrTypes.h"
51#include "llvm/IR/Instruction.h"
53#include "llvm/IR/PassManager.h"
54#include "llvm/IR/Type.h"
55#include "llvm/IR/Use.h"
56#include "llvm/IR/Value.h"
62#include "llvm/Support/Debug.h"
69#include <cassert>
70#include <cstddef>
71#include <cstdint>
72#include <iterator>
73#include <utility>
74
75using namespace llvm;
76
77#define DEBUG_TYPE "gvn-sink"
78
79STATISTIC(NumRemoved, "Number of instructions removed");
80
81namespace llvm {
82namespace GVNExpression {
83
85 print(dbgs());
86 dbgs() << "\n";
87}
88
89} // end namespace GVNExpression
90} // end namespace llvm
91
92namespace {
93
94static bool isMemoryInst(const Instruction *I) {
95 return isa<LoadInst>(I) || isa<StoreInst>(I) ||
96 (isa<InvokeInst>(I) && !cast<InvokeInst>(I)->doesNotAccessMemory()) ||
97 (isa<CallInst>(I) && !cast<CallInst>(I)->doesNotAccessMemory());
98}
99
100//===----------------------------------------------------------------------===//
101
102/// Candidate solution for sinking. There may be different ways to
103/// sink instructions, differing in the number of instructions sunk,
104/// the number of predecessors sunk from and the number of PHIs
105/// required.
106struct SinkingInstructionCandidate {
107 unsigned NumBlocks;
108 unsigned NumInstructions;
109 unsigned NumPHIs;
110 unsigned NumMemoryInsts;
111 int Cost = -1;
113
114 void calculateCost(unsigned NumOrigPHIs, unsigned NumOrigBlocks) {
115 unsigned NumExtraPHIs = NumPHIs - NumOrigPHIs;
116 unsigned SplitEdgeCost = (NumOrigBlocks > NumBlocks) ? 2 : 0;
117 Cost = (NumInstructions * (NumBlocks - 1)) -
118 (NumExtraPHIs *
119 NumExtraPHIs) // PHIs are expensive, so make sure they're worth it.
120 - SplitEdgeCost;
121 }
122
123 bool operator>(const SinkingInstructionCandidate &Other) const {
124 return Cost > Other.Cost;
125 }
126};
127
128#ifndef NDEBUG
129raw_ostream &operator<<(raw_ostream &OS, const SinkingInstructionCandidate &C) {
130 OS << "<Candidate Cost=" << C.Cost << " #Blocks=" << C.NumBlocks
131 << " #Insts=" << C.NumInstructions << " #PHIs=" << C.NumPHIs << ">";
132 return OS;
133}
134#endif
135
136//===----------------------------------------------------------------------===//
137
138/// Describes a PHI node that may or may not exist. These track the PHIs
139/// that must be created if we sunk a sequence of instructions. It provides
140/// a hash function for efficient equality comparisons.
141class ModelledPHI {
144
145public:
146 ModelledPHI() = default;
147
148 ModelledPHI(const PHINode *PN,
149 const DenseMap<const BasicBlock *, unsigned> &BlockOrder) {
150 // BasicBlock comes first so we sort by basic block pointer order,
151 // then by value pointer order. No need to call `verifyModelledPHI`
152 // As the Values and Blocks are populated in a deterministic order.
153 using OpsType = std::pair<BasicBlock *, Value *>;
155 for (unsigned I = 0, E = PN->getNumIncomingValues(); I != E; ++I)
157
158 auto ComesBefore = [BlockOrder](OpsType O1, OpsType O2) {
159 return BlockOrder.lookup(O1.first) < BlockOrder.lookup(O2.first);
160 };
161 // Sort in a deterministic order.
162 llvm::sort(Ops, ComesBefore);
163
164 for (auto &P : Ops) {
165 Blocks.push_back(P.first);
166 Values.push_back(P.second);
167 }
168 }
169
170 /// Create a dummy ModelledPHI that will compare unequal to any other ModelledPHI
171 /// without the same ID.
172 /// \note This is specifically for DenseMapInfo - do not use this!
173 static ModelledPHI createDummy(size_t ID) {
174 ModelledPHI M;
175 M.Values.push_back(reinterpret_cast<Value*>(ID));
176 return M;
177 }
178
179 void
180 verifyModelledPHI(const DenseMap<const BasicBlock *, unsigned> &BlockOrder) {
181 assert(Values.size() > 1 && Blocks.size() > 1 &&
182 "Modelling PHI with less than 2 values");
183 auto ComesBefore = [BlockOrder](const BasicBlock *BB1,
184 const BasicBlock *BB2) {
185 return BlockOrder.lookup(BB1) < BlockOrder.lookup(BB2);
186 };
187 assert(llvm::is_sorted(Blocks, ComesBefore));
188 int C = 0;
189 for (const Value *V : Values) {
190 if (!isa<UndefValue>(V)) {
191 assert(cast<Instruction>(V)->getParent() == Blocks[C]);
192 (void)C;
193 }
194 C++;
195 }
196 }
197 /// Create a PHI from an array of incoming values and incoming blocks.
198 ModelledPHI(SmallVectorImpl<Instruction *> &V,
200 const DenseMap<const BasicBlock *, unsigned> &BlockOrder) {
201 // The order of Values and Blocks are already ordered by the caller.
202 llvm::append_range(Values, V);
203 llvm::append_range(Blocks, B);
204 verifyModelledPHI(BlockOrder);
205 }
206
207 /// Create a PHI from [I[OpNum] for I in Insts].
208 /// TODO: Figure out a way to verifyModelledPHI in this constructor.
209 ModelledPHI(ArrayRef<Instruction *> Insts, unsigned OpNum,
211 llvm::append_range(Blocks, B);
212 for (auto *I : Insts)
213 Values.push_back(I->getOperand(OpNum));
214 }
215
216 /// Restrict the PHI's contents down to only \c NewBlocks.
217 /// \c NewBlocks must be a subset of \c this->Blocks.
218 void restrictToBlocks(const SmallSetVector<BasicBlock *, 4> &NewBlocks) {
219 auto BI = Blocks.begin();
220 auto VI = Values.begin();
221 while (BI != Blocks.end()) {
222 assert(VI != Values.end());
223 if (!NewBlocks.contains(*BI)) {
224 BI = Blocks.erase(BI);
225 VI = Values.erase(VI);
226 } else {
227 ++BI;
228 ++VI;
229 }
230 }
231 assert(Blocks.size() == NewBlocks.size());
232 }
233
234 ArrayRef<Value *> getValues() const { return Values; }
235
236 bool areAllIncomingValuesSame() const {
237 return llvm::all_equal(Values);
238 }
239
240 bool areAllIncomingValuesSameType() const {
241 return llvm::all_of(
242 Values, [&](Value *V) { return V->getType() == Values[0]->getType(); });
243 }
244
245 bool areAnyIncomingValuesConstant() const {
246 return llvm::any_of(Values, [&](Value *V) { return isa<Constant>(V); });
247 }
248
249 // Hash functor
250 unsigned hash() const {
251 // Is deterministic because Values are saved in a specific order.
252 return (unsigned)hash_combine_range(Values);
253 }
254
255 bool operator==(const ModelledPHI &Other) const {
256 return Values == Other.Values && Blocks == Other.Blocks;
257 }
258};
259
260template <typename ModelledPHI> struct DenseMapInfo {
261 static inline ModelledPHI &getEmptyKey() {
262 static ModelledPHI Dummy = ModelledPHI::createDummy(0);
263 return Dummy;
264 }
265
266 static inline ModelledPHI &getTombstoneKey() {
267 static ModelledPHI Dummy = ModelledPHI::createDummy(1);
268 return Dummy;
269 }
270
271 static unsigned getHashValue(const ModelledPHI &V) { return V.hash(); }
272
273 static bool isEqual(const ModelledPHI &LHS, const ModelledPHI &RHS) {
274 return LHS == RHS;
275 }
276};
277
279
280//===----------------------------------------------------------------------===//
281// ValueTable
282//===----------------------------------------------------------------------===//
283// This is a value number table where the value number is a function of the
284// *uses* of a value, rather than its operands. Thus, if VN(A) == VN(B) we know
285// that the program would be equivalent if we replaced A with PHI(A, B).
286//===----------------------------------------------------------------------===//
287
288/// A GVN expression describing how an instruction is used. The operands
289/// field of BasicExpression is used to store uses, not operands.
290///
291/// This class also contains fields for discriminators used when determining
292/// equivalence of instructions with sideeffects.
293class InstructionUseExpr : public GVNExpression::BasicExpression {
294 unsigned MemoryUseOrder = -1;
295 bool Volatile = false;
296 ArrayRef<int> ShuffleMask;
297
298public:
299 InstructionUseExpr(Instruction *I, ArrayRecycler<Value *> &R,
301 : GVNExpression::BasicExpression(I->getNumUses()) {
303 setOpcode(I->getOpcode());
304 setType(I->getType());
305
306 if (ShuffleVectorInst *SVI = dyn_cast<ShuffleVectorInst>(I))
307 ShuffleMask = SVI->getShuffleMask().copy(A);
308
309 for (auto &U : I->uses())
310 op_push_back(U.getUser());
312 }
313
314 void setMemoryUseOrder(unsigned MUO) { MemoryUseOrder = MUO; }
315 void setVolatile(bool V) { Volatile = V; }
316
317 hash_code getHashValue() const override {
319 MemoryUseOrder, Volatile, ShuffleMask);
320 }
321
322 template <typename Function> hash_code getHashValue(Function MapFn) {
323 hash_code H = hash_combine(getOpcode(), getType(), MemoryUseOrder, Volatile,
324 ShuffleMask);
325 for (auto *V : operands())
326 H = hash_combine(H, MapFn(V));
327 return H;
328 }
329};
330
331using BasicBlocksSet = SmallPtrSet<const BasicBlock *, 32>;
332
333class ValueTable {
334 DenseMap<Value *, uint32_t> ValueNumbering;
336 DenseMap<size_t, uint32_t> HashNumbering;
339 uint32_t nextValueNumber = 1;
340 BasicBlocksSet ReachableBBs;
341
342 /// Create an expression for I based on its opcode and its uses. If I
343 /// touches or reads memory, the expression is also based upon its memory
344 /// order - see \c getMemoryUseOrder().
345 InstructionUseExpr *createExpr(Instruction *I) {
346 InstructionUseExpr *E =
347 new (Allocator) InstructionUseExpr(I, Recycler, Allocator);
348 if (isMemoryInst(I))
349 E->setMemoryUseOrder(getMemoryUseOrder(I));
350
351 if (CmpInst *C = dyn_cast<CmpInst>(I)) {
352 CmpInst::Predicate Predicate = C->getPredicate();
353 E->setOpcode((C->getOpcode() << 8) | Predicate);
354 }
355 return E;
356 }
357
358 /// Helper to compute the value number for a memory instruction
359 /// (LoadInst/StoreInst), including checking the memory ordering and
360 /// volatility.
361 template <class Inst> InstructionUseExpr *createMemoryExpr(Inst *I) {
362 if (isStrongerThanUnordered(I->getOrdering()) || I->isAtomic())
363 return nullptr;
364 InstructionUseExpr *E = createExpr(I);
365 E->setVolatile(I->isVolatile());
366 return E;
367 }
368
369public:
370 ValueTable() = default;
371
372 /// Set basic blocks reachable from entry block.
373 void setReachableBBs(const BasicBlocksSet &ReachableBBs) {
374 this->ReachableBBs = ReachableBBs;
375 }
376
377 /// Returns the value number for the specified value, assigning
378 /// it a new number if it did not have one before.
379 uint32_t lookupOrAdd(Value *V) {
380 auto VI = ValueNumbering.find(V);
381 if (VI != ValueNumbering.end())
382 return VI->second;
383
384 if (!isa<Instruction>(V)) {
385 ValueNumbering[V] = nextValueNumber;
386 return nextValueNumber++;
387 }
388
389 Instruction *I = cast<Instruction>(V);
390 if (!ReachableBBs.contains(I->getParent()))
391 return ~0U;
392
393 InstructionUseExpr *exp = nullptr;
394 switch (I->getOpcode()) {
395 case Instruction::Load:
396 exp = createMemoryExpr(cast<LoadInst>(I));
397 break;
398 case Instruction::Store:
399 exp = createMemoryExpr(cast<StoreInst>(I));
400 break;
401 case Instruction::Call:
402 case Instruction::Invoke:
403 case Instruction::FNeg:
404 case Instruction::Add:
405 case Instruction::FAdd:
406 case Instruction::Sub:
407 case Instruction::FSub:
408 case Instruction::Mul:
409 case Instruction::FMul:
410 case Instruction::UDiv:
411 case Instruction::SDiv:
412 case Instruction::FDiv:
413 case Instruction::URem:
414 case Instruction::SRem:
415 case Instruction::FRem:
416 case Instruction::Shl:
417 case Instruction::LShr:
418 case Instruction::AShr:
419 case Instruction::And:
420 case Instruction::Or:
421 case Instruction::Xor:
422 case Instruction::ICmp:
423 case Instruction::FCmp:
424 case Instruction::Trunc:
425 case Instruction::ZExt:
426 case Instruction::SExt:
427 case Instruction::FPToUI:
428 case Instruction::FPToSI:
429 case Instruction::UIToFP:
430 case Instruction::SIToFP:
431 case Instruction::FPTrunc:
432 case Instruction::FPExt:
433 case Instruction::PtrToInt:
434 case Instruction::IntToPtr:
435 case Instruction::BitCast:
436 case Instruction::AddrSpaceCast:
437 case Instruction::Select:
438 case Instruction::ExtractElement:
439 case Instruction::InsertElement:
440 case Instruction::ShuffleVector:
441 case Instruction::InsertValue:
442 case Instruction::GetElementPtr:
443 exp = createExpr(I);
444 break;
445 default:
446 break;
447 }
448
449 if (!exp) {
450 ValueNumbering[V] = nextValueNumber;
451 return nextValueNumber++;
452 }
453
454 uint32_t e = ExpressionNumbering[exp];
455 if (!e) {
456 hash_code H = exp->getHashValue([=](Value *V) { return lookupOrAdd(V); });
457 auto [I, Inserted] = HashNumbering.try_emplace(H, nextValueNumber);
458 e = I->second;
459 if (Inserted)
460 ExpressionNumbering[exp] = nextValueNumber++;
461 }
462 ValueNumbering[V] = e;
463 return e;
464 }
465
466 /// Returns the value number of the specified value. Fails if the value has
467 /// not yet been numbered.
468 uint32_t lookup(Value *V) const {
469 auto VI = ValueNumbering.find(V);
470 assert(VI != ValueNumbering.end() && "Value not numbered?");
471 return VI->second;
472 }
473
474 /// Removes all value numberings and resets the value table.
475 void clear() {
476 ValueNumbering.clear();
477 ExpressionNumbering.clear();
478 HashNumbering.clear();
479 Recycler.clear(Allocator);
480 nextValueNumber = 1;
481 }
482
483 /// \c Inst uses or touches memory. Return an ID describing the memory state
484 /// at \c Inst such that if getMemoryUseOrder(I1) == getMemoryUseOrder(I2),
485 /// the exact same memory operations happen after I1 and I2.
486 ///
487 /// This is a very hard problem in general, so we use domain-specific
488 /// knowledge that we only ever check for equivalence between blocks sharing a
489 /// single immediate successor that is common, and when determining if I1 ==
490 /// I2 we will have already determined that next(I1) == next(I2). This
491 /// inductive property allows us to simply return the value number of the next
492 /// instruction that defines memory.
493 uint32_t getMemoryUseOrder(Instruction *Inst) {
494 auto *BB = Inst->getParent();
495 for (auto I = std::next(Inst->getIterator()), E = BB->end();
496 I != E && !I->isTerminator(); ++I) {
497 if (!isMemoryInst(&*I))
498 continue;
499 if (isa<LoadInst>(&*I))
500 continue;
501 CallInst *CI = dyn_cast<CallInst>(&*I);
502 if (CI && CI->onlyReadsMemory())
503 continue;
504 InvokeInst *II = dyn_cast<InvokeInst>(&*I);
505 if (II && II->onlyReadsMemory())
506 continue;
507 return lookupOrAdd(&*I);
508 }
509 return 0;
510 }
511};
512
513//===----------------------------------------------------------------------===//
514
515class GVNSink {
516public:
517 GVNSink() {}
518
519 bool run(Function &F) {
520 LLVM_DEBUG(dbgs() << "GVNSink: running on function @" << F.getName()
521 << "\n");
522
523 unsigned NumSunk = 0;
525 VN.setReachableBBs(BasicBlocksSet(llvm::from_range, RPOT));
526 // Populate reverse post-order to order basic blocks in deterministic
527 // order. Any arbitrary ordering will work in this case as long as they are
528 // deterministic. The node ordering of newly created basic blocks
529 // are irrelevant because RPOT(for computing sinkable candidates) is also
530 // obtained ahead of time and only their order are relevant for this pass.
531 unsigned NodeOrdering = 0;
532 RPOTOrder[*RPOT.begin()] = ++NodeOrdering;
533 for (auto *BB : RPOT)
534 if (!pred_empty(BB))
535 RPOTOrder[BB] = ++NodeOrdering;
536 for (auto *N : RPOT)
537 NumSunk += sinkBB(N);
538
539 return NumSunk > 0;
540 }
541
542private:
543 ValueTable VN;
545
546 bool shouldAvoidSinkingInstruction(Instruction *I) {
547 // These instructions may change or break semantics if moved.
548 if (isa<PHINode>(I) || I->isEHPad() || isa<AllocaInst>(I) ||
549 I->getType()->isTokenTy())
550 return true;
551 return false;
552 }
553
554 /// The main heuristic function. Analyze the set of instructions pointed to by
555 /// LRI and return a candidate solution if these instructions can be sunk, or
556 /// std::nullopt otherwise.
557 std::optional<SinkingInstructionCandidate>
558 analyzeInstructionForSinking(LockstepReverseIterator<false> &LRI,
559 unsigned &InstNum, unsigned &MemoryInstNum,
560 ModelledPHISet &NeededPHIs,
561 SmallPtrSetImpl<Value *> &PHIContents);
562
563 /// Create a ModelledPHI for each PHI in BB, adding to PHIs.
564 void analyzeInitialPHIs(BasicBlock *BB, ModelledPHISet &PHIs,
565 SmallPtrSetImpl<Value *> &PHIContents) {
566 for (PHINode &PN : BB->phis()) {
567 auto MPHI = ModelledPHI(&PN, RPOTOrder);
568 PHIs.insert(MPHI);
569 PHIContents.insert_range(MPHI.getValues());
570 }
571 }
572
573 /// The main instruction sinking driver. Set up state and try and sink
574 /// instructions into BBEnd from its predecessors.
575 unsigned sinkBB(BasicBlock *BBEnd);
576
577 /// Perform the actual mechanics of sinking an instruction from Blocks into
578 /// BBEnd, which is their only successor.
580
581 /// Remove PHIs that all have the same incoming value.
582 void foldPointlessPHINodes(BasicBlock *BB) {
583 auto I = BB->begin();
584 while (PHINode *PN = dyn_cast<PHINode>(I++)) {
585 if (!llvm::all_of(PN->incoming_values(), [&](const Value *V) {
586 return V == PN->getIncomingValue(0);
587 }))
588 continue;
589 if (PN->getIncomingValue(0) != PN)
591 else
593 PN->eraseFromParent();
594 }
595 }
596};
597
598std::optional<SinkingInstructionCandidate>
599GVNSink::analyzeInstructionForSinking(LockstepReverseIterator<false> &LRI,
600 unsigned &InstNum,
601 unsigned &MemoryInstNum,
602 ModelledPHISet &NeededPHIs,
603 SmallPtrSetImpl<Value *> &PHIContents) {
604 auto Insts = *LRI;
605 LLVM_DEBUG(dbgs() << " -- Analyzing instruction set: [\n"; for (auto *I
606 : Insts) {
607 I->dump();
608 } dbgs() << " ]\n";);
609
611 for (auto *I : Insts) {
612 uint32_t N = VN.lookupOrAdd(I);
613 LLVM_DEBUG(dbgs() << " VN=" << Twine::utohexstr(N) << " for" << *I << "\n");
614 if (N == ~0U)
615 return std::nullopt;
616 VNums[N]++;
617 }
618 unsigned VNumToSink = llvm::max_element(VNums, llvm::less_second())->first;
619
620 if (VNums[VNumToSink] == 1)
621 // Can't sink anything!
622 return std::nullopt;
623
624 // Now restrict the number of incoming blocks down to only those with
625 // VNumToSink.
626 auto &ActivePreds = LRI.getActiveBlocks();
627 unsigned InitialActivePredSize = ActivePreds.size();
629 for (auto *I : Insts) {
630 if (VN.lookup(I) != VNumToSink)
631 ActivePreds.remove(I->getParent());
632 else
633 NewInsts.push_back(I);
634 }
635 for (auto *I : NewInsts)
636 if (shouldAvoidSinkingInstruction(I))
637 return std::nullopt;
638
639 // If we've restricted the incoming blocks, restrict all needed PHIs also
640 // to that set.
641 bool RecomputePHIContents = false;
642 if (ActivePreds.size() != InitialActivePredSize) {
643 ModelledPHISet NewNeededPHIs;
644 for (auto P : NeededPHIs) {
645 P.restrictToBlocks(ActivePreds);
646 NewNeededPHIs.insert(P);
647 }
648 NeededPHIs = NewNeededPHIs;
649 LRI.restrictToBlocks(ActivePreds);
650 RecomputePHIContents = true;
651 }
652
653 // The sunk instruction's results.
654 ModelledPHI NewPHI(NewInsts, ActivePreds, RPOTOrder);
655
656 // Does sinking this instruction render previous PHIs redundant?
657 if (NeededPHIs.erase(NewPHI))
658 RecomputePHIContents = true;
659
660 if (RecomputePHIContents) {
661 // The needed PHIs have changed, so recompute the set of all needed
662 // values.
663 PHIContents.clear();
664 for (auto &PHI : NeededPHIs)
665 PHIContents.insert_range(PHI.getValues());
666 }
667
668 // Is this instruction required by a later PHI that doesn't match this PHI?
669 // if so, we can't sink this instruction.
670 for (auto *V : NewPHI.getValues())
671 if (PHIContents.count(V))
672 // V exists in this PHI, but the whole PHI is different to NewPHI
673 // (else it would have been removed earlier). We cannot continue
674 // because this isn't representable.
675 return std::nullopt;
676
677 // Which operands need PHIs?
678 // FIXME: If any of these fail, we should partition up the candidates to
679 // try and continue making progress.
680 Instruction *I0 = NewInsts[0];
681
682 auto isNotSameOperation = [&I0](Instruction *I) {
683 return !I0->isSameOperationAs(I);
684 };
685
686 if (any_of(NewInsts, isNotSameOperation))
687 return std::nullopt;
688
689 for (unsigned OpNum = 0, E = I0->getNumOperands(); OpNum != E; ++OpNum) {
690 ModelledPHI PHI(NewInsts, OpNum, ActivePreds);
691 if (PHI.areAllIncomingValuesSame())
692 continue;
693 if (!canReplaceOperandWithVariable(I0, OpNum))
694 // We can 't create a PHI from this instruction!
695 return std::nullopt;
696 if (NeededPHIs.count(PHI))
697 continue;
698 if (!PHI.areAllIncomingValuesSameType())
699 return std::nullopt;
700 // Don't create indirect calls! The called value is the final operand.
701 if ((isa<CallInst>(I0) || isa<InvokeInst>(I0)) && OpNum == E - 1 &&
702 PHI.areAnyIncomingValuesConstant())
703 return std::nullopt;
704
705 NeededPHIs.reserve(NeededPHIs.size());
706 NeededPHIs.insert(PHI);
707 PHIContents.insert_range(PHI.getValues());
708 }
709
710 if (isMemoryInst(NewInsts[0]))
711 ++MemoryInstNum;
712
713 SinkingInstructionCandidate Cand;
714 Cand.NumInstructions = ++InstNum;
715 Cand.NumMemoryInsts = MemoryInstNum;
716 Cand.NumBlocks = ActivePreds.size();
717 Cand.NumPHIs = NeededPHIs.size();
718 append_range(Cand.Blocks, ActivePreds);
719
720 return Cand;
721}
722
723unsigned GVNSink::sinkBB(BasicBlock *BBEnd) {
724 LLVM_DEBUG(dbgs() << "GVNSink: running on basic block ";
725 BBEnd->printAsOperand(dbgs()); dbgs() << "\n");
727 for (auto *B : predecessors(BBEnd)) {
728 // Bailout on basic blocks without predecessor(PR42346).
729 if (!RPOTOrder.count(B))
730 return 0;
731 auto *T = B->getTerminator();
732 if (isa<BranchInst>(T) || isa<SwitchInst>(T))
733 Preds.push_back(B);
734 else
735 return 0;
736 }
737 if (Preds.size() < 2)
738 return 0;
739 auto ComesBefore = [this](const BasicBlock *BB1, const BasicBlock *BB2) {
740 return RPOTOrder.lookup(BB1) < RPOTOrder.lookup(BB2);
741 };
742 // Sort in a deterministic order.
743 llvm::sort(Preds, ComesBefore);
744
745 unsigned NumOrigPreds = Preds.size();
746 // We can only sink instructions through unconditional branches.
747 llvm::erase_if(Preds, [](BasicBlock *BB) {
748 return BB->getTerminator()->getNumSuccessors() != 1;
749 });
750
753 unsigned InstNum = 0, MemoryInstNum = 0;
754 ModelledPHISet NeededPHIs;
755 SmallPtrSet<Value *, 4> PHIContents;
756 analyzeInitialPHIs(BBEnd, NeededPHIs, PHIContents);
757 unsigned NumOrigPHIs = NeededPHIs.size();
758
759 while (LRI.isValid()) {
760 auto Cand = analyzeInstructionForSinking(LRI, InstNum, MemoryInstNum,
761 NeededPHIs, PHIContents);
762 if (!Cand)
763 break;
764 Cand->calculateCost(NumOrigPHIs, Preds.size());
765 Candidates.emplace_back(*Cand);
766 --LRI;
767 }
768
769 llvm::stable_sort(Candidates, std::greater<SinkingInstructionCandidate>());
770 LLVM_DEBUG(dbgs() << " -- Sinking candidates:\n"; for (auto &C
771 : Candidates) dbgs()
772 << " " << C << "\n";);
773
774 // Pick the top candidate, as long it is positive!
775 if (Candidates.empty() || Candidates.front().Cost <= 0)
776 return 0;
777 auto C = Candidates.front();
778
779 LLVM_DEBUG(dbgs() << " -- Sinking: " << C << "\n");
780 BasicBlock *InsertBB = BBEnd;
781 if (C.Blocks.size() < NumOrigPreds) {
782 LLVM_DEBUG(dbgs() << " -- Splitting edge to ";
783 BBEnd->printAsOperand(dbgs()); dbgs() << "\n");
784 InsertBB = SplitBlockPredecessors(BBEnd, C.Blocks, ".gvnsink.split");
785 if (!InsertBB) {
786 LLVM_DEBUG(dbgs() << " -- FAILED to split edge!\n");
787 // Edge couldn't be split.
788 return 0;
789 }
790 }
791
792 for (unsigned I = 0; I < C.NumInstructions; ++I)
793 sinkLastInstruction(C.Blocks, InsertBB);
794
795 return C.NumInstructions;
796}
797
798void GVNSink::sinkLastInstruction(ArrayRef<BasicBlock *> Blocks,
799 BasicBlock *BBEnd) {
801 for (BasicBlock *BB : Blocks)
802 Insts.push_back(BB->getTerminator()->getPrevNode());
803 Instruction *I0 = Insts.front();
804
805 SmallVector<Value *, 4> NewOperands;
806 for (unsigned O = 0, E = I0->getNumOperands(); O != E; ++O) {
807 bool NeedPHI = llvm::any_of(Insts, [&I0, O](const Instruction *I) {
808 return I->getOperand(O) != I0->getOperand(O);
809 });
810 if (!NeedPHI) {
811 NewOperands.push_back(I0->getOperand(O));
812 continue;
813 }
814
815 // Create a new PHI in the successor block and populate it.
816 auto *Op = I0->getOperand(O);
817 assert(!Op->getType()->isTokenTy() && "Can't PHI tokens!");
818 auto *PN =
819 PHINode::Create(Op->getType(), Insts.size(), Op->getName() + ".sink");
820 PN->insertBefore(BBEnd->begin());
821 for (auto *I : Insts)
822 PN->addIncoming(I->getOperand(O), I->getParent());
823 NewOperands.push_back(PN);
824 }
825
826 // Arbitrarily use I0 as the new "common" instruction; remap its operands
827 // and move it to the start of the successor block.
828 for (unsigned O = 0, E = I0->getNumOperands(); O != E; ++O)
829 I0->getOperandUse(O).set(NewOperands[O]);
830 I0->moveBefore(BBEnd->getFirstInsertionPt());
831
832 // Update metadata and IR flags.
833 for (auto *I : Insts)
834 if (I != I0) {
835 combineMetadataForCSE(I0, I, true);
836 I0->andIRFlags(I);
837 }
838
839 for (auto *I : Insts)
840 if (I != I0) {
841 I->replaceAllUsesWith(I0);
842 I0->applyMergedLocation(I0->getDebugLoc(), I->getDebugLoc());
843 }
844 foldPointlessPHINodes(BBEnd);
845
846 // Finally nuke all instructions apart from the common instruction.
847 for (auto *I : Insts)
848 if (I != I0)
849 I->eraseFromParent();
850
851 NumRemoved += Insts.size() - 1;
852}
853
854} // end anonymous namespace
855
857 GVNSink G;
858 if (!G.run(F))
859 return PreservedAnalyses::all();
860
862}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Rewrite undef for PHI
This file defines the BumpPtrAllocator interface.
Atomic ordering constants.
static const Function * getParent(const Value *V)
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Definition: Compiler.h:638
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
std::optional< std::vector< StOtherPiece > > Other
Definition: ELFYAML.cpp:1328
DenseMap< Block *, BlockRelaxAux > Blocks
Definition: ELF_riscv.cpp:507
The header file for the GVN pass that contains expression handling classes.
This file provides the interface for LLVM's Global Value Numbering pass which eliminates fully redund...
This is the interface for a simple mod/ref and alias analysis over globals.
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
This header defines various interfaces for pass management in LLVM.
This defines the Use class.
static bool lookup(const GsymReader &GR, DataExtractor &Data, uint64_t &Offset, uint64_t BaseAddr, uint64_t Addr, SourceLocations &SrcLocs, llvm::Error &Err)
A Lookup helper functions.
Definition: InlineInfo.cpp:108
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
#define G(x, y, z)
Definition: MD5.cpp:56
#define H(x, y, z)
Definition: MD5.cpp:57
uint64_t IntrinsicInst * II
#define P(N)
This file builds on the ADT/GraphTraits.h file to build a generic graph post order iterator.
Basic Register Allocator
This file contains some templates that are useful if you are working with the STL at all.
raw_pwrite_stream & OS
static void sinkLastInstruction(ArrayRef< BasicBlock * > Blocks)
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
static SymbolRef::Type getType(const Symbol *Sym)
Definition: TapiFile.cpp:39
Value * RHS
Value * LHS
A container for analyses that lazily runs them and caches their results.
Definition: PassManager.h:255
Recycle small arrays allocated from a BumpPtrAllocator.
Definition: ArrayRecycler.h:28
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
MutableArrayRef< T > copy(Allocator &A)
Definition: ArrayRef.h:176
LLVM Basic Block Representation.
Definition: BasicBlock.h:62
iterator begin()
Instruction iterator methods.
Definition: BasicBlock.h:459
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
Definition: BasicBlock.h:528
LLVM_ABI const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
Definition: BasicBlock.cpp:393
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
Allocate memory in an ever growing pool, as if by bump-pointer.
Definition: Allocator.h:67
bool onlyReadsMemory(unsigned OpNo) const
Definition: InstrTypes.h:1751
This class represents a function call, abstracting a target machine's calling convention.
This class is the base class for the comparison instructions.
Definition: InstrTypes.h:666
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition: InstrTypes.h:678
This class represents an Operation in the Expression.
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
Definition: DenseMap.h:203
iterator find(const_arg_type_t< KeyT > Val)
Definition: DenseMap.h:177
std::pair< iterator, bool > try_emplace(KeyT &&Key, Ts &&...Args)
Definition: DenseMap.h:245
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
Definition: DenseMap.h:173
iterator end()
Definition: DenseMap.h:87
Implements a dense probed hash-table based set.
Definition: DenseSet.h:263
void allocateOperands(RecyclerType &Recycler, BumpPtrAllocator &Allocator)
hash_code getHashValue() const override
iterator_range< op_iterator > operands()
LLVM_DUMP_METHOD void dump() const
Definition: GVNSink.cpp:84
void setOpcode(unsigned opcode)
void print(raw_ostream &OS) const
LLVM_ABI bool isSameOperationAs(const Instruction *I, unsigned flags=0) const LLVM_READONLY
This function determines if the specified instruction executes the same operation as the current one.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
Definition: Instruction.h:513
LLVM_ABI void andIRFlags(const Value *V)
Logical 'and' of any supported wrapping, exact, and fast-math flags of V and this instruction.
LLVM_ABI void moveBefore(InstListType::iterator InsertPos)
Unlink this instruction from its current basic block and insert it into the basic block that MovePos ...
LLVM_ABI void insertBefore(InstListType::iterator InsertPos)
Insert an unlinked instruction into a basic block immediately before the specified position.
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI void applyMergedLocation(DebugLoc LocA, DebugLoc LocB)
Merge 2 debug locations and apply it to the Instruction.
Definition: DebugInfo.cpp:897
Invoke instruction.
Iterates through instructions in a set of blocks in reverse order from the first non-terminator.
void restrictToBlocks(SmallSetVector< BasicBlock *, 4 > &Blocks)
SmallSetVector< BasicBlock *, 4 > & getActiveBlocks()
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
op_range incoming_values()
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
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...
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Definition: Constants.cpp:1885
A set of analyses that are preserved following a run of a transformation pass.
Definition: Analysis.h:112
static PreservedAnalyses none()
Convenience factory function for the empty preserved set.
Definition: Analysis.h:115
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition: Analysis.h:118
Recycler - This class manages a linked-list of deallocated nodes and facilitates reusing deallocated ...
Definition: Recycler.h:36
void clear(AllocatorType &Allocator)
clear - Release all the tracked allocations to the allocator.
Definition: Recycler.h:74
size_type size() const
Determine the number of elements in the SetVector.
Definition: SetVector.h:104
bool contains(const key_type &key) const
Check if the SetVector contains the given key.
Definition: SetVector.h:269
This instruction constructs a fixed permutation of two input vectors.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
Definition: SmallPtrSet.h:380
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
Definition: SmallPtrSet.h:470
void insert_range(Range &&R)
Definition: SmallPtrSet.h:490
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:541
A SetVector that performs no allocations if smaller than a certain size.
Definition: SetVector.h:356
size_t size() const
Definition: SmallVector.h:79
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:574
reference emplace_back(ArgTypes &&... Args)
Definition: SmallVector.h:938
void push_back(const T &Elt)
Definition: SmallVector.h:414
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1197
static Twine utohexstr(const uint64_t &Val)
Definition: Twine.h:418
LLVM_ABI void set(Value *Val)
Definition: Value.h:905
const Use & getOperandUse(unsigned i) const
Definition: User.h:245
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 void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition: Value.cpp:546
LLVM_ABI void printAsOperand(raw_ostream &O, bool PrintType=true, const Module *M=nullptr) const
Print the name of this Value out to the specified raw_ostream.
Definition: AsmWriter.cpp:5305
An opaque object representing a hash code.
Definition: Hashing.h:76
const ParentTy * getParent() const
Definition: ilist_node.h:34
self_iterator getIterator()
Definition: ilist_node.h:134
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:53
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
@ Volatile
Definition: NVPTX.h:165
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
constexpr double e
Definition: MathExtras.h:47
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
void stable_sort(R &&Range)
Definition: STLExtras.h:2077
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition: STLExtras.h:1744
bool isEqual(const GCNRPTracker::LiveRegSet &S1, const GCNRPTracker::LiveRegSet &S2)
constexpr from_range_t from_range
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition: STLExtras.h:2155
bool isStrongerThanUnordered(AtomicOrdering AO)
bool operator==(const AddressRangeValuePair &LHS, const AddressRangeValuePair &RHS)
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
bool operator>(int64_t V1, const APSInt &V2)
Definition: APSInt.h:363
void sort(IteratorTy Start, IteratorTy End)
Definition: STLExtras.h:1669
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:207
bool is_sorted(R &&Range, Compare C)
Wrapper function around std::is_sorted to check if elements in a range R are sorted with respect to a...
Definition: STLExtras.h:1939
LLVM_ABI void combineMetadataForCSE(Instruction *K, const Instruction *J, bool DoesKMove)
Combine the metadata of two instructions so that K can replace J.
Definition: Local.cpp:3081
LLVM_ABI BasicBlock * SplitBlockPredecessors(BasicBlock *BB, ArrayRef< BasicBlock * > Preds, const char *Suffix, DominatorTree *DT, LoopInfo *LI=nullptr, MemorySSAUpdater *MSSAU=nullptr, bool PreserveLCSSA=false)
This method introduces at least one new basic block into the function and moves some of the predecess...
LLVM_ABI bool canReplaceOperandWithVariable(const Instruction *I, unsigned OpIdx)
Given an instruction, is it legal to set operand OpIdx to a non-constant value?
Definition: Local.cpp:3839
auto max_element(R &&Range)
Provide wrappers to std::max_element which take ranges instead of having to pass begin/end explicitly...
Definition: STLExtras.h:2049
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
Definition: APFixedPoint.h:312
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
Definition: STLExtras.h:2139
auto predecessors(const MachineBasicBlock *BB)
bool pred_empty(const BasicBlock *BB)
Definition: CFG.h:119
bool all_equal(std::initializer_list< T > Values)
Returns true if all Values in the initializer lists are equal or the list.
Definition: STLExtras.h:2127
hash_code hash_combine(const Ts &...args)
Combine values into a single hash_code.
Definition: Hashing.h:595
hash_code hash_combine_range(InputIteratorT first, InputIteratorT last)
Compute a hash_code for a sequence of values.
Definition: Hashing.h:469
#define N
An information struct used to provide DenseMap with the various necessary components for a given valu...
Definition: DenseMapInfo.h:54
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
Run the pass over the function.
Definition: GVNSink.cpp:856
Function object to check whether the second component of a container supported by std::get (like std:...
Definition: STLExtras.h:1481