<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>