[llvm-dev] Not increasing SDNodeOrder for llvm.dbg.value to avoid different scheduling?

Mikael Holmén via llvm-dev llvm-dev at lists.llvm.org
Thu Oct 6 01:27:18 PDT 2016


Hi,

On 10/05/16 16:02, Mikael Holmén via llvm-dev wrote:
> Hi,
>
> We've noticed a case where ScheduleDAGRRList behaves differently when
> there are llvm.dbg.value present.
>
> When building the selection dag, the SDNodeOrder field is increased for
> every visited instruction, including calls to llvm.dbg.value. The
> SDNodeOrder is saved in each SDNode in the IROrder field.
>
> Then in ScheduleDAGRRList.cpp, the IROrder is used, e.g via
> bu_ls_rr_sort::operator() (via BURRSort, via SPQ->getNodeOrdering)
> affecting the scheduling order.
>
> This can result in different scheduling order depending on if there
> happens to be calls to llvm.dbg.value present in the code or not.
>
> If we only increase the SDNodeNumber for non llvm.dbg.value/declare
> instructions then this goes away:
>
> +  // Increase the SDNodeOrder if dealing with a non-debug instruction
> +  if (!isa<DbgValueInst>(I) && !isa<DbgDeclareInst>(I))
>     ++SDNodeOrder;
>
> However, I've no idea if this change is fundamentally breaking how the
> SDNodeOrder stuff is supposed to work.
>
> Does this seem reasonable?
>
>
> I noticed that one test case failed due to the change above.

It seems like I need to update
ProcessSDDbgValues in ScheduleDAGSDNodes.cpp as well:

-    if (!Order || DVOrder == ++Order) {
+    if (!Order || DVOrder == Order) {

since I don't increase the SDNodeOrder for llvm.dbg.value/declare, I 
need to change the check in ProcessSDDbgValues so it searches for 
dbgValues with the _same_ order as the SDNode, not orders strictly 
following it.

So with

@@ -971,11 +971,13 @@ void SelectionDAGBuilder::visit(const Instruction 
&I) {
    if (isa<TerminatorInst>(&I)) {
      copySwiftErrorsToFinalVRegs(*this);
      HandlePHINodesInSuccessorBlocks(I.getParent());
    }

-  ++SDNodeOrder;
+  // Increase the SDNodeOrder if dealing with a non-debug instruction
+  if (!isa<DbgValueInst>(I) && !isa<DbgDeclareInst>(I))
+    ++SDNodeOrder;

    CurInst = &I;

    visit(I.getOpcode(), I);

and

@@ -702,20 +702,20 @@ ProcessSDDbgValues(SDNode *N, SelectionDAG *DAG, 
InstrEmitter &Emitter,
                     SmallVectorImpl<std::pair<unsigned, MachineInstr*> 
 > &Orders,
                     DenseMap<SDValue, unsigned> &VRBaseMap, unsigned 
Order) {
    if (!N->getHasDebugValue())
      return;

-  // Opportunistically insert immediate dbg_value uses, i.e. those with 
source
-  // order number right after the N.
+  // Opportunistically insert immediate dbg_value uses, i.e. those with 
the same
+  // source order number as N.
    MachineBasicBlock *BB = Emitter.getBlock();
    MachineBasicBlock::iterator InsertPos = Emitter.getInsertPos();
    ArrayRef<SDDbgValue*> DVs = DAG->GetDbgValues(N);
    for (unsigned i = 0, e = DVs.size(); i != e; ++i) {
      if (DVs[i]->isInvalidated())
        continue;
      unsigned DVOrder = DVs[i]->getOrder();
-    if (!Order || DVOrder == ++Order) {
+    if (!Order || DVOrder == Order) {
        MachineInstr *DbgMI = Emitter.EmitDbgValue(DVs[i], VRBaseMap);
        if (DbgMI) {
          Orders.push_back(std::make_pair(DVOrder, DbgMI));
          BB->insert(InsertPos, DbgMI);
        }

the problem where llvm.dbg.value affected scheduling goes away, and all 
tests in test/ passes.

Question remains, is this fundamentaly breaking how the orders are 
supposed to work or is this change sane?

Appreciating any input,
Mikael

>
> For test/DebugInfo/X86/Output/subregisters.ll I got a few changes in the
> output which I suppose is a significant regression:
>
> 27c27
> <       DW_AT_location  DW_FORM_block1
> ---
>>       DW_AT_location  DW_FORM_data4
>
> [...]
>
> 109c108
> <                   DW_AT_location [DW_FORM_block1]     (<0x01> 55 )
> ---
>>                   DW_AT_location [DW_FORM_data4]      (0x00000000)
>
> [...]
>
> 115,116c114
> < 0x00000055:     DW_TAG_variable [4]
> <                   DW_AT_location [DW_FORM_data4]      (0x00000000)
> ---
>> 0x00000057:     DW_TAG_variable [4]
>
> [...]
>
> 178,180c176,178
> < 0x00000000: Beginning address offset: 0x0000000000000002
> <                Ending address offset: 0x0000000000000014
> <                 Location description: 54 93 04
> ---
>> 0x00000000: Beginning address offset: 0x0000000000000000
>>                Ending address offset: 0x0000000000000009
>>                 Location description: 55
>
> Any thoughts on this?
>
> Thanks,
> Mikael
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev



More information about the llvm-dev mailing list