On 05/21/2015 05:54 AM, Ilya Enkovich wrote:
Thanks.  For me it looks like an inheritance bug.  It is really hard
>to fix the bug w/o the source code.  Could you send me your patch in
>order I can debug RA with it to investigate more.
>
Sure! Here is a patch and a testcase.  I applied patch to r222125.  Cmd to 
reproduce:

gcc -m32 -msse4.2 -O2 pr65105.c -S -march=slm -fPIE
The problem is in sharing a subreg in different insns. Pseudo should be shared but not their subregs.

We have before inheritance:

   28: r132:V2DI=r132:V2DI|r126:DI#0
      REG_DEAD r126:DI
      REG_DEAD r118:DI
    Inserting insn reload before:
   81: r132:V2DI=r118:DI#0
    Inserting insn reload after:
   82: r108:DI#0=r132:V2DI
...
      Creating newreg=135, assigning class SSE_REGS to r135
   42: r135:V2DI=r135:V2DI&r108:DI#0
      REG_DEAD r127:DI
    Inserting insn reload before:
   85: r135:V2DI=r127:DI#0
    Inserting insn reload after:
   86: r108:DI#0=r135:V2DI

As subreg of 108 in original insns 28 and 42 are shared, The subregs of 108 in insns 82 and 86 are shared too. During inheritance subpass we change r108 in insn 82 onto r137. This change insn 86 too.

Creating newreg=137 from oldreg=108, assigning class NO_REX_SSE_REGS to inheritance r137
    Original reg change 108->137 (bb2):
   82: r137:DI#0=r132:V2DI
      REG_DEAD r132:V2DI
    Add original<-inheritance after:
   88: r108:DI=r137:DI

    Inheritance reuse change 108->137 (bb2):
   68: r124:V2DI=r137:DI#0

And now we are trying to do inheritance for insn #86:

Creating newreg=138 from oldreg=108, assigning class NO_REX_SSE_REGS to inheritance r138
    Original reg change 108->138 (bb3):
   86: r137:DI#0=r135:V2DI
      REG_DEAD r135:V2DI
    Add original<-inheritance after:
   89: r108:DI=r138:DI

    Inheritance reuse change 108->138 (bb3):
   64: r123:V2DI=r137:DI#0

and after that having a complete mess. We are trying to change r108 onto r138, but r108 is already r137 because of sharing. Later we undo the second inheritance creating even more mess.

So, Ilya, to solve the problem you need to avoid sharing subregs for the correct LRA/reload work.


Reply via email to