[llvm-bugs] [Bug 36392] New: machine sinking of 2 dest instructions when only one needs BreakPHIEdge

via llvm-bugs llvm-bugs at lists.llvm.org
Thu Feb 15 05:15:07 PST 2018


https://bugs.llvm.org/show_bug.cgi?id=36392

            Bug ID: 36392
           Summary: machine sinking of 2 dest instructions when only one
                    needs BreakPHIEdge
           Product: new-bugs
           Version: 4.0
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: new bugs
          Assignee: unassignedbugs at nondot.org
          Reporter: verena at codeplay.com
                CC: llvm-bugs at lists.llvm.org

There is a bug in machine sinking of an instruction with two destinations when
exactly one destination needs a PHI edge to be broken.
Unfortunately, I am working on a confidential target, so cannot provide a test
case.

In FindSuccToSinkTo it uses the first destination to set SuccToSinkTo and
BreakPHIEdge, if the PHI edge needs breaking:

for (MachineBasicBlock *SuccBlock : GetAllSortedSuccessors(MI, MBB,
AllSuccessors)) {
  if (AllUsesDominatedByBlock(Reg, SuccBlock, MBB, BreakPHIEdge, LocalUse)) {
    SuccToSinkTo = SuccBlock;

Then, if the instruction has a second destination, it calls
AllUsesDominatedByBlock again

if (SuccToSinkTo) {
   if (!AllUsesDominatedByBlock(Reg, SuccToSinkTo, MBB, BreakPHIEdge,
LocalUse))

But what if the use of the second destination does not need a PHI edge to be
broken? In that case we reset BreakPHIEdge to false. The instruction is sunk
without the PHI edge being broken. This leads to the sunk instruction being
scheduled after the PHI use.
As far as I understand BreakPHIEdge should be true if the uses of *any* of the
destinations need a PHI edge break. Therefore I think the code should be

if (SuccToSinkTo) {
  bool LocalUse = false;
+ bool BreakPHIEdgeOtherDest = false;
  if (!AllUsesDominatedByBlock(Reg, SuccToSinkTo, MBB,
+                              BreakPHIEdgeOtherDest, LocalUse))
    return nullptr;

+ BreakPHIEdge |= BreakPHIEdgeOtherDest;
  continue;
}

Here's a pseudo MIR test for this:

body: |
  bb.0:
    successors: %bb.1, %bb.2

    %1, %2 = TWO_DEST_INSTR
    COND_BRANCH %3, %bb.1
    UNCOND_BRANCH %bb.2

  bb.1:
    successors: %bb.2

    %4 = INSTR

  bb.2:
    successors: %bb.3

    %5 = PHI %1, %bb.0, %4, %bb.1

  bb.3:
    %6 = MOV %2
    RET

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20180215/3241b164/attachment.html>


More information about the llvm-bugs mailing list