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