xref: /freebsd/contrib/llvm-project/llvm/lib/CodeGen/CodeGenCommonISel.cpp (revision 54b96380f5774c1754a0fcf25212fa8e01db74f6)
1  //===-- CodeGenCommonISel.cpp ---------------------------------------------===//
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  // This file defines common utilies that are shared between SelectionDAG and
10  // GlobalISel frameworks.
11  //
12  //===----------------------------------------------------------------------===//
13  
14  #include "llvm/CodeGen/CodeGenCommonISel.h"
15  #include "llvm/Analysis/BranchProbabilityInfo.h"
16  #include "llvm/CodeGen/MachineBasicBlock.h"
17  #include "llvm/CodeGen/MachineFunction.h"
18  #include "llvm/CodeGen/TargetInstrInfo.h"
19  #include "llvm/CodeGen/TargetOpcodes.h"
20  
21  using namespace llvm;
22  
23  /// Add a successor MBB to ParentMBB< creating a new MachineBB for BB if SuccMBB
24  /// is 0.
25  MachineBasicBlock *
26  StackProtectorDescriptor::addSuccessorMBB(
27      const BasicBlock *BB, MachineBasicBlock *ParentMBB, bool IsLikely,
28      MachineBasicBlock *SuccMBB) {
29    // If SuccBB has not been created yet, create it.
30    if (!SuccMBB) {
31      MachineFunction *MF = ParentMBB->getParent();
32      MachineFunction::iterator BBI(ParentMBB);
33      SuccMBB = MF->CreateMachineBasicBlock(BB);
34      MF->insert(++BBI, SuccMBB);
35    }
36    // Add it as a successor of ParentMBB.
37    ParentMBB->addSuccessor(
38        SuccMBB, BranchProbabilityInfo::getBranchProbStackProtector(IsLikely));
39    return SuccMBB;
40  }
41  
42  /// Given that the input MI is before a partial terminator sequence TSeq, return
43  /// true if M + TSeq also a partial terminator sequence.
44  ///
45  /// A Terminator sequence is a sequence of MachineInstrs which at this point in
46  /// lowering copy vregs into physical registers, which are then passed into
47  /// terminator instructors so we can satisfy ABI constraints. A partial
48  /// terminator sequence is an improper subset of a terminator sequence (i.e. it
49  /// may be the whole terminator sequence).
50  static bool MIIsInTerminatorSequence(const MachineInstr &MI) {
51    // If we do not have a copy or an implicit def, we return true if and only if
52    // MI is a debug value.
53    if (!MI.isCopy() && !MI.isImplicitDef()) {
54      // Sometimes DBG_VALUE MI sneak in between the copies from the vregs to the
55      // physical registers if there is debug info associated with the terminator
56      // of our mbb. We want to include said debug info in our terminator
57      // sequence, so we return true in that case.
58      if (MI.isDebugInstr())
59        return true;
60  
61      // For GlobalISel, we may have extension instructions for arguments within
62      // copy sequences. Allow these.
63      switch (MI.getOpcode()) {
64      case TargetOpcode::G_TRUNC:
65      case TargetOpcode::G_ZEXT:
66      case TargetOpcode::G_ANYEXT:
67      case TargetOpcode::G_SEXT:
68      case TargetOpcode::G_MERGE_VALUES:
69      case TargetOpcode::G_UNMERGE_VALUES:
70      case TargetOpcode::G_CONCAT_VECTORS:
71      case TargetOpcode::G_BUILD_VECTOR:
72      case TargetOpcode::G_EXTRACT:
73        return true;
74      default:
75        return false;
76      }
77    }
78  
79    // We have left the terminator sequence if we are not doing one of the
80    // following:
81    //
82    // 1. Copying a vreg into a physical register.
83    // 2. Copying a vreg into a vreg.
84    // 3. Defining a register via an implicit def.
85  
86    // OPI should always be a register definition...
87    MachineInstr::const_mop_iterator OPI = MI.operands_begin();
88    if (!OPI->isReg() || !OPI->isDef())
89      return false;
90  
91    // Defining any register via an implicit def is always ok.
92    if (MI.isImplicitDef())
93      return true;
94  
95    // Grab the copy source...
96    MachineInstr::const_mop_iterator OPI2 = OPI;
97    ++OPI2;
98    assert(OPI2 != MI.operands_end()
99           && "Should have a copy implying we should have 2 arguments.");
100  
101    // Make sure that the copy dest is not a vreg when the copy source is a
102    // physical register.
103    if (!OPI2->isReg() || (!Register::isPhysicalRegister(OPI->getReg()) &&
104                           Register::isPhysicalRegister(OPI2->getReg())))
105      return false;
106  
107    return true;
108  }
109  
110  /// Find the split point at which to splice the end of BB into its success stack
111  /// protector check machine basic block.
112  ///
113  /// On many platforms, due to ABI constraints, terminators, even before register
114  /// allocation, use physical registers. This creates an issue for us since
115  /// physical registers at this point can not travel across basic
116  /// blocks. Luckily, selectiondag always moves physical registers into vregs
117  /// when they enter functions and moves them through a sequence of copies back
118  /// into the physical registers right before the terminator creating a
119  /// ``Terminator Sequence''. This function is searching for the beginning of the
120  /// terminator sequence so that we can ensure that we splice off not just the
121  /// terminator, but additionally the copies that move the vregs into the
122  /// physical registers.
123  MachineBasicBlock::iterator
124  llvm::findSplitPointForStackProtector(MachineBasicBlock *BB,
125                                        const TargetInstrInfo &TII) {
126    MachineBasicBlock::iterator SplitPoint = BB->getFirstTerminator();
127    if (SplitPoint == BB->begin())
128      return SplitPoint;
129  
130    MachineBasicBlock::iterator Start = BB->begin();
131    MachineBasicBlock::iterator Previous = SplitPoint;
132    --Previous;
133  
134    if (TII.isTailCall(*SplitPoint) &&
135        Previous->getOpcode() == TII.getCallFrameDestroyOpcode()) {
136      // Call frames cannot be nested, so if this frame is describing the tail
137      // call itself, then we must insert before the sequence even starts. For
138      // example:
139      //     <split point>
140      //     ADJCALLSTACKDOWN ...
141      //     <Moves>
142      //     ADJCALLSTACKUP ...
143      //     TAILJMP somewhere
144      // On the other hand, it could be an unrelated call in which case this tail
145      // call has to register moves of its own and should be the split point. For
146      // example:
147      //     ADJCALLSTACKDOWN
148      //     CALL something_else
149      //     ADJCALLSTACKUP
150      //     <split point>
151      //     TAILJMP somewhere
152      do {
153        --Previous;
154        if (Previous->isCall())
155          return SplitPoint;
156      } while(Previous->getOpcode() != TII.getCallFrameSetupOpcode());
157  
158      return Previous;
159    }
160  
161    while (MIIsInTerminatorSequence(*Previous)) {
162      SplitPoint = Previous;
163      if (Previous == Start)
164        break;
165      --Previous;
166    }
167  
168    return SplitPoint;
169  }
170