<div dir="ltr"><div dir="ltr"><div dir="ltr"><br><br><div class="gmail_quote"><div dir="ltr">On Tue, Nov 13, 2018 at 12:53 AM Jessica Paquette via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Author: paquette<br>
Date: Mon Nov 12 15:51:32 2018<br>
New Revision: 346718<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=346718&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=346718&view=rev</a><br>
Log:<br>
[MachineOutliner][NFC] Change getMachineOutlinerMBBFlags to isMBBSafeToOutlineFrom<br>
<br>
Instead of returning Flags, return true if the MBB is safe to outline from.<br>
<br>
This lets us check for unsafe situations, like say, in AArch64, X17 is live<br>
across a MBB without being defined in that MBB. In that case, there's no point<br>
in performing an instruction mapping.<br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/CodeGen/TargetInstrInfo.h<br>
    llvm/trunk/lib/CodeGen/MachineOutliner.cpp<br>
    llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.cpp<br>
    llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.h<br>
<br>
Modified: llvm/trunk/include/llvm/CodeGen/TargetInstrInfo.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/TargetInstrInfo.h?rev=346718&r1=346717&r2=346718&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/TargetInstrInfo.h?rev=346718&r1=346717&r2=346718&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/CodeGen/TargetInstrInfo.h (original)<br>
+++ llvm/trunk/include/llvm/CodeGen/TargetInstrInfo.h Mon Nov 12 15:51:32 2018<br>
@@ -1635,10 +1635,11 @@ public:<br>
         "Target didn't implement TargetInstrInfo::getOutliningType!");<br>
   }<br>
