]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/Transforms/Scalar/SpeculateAroundPHIs.cpp
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / Transforms / Scalar / SpeculateAroundPHIs.cpp
1 //===- SpeculateAroundPHIs.cpp --------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "llvm/Transforms/Scalar/SpeculateAroundPHIs.h"
11 #include "llvm/ADT/PostOrderIterator.h"
12 #include "llvm/ADT/Sequence.h"
13 #include "llvm/ADT/SetVector.h"
14 #include "llvm/ADT/Statistic.h"
15 #include "llvm/Analysis/TargetTransformInfo.h"
16 #include "llvm/Analysis/ValueTracking.h"
17 #include "llvm/IR/BasicBlock.h"
18 #include "llvm/IR/IRBuilder.h"
19 #include "llvm/IR/Instructions.h"
20 #include "llvm/IR/IntrinsicInst.h"
21 #include "llvm/Support/Debug.h"
22 #include "llvm/Transforms/Utils/BasicBlockUtils.h"
23
24 using namespace llvm;
25
26 #define DEBUG_TYPE "spec-phis"
27
28 STATISTIC(NumPHIsSpeculated, "Number of PHI nodes we speculated around");
29 STATISTIC(NumEdgesSplit,
30           "Number of critical edges which were split for speculation");
31 STATISTIC(NumSpeculatedInstructions,
32           "Number of instructions we speculated around the PHI nodes");
33 STATISTIC(NumNewRedundantInstructions,
34           "Number of new, redundant instructions inserted");
35
36 /// Check whether speculating the users of a PHI node around the PHI
37 /// will be safe.
38 ///
39 /// This checks both that all of the users are safe and also that all of their
40 /// operands are either recursively safe or already available along an incoming
41 /// edge to the PHI.
42 ///
43 /// This routine caches both all the safe nodes explored in `PotentialSpecSet`
44 /// and the chain of nodes that definitively reach any unsafe node in
45 /// `UnsafeSet`. By preserving these between repeated calls to this routine for
46 /// PHIs in the same basic block, the exploration here can be reused. However,
47 /// these caches must no be reused for PHIs in a different basic block as they
48 /// reflect what is available along incoming edges.
49 static bool
50 isSafeToSpeculatePHIUsers(PHINode &PN, DominatorTree &DT,
51                           SmallPtrSetImpl<Instruction *> &PotentialSpecSet,
52                           SmallPtrSetImpl<Instruction *> &UnsafeSet) {
53   auto *PhiBB = PN.getParent();
54   SmallPtrSet<Instruction *, 4> Visited;
55   SmallVector<std::pair<Instruction *, User::value_op_iterator>, 16> DFSStack;
56
57   // Walk each user of the PHI node.
58   for (Use &U : PN.uses()) {
59     auto *UI = cast<Instruction>(U.getUser());
60
61     // Ensure the use post-dominates the PHI node. This ensures that, in the
62     // absence of unwinding, the use will actually be reached.
63     // FIXME: We use a blunt hammer of requiring them to be in the same basic
64     // block. We should consider using actual post-dominance here in the
65     // future.
66     if (UI->getParent() != PhiBB) {
67       LLVM_DEBUG(dbgs() << "  Unsafe: use in a different BB: " << *UI << "\n");
68       return false;
69     }
70
71     // FIXME: This check is much too conservative. We're not going to move these
72     // instructions onto new dynamic paths through the program unless there is
73     // a call instruction between the use and the PHI node. And memory isn't
74     // changing unless there is a store in that same sequence. We should
75     // probably change this to do at least a limited scan of the intervening
76     // instructions and allow handling stores in easily proven safe cases.
77     if (mayBeMemoryDependent(*UI)) {
78       LLVM_DEBUG(dbgs() << "  Unsafe: can't speculate use: " << *UI << "\n");
79       return false;
80     }
81
82     // Now do a depth-first search of everything these users depend on to make
83     // sure they are transitively safe. This is a depth-first search, but we
84     // check nodes in preorder to minimize the amount of checking.
85     Visited.insert(UI);
86     DFSStack.push_back({UI, UI->value_op_begin()});
87     do {
88       User::value_op_iterator OpIt;
89       std::tie(UI, OpIt) = DFSStack.pop_back_val();
90
91       while (OpIt != UI->value_op_end()) {
92         auto *OpI = dyn_cast<Instruction>(*OpIt);
93         // Increment to the next operand for whenever we continue.
94         ++OpIt;
95         // No need to visit non-instructions, which can't form dependencies.
96         if (!OpI)
97           continue;
98
99         // Now do the main pre-order checks that this operand is a viable
100         // dependency of something we want to speculate.
101
102         // First do a few checks for instructions that won't require
103         // speculation at all because they are trivially available on the
104         // incoming edge (either through dominance or through an incoming value
105         // to a PHI).
106         //
107         // The cases in the current block will be trivially dominated by the
108         // edge.
109         auto *ParentBB = OpI->getParent();
110         if (ParentBB == PhiBB) {
111           if (isa<PHINode>(OpI)) {
112             // We can trivially map through phi nodes in the same block.
113             continue;
114           }
115         } else if (DT.dominates(ParentBB, PhiBB)) {
116           // Instructions from dominating blocks are already available.
117           continue;
118         }
119
120         // Once we know that we're considering speculating the operand, check
121         // if we've already explored this subgraph and found it to be safe.
122         if (PotentialSpecSet.count(OpI))
123           continue;
124
125         // If we've already explored this subgraph and found it unsafe, bail.
126         // If when we directly test whether this is safe it fails, bail.
127         if (UnsafeSet.count(OpI) || ParentBB != PhiBB ||
128             mayBeMemoryDependent(*OpI)) {
129           LLVM_DEBUG(dbgs() << "  Unsafe: can't speculate transitive use: "
130                             << *OpI << "\n");
131           // Record the stack of instructions which reach this node as unsafe
132           // so we prune subsequent searches.
133           UnsafeSet.insert(OpI);
134           for (auto &StackPair : DFSStack) {
135             Instruction *I = StackPair.first;
136             UnsafeSet.insert(I);
137           }
138           return false;
139         }
140
141         // Skip any operands we're already recursively checking.
142         if (!Visited.insert(OpI).second)
143           continue;
144
145         // Push onto the stack and descend. We can directly continue this
146         // loop when ascending.
147         DFSStack.push_back({UI, OpIt});
148         UI = OpI;
149         OpIt = OpI->value_op_begin();
150       }
151
152       // This node and all its operands are safe. Go ahead and cache that for
153       // reuse later.
154       PotentialSpecSet.insert(UI);
155
156       // Continue with the next node on the stack.
157     } while (!DFSStack.empty());
158   }
159
160 #ifndef NDEBUG
161   // Every visited operand should have been marked as safe for speculation at
162   // this point. Verify this and return success.
163   for (auto *I : Visited)
164     assert(PotentialSpecSet.count(I) &&
165            "Failed to mark a visited instruction as safe!");
166 #endif
167   return true;
168 }
169
170 /// Check whether, in isolation, a given PHI node is both safe and profitable
171 /// to speculate users around.
172 ///
173 /// This handles checking whether there are any constant operands to a PHI
174 /// which could represent a useful speculation candidate, whether the users of
175 /// the PHI are safe to speculate including all their transitive dependencies,
176 /// and whether after speculation there will be some cost savings (profit) to
177 /// folding the operands into the users of the PHI node. Returns true if both
178 /// safe and profitable with relevant cost savings updated in the map and with
179 /// an update to the `PotentialSpecSet`. Returns false if either safety or
180 /// profitability are absent. Some new entries may be made to the
181 /// `PotentialSpecSet` even when this routine returns false, but they remain
182 /// conservatively correct.
183 ///
184 /// The profitability check here is a local one, but it checks this in an
185 /// interesting way. Beyond checking that the total cost of materializing the
186 /// constants will be less than the cost of folding them into their users, it
187 /// also checks that no one incoming constant will have a higher cost when
188 /// folded into its users rather than materialized. This higher cost could
189 /// result in a dynamic *path* that is more expensive even when the total cost
190 /// is lower. Currently, all of the interesting cases where this optimization
191 /// should fire are ones where it is a no-loss operation in this sense. If we
192 /// ever want to be more aggressive here, we would need to balance the
193 /// different incoming edges' cost by looking at their respective
194 /// probabilities.
195 static bool isSafeAndProfitableToSpeculateAroundPHI(
196     PHINode &PN, SmallDenseMap<PHINode *, int, 16> &CostSavingsMap,
197     SmallPtrSetImpl<Instruction *> &PotentialSpecSet,
198     SmallPtrSetImpl<Instruction *> &UnsafeSet, DominatorTree &DT,
199     TargetTransformInfo &TTI) {
200   // First see whether there is any cost savings to speculating around this
201   // PHI, and build up a map of the constant inputs to how many times they
202   // occur.
203   bool NonFreeMat = false;
204   struct CostsAndCount {
205     int MatCost = TargetTransformInfo::TCC_Free;
206     int FoldedCost = TargetTransformInfo::TCC_Free;
207     int Count = 0;
208   };
209   SmallDenseMap<ConstantInt *, CostsAndCount, 16> CostsAndCounts;
210   SmallPtrSet<BasicBlock *, 16> IncomingConstantBlocks;
211   for (int i : llvm::seq<int>(0, PN.getNumIncomingValues())) {
212     auto *IncomingC = dyn_cast<ConstantInt>(PN.getIncomingValue(i));
213     if (!IncomingC)
214       continue;
215
216     // Only visit each incoming edge with a constant input once.
217     if (!IncomingConstantBlocks.insert(PN.getIncomingBlock(i)).second)
218       continue;
219
220     auto InsertResult = CostsAndCounts.insert({IncomingC, {}});
221     // Count how many edges share a given incoming costant.
222     ++InsertResult.first->second.Count;
223     // Only compute the cost the first time we see a particular constant.
224     if (!InsertResult.second)
225       continue;
226
227     int &MatCost = InsertResult.first->second.MatCost;
228     MatCost = TTI.getIntImmCost(IncomingC->getValue(), IncomingC->getType());
229     NonFreeMat |= MatCost != TTI.TCC_Free;
230   }
231   if (!NonFreeMat) {
232     LLVM_DEBUG(dbgs() << "    Free: " << PN << "\n");
233     // No profit in free materialization.
234     return false;
235   }
236
237   // Now check that the uses of this PHI can actually be speculated,
238   // otherwise we'll still have to materialize the PHI value.
239   if (!isSafeToSpeculatePHIUsers(PN, DT, PotentialSpecSet, UnsafeSet)) {
240     LLVM_DEBUG(dbgs() << "    Unsafe PHI: " << PN << "\n");
241     return false;
242   }
243
244   // Compute how much (if any) savings are available by speculating around this
245   // PHI.
246   for (Use &U : PN.uses()) {
247     auto *UserI = cast<Instruction>(U.getUser());
248     // Now check whether there is any savings to folding the incoming constants
249     // into this use.
250     unsigned Idx = U.getOperandNo();
251
252     // If we have a binary operator that is commutative, an actual constant
253     // operand would end up on the RHS, so pretend the use of the PHI is on the
254     // RHS.
255     //
256     // Technically, this is a bit weird if *both* operands are PHIs we're
257     // speculating. But if that is the case, giving an "optimistic" cost isn't
258     // a bad thing because after speculation it will constant fold. And
259     // moreover, such cases should likely have been constant folded already by
260     // some other pass, so we shouldn't worry about "modeling" them terribly
261     // accurately here. Similarly, if the other operand is a constant, it still
262     // seems fine to be "optimistic" in our cost modeling, because when the
263     // incoming operand from the PHI node is also a constant, we will end up
264     // constant folding.
265     if (UserI->isBinaryOp() && UserI->isCommutative() && Idx != 1)
266       // Assume we will commute the constant to the RHS to be canonical.
267       Idx = 1;
268
269     // Get the intrinsic ID if this user is an intrinsic.
270     Intrinsic::ID IID = Intrinsic::not_intrinsic;
271     if (auto *UserII = dyn_cast<IntrinsicInst>(UserI))
272       IID = UserII->getIntrinsicID();
273
274     for (auto &IncomingConstantAndCostsAndCount : CostsAndCounts) {
275       ConstantInt *IncomingC = IncomingConstantAndCostsAndCount.first;
276       int MatCost = IncomingConstantAndCostsAndCount.second.MatCost;
277       int &FoldedCost = IncomingConstantAndCostsAndCount.second.FoldedCost;
278       if (IID)
279         FoldedCost += TTI.getIntImmCost(IID, Idx, IncomingC->getValue(),
280                                         IncomingC->getType());
281       else
282         FoldedCost +=
283             TTI.getIntImmCost(UserI->getOpcode(), Idx, IncomingC->getValue(),
284                               IncomingC->getType());
285
286       // If we accumulate more folded cost for this incoming constant than
287       // materialized cost, then we'll regress any edge with this constant so
288       // just bail. We're only interested in cases where folding the incoming
289       // constants is at least break-even on all paths.
290       if (FoldedCost > MatCost) {
291         LLVM_DEBUG(dbgs() << "  Not profitable to fold imm: " << *IncomingC
292                           << "\n"
293                              "    Materializing cost:    "
294                           << MatCost
295                           << "\n"
296                              "    Accumulated folded cost: "
297                           << FoldedCost << "\n");
298         return false;
299       }
300     }
301   }
302
303   // Compute the total cost savings afforded by this PHI node.
304   int TotalMatCost = TTI.TCC_Free, TotalFoldedCost = TTI.TCC_Free;
305   for (auto IncomingConstantAndCostsAndCount : CostsAndCounts) {
306     int MatCost = IncomingConstantAndCostsAndCount.second.MatCost;
307     int FoldedCost = IncomingConstantAndCostsAndCount.second.FoldedCost;
308     int Count = IncomingConstantAndCostsAndCount.second.Count;
309
310     TotalMatCost += MatCost * Count;
311     TotalFoldedCost += FoldedCost * Count;
312   }
313   assert(TotalFoldedCost <= TotalMatCost && "If each constant's folded cost is "
314                                             "less that its materialized cost, "
315                                             "the sum must be as well.");
316
317   LLVM_DEBUG(dbgs() << "    Cost savings " << (TotalMatCost - TotalFoldedCost)
318                     << ": " << PN << "\n");
319   CostSavingsMap[&PN] = TotalMatCost - TotalFoldedCost;
320   return true;
321 }
322
323 /// Simple helper to walk all the users of a list of phis depth first, and call
324 /// a visit function on each one in post-order.
325 ///
326 /// All of the PHIs should be in the same basic block, and this is primarily
327 /// used to make a single depth-first walk across their collective users
328 /// without revisiting any subgraphs. Callers should provide a fast, idempotent
329 /// callable to test whether a node has been visited and the more important
330 /// callable to actually visit a particular node.
331 ///
332 /// Depth-first and postorder here refer to the *operand* graph -- we start
333 /// from a collection of users of PHI nodes and walk "up" the operands
334 /// depth-first.
335 template <typename IsVisitedT, typename VisitT>
336 static void visitPHIUsersAndDepsInPostOrder(ArrayRef<PHINode *> PNs,
337                                             IsVisitedT IsVisited,
338                                             VisitT Visit) {
339   SmallVector<std::pair<Instruction *, User::value_op_iterator>, 16> DFSStack;
340   for (auto *PN : PNs)
341     for (Use &U : PN->uses()) {
342       auto *UI = cast<Instruction>(U.getUser());
343       if (IsVisited(UI))
344         // Already visited this user, continue across the roots.
345         continue;
346
347       // Otherwise, walk the operand graph depth-first and visit each
348       // dependency in postorder.
349       DFSStack.push_back({UI, UI->value_op_begin()});
350       do {
351         User::value_op_iterator OpIt;
352         std::tie(UI, OpIt) = DFSStack.pop_back_val();
353         while (OpIt != UI->value_op_end()) {
354           auto *OpI = dyn_cast<Instruction>(*OpIt);
355           // Increment to the next operand for whenever we continue.
356           ++OpIt;
357           // No need to visit non-instructions, which can't form dependencies,
358           // or instructions outside of our potential dependency set that we
359           // were given. Finally, if we've already visited the node, continue
360           // to the next.
361           if (!OpI || IsVisited(OpI))
362             continue;
363
364           // Push onto the stack and descend. We can directly continue this
365           // loop when ascending.
366           DFSStack.push_back({UI, OpIt});
367           UI = OpI;
368           OpIt = OpI->value_op_begin();
369         }
370
371         // Finished visiting children, visit this node.
372         assert(!IsVisited(UI) && "Should not have already visited a node!");
373         Visit(UI);
374       } while (!DFSStack.empty());
375     }
376 }
377
378 /// Find profitable PHIs to speculate.
379 ///
380 /// For a PHI node to be profitable, we need the cost of speculating its users
381 /// (and their dependencies) to not exceed the savings of folding the PHI's
382 /// constant operands into the speculated users.
383 ///
384 /// Computing this is surprisingly challenging. Because users of two different
385 /// PHI nodes can depend on each other or on common other instructions, it may
386 /// be profitable to speculate two PHI nodes together even though neither one
387 /// in isolation is profitable. The straightforward way to find all the
388 /// profitable PHIs would be to check each combination of PHIs' cost, but this
389 /// is exponential in complexity.
390 ///
391 /// Even if we assume that we only care about cases where we can consider each
392 /// PHI node in isolation (rather than considering cases where none are
393 /// profitable in isolation but some subset are profitable as a set), we still
394 /// have a challenge. The obvious way to find all individually profitable PHIs
395 /// is to iterate until reaching a fixed point, but this will be quadratic in
396 /// complexity. =/
397 ///
398 /// This code currently uses a linear-to-compute order for a greedy approach.
399 /// It won't find cases where a set of PHIs must be considered together, but it
400 /// handles most cases of order dependence without quadratic iteration. The
401 /// specific order used is the post-order across the operand DAG. When the last
402 /// user of a PHI is visited in this postorder walk, we check it for
403 /// profitability.
404 ///
405 /// There is an orthogonal extra complexity to all of this: computing the cost
406 /// itself can easily become a linear computation making everything again (at
407 /// best) quadratic. Using a postorder over the operand graph makes it
408 /// particularly easy to avoid this through dynamic programming. As we do the
409 /// postorder walk, we build the transitive cost of that subgraph. It is also
410 /// straightforward to then update these costs when we mark a PHI for
411 /// speculation so that subsequent PHIs don't re-pay the cost of already
412 /// speculated instructions.
413 static SmallVector<PHINode *, 16>
414 findProfitablePHIs(ArrayRef<PHINode *> PNs,
415                    const SmallDenseMap<PHINode *, int, 16> &CostSavingsMap,
416                    const SmallPtrSetImpl<Instruction *> &PotentialSpecSet,
417                    int NumPreds, DominatorTree &DT, TargetTransformInfo &TTI) {
418   SmallVector<PHINode *, 16> SpecPNs;
419
420   // First, establish a reverse mapping from immediate users of the PHI nodes
421   // to the nodes themselves, and count how many users each PHI node has in
422   // a way we can update while processing them.
423   SmallDenseMap<Instruction *, TinyPtrVector<PHINode *>, 16> UserToPNMap;
424   SmallDenseMap<PHINode *, int, 16> PNUserCountMap;
425   SmallPtrSet<Instruction *, 16> UserSet;
426   for (auto *PN : PNs) {
427     assert(UserSet.empty() && "Must start with an empty user set!");
428     for (Use &U : PN->uses())
429       UserSet.insert(cast<Instruction>(U.getUser()));
430     PNUserCountMap[PN] = UserSet.size();
431     for (auto *UI : UserSet)
432       UserToPNMap.insert({UI, {}}).first->second.push_back(PN);
433     UserSet.clear();
434   }
435
436   // Now do a DFS across the operand graph of the users, computing cost as we
437   // go and when all costs for a given PHI are known, checking that PHI for
438   // profitability.
439   SmallDenseMap<Instruction *, int, 16> SpecCostMap;
440   visitPHIUsersAndDepsInPostOrder(
441       PNs,
442       /*IsVisited*/
443       [&](Instruction *I) {
444         // We consider anything that isn't potentially speculated to be
445         // "visited" as it is already handled. Similarly, anything that *is*
446         // potentially speculated but for which we have an entry in our cost
447         // map, we're done.
448         return !PotentialSpecSet.count(I) || SpecCostMap.count(I);
449       },
450       /*Visit*/
451       [&](Instruction *I) {
452         // We've fully visited the operands, so sum their cost with this node
453         // and update the cost map.
454         int Cost = TTI.TCC_Free;
455         for (Value *OpV : I->operand_values())
456           if (auto *OpI = dyn_cast<Instruction>(OpV)) {
457             auto CostMapIt = SpecCostMap.find(OpI);
458             if (CostMapIt != SpecCostMap.end())
459               Cost += CostMapIt->second;
460           }
461         Cost += TTI.getUserCost(I);
462         bool Inserted = SpecCostMap.insert({I, Cost}).second;
463         (void)Inserted;
464         assert(Inserted && "Must not re-insert a cost during the DFS!");
465
466         // Now check if this node had a corresponding PHI node using it. If so,
467         // we need to decrement the outstanding user count for it.
468         auto UserPNsIt = UserToPNMap.find(I);
469         if (UserPNsIt == UserToPNMap.end())
470           return;
471         auto &UserPNs = UserPNsIt->second;
472         auto UserPNsSplitIt = std::stable_partition(
473             UserPNs.begin(), UserPNs.end(), [&](PHINode *UserPN) {
474               int &PNUserCount = PNUserCountMap.find(UserPN)->second;
475               assert(
476                   PNUserCount > 0 &&
477                   "Should never re-visit a PN after its user count hits zero!");
478               --PNUserCount;
479               return PNUserCount != 0;
480             });
481
482         // FIXME: Rather than one at a time, we should sum the savings as the
483         // cost will be completely shared.
484         SmallVector<Instruction *, 16> SpecWorklist;
485         for (auto *PN : llvm::make_range(UserPNsSplitIt, UserPNs.end())) {
486           int SpecCost = TTI.TCC_Free;
487           for (Use &U : PN->uses())
488             SpecCost +=
489                 SpecCostMap.find(cast<Instruction>(U.getUser()))->second;
490           SpecCost *= (NumPreds - 1);
491           // When the user count of a PHI node hits zero, we should check its
492           // profitability. If profitable, we should mark it for speculation
493           // and zero out the cost of everything it depends on.
494           int CostSavings = CostSavingsMap.find(PN)->second;
495           if (SpecCost > CostSavings) {
496             LLVM_DEBUG(dbgs() << "  Not profitable, speculation cost: " << *PN
497                               << "\n"
498                                  "    Cost savings:     "
499                               << CostSavings
500                               << "\n"
501                                  "    Speculation cost: "
502                               << SpecCost << "\n");
503             continue;
504           }
505
506           // We're going to speculate this user-associated PHI. Copy it out and
507           // add its users to the worklist to update their cost.
508           SpecPNs.push_back(PN);
509           for (Use &U : PN->uses()) {
510             auto *UI = cast<Instruction>(U.getUser());
511             auto CostMapIt = SpecCostMap.find(UI);
512             if (CostMapIt->second == 0)
513               continue;
514             // Zero out this cost entry to avoid duplicates.
515             CostMapIt->second = 0;
516             SpecWorklist.push_back(UI);
517           }
518         }
519
520         // Now walk all the operands of the users in the worklist transitively
521         // to zero out all the memoized costs.
522         while (!SpecWorklist.empty()) {
523           Instruction *SpecI = SpecWorklist.pop_back_val();
524           assert(SpecCostMap.find(SpecI)->second == 0 &&
525                  "Didn't zero out a cost!");
526
527           // Walk the operands recursively to zero out their cost as well.
528           for (auto *OpV : SpecI->operand_values()) {
529             auto *OpI = dyn_cast<Instruction>(OpV);
530             if (!OpI)
531               continue;
532             auto CostMapIt = SpecCostMap.find(OpI);
533             if (CostMapIt == SpecCostMap.end() || CostMapIt->second == 0)
534               continue;
535             CostMapIt->second = 0;
536             SpecWorklist.push_back(OpI);
537           }
538         }
539       });
540
541   return SpecPNs;
542 }
543
544 /// Speculate users around a set of PHI nodes.
545 ///
546 /// This routine does the actual speculation around a set of PHI nodes where we
547 /// have determined this to be both safe and profitable.
548 ///
549 /// This routine handles any spliting of critical edges necessary to create
550 /// a safe block to speculate into as well as cloning the instructions and
551 /// rewriting all uses.
552 static void speculatePHIs(ArrayRef<PHINode *> SpecPNs,
553                           SmallPtrSetImpl<Instruction *> &PotentialSpecSet,
554                           SmallSetVector<BasicBlock *, 16> &PredSet,
555                           DominatorTree &DT) {
556   LLVM_DEBUG(dbgs() << "  Speculating around " << SpecPNs.size() << " PHIs!\n");
557   NumPHIsSpeculated += SpecPNs.size();
558
559   // Split any critical edges so that we have a block to hoist into.
560   auto *ParentBB = SpecPNs[0]->getParent();
561   SmallVector<BasicBlock *, 16> SpecPreds;
562   SpecPreds.reserve(PredSet.size());
563   for (auto *PredBB : PredSet) {
564     auto *NewPredBB = SplitCriticalEdge(
565         PredBB, ParentBB,
566         CriticalEdgeSplittingOptions(&DT).setMergeIdenticalEdges());
567     if (NewPredBB) {
568       ++NumEdgesSplit;
569       LLVM_DEBUG(dbgs() << "  Split critical edge from: " << PredBB->getName()
570                         << "\n");
571       SpecPreds.push_back(NewPredBB);
572     } else {
573       assert(PredBB->getSingleSuccessor() == ParentBB &&
574              "We need a non-critical predecessor to speculate into.");
575       assert(!isa<InvokeInst>(PredBB->getTerminator()) &&
576              "Cannot have a non-critical invoke!");
577
578       // Already non-critical, use existing pred.
579       SpecPreds.push_back(PredBB);
580     }
581   }
582
583   SmallPtrSet<Instruction *, 16> SpecSet;
584   SmallVector<Instruction *, 16> SpecList;
585   visitPHIUsersAndDepsInPostOrder(SpecPNs,
586                                   /*IsVisited*/
587                                   [&](Instruction *I) {
588                                     // This is visited if we don't need to
589                                     // speculate it or we already have
590                                     // speculated it.
591                                     return !PotentialSpecSet.count(I) ||
592                                            SpecSet.count(I);
593                                   },
594                                   /*Visit*/
595                                   [&](Instruction *I) {
596                                     // All operands scheduled, schedule this
597                                     // node.
598                                     SpecSet.insert(I);
599                                     SpecList.push_back(I);
600                                   });
601
602   int NumSpecInsts = SpecList.size() * SpecPreds.size();
603   int NumRedundantInsts = NumSpecInsts - SpecList.size();
604   LLVM_DEBUG(dbgs() << "  Inserting " << NumSpecInsts
605                     << " speculated instructions, " << NumRedundantInsts
606                     << " redundancies\n");
607   NumSpeculatedInstructions += NumSpecInsts;
608   NumNewRedundantInstructions += NumRedundantInsts;
609
610   // Each predecessor is numbered by its index in `SpecPreds`, so for each
611   // instruction we speculate, the speculated instruction is stored in that
612   // index of the vector associated with the original instruction. We also
613   // store the incoming values for each predecessor from any PHIs used.
614   SmallDenseMap<Instruction *, SmallVector<Value *, 2>, 16> SpeculatedValueMap;
615
616   // Inject the synthetic mappings to rewrite PHIs to the appropriate incoming
617   // value. This handles both the PHIs we are speculating around and any other
618   // PHIs that happen to be used.
619   for (auto *OrigI : SpecList)
620     for (auto *OpV : OrigI->operand_values()) {
621       auto *OpPN = dyn_cast<PHINode>(OpV);
622       if (!OpPN || OpPN->getParent() != ParentBB)
623         continue;
624
625       auto InsertResult = SpeculatedValueMap.insert({OpPN, {}});
626       if (!InsertResult.second)
627         continue;
628
629       auto &SpeculatedVals = InsertResult.first->second;
630
631       // Populating our structure for mapping is particularly annoying because
632       // finding an incoming value for a particular predecessor block in a PHI
633       // node is a linear time operation! To avoid quadratic behavior, we build
634       // a map for this PHI node's incoming values and then translate it into
635       // the more compact representation used below.
636       SmallDenseMap<BasicBlock *, Value *, 16> IncomingValueMap;
637       for (int i : llvm::seq<int>(0, OpPN->getNumIncomingValues()))
638         IncomingValueMap[OpPN->getIncomingBlock(i)] = OpPN->getIncomingValue(i);
639
640       for (auto *PredBB : SpecPreds)
641         SpeculatedVals.push_back(IncomingValueMap.find(PredBB)->second);
642     }
643
644   // Speculate into each predecessor.
645   for (int PredIdx : llvm::seq<int>(0, SpecPreds.size())) {
646     auto *PredBB = SpecPreds[PredIdx];
647     assert(PredBB->getSingleSuccessor() == ParentBB &&
648            "We need a non-critical predecessor to speculate into.");
649
650     for (auto *OrigI : SpecList) {
651       auto *NewI = OrigI->clone();
652       NewI->setName(Twine(OrigI->getName()) + "." + Twine(PredIdx));
653       NewI->insertBefore(PredBB->getTerminator());
654
655       // Rewrite all the operands to the previously speculated instructions.
656       // Because we're walking in-order, the defs must precede the uses and we
657       // should already have these mappings.
658       for (Use &U : NewI->operands()) {
659         auto *OpI = dyn_cast<Instruction>(U.get());
660         if (!OpI)
661           continue;
662         auto MapIt = SpeculatedValueMap.find(OpI);
663         if (MapIt == SpeculatedValueMap.end())
664           continue;
665         const auto &SpeculatedVals = MapIt->second;
666         assert(SpeculatedVals[PredIdx] &&
667                "Must have a speculated value for this predecessor!");
668         assert(SpeculatedVals[PredIdx]->getType() == OpI->getType() &&
669                "Speculated value has the wrong type!");
670
671         // Rewrite the use to this predecessor's speculated instruction.
672         U.set(SpeculatedVals[PredIdx]);
673       }
674
675       // Commute instructions which now have a constant in the LHS but not the
676       // RHS.
677       if (NewI->isBinaryOp() && NewI->isCommutative() &&
678           isa<Constant>(NewI->getOperand(0)) &&
679           !isa<Constant>(NewI->getOperand(1)))
680         NewI->getOperandUse(0).swap(NewI->getOperandUse(1));
681
682       SpeculatedValueMap[OrigI].push_back(NewI);
683       assert(SpeculatedValueMap[OrigI][PredIdx] == NewI &&
684              "Mismatched speculated instruction index!");
685     }
686   }
687
688   // Walk the speculated instruction list and if they have uses, insert a PHI
689   // for them from the speculated versions, and replace the uses with the PHI.
690   // Then erase the instructions as they have been fully speculated. The walk
691   // needs to be in reverse so that we don't think there are users when we'll
692   // actually eventually remove them later.
693   IRBuilder<> IRB(SpecPNs[0]);
694   for (auto *OrigI : llvm::reverse(SpecList)) {
695     // Check if we need a PHI for any remaining users and if so, insert it.
696     if (!OrigI->use_empty()) {
697       auto *SpecIPN = IRB.CreatePHI(OrigI->getType(), SpecPreds.size(),
698                                     Twine(OrigI->getName()) + ".phi");
699       // Add the incoming values we speculated.
700       auto &SpeculatedVals = SpeculatedValueMap.find(OrigI)->second;
701       for (int PredIdx : llvm::seq<int>(0, SpecPreds.size()))
702         SpecIPN->addIncoming(SpeculatedVals[PredIdx], SpecPreds[PredIdx]);
703
704       // And replace the uses with the PHI node.
705       OrigI->replaceAllUsesWith(SpecIPN);
706     }
707
708     // It is important to immediately erase this so that it stops using other
709     // instructions. This avoids inserting needless PHIs of them.
710     OrigI->eraseFromParent();
711   }
712
713   // All of the uses of the speculated phi nodes should be removed at this
714   // point, so erase them.
715   for (auto *SpecPN : SpecPNs) {
716     assert(SpecPN->use_empty() && "All users should have been speculated!");
717     SpecPN->eraseFromParent();
718   }
719 }
720
721 /// Try to speculate around a series of PHIs from a single basic block.
722 ///
723 /// This routine checks whether any of these PHIs are profitable to speculate
724 /// users around. If safe and profitable, it does the speculation. It returns
725 /// true when at least some speculation occurs.
726 static bool tryToSpeculatePHIs(SmallVectorImpl<PHINode *> &PNs,
727                                DominatorTree &DT, TargetTransformInfo &TTI) {
728   LLVM_DEBUG(dbgs() << "Evaluating phi nodes for speculation:\n");
729
730   // Savings in cost from speculating around a PHI node.
731   SmallDenseMap<PHINode *, int, 16> CostSavingsMap;
732
733   // Remember the set of instructions that are candidates for speculation so
734   // that we can quickly walk things within that space. This prunes out
735   // instructions already available along edges, etc.
736   SmallPtrSet<Instruction *, 16> PotentialSpecSet;
737
738   // Remember the set of instructions that are (transitively) unsafe to
739   // speculate into the incoming edges of this basic block. This avoids
740   // recomputing them for each PHI node we check. This set is specific to this
741   // block though as things are pruned out of it based on what is available
742   // along incoming edges.
743   SmallPtrSet<Instruction *, 16> UnsafeSet;
744
745   // For each PHI node in this block, check whether there are immediate folding
746   // opportunities from speculation, and whether that speculation will be
747   // valid. This determise the set of safe PHIs to speculate.
748   PNs.erase(llvm::remove_if(PNs,
749                             [&](PHINode *PN) {
750                               return !isSafeAndProfitableToSpeculateAroundPHI(
751                                   *PN, CostSavingsMap, PotentialSpecSet,
752                                   UnsafeSet, DT, TTI);
753                             }),
754             PNs.end());
755   // If no PHIs were profitable, skip.
756   if (PNs.empty()) {
757     LLVM_DEBUG(dbgs() << "  No safe and profitable PHIs found!\n");
758     return false;
759   }
760
761   // We need to know how much speculation will cost which is determined by how
762   // many incoming edges will need a copy of each speculated instruction.
763   SmallSetVector<BasicBlock *, 16> PredSet;
764   for (auto *PredBB : PNs[0]->blocks()) {
765     if (!PredSet.insert(PredBB))
766       continue;
767
768     // We cannot speculate when a predecessor is an indirect branch.
769     // FIXME: We also can't reliably create a non-critical edge block for
770     // speculation if the predecessor is an invoke. This doesn't seem
771     // fundamental and we should probably be splitting critical edges
772     // differently.
773     if (isa<IndirectBrInst>(PredBB->getTerminator()) ||
774         isa<InvokeInst>(PredBB->getTerminator())) {
775       LLVM_DEBUG(dbgs() << "  Invalid: predecessor terminator: "
776                         << PredBB->getName() << "\n");
777       return false;
778     }
779   }
780   if (PredSet.size() < 2) {
781     LLVM_DEBUG(dbgs() << "  Unimportant: phi with only one predecessor\n");
782     return false;
783   }
784
785   SmallVector<PHINode *, 16> SpecPNs = findProfitablePHIs(
786       PNs, CostSavingsMap, PotentialSpecSet, PredSet.size(), DT, TTI);
787   if (SpecPNs.empty())
788     // Nothing to do.
789     return false;
790
791   speculatePHIs(SpecPNs, PotentialSpecSet, PredSet, DT);
792   return true;
793 }
794
795 PreservedAnalyses SpeculateAroundPHIsPass::run(Function &F,
796                                                FunctionAnalysisManager &AM) {
797   auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
798   auto &TTI = AM.getResult<TargetIRAnalysis>(F);
799
800   bool Changed = false;
801   for (auto *BB : ReversePostOrderTraversal<Function *>(&F)) {
802     SmallVector<PHINode *, 16> PNs;
803     auto BBI = BB->begin();
804     while (auto *PN = dyn_cast<PHINode>(&*BBI)) {
805       PNs.push_back(PN);
806       ++BBI;
807     }
808
809     if (PNs.empty())
810       continue;
811
812     Changed |= tryToSpeculatePHIs(PNs, DT, TTI);
813   }
814
815   if (!Changed)
816     return PreservedAnalyses::all();
817
818   PreservedAnalyses PA;
819   return PA;
820 }