[llvm] r274928 - Allow dead insts to be kept in DeadRemat only when they are rematerializable.

Lang Hames via llvm-commits llvm-commits at lists.llvm.org
Sat Jul 9 09:03:54 PDT 2016


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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160709/17cb1352/attachment.html>


More information about the llvm-commits mailing list