<div dir="ltr">Hi Wei,<div><br></div><div>This appears to have broken the bots: <a href="http://lab.llvm.org:8080/green/job/clang-stage1-cmake-RA-incremental_build/27331/">http://lab.llvm.org:8080/green/job/clang-stage1-cmake-RA-incremental_build/27331/</a></div><div><br></div><div>Could you please fix or revert?</div><div><br></div><div>Cheers,</div><div>Lang.</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jul 8, 2016 at 2:08 PM, Wei Mi via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: wmi<br>
Date: Fri Jul  8 16:08:09 2016<br>
New Revision: 274928<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=274928&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=274928&view=rev</a><br>
Log:<br>
Allow dead insts to be kept in DeadRemat only when they are rematerializable.<br>
<br>
Because isReallyTriviallyReMaterializableGeneric puts many limits on<br>
rematerializable instructions, this fix can prevent instructions with<br>
tied virtual operands and instructions with virtual register uses from<br>
being kept in DeadRemat, so as to workaround the live interval consistency<br>
problem for the dummy instructions kept in DeadRemat.<br>
<br>
But we still need to fix the live interval consistency problem. This patch<br>
is just a short time relieve. PR28464 has been filed as a reminder.<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D19486" rel="noreferrer" target="_blank">http://reviews.llvm.org/D19486</a><br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/CodeGen/LiveRangeEdit.h<br>
    llvm/trunk/lib/CodeGen/InlineSpiller.cpp<br>
    llvm/trunk/lib/CodeGen/LiveRangeEdit.cpp<br>
    llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp<br>
    llvm/trunk/lib/CodeGen/SplitKit.cpp<br>
    llvm/trunk/lib/CodeGen/SplitKit.h<br>
<br>
Modified: llvm/trunk/include/llvm/CodeGen/LiveRangeEdit.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/LiveRangeEdit.h?rev=274928&r1=274927&r2=274928&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/LiveRangeEdit.h?rev=274928&r1=274927&r2=274928&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/CodeGen/LiveRangeEdit.h (original)<br>
+++ llvm/trunk/include/llvm/CodeGen/LiveRangeEdit.h Fri Jul  8 16:08:09 2016<br>
@@ -100,7 +100,8 @@ private:<br>
                     SmallVector<LiveInterval*, 8>,<br>
                     SmallPtrSet<LiveInterval*, 8> > ToShrinkSet;<br>
   /// Helper for eliminateDeadDefs.<br>
-  void eliminateDeadDef(MachineInstr *MI, ToShrinkSet &ToShrink);<br>
+  void eliminateDeadDef(MachineInstr *MI, ToShrinkSet &ToShrink,<br>
+                        AliasAnalysis *AA);<br>
<br>
   /// MachineRegisterInfo callback to notify when new virtual<br>
   /// registers are created.<br>
@@ -242,7 +243,8 @@ public:<br>
   /// allocator.  These registers should not be split into new intervals<br>
   /// as currently those new intervals are not guaranteed to spill.<br>
   void eliminateDeadDefs(SmallVectorImpl<MachineInstr *> &Dead,<br>
-                         ArrayRef<unsigned> RegsBeingSpilled = None);<br>
+                         ArrayRef<unsigned> RegsBeingSpilled = None,<br>
+                         AliasAnalysis *AA = nullptr);<br>
<br>
   /// calculateRegClassAndHint - Recompute register class and hint for each new<br>
   /// register.<br>
<br>
Modified: llvm/trunk/lib/CodeGen/InlineSpiller.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/InlineSpiller.cpp?rev=274928&r1=274927&r2=274928&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/InlineSpiller.cpp?rev=274928&r1=274927&r2=274928&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/InlineSpiller.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/InlineSpiller.cpp Fri Jul  8 16:08:09 2016<br>
@@ -626,7 +626,7 @@ void InlineSpiller::reMaterializeAll() {<br>
   if (DeadDefs.empty())<br>
     return;<br>
   DEBUG(dbgs() << "Remat created " << DeadDefs.size() << " dead defs.\n");<br>
-  Edit->eliminateDeadDefs(DeadDefs, RegsToSpill);<br>
+  Edit->eliminateDeadDefs(DeadDefs, RegsToSpill, AA);<br>
<br>
   // LiveRangeEdit::eliminateDeadDef is used to remove dead define instructions<br>
   // after rematerialization.  To remove a VNI for a vreg from its LiveInterval,<br>
@@ -996,7 +996,7 @@ void InlineSpiller::spillAll() {<br>
   // Hoisted spills may cause dead code.<br>
   if (!DeadDefs.empty()) {<br>
     DEBUG(dbgs() << "Eliminating " << DeadDefs.size() << " dead defs\n");<br>
-    Edit->eliminateDeadDefs(DeadDefs, RegsToSpill);<br>
+    Edit->eliminateDeadDefs(DeadDefs, RegsToSpill, AA);<br>
   }<br>
<br>
   // Finally delete the SnippetCopies.<br>
@@ -1440,7 +1440,7 @@ void HoistSpillHelper::hoistAllSpills()<br>
           RMEnt->RemoveOperand(i - 1);<br>
       }<br>
     }<br>
