[llvm-dev] Spill hoisting on RAL: looking for some debugging ideas

Konstantin Vladimirov via llvm-dev llvm-dev at lists.llvm.org
Thu Dec 22 08:46:31 PST 2016


Hi,

I am debugging private backend and faced interesting problem:
sometimes spill hoisting creates double stores.

(some output from -debug-only=regalloc).

First hoisting:

Checking redundant spills for 0 at 16r in %vreg19
[16r,144B:0)[144B,240B:1)[240B,280r:2)[296r,416B:3)[416B,456r:4)[472r,592B:5)
0 at 16r 1 at 144B-phi 2 at 240B-phi
3 at 296r 4 at 416B-phi 5 at 472r
Merged to stack int: SS#0 [16r,592B:0)  0 at x
 hoisted: 16r    STbo %vreg19, <fi#0>

Second below:

Checking redundant spills for 0 at 16r in %vreg19
[16r,96B:0)[144B,240B:1)[296r,416B:2)[416B,456r:3)[472r,592B:4)  0 at 16r
1 at 144B-phi 2 at 296r 3 at 416B-phi 4 at 472r
Merged to stack int: SS#0 [16r,592B:0)  0 at x
  hoisted: 16r    STbo %vreg19, <fi#0>

Result just prior to rewriting:

20B             STbo %vreg19, <fi#0>
24B             STbo %vreg19<kill>, <fi#0>

---

Original code is like this:

int foo(int fst, int snd, int *links) {
  int ptr;
  for (ptr = fst; ptr != 0; ptr = links[ptr])
    mrglist();
  for (ptr = snd; ptr != 0; ptr = links[ptr])
    cpylist();
}

Without spill hoisting, it spills links in each loop separately into
fi#0, but with it, it moves both spills up. In architectures like
AARCH64 there are a plenty of callee-saved registers and this bug can
not be easily reproduced, so I am trying to understand why spill
hoisting do such things in mine case.

I found InlineSpiller::eliminateRedundantSpills that seems to be in
charge. I traced code down to problem. First time it hoists vreg19 ok.
Second time it sees MI, created first time, sees slot index, but then
on line:

if (LI->getVNInfoAt(Idx) != VNI) continue;

it continues.

(gdb) p *VNI
$21 = {id = 4, def = {lie = {Value = 260284292}}}
(gdb) p *LI->getVNInfoAt(Idx)
$22 = {id = 0, def = {lie = {Value = 260282980}}}

I do not clearly understand this LI/VNI mechanics. How to look where
everything gone wrong? Where shall I look first?

---
With best regards, Konstantin


More information about the llvm-dev mailing list