xref: /freebsd-src/contrib/llvm-project/llvm/lib/CodeGen/CodeGenCommonISel.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1349cc55cSDimitry Andric //===-- CodeGenCommonISel.cpp ---------------------------------------------===//
2349cc55cSDimitry Andric //
3349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6349cc55cSDimitry Andric //
7349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
8349cc55cSDimitry Andric //
9349cc55cSDimitry Andric // This file defines common utilies that are shared between SelectionDAG and
10349cc55cSDimitry Andric // GlobalISel frameworks.
11349cc55cSDimitry Andric //
12349cc55cSDimitry Andric //===----------------------------------------------------------------------===//
13349cc55cSDimitry Andric 
14349cc55cSDimitry Andric #include "llvm/CodeGen/CodeGenCommonISel.h"
15349cc55cSDimitry Andric #include "llvm/Analysis/BranchProbabilityInfo.h"
16349cc55cSDimitry Andric #include "llvm/CodeGen/MachineBasicBlock.h"
17349cc55cSDimitry Andric #include "llvm/CodeGen/MachineFunction.h"
18349cc55cSDimitry Andric #include "llvm/CodeGen/TargetInstrInfo.h"
19349cc55cSDimitry Andric #include "llvm/CodeGen/TargetOpcodes.h"
20bdd1243dSDimitry Andric #include "llvm/IR/DebugInfoMetadata.h"
21bdd1243dSDimitry Andric 
22bdd1243dSDimitry Andric #define DEBUG_TYPE "codegen-common"
23349cc55cSDimitry Andric 
24349cc55cSDimitry Andric using namespace llvm;
25349cc55cSDimitry Andric 
26349cc55cSDimitry Andric /// Add a successor MBB to ParentMBB< creating a new MachineBB for BB if SuccMBB
27349cc55cSDimitry Andric /// is 0.
28349cc55cSDimitry Andric MachineBasicBlock *
29349cc55cSDimitry Andric StackProtectorDescriptor::addSuccessorMBB(
30349cc55cSDimitry Andric     const BasicBlock *BB, MachineBasicBlock *ParentMBB, bool IsLikely,
31349cc55cSDimitry Andric     MachineBasicBlock *SuccMBB) {
32349cc55cSDimitry Andric   // If SuccBB has not been created yet, create it.
33349cc55cSDimitry Andric   if (!SuccMBB) {
34349cc55cSDimitry Andric     MachineFunction *MF = ParentMBB->getParent();
35349cc55cSDimitry Andric     MachineFunction::iterator BBI(ParentMBB);
36349cc55cSDimitry Andric     SuccMBB = MF->CreateMachineBasicBlock(BB);
37349cc55cSDimitry Andric     MF->insert(++BBI, SuccMBB);
38349cc55cSDimitry Andric   }
39349cc55cSDimitry Andric   // Add it as a successor of ParentMBB.
40349cc55cSDimitry Andric   ParentMBB->addSuccessor(
41349cc55cSDimitry Andric       SuccMBB, BranchProbabilityInfo::getBranchProbStackProtector(IsLikely));
42349cc55cSDimitry Andric   return SuccMBB;
43349cc55cSDimitry Andric }
44349cc55cSDimitry Andric 
45349cc55cSDimitry Andric /// Given that the input MI is before a partial terminator sequence TSeq, return
46349cc55cSDimitry Andric /// true if M + TSeq also a partial terminator sequence.
47349cc55cSDimitry Andric ///
48349cc55cSDimitry Andric /// A Terminator sequence is a sequence of MachineInstrs which at this point in
49349cc55cSDimitry Andric /// lowering copy vregs into physical registers, which are then passed into
50349cc55cSDimitry Andric /// terminator instructors so we can satisfy ABI constraints. A partial
51349cc55cSDimitry Andric /// terminator sequence is an improper subset of a terminator sequence (i.e. it
52349cc55cSDimitry Andric /// may be the whole terminator sequence).
53349cc55cSDimitry Andric static bool MIIsInTerminatorSequence(const MachineInstr &MI) {
54349cc55cSDimitry Andric   // If we do not have a copy or an implicit def, we return true if and only if
55349cc55cSDimitry Andric   // MI is a debug value.
56349cc55cSDimitry Andric   if (!MI.isCopy() && !MI.isImplicitDef()) {
57349cc55cSDimitry Andric     // Sometimes DBG_VALUE MI sneak in between the copies from the vregs to the
58349cc55cSDimitry Andric     // physical registers if there is debug info associated with the terminator
59349cc55cSDimitry Andric     // of our mbb. We want to include said debug info in our terminator
60349cc55cSDimitry Andric     // sequence, so we return true in that case.
61349cc55cSDimitry Andric     if (MI.isDebugInstr())
62349cc55cSDimitry Andric       return true;
63349cc55cSDimitry Andric 
64349cc55cSDimitry Andric     // For GlobalISel, we may have extension instructions for arguments within
65349cc55cSDimitry Andric     // copy sequences. Allow these.
66349cc55cSDimitry Andric     switch (MI.getOpcode()) {
67349cc55cSDimitry Andric     case TargetOpcode::G_TRUNC:
68349cc55cSDimitry Andric     case TargetOpcode::G_ZEXT:
69349cc55cSDimitry Andric     case TargetOpcode::G_ANYEXT:
70349cc55cSDimitry Andric     case TargetOpcode::G_SEXT:
71349cc55cSDimitry Andric     case TargetOpcode::G_MERGE_VALUES:
72349cc55cSDimitry Andric     case TargetOpcode::G_UNMERGE_VALUES:
73349cc55cSDimitry Andric     case TargetOpcode::G_CONCAT_VECTORS:
74349cc55cSDimitry Andric     case TargetOpcode::G_BUILD_VECTOR:
75349cc55cSDimitry Andric     case TargetOpcode::G_EXTRACT:
76349cc55cSDimitry Andric       return true;
77349cc55cSDimitry Andric     default:
78349cc55cSDimitry Andric       return false;
79349cc55cSDimitry Andric     }
80349cc55cSDimitry Andric   }
81349cc55cSDimitry Andric 
82349cc55cSDimitry Andric   // We have left the terminator sequence if we are not doing one of the
83349cc55cSDimitry Andric   // following:
84349cc55cSDimitry Andric   //
85349cc55cSDimitry Andric   // 1. Copying a vreg into a physical register.
86349cc55cSDimitry Andric   // 2. Copying a vreg into a vreg.
87349cc55cSDimitry Andric   // 3. Defining a register via an implicit def.
88349cc55cSDimitry Andric 
89349cc55cSDimitry Andric   // OPI should always be a register definition...
90349cc55cSDimitry Andric   MachineInstr::const_mop_iterator OPI = MI.operands_begin();
91349cc55cSDimitry Andric   if (!OPI->isReg() || !OPI->isDef())
92349cc55cSDimitry Andric     return false;
93349cc55cSDimitry Andric 
94349cc55cSDimitry Andric   // Defining any register via an implicit def is always ok.
95349cc55cSDimitry Andric   if (MI.isImplicitDef())
96349cc55cSDimitry Andric     return true;
97349cc55cSDimitry Andric 
98349cc55cSDimitry Andric   // Grab the copy source...
99349cc55cSDimitry Andric   MachineInstr::const_mop_iterator OPI2 = OPI;
100349cc55cSDimitry Andric   ++OPI2;
101349cc55cSDimitry Andric   assert(OPI2 != MI.operands_end()
102349cc55cSDimitry Andric          && "Should have a copy implying we should have 2 arguments.");
103349cc55cSDimitry Andric 
104349cc55cSDimitry Andric   // Make sure that the copy dest is not a vreg when the copy source is a
105349cc55cSDimitry Andric   // physical register.
106bdd1243dSDimitry Andric   if (!OPI2->isReg() ||
107bdd1243dSDimitry Andric       (!OPI->getReg().isPhysical() && OPI2->getReg().isPhysical()))
108349cc55cSDimitry Andric     return false;
109349cc55cSDimitry Andric 
110349cc55cSDimitry Andric   return true;
111349cc55cSDimitry Andric }
112349cc55cSDimitry Andric 
113349cc55cSDimitry Andric /// Find the split point at which to splice the end of BB into its success stack
114349cc55cSDimitry Andric /// protector check machine basic block.
115349cc55cSDimitry Andric ///
116349cc55cSDimitry Andric /// On many platforms, due to ABI constraints, terminators, even before register
117349cc55cSDimitry Andric /// allocation, use physical registers. This creates an issue for us since
118349cc55cSDimitry Andric /// physical registers at this point can not travel across basic
119349cc55cSDimitry Andric /// blocks. Luckily, selectiondag always moves physical registers into vregs
120349cc55cSDimitry Andric /// when they enter functions and moves them through a sequence of copies back
121349cc55cSDimitry Andric /// into the physical registers right before the terminator creating a
122349cc55cSDimitry Andric /// ``Terminator Sequence''. This function is searching for the beginning of the
123349cc55cSDimitry Andric /// terminator sequence so that we can ensure that we splice off not just the
124349cc55cSDimitry Andric /// terminator, but additionally the copies that move the vregs into the
125349cc55cSDimitry Andric /// physical registers.
126349cc55cSDimitry Andric MachineBasicBlock::iterator
127349cc55cSDimitry Andric llvm::findSplitPointForStackProtector(MachineBasicBlock *BB,
128349cc55cSDimitry Andric                                       const TargetInstrInfo &TII) {
129349cc55cSDimitry Andric   MachineBasicBlock::iterator SplitPoint = BB->getFirstTerminator();
130349cc55cSDimitry Andric   if (SplitPoint == BB->begin())
131349cc55cSDimitry Andric     return SplitPoint;
132349cc55cSDimitry Andric 
133349cc55cSDimitry Andric   MachineBasicBlock::iterator Start = BB->begin();
134349cc55cSDimitry Andric   MachineBasicBlock::iterator Previous = SplitPoint;
13581ad6265SDimitry Andric   do {
136349cc55cSDimitry Andric     --Previous;
13781ad6265SDimitry Andric   } while (Previous != Start && Previous->isDebugInstr());
138349cc55cSDimitry Andric 
139349cc55cSDimitry Andric   if (TII.isTailCall(*SplitPoint) &&
140349cc55cSDimitry Andric       Previous->getOpcode() == TII.getCallFrameDestroyOpcode()) {
141349cc55cSDimitry Andric     // Call frames cannot be nested, so if this frame is describing the tail
142349cc55cSDimitry Andric     // call itself, then we must insert before the sequence even starts. For
143349cc55cSDimitry Andric     // example:
144349cc55cSDimitry Andric     //     <split point>
145349cc55cSDimitry Andric     //     ADJCALLSTACKDOWN ...
146349cc55cSDimitry Andric     //     <Moves>
147349cc55cSDimitry Andric     //     ADJCALLSTACKUP ...
148349cc55cSDimitry Andric     //     TAILJMP somewhere
149349cc55cSDimitry Andric     // On the other hand, it could be an unrelated call in which case this tail
15081ad6265SDimitry Andric     // call has no register moves of its own and should be the split point. For
151349cc55cSDimitry Andric     // example:
152349cc55cSDimitry Andric     //     ADJCALLSTACKDOWN
153349cc55cSDimitry Andric     //     CALL something_else
154349cc55cSDimitry Andric     //     ADJCALLSTACKUP
155349cc55cSDimitry Andric     //     <split point>
156349cc55cSDimitry Andric     //     TAILJMP somewhere
157349cc55cSDimitry Andric     do {
158349cc55cSDimitry Andric       --Previous;
159349cc55cSDimitry Andric       if (Previous->isCall())
160349cc55cSDimitry Andric         return SplitPoint;
161349cc55cSDimitry Andric     } while(Previous->getOpcode() != TII.getCallFrameSetupOpcode());
162349cc55cSDimitry Andric 
163349cc55cSDimitry Andric     return Previous;
164349cc55cSDimitry Andric   }
165349cc55cSDimitry Andric 
166349cc55cSDimitry Andric   while (MIIsInTerminatorSequence(*Previous)) {
167349cc55cSDimitry Andric     SplitPoint = Previous;
168349cc55cSDimitry Andric     if (Previous == Start)
169349cc55cSDimitry Andric       break;
170349cc55cSDimitry Andric     --Previous;
171349cc55cSDimitry Andric   }
172349cc55cSDimitry Andric 
173349cc55cSDimitry Andric   return SplitPoint;
174349cc55cSDimitry Andric }
17581ad6265SDimitry Andric 
17606c3fb27SDimitry Andric FPClassTest llvm::invertFPClassTestIfSimpler(FPClassTest Test) {
17706c3fb27SDimitry Andric   FPClassTest InvertedTest = ~Test;
17806c3fb27SDimitry Andric   // Pick the direction with fewer tests
17906c3fb27SDimitry Andric   // TODO: Handle more combinations of cases that can be handled together
18006c3fb27SDimitry Andric   switch (static_cast<unsigned>(InvertedTest)) {
18181ad6265SDimitry Andric   case fcNan:
18281ad6265SDimitry Andric   case fcSNan:
18381ad6265SDimitry Andric   case fcQNan:
18481ad6265SDimitry Andric   case fcInf:
18581ad6265SDimitry Andric   case fcPosInf:
18681ad6265SDimitry Andric   case fcNegInf:
18781ad6265SDimitry Andric   case fcNormal:
18881ad6265SDimitry Andric   case fcPosNormal:
18981ad6265SDimitry Andric   case fcNegNormal:
19081ad6265SDimitry Andric   case fcSubnormal:
19181ad6265SDimitry Andric   case fcPosSubnormal:
19281ad6265SDimitry Andric   case fcNegSubnormal:
19381ad6265SDimitry Andric   case fcZero:
19481ad6265SDimitry Andric   case fcPosZero:
19581ad6265SDimitry Andric   case fcNegZero:
19681ad6265SDimitry Andric   case fcFinite:
19781ad6265SDimitry Andric   case fcPosFinite:
19881ad6265SDimitry Andric   case fcNegFinite:
19906c3fb27SDimitry Andric   case fcZero | fcNan:
20006c3fb27SDimitry Andric   case fcSubnormal | fcZero:
20106c3fb27SDimitry Andric   case fcSubnormal | fcZero | fcNan:
20281ad6265SDimitry Andric     return InvertedTest;
20306c3fb27SDimitry Andric   default:
20406c3fb27SDimitry Andric     return fcNone;
20581ad6265SDimitry Andric   }
20606c3fb27SDimitry Andric 
20706c3fb27SDimitry Andric   llvm_unreachable("covered FPClassTest");
20881ad6265SDimitry Andric }
209bdd1243dSDimitry Andric 
210bdd1243dSDimitry Andric static MachineOperand *getSalvageOpsForCopy(const MachineRegisterInfo &MRI,
211bdd1243dSDimitry Andric                                             MachineInstr &Copy) {
212bdd1243dSDimitry Andric   assert(Copy.getOpcode() == TargetOpcode::COPY && "Must be a COPY");
213bdd1243dSDimitry Andric 
214bdd1243dSDimitry Andric   return &Copy.getOperand(1);
215bdd1243dSDimitry Andric }
216bdd1243dSDimitry Andric 
217bdd1243dSDimitry Andric static MachineOperand *getSalvageOpsForTrunc(const MachineRegisterInfo &MRI,
218bdd1243dSDimitry Andric                                             MachineInstr &Trunc,
219bdd1243dSDimitry Andric                                             SmallVectorImpl<uint64_t> &Ops) {
220bdd1243dSDimitry Andric   assert(Trunc.getOpcode() == TargetOpcode::G_TRUNC && "Must be a G_TRUNC");
221bdd1243dSDimitry Andric 
222bdd1243dSDimitry Andric   const auto FromLLT = MRI.getType(Trunc.getOperand(1).getReg());
223bdd1243dSDimitry Andric   const auto ToLLT = MRI.getType(Trunc.defs().begin()->getReg());
224bdd1243dSDimitry Andric 
225bdd1243dSDimitry Andric   // TODO: Support non-scalar types.
226bdd1243dSDimitry Andric   if (!FromLLT.isScalar()) {
227bdd1243dSDimitry Andric     return nullptr;
228bdd1243dSDimitry Andric   }
229bdd1243dSDimitry Andric 
230bdd1243dSDimitry Andric   auto ExtOps = DIExpression::getExtOps(FromLLT.getSizeInBits(),
231bdd1243dSDimitry Andric                                         ToLLT.getSizeInBits(), false);
232bdd1243dSDimitry Andric   Ops.append(ExtOps.begin(), ExtOps.end());
233bdd1243dSDimitry Andric   return &Trunc.getOperand(1);
234bdd1243dSDimitry Andric }
235bdd1243dSDimitry Andric 
236bdd1243dSDimitry Andric static MachineOperand *salvageDebugInfoImpl(const MachineRegisterInfo &MRI,
237bdd1243dSDimitry Andric                                             MachineInstr &MI,
238bdd1243dSDimitry Andric                                             SmallVectorImpl<uint64_t> &Ops) {
239bdd1243dSDimitry Andric   switch (MI.getOpcode()) {
240bdd1243dSDimitry Andric   case TargetOpcode::G_TRUNC:
241bdd1243dSDimitry Andric     return getSalvageOpsForTrunc(MRI, MI, Ops);
242bdd1243dSDimitry Andric   case TargetOpcode::COPY:
243bdd1243dSDimitry Andric     return getSalvageOpsForCopy(MRI, MI);
244bdd1243dSDimitry Andric   default:
245bdd1243dSDimitry Andric     return nullptr;
246bdd1243dSDimitry Andric   }
247bdd1243dSDimitry Andric }
248bdd1243dSDimitry Andric 
249bdd1243dSDimitry Andric void llvm::salvageDebugInfoForDbgValue(const MachineRegisterInfo &MRI,
250bdd1243dSDimitry Andric                                        MachineInstr &MI,
251bdd1243dSDimitry Andric                                        ArrayRef<MachineOperand *> DbgUsers) {
252bdd1243dSDimitry Andric   // These are arbitrary chosen limits on the maximum number of values and the
253bdd1243dSDimitry Andric   // maximum size of a debug expression we can salvage up to, used for
254bdd1243dSDimitry Andric   // performance reasons.
255bdd1243dSDimitry Andric   const unsigned MaxExpressionSize = 128;
256bdd1243dSDimitry Andric 
257bdd1243dSDimitry Andric   for (auto *DefMO : DbgUsers) {
258bdd1243dSDimitry Andric     MachineInstr *DbgMI = DefMO->getParent();
259bdd1243dSDimitry Andric     if (DbgMI->isIndirectDebugValue()) {
260bdd1243dSDimitry Andric       continue;
261bdd1243dSDimitry Andric     }
262bdd1243dSDimitry Andric 
263*0fca6ea1SDimitry Andric     int UseMOIdx =
264*0fca6ea1SDimitry Andric         DbgMI->findRegisterUseOperandIdx(DefMO->getReg(), /*TRI=*/nullptr);
265bdd1243dSDimitry Andric     assert(UseMOIdx != -1 && DbgMI->hasDebugOperandForReg(DefMO->getReg()) &&
266bdd1243dSDimitry Andric            "Must use salvaged instruction as its location");
267bdd1243dSDimitry Andric 
268bdd1243dSDimitry Andric     // TODO: Support DBG_VALUE_LIST.
269bdd1243dSDimitry Andric     if (DbgMI->getOpcode() != TargetOpcode::DBG_VALUE) {
270bdd1243dSDimitry Andric       assert(DbgMI->getOpcode() == TargetOpcode::DBG_VALUE_LIST &&
271bdd1243dSDimitry Andric              "Must be either DBG_VALUE or DBG_VALUE_LIST");
272bdd1243dSDimitry Andric       continue;
273bdd1243dSDimitry Andric     }
274bdd1243dSDimitry Andric 
275bdd1243dSDimitry Andric     const DIExpression *SalvagedExpr = DbgMI->getDebugExpression();
276bdd1243dSDimitry Andric 
277bdd1243dSDimitry Andric     SmallVector<uint64_t, 16> Ops;
278bdd1243dSDimitry Andric     auto Op0 = salvageDebugInfoImpl(MRI, MI, Ops);
279bdd1243dSDimitry Andric     if (!Op0)
280bdd1243dSDimitry Andric       continue;
281bdd1243dSDimitry Andric     SalvagedExpr = DIExpression::appendOpsToArg(SalvagedExpr, Ops, 0, true);
282bdd1243dSDimitry Andric 
283bdd1243dSDimitry Andric     bool IsValidSalvageExpr =
284bdd1243dSDimitry Andric         SalvagedExpr->getNumElements() <= MaxExpressionSize;
285bdd1243dSDimitry Andric     if (IsValidSalvageExpr) {
286bdd1243dSDimitry Andric       auto &UseMO = DbgMI->getOperand(UseMOIdx);
287bdd1243dSDimitry Andric       UseMO.setReg(Op0->getReg());
288bdd1243dSDimitry Andric       UseMO.setSubReg(Op0->getSubReg());
289bdd1243dSDimitry Andric       DbgMI->getDebugExpressionOp().setMetadata(SalvagedExpr);
290bdd1243dSDimitry Andric 
291bdd1243dSDimitry Andric       LLVM_DEBUG(dbgs() << "SALVAGE: " << *DbgMI << '\n');
292bdd1243dSDimitry Andric     }
293bdd1243dSDimitry Andric   }
294bdd1243dSDimitry Andric }
295