-    Edit.eliminateDeadDefs(SpillsToRm, None);<br>
+    Edit.eliminateDeadDefs(SpillsToRm, None, AA);<br>
   }<br>
 }<br>
<br>
<br>
Modified: llvm/trunk/lib/CodeGen/LiveRangeEdit.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveRangeEdit.cpp?rev=274928&r1=274927&r2=274928&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveRangeEdit.cpp?rev=274928&r1=274927&r2=274928&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/LiveRangeEdit.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/LiveRangeEdit.cpp Fri Jul  8 16:08:09 2016<br>
@@ -234,7 +234,8 @@ bool LiveRangeEdit::useIsKill(const Live<br>
 }<br>
<br>
 /// Find all live intervals that need to shrink, then remove the instruction.<br>
-void LiveRangeEdit::eliminateDeadDef(MachineInstr *MI, ToShrinkSet &ToShrink) {<br>
+void LiveRangeEdit::eliminateDeadDef(MachineInstr *MI, ToShrinkSet &ToShrink,<br>
+                                     AliasAnalysis *AA) {<br>
   assert(MI->allDefsAreDead() && "Def isn't really dead");<br>
   SlotIndex Idx = LIS.getInstructionIndex(*MI).getRegSlot();<br>
<br>
@@ -327,11 +328,12 @@ void LiveRangeEdit::eliminateDeadDef(Mac<br>
     }<br>
     DEBUG(dbgs() << "Converted physregs to:\t" << *MI);<br>
   } else {<br>
-    // If the dest of MI is an original reg, don't delete the inst. Replace<br>
-    // the dest with a new reg, keep the inst for remat of other siblings.<br>
-    // The inst is saved in LiveRangeEdit::DeadRemats and will be deleted<br>
-    // after all the allocations of the func are done.<br>
-    if (isOrigDef) {<br>
+    // If the dest of MI is an original reg and MI is reMaterializable,<br>
+    // don't delete the inst. Replace the dest with a new reg, and keep<br>
+    // the inst for remat of other siblings. The inst is saved in<br>
+    // LiveRangeEdit::DeadRemats and will be deleted after all the<br>
+    // allocations of the func are done.<br>
+    if (isOrigDef && DeadRemats && TII.isTriviallyReMaterializable(*MI, AA)) {<br>
       LiveInterval &NewLI = createEmptyIntervalFrom(Dest);<br>
       VNInfo *VNI = NewLI.getNextValue(Idx, LIS.getVNInfoAllocator());<br>
       NewLI.addSegment(LiveInterval::Segment(Idx, Idx.getDeadSlot(), VNI));<br>
@@ -361,13 +363,14 @@ void LiveRangeEdit::eliminateDeadDef(Mac<br>
 }<br>
<br>
 void LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr *> &Dead,<br>
-                                      ArrayRef<unsigned> RegsBeingSpilled) {<br>
+                                      ArrayRef<unsigned> RegsBeingSpilled,<br>
+                                      AliasAnalysis *AA) {<br>
   ToShrinkSet ToShrink;<br>
<br>
   for (;;) {<br>
     // Erase all dead defs.<br>
     while (!Dead.empty())<br>
-      eliminateDeadDef(Dead.pop_back_val(), ToShrink);<br>
+      eliminateDeadDef(Dead.pop_back_val(), ToShrink, AA);<br>
<br>
     if (ToShrink.empty())<br>
       break;<br>
<br>
Modified: llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp?rev=274928&r1=274927&r2=274928&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp?rev=274928&r1=274927&r2=274928&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp Fri Jul  8 16:08:09 2016<br>
@@ -129,6 +129,7 @@ class RAGreedy : public MachineFunctionP<br>
   EdgeBundles *Bundles;<br>
   SpillPlacement *SpillPlacer;<br>
   LiveDebugVariables *DebugVars;<br>
+  AliasAnalysis *AA;<br>
<br>
   // state<br>
   std::unique_ptr<Spiller> SpillerInstance;<br>
@@ -2592,6 +2593,7 @@ bool RAGreedy::runOnMachineFunction(Mach<br>
   Bundles = &getAnalysis<EdgeBundles>();<br>
   SpillPlacer = &getAnalysis<SpillPlacement>();<br>
   DebugVars = &getAnalysis<LiveDebugVariables>();<br>
+  AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();<br>
<br>
   initializeCSRCost();<br>
<br>
@@ -2600,7 +2602,7 @@ bool RAGreedy::runOnMachineFunction(Mach<br>
   DEBUG(LIS->dump());<br>
<br>
   SA.reset(new SplitAnalysis(*VRM, *LIS, *Loops));<br>
-  SE.reset(new SplitEditor(*SA, *LIS, *VRM, *DomTree, *MBFI));<br>
+  SE.reset(new SplitEditor(*SA, *AA, *LIS, *VRM, *DomTree, *MBFI));<br>
   ExtraRegInfo.clear();<br>
   ExtraRegInfo.resize(MRI->getNumVirtRegs());<br>
   NextCascade = 1;<br>
<br>
Modified: llvm/trunk/lib/CodeGen/SplitKit.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SplitKit.cpp?rev=274928&r1=274927&r2=274928&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SplitKit.cpp?rev=274928&r1=274927&r2=274928&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/SplitKit.cpp (original)<br>
+++ llvm/trunk/lib/CodeGen/SplitKit.cpp Fri Jul  8 16:08:09 2016<br>
@@ -338,11 +338,13 @@ void SplitAnalysis::analyze(const LiveIn<br>
 //===----------------------------------------------------------------------===//<br>
<br>
 /// Create a new SplitEditor for editing the LiveInterval analyzed by SA.<br>
-SplitEditor::SplitEditor(SplitAnalysis &sa, LiveIntervals &lis, VirtRegMap &vrm,<br>
+SplitEditor::SplitEditor(SplitAnalysis &sa, AliasAnalysis &aa,<br>
+                         LiveIntervals &lis, VirtRegMap &vrm,<br>
                          MachineDominatorTree &mdt,<br>
                          MachineBlockFrequencyInfo &mbfi)<br>
-    : SA(sa), LIS(lis), VRM(vrm), MRI(vrm.getMachineFunction().getRegInfo()),<br>
-      MDT(mdt), TII(*vrm.getMachineFunction().getSubtarget().getInstrInfo()),<br>
+    : SA(sa), AA(aa), LIS(lis), VRM(vrm),<br>
+      MRI(vrm.getMachineFunction().getRegInfo()), MDT(mdt),<br>
+      TII(*vrm.getMachineFunction().getSubtarget().getInstrInfo()),<br>
       TRI(*vrm.getMachineFunction().getSubtarget().getRegisterInfo()),<br>
       MBFI(mbfi), Edit(nullptr), OpenIdx(0), SpillMode(SM_Partition),<br>
       RegAssign(Allocator) {}<br>
@@ -1130,7 +1132,7 @@ void SplitEditor::deleteRematVictims() {<br>
   if (Dead.empty())<br>
     return;<br>
<br>
-  Edit->eliminateDeadDefs(Dead);<br>
+  Edit->eliminateDeadDefs(Dead, None, &AA);<br>
 }<br>
<br>
 void SplitEditor::finish(SmallVectorImpl<unsigned> *LRMap) {<br>
<br>
Modified: llvm/trunk/lib/CodeGen/SplitKit.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SplitKit.h?rev=274928&r1=274927&r2=274928&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SplitKit.h?rev=274928&r1=274927&r2=274928&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/CodeGen/SplitKit.h (original)<br>
+++ llvm/trunk/lib/CodeGen/SplitKit.h Fri Jul  8 16:08:09 2016<br>
@@ -235,6 +235,7 @@ public:<br>
 ///<br>
 class LLVM_LIBRARY_VISIBILITY SplitEditor {<br>
   SplitAnalysis &SA;<br>
+  AliasAnalysis &AA;<br>
   LiveIntervals &LIS;<br>
   VirtRegMap &VRM;<br>
   MachineRegisterInfo &MRI;<br>
@@ -380,8 +381,9 @@ private:<br>
 public:<br>
   /// Create a new SplitEditor for editing the LiveInterval analyzed by SA.<br>
   /// Newly created intervals will be appended to newIntervals.<br>
-  SplitEditor(SplitAnalysis &SA, LiveIntervals&, VirtRegMap&,<br>
-              MachineDominatorTree&, MachineBlockFrequencyInfo &);<br>
+  SplitEditor(SplitAnalysis &SA, AliasAnalysis &AA, LiveIntervals&,<br>
+              VirtRegMap&, MachineDominatorTree&,<br>
+              MachineBlockFrequencyInfo &);<br>
<br>
   /// reset - Prepare for a new split.<br>
   void reset(LiveRangeEdit&, ComplementSpillMode = SM_Partition);<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">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><br></div>