xref: /freebsd/contrib/llvm-project/llvm/lib/Target/PowerPC/PPCExpandISEL.cpp (revision 1b10e191f341111fad7be32ead11484dfd09b800)
1 //===------------- PPCExpandISEL.cpp - Expand ISEL instruction ------------===//
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 // A pass that expands the ISEL instruction into an if-then-else sequence.
10 // This pass must be run post-RA since all operands must be physical registers.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "PPC.h"
15 #include "PPCInstrInfo.h"
16 #include "PPCSubtarget.h"
17 #include "llvm/ADT/DenseMap.h"
18 #include "llvm/ADT/Statistic.h"
19 #include "llvm/CodeGen/LivePhysRegs.h"
20 #include "llvm/CodeGen/MachineFunctionPass.h"
21 #include "llvm/CodeGen/MachineInstrBuilder.h"
22 #include "llvm/CodeGen/MachineRegisterInfo.h"
23 #include "llvm/Support/CommandLine.h"
24 #include "llvm/Support/Debug.h"
25 #include "llvm/Support/raw_ostream.h"
26 
27 using namespace llvm;
28 
29 #define DEBUG_TYPE "ppc-expand-isel"
30 
31 STATISTIC(NumExpanded, "Number of ISEL instructions expanded");
32 STATISTIC(NumRemoved, "Number of ISEL instructions removed");
33 STATISTIC(NumFolded, "Number of ISEL instructions folded");
34 
35 // If -ppc-gen-isel=false is set, we will disable generating the ISEL
36 // instruction on all PPC targets. Otherwise, if the user set option
37 // -misel or the platform supports ISEL by default, still generate the
38 // ISEL instruction, else expand it.
39 static cl::opt<bool>
40     GenerateISEL("ppc-gen-isel",
41                  cl::desc("Enable generating the ISEL instruction."),
42                  cl::init(true), cl::Hidden);
43 
44 namespace {
45 class PPCExpandISEL : public MachineFunctionPass {
46   DebugLoc dl;
47   MachineFunction *MF;
48   const TargetInstrInfo *TII;
49   bool IsTrueBlockRequired;
50   bool IsFalseBlockRequired;
51   MachineBasicBlock *TrueBlock;
52   MachineBasicBlock *FalseBlock;
53   MachineBasicBlock *NewSuccessor;
54   MachineBasicBlock::iterator TrueBlockI;
55   MachineBasicBlock::iterator FalseBlockI;
56 
57   typedef SmallVector<MachineInstr *, 4> BlockISELList;
58   typedef SmallDenseMap<int, BlockISELList> ISELInstructionList;
59 
60   // A map of MBB numbers to their lists of contained ISEL instructions.
61   // Please note when we traverse this list and expand ISEL, we only remove
62   // the ISEL from the MBB not from this list.
63   ISELInstructionList ISELInstructions;
64 
65   /// Initialize the object.
66   void initialize(MachineFunction &MFParam);
67 
68   void handleSpecialCases(BlockISELList &BIL, MachineBasicBlock *MBB);
69   void reorganizeBlockLayout(BlockISELList &BIL, MachineBasicBlock *MBB);
70   void populateBlocks(BlockISELList &BIL);
71   void expandMergeableISELs(BlockISELList &BIL);
72   void expandAndMergeISELs();
73 
74   bool canMerge(MachineInstr *PrevPushedMI, MachineInstr *MI);
75 
76   ///  Is this instruction an ISEL or ISEL8?
77   static bool isISEL(const MachineInstr &MI) {
78     return (MI.getOpcode() == PPC::ISEL || MI.getOpcode() == PPC::ISEL8);
79   }
80 
81   ///  Is this instruction an ISEL8?
82   static bool isISEL8(const MachineInstr &MI) {
83     return (MI.getOpcode() == PPC::ISEL8);
84   }
85 
86   /// Are the two operands using the same register?
87   bool useSameRegister(const MachineOperand &Op1, const MachineOperand &Op2) {
88     return (Op1.getReg() == Op2.getReg());
89   }
90 
91   ///
92   ///  Collect all ISEL instructions from the current function.
93   ///
94   /// Walk the current function and collect all the ISEL instructions that are
95   /// found. The instructions are placed in the ISELInstructions vector.
96   ///
97   /// \return true if any ISEL instructions were found, false otherwise
98   ///
99   bool collectISELInstructions();
100 
101 public:
102   static char ID;
103   PPCExpandISEL() : MachineFunctionPass(ID) {
104     initializePPCExpandISELPass(*PassRegistry::getPassRegistry());
105   }
106 
107   ///
108   ///  Determine whether to generate the ISEL instruction or expand it.
109   ///
110   /// Expand ISEL instruction into if-then-else sequence when one of
111   /// the following two conditions hold:
112   /// (1) -ppc-gen-isel=false
113   /// (2) hasISEL() return false
114   /// Otherwise, still generate ISEL instruction.
115   /// The -ppc-gen-isel option is set to true by default. Which means the ISEL
116   /// instruction is still generated by default on targets that support them.
117   ///
118   /// \return true if ISEL should be expanded into if-then-else code sequence;
119   ///         false if ISEL instruction should be generated, i.e. not expanded.
120   ///
121   static bool isExpandISELEnabled(const MachineFunction &MF);
122 
123 #ifndef NDEBUG
124   void DumpISELInstructions() const;
125 #endif
126 
127   bool runOnMachineFunction(MachineFunction &MF) override {
128     LLVM_DEBUG(dbgs() << "Function: "; MF.dump(); dbgs() << "\n");
129     initialize(MF);
130 
131     if (!collectISELInstructions()) {
132       LLVM_DEBUG(dbgs() << "No ISEL instructions in this function\n");
133       return false;
134     }
135 
136 #ifndef NDEBUG
137     DumpISELInstructions();
138 #endif
139 
140     expandAndMergeISELs();
141 
142     return true;
143   }
144 };
145 } // end anonymous namespace
146 
147 void PPCExpandISEL::initialize(MachineFunction &MFParam) {
148   MF = &MFParam;
149   TII = MF->getSubtarget().getInstrInfo();
150   ISELInstructions.clear();
151 }
152 
153 bool PPCExpandISEL::isExpandISELEnabled(const MachineFunction &MF) {
154   return !GenerateISEL || !MF.getSubtarget<PPCSubtarget>().hasISEL();
155 }
156 
157 bool PPCExpandISEL::collectISELInstructions() {
158   for (MachineBasicBlock &MBB : *MF) {
159     BlockISELList thisBlockISELs;
160     for (MachineInstr &MI : MBB)
161       if (isISEL(MI))
162         thisBlockISELs.push_back(&MI);
163     if (!thisBlockISELs.empty())
164       ISELInstructions.insert(std::make_pair(MBB.getNumber(), thisBlockISELs));
165   }
166   return !ISELInstructions.empty();
167 }
168 
169 #ifndef NDEBUG
170 void PPCExpandISEL::DumpISELInstructions() const {
171   for (const auto &I : ISELInstructions) {
172     LLVM_DEBUG(dbgs() << printMBBReference(*MF->getBlockNumbered(I.first))
173                       << ":\n");
174     for (const auto &VI : I.second)
175       LLVM_DEBUG(dbgs() << "    "; VI->print(dbgs()));
176   }
177 }
178 #endif
179 
180 /// Contiguous ISELs that have the same condition can be merged.
181 bool PPCExpandISEL::canMerge(MachineInstr *PrevPushedMI, MachineInstr *MI) {
182   // Same Condition Register?
183   if (!useSameRegister(PrevPushedMI->getOperand(3), MI->getOperand(3)))
184     return false;
185 
186   MachineBasicBlock::iterator PrevPushedMBBI = *PrevPushedMI;
187   MachineBasicBlock::iterator MBBI = *MI;
188   return (std::prev(MBBI) == PrevPushedMBBI); // Contiguous ISELs?
189 }
190 
191 void PPCExpandISEL::expandAndMergeISELs() {
192   bool ExpandISELEnabled = isExpandISELEnabled(*MF);
193 
194   for (auto &BlockList : ISELInstructions) {
195     LLVM_DEBUG(
196         dbgs() << "Expanding ISEL instructions in "
197                << printMBBReference(*MF->getBlockNumbered(BlockList.first))
198                << "\n");
199     BlockISELList &CurrentISELList = BlockList.second;
200     auto I = CurrentISELList.begin();
201     auto E = CurrentISELList.end();
202 
203     while (I != E) {
204       assert(isISEL(**I) && "Expecting an ISEL instruction");
205       MachineOperand &Dest = (*I)->getOperand(0);
206       MachineOperand &TrueValue = (*I)->getOperand(1);
207       MachineOperand &FalseValue = (*I)->getOperand(2);
208 
209       // Special case 1, all registers used by ISEL are the same one.
210       // The non-redundant isel 0, 0, 0, N would not satisfy these conditions
211       // as it would be ISEL %R0, %ZERO, %R0, %CRN.
212       if (useSameRegister(Dest, TrueValue) &&
213           useSameRegister(Dest, FalseValue)) {
214         LLVM_DEBUG(dbgs() << "Remove redundant ISEL instruction: " << **I
215                           << "\n");
216         // FIXME: if the CR field used has no other uses, we could eliminate the
217         // instruction that defines it. This would have to be done manually
218         // since this pass runs too late to run DCE after it.
219         NumRemoved++;
220         (*I)->eraseFromParent();
221         I++;
222       } else if (useSameRegister(TrueValue, FalseValue)) {
223         // Special case 2, the two input registers used by ISEL are the same.
224         // Note: the non-foldable isel RX, 0, 0, N would not satisfy this
225         // condition as it would be ISEL %RX, %ZERO, %R0, %CRN, which makes it
226         // safe to fold ISEL to MR(OR) instead of ADDI.
227         MachineBasicBlock *MBB = (*I)->getParent();
228         LLVM_DEBUG(
229             dbgs() << "Fold the ISEL instruction to an unconditional copy:\n");
230         LLVM_DEBUG(dbgs() << "ISEL: " << **I << "\n");
231         NumFolded++;
232         // Note: we're using both the TrueValue and FalseValue operands so as
233         // not to lose the kill flag if it is set on either of them.
234         BuildMI(*MBB, (*I), dl, TII->get(isISEL8(**I) ? PPC::OR8 : PPC::OR))
235             .add(Dest)
236             .add(TrueValue)
237             .add(FalseValue);
238         (*I)->eraseFromParent();
239         I++;
240       } else if (ExpandISELEnabled) { // Normal cases expansion enabled
241         LLVM_DEBUG(dbgs() << "Expand ISEL instructions:\n");
242         LLVM_DEBUG(dbgs() << "ISEL: " << **I << "\n");
243         BlockISELList SubISELList;
244         SubISELList.push_back(*I++);
245         // Collect the ISELs that can be merged together.
246         // This will eat up ISEL instructions without considering whether they
247         // may be redundant or foldable to a register copy. So we still keep
248         // the handleSpecialCases() downstream to handle them.
249         while (I != E && canMerge(SubISELList.back(), *I)) {
250           LLVM_DEBUG(dbgs() << "ISEL: " << **I << "\n");
251           SubISELList.push_back(*I++);
252         }
253 
254         expandMergeableISELs(SubISELList);
255       } else { // Normal cases expansion disabled
256         I++; // leave the ISEL as it is
257       }
258     } // end while
259   } // end for
260 }
261 
262 void PPCExpandISEL::handleSpecialCases(BlockISELList &BIL,
263                                        MachineBasicBlock *MBB) {
264   IsTrueBlockRequired = false;
265   IsFalseBlockRequired = false;
266 
267   auto MI = BIL.begin();
268   while (MI != BIL.end()) {
269     assert(isISEL(**MI) && "Expecting an ISEL instruction");
270     LLVM_DEBUG(dbgs() << "ISEL: " << **MI << "\n");
271 
272     MachineOperand &Dest = (*MI)->getOperand(0);
273     MachineOperand &TrueValue = (*MI)->getOperand(1);
274     MachineOperand &FalseValue = (*MI)->getOperand(2);
275 
276     // If at least one of the ISEL instructions satisfy the following
277     // condition, we need the True Block:
278     // The Dest Register and True Value Register are not the same
279     // Similarly, if at least one of the ISEL instructions satisfy the
280     // following condition, we need the False Block:
281     // The Dest Register and False Value Register are not the same.
282     bool IsADDIInstRequired = !useSameRegister(Dest, TrueValue);
283     bool IsORIInstRequired = !useSameRegister(Dest, FalseValue);
284 
285     // Special case 1, all registers used by ISEL are the same one.
286     if (!IsADDIInstRequired && !IsORIInstRequired) {
287       LLVM_DEBUG(dbgs() << "Remove redundant ISEL instruction.");
288       // FIXME: if the CR field used has no other uses, we could eliminate the
289       // instruction that defines it. This would have to be done manually
290       // since this pass runs too late to run DCE after it.
291       NumRemoved++;
292       (*MI)->eraseFromParent();
293       // Setting MI to the erase result keeps the iterator valid and increased.
294       MI = BIL.erase(MI);
295       continue;
296     }
297 
298     // Special case 2, the two input registers used by ISEL are the same.
299     // Note 1: We favor merging ISEL expansions over folding a single one. If
300     // the passed list has multiple merge-able ISEL's, we won't fold any.
301     // Note 2: There is no need to test for PPC::R0/PPC::X0 because PPC::ZERO/
302     // PPC::ZERO8 will be used for the first operand if the value is meant to
303     // be zero. In this case, the useSameRegister method will return false,
304     // thereby preventing this ISEL from being folded.
305     if (useSameRegister(TrueValue, FalseValue) && (BIL.size() == 1)) {
306       LLVM_DEBUG(
307           dbgs() << "Fold the ISEL instruction to an unconditional copy.");
308       NumFolded++;
309       // Note: we're using both the TrueValue and FalseValue operands so as
310       // not to lose the kill flag if it is set on either of them.
311       BuildMI(*MBB, (*MI), dl, TII->get(isISEL8(**MI) ? PPC::OR8 : PPC::OR))
312           .add(Dest)
313           .add(TrueValue)
314           .add(FalseValue);
315       (*MI)->eraseFromParent();
316       // Setting MI to the erase result keeps the iterator valid and increased.
317       MI = BIL.erase(MI);
318       continue;
319     }
320 
321     IsTrueBlockRequired |= IsADDIInstRequired;
322     IsFalseBlockRequired |= IsORIInstRequired;
323     MI++;
324   }
325 }
326 
327 void PPCExpandISEL::reorganizeBlockLayout(BlockISELList &BIL,
328                                           MachineBasicBlock *MBB) {
329   if (BIL.empty())
330     return;
331 
332   assert((IsTrueBlockRequired || IsFalseBlockRequired) &&
333          "Should have been handled by special cases earlier!");
334 
335   MachineBasicBlock *Successor = nullptr;
336   const BasicBlock *LLVM_BB = MBB->getBasicBlock();
337   MachineBasicBlock::iterator MBBI = (*BIL.back());
338   NewSuccessor = (MBBI != MBB->getLastNonDebugInstr() || !MBB->canFallThrough())
339                      // Another BB is needed to move the instructions that
340                      // follow this ISEL.  If the ISEL is the last instruction
341                      // in a block that can't fall through, we also need a block
342                      // to branch to.
343                      ? MF->CreateMachineBasicBlock(LLVM_BB)
344                      : nullptr;
345 
346   MachineFunction::iterator It = MBB->getIterator();
347   ++It; // Point to the successor block of MBB.
348 
349   // If NewSuccessor is NULL then the last ISEL in this group is the last
350   // non-debug instruction in this block. Find the fall-through successor
351   // of this block to use when updating the CFG below.
352   if (!NewSuccessor) {
353     for (auto &Succ : MBB->successors()) {
354       if (MBB->isLayoutSuccessor(Succ)) {
355         Successor = Succ;
356         break;
357       }
358     }
359   } else
360     Successor = NewSuccessor;
361 
362   // The FalseBlock and TrueBlock are inserted after the MBB block but before
363   // its successor.
364   // Note this need to be done *after* the above setting the Successor code.
365   if (IsFalseBlockRequired) {
366     FalseBlock = MF->CreateMachineBasicBlock(LLVM_BB);
367     MF->insert(It, FalseBlock);
368   }
369 
370   if (IsTrueBlockRequired) {
371     TrueBlock = MF->CreateMachineBasicBlock(LLVM_BB);
372     MF->insert(It, TrueBlock);
373   }
374 
375   if (NewSuccessor) {
376     MF->insert(It, NewSuccessor);
377 
378     // Transfer the rest of this block into the new successor block.
379     NewSuccessor->splice(NewSuccessor->end(), MBB,
380                          std::next(MachineBasicBlock::iterator(BIL.back())),
381                          MBB->end());
382     NewSuccessor->transferSuccessorsAndUpdatePHIs(MBB);
383 
384     // Update the liveins for NewSuccessor.
385     LivePhysRegs LPR;
386     computeAndAddLiveIns(LPR, *NewSuccessor);
387 
388   } else {
389     // Remove successor from MBB.
390     MBB->removeSuccessor(Successor);
391   }
392 
393   // Note that this needs to be done *after* transfering the successors from MBB
394   // to the NewSuccessor block, otherwise these blocks will also be transferred
395   // as successors!
396   MBB->addSuccessor(IsTrueBlockRequired ? TrueBlock : Successor);
397   MBB->addSuccessor(IsFalseBlockRequired ? FalseBlock : Successor);
398 
399   if (IsTrueBlockRequired) {
400     TrueBlockI = TrueBlock->begin();
401     TrueBlock->addSuccessor(Successor);
402   }
403 
404   if (IsFalseBlockRequired) {
405     FalseBlockI = FalseBlock->begin();
406     FalseBlock->addSuccessor(Successor);
407   }
408 
409   // Conditional branch to the TrueBlock or Successor
410   BuildMI(*MBB, BIL.back(), dl, TII->get(PPC::BC))
411       .add(BIL.back()->getOperand(3))
412       .addMBB(IsTrueBlockRequired ? TrueBlock : Successor);
413 
414   // Jump over the true block to the new successor if the condition is false.
415   BuildMI(*(IsFalseBlockRequired ? FalseBlock : MBB),
416           (IsFalseBlockRequired ? FalseBlockI : BIL.back()), dl,
417           TII->get(PPC::B))
418       .addMBB(Successor);
419 
420   if (IsFalseBlockRequired)
421     FalseBlockI = FalseBlock->begin(); // get the position of PPC::B
422 }
423 
424 void PPCExpandISEL::populateBlocks(BlockISELList &BIL) {
425   for (auto &MI : BIL) {
426     assert(isISEL(*MI) && "Expecting an ISEL instruction");
427 
428     MachineOperand &Dest = MI->getOperand(0);       // location to store to
429     MachineOperand &TrueValue = MI->getOperand(1);  // Value to store if
430                                                        // condition is true
431     MachineOperand &FalseValue = MI->getOperand(2); // Value to store if
432                                                        // condition is false
433 
434     LLVM_DEBUG(dbgs() << "Dest: " << Dest << "\n");
435     LLVM_DEBUG(dbgs() << "TrueValue: " << TrueValue << "\n");
436     LLVM_DEBUG(dbgs() << "FalseValue: " << FalseValue << "\n");
437     LLVM_DEBUG(dbgs() << "ConditionRegister: " << MI->getOperand(3) << "\n");
438 
439     // If the Dest Register and True Value Register are not the same one, we
440     // need the True Block.
441     bool IsADDIInstRequired = !useSameRegister(Dest, TrueValue);
442     bool IsORIInstRequired = !useSameRegister(Dest, FalseValue);
443 
444     // Copy the result into the destination if the condition is true.
445     if (IsADDIInstRequired)
446       BuildMI(*TrueBlock, TrueBlockI, dl,
447               TII->get(isISEL8(*MI) ? PPC::ADDI8 : PPC::ADDI))
448           .add(Dest)
449           .add(TrueValue)
450           .add(MachineOperand::CreateImm(0));
451 
452     // Copy the result into the destination if the condition is false.
453     if (IsORIInstRequired)
454       BuildMI(*FalseBlock, FalseBlockI, dl,
455               TII->get(isISEL8(*MI) ? PPC::ORI8 : PPC::ORI))
456           .add(Dest)
457           .add(FalseValue)
458           .add(MachineOperand::CreateImm(0));
459 
460     MI->eraseFromParent(); // Remove the ISEL instruction.
461 
462     NumExpanded++;
463   }
464 
465   if (IsTrueBlockRequired) {
466     // Update the liveins for TrueBlock.
467     LivePhysRegs LPR;
468     computeAndAddLiveIns(LPR, *TrueBlock);
469   }
470 
471   if (IsFalseBlockRequired) {
472     // Update the liveins for FalseBlock.
473     LivePhysRegs LPR;
474     computeAndAddLiveIns(LPR, *FalseBlock);
475   }
476 }
477 
478 void PPCExpandISEL::expandMergeableISELs(BlockISELList &BIL) {
479   // At this stage all the ISELs of BIL are in the same MBB.
480   MachineBasicBlock *MBB = BIL.back()->getParent();
481 
482   handleSpecialCases(BIL, MBB);
483   reorganizeBlockLayout(BIL, MBB);
484   populateBlocks(BIL);
485 }
486 
487 INITIALIZE_PASS(PPCExpandISEL, DEBUG_TYPE, "PowerPC Expand ISEL Generation",
488                 false, false)
489 char PPCExpandISEL::ID = 0;
490 
491 FunctionPass *llvm::createPPCExpandISELPass() { return new PPCExpandISEL(); }
492