[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 11:05:21 PDT 2016


Hi Lang,

Sorry, I am little confused. I check the program and cannot see any
discrepancy reported in the error log, and I also cannot reproduce the
error in clang bootstrap build. Is it anything related with
incremental build?

Thanks,
Wei.

On Sat, Jul 9, 2016 at 9:28 AM, Wei Mi <wmi at google.com> wrote:
> 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