<br>
-  /// Returns target-defined flags defining properties of the MBB for<br>
-  /// the outliner.<br>
-  virtual unsigned getMachineOutlinerMBBFlags(MachineBasicBlock &MBB) const {<br>
-    return 0x0;<br>
+  /// Optional target hook that returns true if \p MBB is safe to outline from,<br>
+  /// and returns any target-specific information in \p Flags.<br>
+  virtual bool isMBBSafeToOutlineFrom(MachineBasicBlock &MBB,<br>
+                                      unsigned &Flags) const {<br>
+    return true;<br></blockquote><div><br></div>Should this return false? The way it is used in convertToUnsignedVec after this patch results in the Flags variable not being initialized and later used, which breaks test/CodeGen/AArch64/machine-outliner.mir. under memory sanitizer:</div><div class="gmail_quote"><div class="gmail_quote">MemorySanitizer: use-of-uninitialized-value</div><div class="gmail_quote">    #0  in llvm::AArch64InstrInfo::getOutliningType(llvm::MachineInstrBundleIterator<llvm::MachineInstr, false>&, unsigned int) const llvm/lib/Target/AArch64/AArch64InstrInfo.cpp:5494:9</div><div class="gmail_quote">    #1  in (anonymous namespace)::InstructionMapper::convertToUnsignedVec(llvm::MachineBasicBlock&, llvm::TargetInstrInfo const&) llvm/lib/CodeGen/MachineOutliner.cpp:772:19</div><div class="gmail_quote">    #2  in (anonymous namespace)::MachineOutliner::populateMapper((anonymous namespace)::InstructionMapper&, llvm::Module&, llvm::MachineModuleInfo&) llvm/lib/CodeGen/MachineOutliner.cpp:1543:14</div><div class="gmail_quote">    #3  in (anonymous namespace)::MachineOutliner::runOnModule(llvm::Module&) llvm/lib/CodeGen/MachineOutliner.cpp:1645:3</div><div class="gmail_quote">    #4  in (anonymous namespace)::MPPassManager::runOnModule(llvm::Module&) llvm/lib/IR/LegacyPassManager.cpp:1744:27</div><div class="gmail_quote">    #5  in llvm::legacy::PassManagerImpl::run(llvm::Module&) llvm/lib/IR/LegacyPassManager.cpp:1857:44</div><div class="gmail_quote">    #6  in compileModule(char**, llvm::LLVMContext&) llvm/tools/llc/llc.cpp:597:8</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
   }<br>
<br>
   /// Insert a custom frame for outlined functions.<br>
<br>
Modified: llvm/trunk/lib/CodeGen/MachineOutliner.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineOutliner.cpp?rev=346718&r1=346717&r2=346718&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/MachineOutliner.cpp?rev=346718&r1=346717&r2=346718&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/MachineOutliner.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/MachineOutliner.cpp Mon Nov 12 15:51:32 2018<br>
@@ -742,7 +742,12 @@ struct InstructionMapper {<br>
   /// \param TII \p TargetInstrInfo for the function.<br>
   void convertToUnsignedVec(MachineBasicBlock &MBB,<br>
                             const TargetInstrInfo &TII) {<br>
-    unsigned Flags = TII.getMachineOutlinerMBBFlags(MBB);<br>
+    unsigned Flags;<br>
+<br>
+    // Don't even map in this case.<br>
+    if (!TII.isMBBSafeToOutlineFrom(MBB, Flags))<br>
+      return;<br>
+<br>
     MachineBasicBlock::iterator It = MBB.begin();<br>
<br>
     // The number of instructions in this block that will be considered for<br>
<br>
Modified: llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.cpp?rev=346718&r1=346717&r2=346718&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.cpp?rev=346718&r1=346717&r2=346718&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.cpp (original)<br>
+++ llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.cpp Mon Nov 12 15:51:32 2018<br>
@@ -5286,29 +5286,44 @@ bool AArch64InstrInfo::isFunctionSafeToO<br>
   return true;<br>
 }<br>
<br>
-unsigned<br>
-AArch64InstrInfo::getMachineOutlinerMBBFlags(MachineBasicBlock &MBB) const {<br>
-  unsigned Flags = 0x0;<br>
-  // Check if there's a call inside this MachineBasicBlock. If there is, then<br>
-  // set a flag.<br>
-  if (any_of(MBB, [](MachineInstr &MI) { return MI.isCall(); }))<br>
-    Flags |= MachineOutlinerMBBFlags::HasCalls;<br>
-<br>
+bool AArch64InstrInfo::isMBBSafeToOutlineFrom(MachineBasicBlock &MBB,<br>
+                                              unsigned &Flags) const {<br>
   // Check if LR is available through all of the MBB. If it's not, then set<br>
   // a flag.<br>
   assert(MBB.getParent()->getRegInfo().tracksLiveness() &&<br>
          "Suitable Machine Function for outlining must track liveness");<br>
-  LiveRegUnits LRU(getRegisterInfo());<br>
-  LRU.addLiveOuts(MBB);<br>
+  LiveRegUnits ModifiedRegUnits(getRegisterInfo());<br>
+  LiveRegUnits UsedRegUnits(getRegisterInfo());<br>
+  ModifiedRegUnits.addLiveOuts(MBB);<br>
+  UsedRegUnits.addLiveOuts(MBB);<br>
+  const TargetRegisterInfo *TRI = &getRegisterInfo();<br>
+<br>
+  std::for_each(MBB.rbegin(), MBB.rend(),<br>
+                [&ModifiedRegUnits, &UsedRegUnits, &TRI](MachineInstr &MI) {<br>
+                  LiveRegUnits::accumulateUsedDefed(MI, ModifiedRegUnits,<br>
+                                                    UsedRegUnits, TRI);<br>
+                });<br>
+<br>
+  // If one of these registers is live out of the MBB, but not modified in the<br>
+  // MBB, then we can't outline.<br>
+  if ((ModifiedRegUnits.available(AArch64::W16) &&<br>
+       !UsedRegUnits.available(AArch64::W16)) ||<br>
+      (ModifiedRegUnits.available(AArch64::W17) &&<br>
+       !UsedRegUnits.available(AArch64::W17)) ||<br>
+      (ModifiedRegUnits.available(AArch64::NZCV) &&<br>
+       !UsedRegUnits.available(AArch64::NZCV)))<br>
+    return false;<br>
<br>
-  std::for_each(MBB.rbegin(),<br>
-                MBB.rend(),<br>
-                [&LRU](MachineInstr &MI) { LRU.accumulate(MI); });<br>
+  // Check if there's a call inside this MachineBasicBlock. If there is, then<br>
+  // set a flag.<br>
+  if (any_of(MBB, [](MachineInstr &MI) { return MI.isCall(); }))<br>
+    Flags |= MachineOutlinerMBBFlags::HasCalls;<br>
<br>
-  if (!LRU.available(AArch64::LR))<br>
-      Flags |= MachineOutlinerMBBFlags::LRUnavailableSomewhere;<br>
+  if (!ModifiedRegUnits.available(AArch64::LR) ||<br>
+      !UsedRegUnits.available(AArch64::LR))<br>
+    Flags |= MachineOutlinerMBBFlags::LRUnavailableSomewhere;<br>
<br>
-  return Flags;<br>
+  return true;<br>
 }<br>
<br>
 outliner::InstrType<br>
<br>
Modified: llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.h?rev=346718&r1=346717&r2=346718&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.h?rev=346718&r1=346717&r2=346718&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.h (original)<br>
+++ llvm/trunk/lib/Target/AArch64/AArch64InstrInfo.h Mon Nov 12 15:51:32 2018<br>
@@ -246,7 +246,8 @@ public:<br>
       std::vector<outliner::Candidate> &RepeatedSequenceLocs) const override;<br>
   outliner::InstrType<br>
   getOutliningType(MachineBasicBlock::iterator &MIT, unsigned Flags) const override;<br>
-  unsigned getMachineOutlinerMBBFlags(MachineBasicBlock &MBB) const override;<br>
+  bool isMBBSafeToOutlineFrom(MachineBasicBlock &MBB,<br>
+                              unsigned &Flags) const override;<br>
   void buildOutlinedFrame(MachineBasicBlock &MBB, MachineFunction &MF,<br>
                           const outliner::OutlinedFunction &OF) const override;<br>
   MachineBasicBlock::iterator<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div></div></div></div>