xref: /src/contrib/llvm-project/llvm/lib/CodeGen/CodeGenCommonISel.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1c0981da4SDimitry Andric //===-- CodeGenCommonISel.cpp ---------------------------------------------===//
2c0981da4SDimitry Andric //
3c0981da4SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4c0981da4SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5c0981da4SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6c0981da4SDimitry Andric //
7c0981da4SDimitry Andric //===----------------------------------------------------------------------===//
8c0981da4SDimitry Andric //
9c0981da4SDimitry Andric // This file defines common utilies that are shared between SelectionDAG and
10c0981da4SDimitry Andric // GlobalISel frameworks.
11c0981da4SDimitry Andric //
12c0981da4SDimitry Andric //===----------------------------------------------------------------------===//
13c0981da4SDimitry Andric 
14c0981da4SDimitry Andric #include "llvm/CodeGen/CodeGenCommonISel.h"
15c0981da4SDimitry Andric #include "llvm/Analysis/BranchProbabilityInfo.h"
16c0981da4SDimitry Andric #include "llvm/CodeGen/MachineBasicBlock.h"
17c0981da4SDimitry Andric #include "llvm/CodeGen/MachineFunction.h"
18c0981da4SDimitry Andric #include "llvm/CodeGen/TargetInstrInfo.h"
19c0981da4SDimitry Andric #include "llvm/CodeGen/TargetOpcodes.h"
20e3b55780SDimitry Andric #include "llvm/IR/DebugInfoMetadata.h"
21e3b55780SDimitry Andric 
22e3b55780SDimitry Andric #define DEBUG_TYPE "codegen-common"
23c0981da4SDimitry Andric 
24c0981da4SDimitry Andric using namespace llvm;
25c0981da4SDimitry Andric 
26c0981da4SDimitry Andric /// Add a successor MBB to ParentMBB< creating a new MachineBB for BB if SuccMBB
27c0981da4SDimitry Andric /// is 0.
28c0981da4SDimitry Andric MachineBasicBlock *
addSuccessorMBB(const BasicBlock * BB,MachineBasicBlock * ParentMBB,bool IsLikely,MachineBasicBlock * SuccMBB)29c0981da4SDimitry Andric StackProtectorDescriptor::addSuccessorMBB(
30c0981da4SDimitry Andric     const BasicBlock *BB, MachineBasicBlock *ParentMBB, bool IsLikely,
31c0981da4SDimitry Andric     MachineBasicBlock *SuccMBB) {
32c0981da4SDimitry Andric   // If SuccBB has not been created yet, create it.
33c0981da4SDimitry Andric   if (!SuccMBB) {
34c0981da4SDimitry Andric     MachineFunction *MF = ParentMBB->getParent();
35c0981da4SDimitry Andric     MachineFunction::iterator BBI(ParentMBB);
36c0981da4SDimitry Andric     SuccMBB = MF->CreateMachineBasicBlock(BB);
37c0981da4SDimitry Andric     MF->insert(++BBI, SuccMBB);
38c0981da4SDimitry Andric   }
39c0981da4SDimitry Andric   // Add it as a successor of ParentMBB.
40c0981da4SDimitry Andric   ParentMBB->addSuccessor(
41c0981da4SDimitry Andric       SuccMBB, BranchProbabilityInfo::getBranchProbStackProtector(IsLikely));
42c0981da4SDimitry Andric   return SuccMBB;
43c0981da4SDimitry Andric }
44c0981da4SDimitry Andric 
45c0981da4SDimitry Andric /// Given that the input MI is before a partial terminator sequence TSeq, return
46c0981da4SDimitry Andric /// true if M + TSeq also a partial terminator sequence.
47c0981da4SDimitry Andric ///
48c0981da4SDimitry Andric /// A Terminator sequence is a sequence of MachineInstrs which at this point in
49c0981da4SDimitry Andric /// lowering copy vregs into physical registers, which are then passed into
50c0981da4SDimitry Andric /// terminator instructors so we can satisfy ABI constraints. A partial
51c0981da4SDimitry Andric /// terminator sequence is an improper subset of a terminator sequence (i.e. it
52c0981da4SDimitry Andric /// may be the whole terminator sequence).
MIIsInTerminatorSequence(const MachineInstr & MI)53c0981da4SDimitry Andric static bool MIIsInTerminatorSequence(const MachineInstr &MI) {
54c0981da4SDimitry Andric   // If we do not have a copy or an implicit def, we return true if and only if
55c0981da4SDimitry Andric   // MI is a debug value.
56c0981da4SDimitry Andric   if (!MI.isCopy() && !MI.isImplicitDef()) {
57c0981da4SDimitry Andric     // Sometimes DBG_VALUE MI sneak in between the copies from the vregs to the
58c0981da4SDimitry Andric     // physical registers if there is debug info associated with the terminator
59c0981da4SDimitry Andric     // of our mbb. We want to include said debug info in our terminator
60c0981da4SDimitry Andric     // sequence, so we return true in that case.
61c0981da4SDimitry Andric     if (MI.isDebugInstr())
62c0981da4SDimitry Andric       return true;
63c0981da4SDimitry Andric 
64c0981da4SDimitry Andric     // For GlobalISel, we may have extension instructions for arguments within
65c0981da4SDimitry Andric     // copy sequences. Allow these.
66c0981da4SDimitry Andric     switch (MI.getOpcode()) {
67c0981da4SDimitry Andric     case TargetOpcode::G_TRUNC:
68c0981da4SDimitry Andric     case TargetOpcode::G_ZEXT:
69c0981da4SDimitry Andric     case TargetOpcode::G_ANYEXT:
70c0981da4SDimitry Andric     case TargetOpcode::G_SEXT:
71c0981da4SDimitry Andric     case TargetOpcode::G_MERGE_VALUES:
72c0981da4SDimitry Andric     case TargetOpcode::G_UNMERGE_VALUES:
73c0981da4SDimitry Andric     case TargetOpcode::G_CONCAT_VECTORS:
74c0981da4SDimitry Andric     case TargetOpcode::G_BUILD_VECTOR:
75c0981da4SDimitry Andric     case TargetOpcode::G_EXTRACT:
76c0981da4SDimitry Andric       return true;
77c0981da4SDimitry Andric     default:
78c0981da4SDimitry Andric       return false;
79c0981da4SDimitry Andric     }
80c0981da4SDimitry Andric   }
81c0981da4SDimitry Andric 
82c0981da4SDimitry Andric   // We have left the terminator sequence if we are not doing one of the
83c0981da4SDimitry Andric   // following:
84c0981da4SDimitry Andric   //
85c0981da4SDimitry Andric   // 1. Copying a vreg into a physical register.
86c0981da4SDimitry Andric   // 2. Copying a vreg into a vreg.
87c0981da4SDimitry Andric   // 3. Defining a register via an implicit def.
88c0981da4SDimitry Andric 
89c0981da4SDimitry Andric   // OPI should always be a register definition...
90c0981da4SDimitry Andric   MachineInstr::const_mop_iterator OPI = MI.operands_begin();
91c0981da4SDimitry Andric   if (!OPI->isReg() || !OPI->isDef())
92c0981da4SDimitry Andric     return false;
93c0981da4SDimitry Andric 
94c0981da4SDimitry Andric   // Defining any register via an implicit def is always ok.
95c0981da4SDimitry Andric   if (MI.isImplicitDef())
96c0981da4SDimitry Andric     return true;
97c0981da4SDimitry Andric 
98c0981da4SDimitry Andric   // Grab the copy source...
99c0981da4SDimitry Andric   MachineInstr::const_mop_iterator OPI2 = OPI;
100c0981da4SDimitry Andric   ++OPI2;
101c0981da4SDimitry Andric   assert(OPI2 != MI.operands_end()
102c0981da4SDimitry Andric          && "Should have a copy implying we should have 2 arguments.");
103c0981da4SDimitry Andric 
104c0981da4SDimitry Andric   // Make sure that the copy dest is not a vreg when the copy source is a
105c0981da4SDimitry Andric   // physical register.
106e3b55780SDimitry Andric   if (!OPI2->isReg() ||
107e3b55780SDimitry Andric       (!OPI->getReg().isPhysical() && OPI2->getReg().isPhysical()))
108c0981da4SDimitry Andric     return false;
109c0981da4SDimitry Andric 
110c0981da4SDimitry Andric   return true;
111c0981da4SDimitry Andric }
112c0981da4SDimitry Andric 
113c0981da4SDimitry Andric /// Find the split point at which to splice the end of BB into its success stack
114c0981da4SDimitry Andric /// protector check machine basic block.
115c0981da4SDimitry Andric ///
116c0981da4SDimitry Andric /// On many platforms, due to ABI constraints, terminators, even before register
117c0981da4SDimitry Andric /// allocation, use physical registers. This creates an issue for us since
118c0981da4SDimitry Andric /// physical registers at this point can not travel across basic
119c0981da4SDimitry Andric /// blocks. Luckily, selectiondag always moves physical registers into vregs
120c0981da4SDimitry Andric /// when they enter functions and moves them through a sequence of copies back
121c0981da4SDimitry Andric /// into the physical registers right before the terminator creating a
122c0981da4SDimitry Andric /// ``Terminator Sequence''. This function is searching for the beginning of the
123c0981da4SDimitry Andric /// terminator sequence so that we can ensure that we splice off not just the
124c0981da4SDimitry Andric /// terminator, but additionally the copies that move the vregs into the
125c0981da4SDimitry Andric /// physical registers.
126c0981da4SDimitry Andric MachineBasicBlock::iterator
findSplitPointForStackProtector(MachineBasicBlock * BB,const TargetInstrInfo & TII)127c0981da4SDimitry Andric llvm::findSplitPointForStackProtector(MachineBasicBlock *BB,
128c0981da4SDimitry Andric                                       const TargetInstrInfo &TII) {
129c0981da4SDimitry Andric   MachineBasicBlock::iterator SplitPoint = BB->getFirstTerminator();
130c0981da4SDimitry Andric   if (SplitPoint == BB->begin())
131c0981da4SDimitry Andric     return SplitPoint;
132c0981da4SDimitry Andric 
133c0981da4SDimitry Andric   MachineBasicBlock::iterator Start = BB->begin();
134c0981da4SDimitry Andric   MachineBasicBlock::iterator Previous = SplitPoint;
135145449b1SDimitry Andric   do {
136c0981da4SDimitry Andric     --Previous;
137145449b1SDimitry Andric   } while (Previous != Start && Previous->isDebugInstr());
138c0981da4SDimitry Andric 
139c0981da4SDimitry Andric   if (TII.isTailCall(*SplitPoint) &&
140c0981da4SDimitry Andric       Previous->getOpcode() == TII.getCallFrameDestroyOpcode()) {
141c0981da4SDimitry Andric     // Call frames cannot be nested, so if this frame is describing the tail
142c0981da4SDimitry Andric     // call itself, then we must insert before the sequence even starts. For
143c0981da4SDimitry Andric     // example:
144c0981da4SDimitry Andric     //     <split point>
145c0981da4SDimitry Andric     //     ADJCALLSTACKDOWN ...
146c0981da4SDimitry Andric     //     <Moves>
147c0981da4SDimitry Andric     //     ADJCALLSTACKUP ...
148c0981da4SDimitry Andric     //     TAILJMP somewhere
149c0981da4SDimitry Andric     // On the other hand, it could be an unrelated call in which case this tail
150145449b1SDimitry Andric     // call has no register moves of its own and should be the split point. For
151c0981da4SDimitry Andric     // example:
152c0981da4SDimitry Andric     //     ADJCALLSTACKDOWN
153c0981da4SDimitry Andric     //     CALL something_else
154c0981da4SDimitry Andric     //     ADJCALLSTACKUP
155c0981da4SDimitry Andric     //     <split point>
156c0981da4SDimitry Andric     //     TAILJMP somewhere
157c0981da4SDimitry Andric     do {
158c0981da4SDimitry Andric       --Previous;
159c0981da4SDimitry Andric       if (Previous->isCall())
160c0981da4SDimitry Andric         return SplitPoint;
161c0981da4SDimitry Andric     } while(Previous->getOpcode() != TII.getCallFrameSetupOpcode());
162c0981da4SDimitry Andric 
163c0981da4SDimitry Andric     return Previous;
164c0981da4SDimitry Andric   }
165c0981da4SDimitry Andric 
166c0981da4SDimitry Andric   while (MIIsInTerminatorSequence(*Previous)) {
167c0981da4SDimitry Andric     SplitPoint = Previous;
168c0981da4SDimitry Andric     if (Previous == Start)
169c0981da4SDimitry Andric       break;
170c0981da4SDimitry Andric     --Previous;
171c0981da4SDimitry Andric   }
172c0981da4SDimitry Andric 
173c0981da4SDimitry Andric   return SplitPoint;
174c0981da4SDimitry Andric }
175145449b1SDimitry Andric 
invertFPClassTestIfSimpler(FPClassTest Test)1767fa27ce4SDimitry Andric FPClassTest llvm::invertFPClassTestIfSimpler(FPClassTest Test) {
1777fa27ce4SDimitry Andric   FPClassTest InvertedTest = ~Test;
1787fa27ce4SDimitry Andric   // Pick the direction with fewer tests
1797fa27ce4SDimitry Andric   // TODO: Handle more combinations of cases that can be handled together
1807fa27ce4SDimitry Andric   switch (static_cast<unsigned>(InvertedTest)) {
181145449b1SDimitry Andric   case fcNan:
182145449b1SDimitry Andric   case fcSNan:
183145449b1SDimitry Andric   case fcQNan:
184145449b1SDimitry Andric   case fcInf:
185145449b1SDimitry Andric   case fcPosInf:
186145449b1SDimitry Andric   case fcNegInf:
187145449b1SDimitry Andric   case fcNormal:
188145449b1SDimitry Andric   case fcPosNormal:
189145449b1SDimitry Andric   case fcNegNormal:
190145449b1SDimitry Andric   case fcSubnormal:
191145449b1SDimitry Andric   case fcPosSubnormal:
192145449b1SDimitry Andric   case fcNegSubnormal:
193145449b1SDimitry Andric   case fcZero:
194145449b1SDimitry Andric   case fcPosZero:
195145449b1SDimitry Andric   case fcNegZero:
196145449b1SDimitry Andric   case fcFinite:
197145449b1SDimitry Andric   case fcPosFinite:
198145449b1SDimitry Andric   case fcNegFinite:
1997fa27ce4SDimitry Andric   case fcZero | fcNan:
2007fa27ce4SDimitry Andric   case fcSubnormal | fcZero:
2017fa27ce4SDimitry Andric   case fcSubnormal | fcZero | fcNan:
202145449b1SDimitry Andric     return InvertedTest;
2037fa27ce4SDimitry Andric   default:
2047fa27ce4SDimitry Andric     return fcNone;
205145449b1SDimitry Andric   }
2067fa27ce4SDimitry Andric 
2077fa27ce4SDimitry Andric   llvm_unreachable("covered FPClassTest");
208145449b1SDimitry Andric }
209e3b55780SDimitry Andric 
getSalvageOpsForCopy(const MachineRegisterInfo & MRI,MachineInstr & Copy)210e3b55780SDimitry Andric static MachineOperand *getSalvageOpsForCopy(const MachineRegisterInfo &MRI,
211e3b55780SDimitry Andric                                             MachineInstr &Copy) {
212e3b55780SDimitry Andric   assert(Copy.getOpcode() == TargetOpcode::COPY && "Must be a COPY");
213e3b55780SDimitry Andric 
214e3b55780SDimitry Andric   return &Copy.getOperand(1);
215e3b55780SDimitry Andric }
216e3b55780SDimitry Andric 
getSalvageOpsForTrunc(const MachineRegisterInfo & MRI,MachineInstr & Trunc,SmallVectorImpl<uint64_t> & Ops)217e3b55780SDimitry Andric static MachineOperand *getSalvageOpsForTrunc(const MachineRegisterInfo &MRI,
218e3b55780SDimitry Andric                                             MachineInstr &Trunc,
219e3b55780SDimitry Andric                                             SmallVectorImpl<uint64_t> &Ops) {
220e3b55780SDimitry Andric   assert(Trunc.getOpcode() == TargetOpcode::G_TRUNC && "Must be a G_TRUNC");
221e3b55780SDimitry Andric 
222e3b55780SDimitry Andric   const auto FromLLT = MRI.getType(Trunc.getOperand(1).getReg());
223e3b55780SDimitry Andric   const auto ToLLT = MRI.getType(Trunc.defs().begin()->getReg());
224e3b55780SDimitry Andric 
225e3b55780SDimitry Andric   // TODO: Support non-scalar types.
226e3b55780SDimitry Andric   if (!FromLLT.isScalar()) {
227e3b55780SDimitry Andric     return nullptr;
228e3b55780SDimitry Andric   }
229e3b55780SDimitry Andric 
230e3b55780SDimitry Andric   auto ExtOps = DIExpression::getExtOps(FromLLT.getSizeInBits(),
231e3b55780SDimitry Andric                                         ToLLT.getSizeInBits(), false);
232e3b55780SDimitry Andric   Ops.append(ExtOps.begin(), ExtOps.end());
233e3b55780SDimitry Andric   return &Trunc.getOperand(1);
234e3b55780SDimitry Andric }
235e3b55780SDimitry Andric 
salvageDebugInfoImpl(const MachineRegisterInfo & MRI,MachineInstr & MI,SmallVectorImpl<uint64_t> & Ops)236e3b55780SDimitry Andric static MachineOperand *salvageDebugInfoImpl(const MachineRegisterInfo &MRI,
237e3b55780SDimitry Andric                                             MachineInstr &MI,
238e3b55780SDimitry Andric                                             SmallVectorImpl<uint64_t> &Ops) {
239e3b55780SDimitry Andric   switch (MI.getOpcode()) {
240e3b55780SDimitry Andric   case TargetOpcode::G_TRUNC:
241e3b55780SDimitry Andric     return getSalvageOpsForTrunc(MRI, MI, Ops);
242e3b55780SDimitry Andric   case TargetOpcode::COPY:
243e3b55780SDimitry Andric     return getSalvageOpsForCopy(MRI, MI);
244e3b55780SDimitry Andric   default:
245e3b55780SDimitry Andric     return nullptr;
246e3b55780SDimitry Andric   }
247e3b55780SDimitry Andric }
248e3b55780SDimitry Andric 
salvageDebugInfoForDbgValue(const MachineRegisterInfo & MRI,MachineInstr & MI,ArrayRef<MachineOperand * > DbgUsers)249e3b55780SDimitry Andric void llvm::salvageDebugInfoForDbgValue(const MachineRegisterInfo &MRI,
250e3b55780SDimitry Andric                                        MachineInstr &MI,
251e3b55780SDimitry Andric                                        ArrayRef<MachineOperand *> DbgUsers) {
252e3b55780SDimitry Andric   // These are arbitrary chosen limits on the maximum number of values and the
253e3b55780SDimitry Andric   // maximum size of a debug expression we can salvage up to, used for
254e3b55780SDimitry Andric   // performance reasons.
255e3b55780SDimitry Andric   const unsigned MaxExpressionSize = 128;
256e3b55780SDimitry Andric 
257e3b55780SDimitry Andric   for (auto *DefMO : DbgUsers) {
258e3b55780SDimitry Andric     MachineInstr *DbgMI = DefMO->getParent();
259e3b55780SDimitry Andric     if (DbgMI->isIndirectDebugValue()) {
260e3b55780SDimitry Andric       continue;
261e3b55780SDimitry Andric     }
262e3b55780SDimitry Andric 
263ac9a064cSDimitry Andric     int UseMOIdx =
264ac9a064cSDimitry Andric         DbgMI->findRegisterUseOperandIdx(DefMO->getReg(), /*TRI=*/nullptr);
265e3b55780SDimitry Andric     assert(UseMOIdx != -1 && DbgMI->hasDebugOperandForReg(DefMO->getReg()) &&
266e3b55780SDimitry Andric            "Must use salvaged instruction as its location");
267e3b55780SDimitry Andric 
268e3b55780SDimitry Andric     // TODO: Support DBG_VALUE_LIST.
269e3b55780SDimitry Andric     if (DbgMI->getOpcode() != TargetOpcode::DBG_VALUE) {
270e3b55780SDimitry Andric       assert(DbgMI->getOpcode() == TargetOpcode::DBG_VALUE_LIST &&
271e3b55780SDimitry Andric              "Must be either DBG_VALUE or DBG_VALUE_LIST");
272e3b55780SDimitry Andric       continue;
273e3b55780SDimitry Andric     }
274e3b55780SDimitry Andric 
275e3b55780SDimitry Andric     const DIExpression *SalvagedExpr = DbgMI->getDebugExpression();
276e3b55780SDimitry Andric 
277e3b55780SDimitry Andric     SmallVector<uint64_t, 16> Ops;
278e3b55780SDimitry Andric     auto Op0 = salvageDebugInfoImpl(MRI, MI, Ops);
279e3b55780SDimitry Andric     if (!Op0)
280e3b55780SDimitry Andric       continue;
281e3b55780SDimitry Andric     SalvagedExpr = DIExpression::appendOpsToArg(SalvagedExpr, Ops, 0, true);
282e3b55780SDimitry Andric 
283e3b55780SDimitry Andric     bool IsValidSalvageExpr =
284e3b55780SDimitry Andric         SalvagedExpr->getNumElements() <= MaxExpressionSize;
285e3b55780SDimitry Andric     if (IsValidSalvageExpr) {
286e3b55780SDimitry Andric       auto &UseMO = DbgMI->getOperand(UseMOIdx);
287e3b55780SDimitry Andric       UseMO.setReg(Op0->getReg());
288e3b55780SDimitry Andric       UseMO.setSubReg(Op0->getSubReg());
289e3b55780SDimitry Andric       DbgMI->getDebugExpressionOp().setMetadata(SalvagedExpr);
290e3b55780SDimitry Andric 
291e3b55780SDimitry Andric       LLVM_DEBUG(dbgs() << "SALVAGE: " << *DbgMI << '\n');
292e3b55780SDimitry Andric     }
293e3b55780SDimitry Andric   }
294e3b55780SDimitry Andric }
295