[Bug rtl-optimization/87763] [9 Regression] aarch64 target testcases fail after r265398

sje at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue Jan 22 17:06:00 GMT 2019


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87763

--- Comment #21 from Steve Ellcey <sje at gcc dot gnu.org> ---
If I look at this specific example:

int f2 (int x, int y)
{
  return (x & ~0x0ff000) | ((y & 0x0ff) << 12);
}


Before the combine change, I see in x.c.260r.combine:

Trying 8, 9 -> 15:
    8: r98:SI=x1:SI<<0xc&0xff000
      REG_DEAD x1:SI
    9: r99:SI=x0:SI&0xfffffffffff00fff
      REG_DEAD x0:SI
   15: x0:SI=r98:SI|r99:SI
      REG_DEAD r98:SI
      REG_DEAD r99:SI
Successfully matched this instruction:
(set (zero_extract:SI (reg/i:SI 0 x0)
        (const_int 8 [0x8])
        (const_int 12 [0xc]))
    (zero_extend:SI (reg:QI 1 x1 [ y ])))
allowing combination of insns 8, 9 and 15
original costs 4 + 4 + 4 = 12
replacement cost 4
deferring deletion of insn with uid = 9.


Immediately after the combine change, I get:

Trying 8, 9 -> 15:
    8: r98:SI=r101:SI<<0xc&0xff000
      REG_DEAD r101:SI
    9: r99:SI=r100:SI&0xfffffffffff00fff
      REG_DEAD r100:SI
   15: x0:SI=r98:SI|r99:SI
      REG_DEAD r98:SI
      REG_DEAD r99:SI
Failed to match this instruction:
(set (reg/i:SI 0 x0)
    (ior:SI (and:SI (reg:SI 100)
            (const_int -1044481 [0xfffffffffff00fff]))
        (and:SI (ashift:SI (reg:SI 101)
                (const_int 12 [0xc]))
            (const_int 1044480 [0xff000]))))
Successfully matched this instruction:
(set (reg:SI 99)
    (ashift:SI (reg:SI 101)
        (const_int 12 [0xc])))
Failed to match this instruction:
(set (reg/i:SI 0 x0)
    (ior:SI (and:SI (reg:SI 100)
            (const_int -1044481 [0xfffffffffff00fff]))
        (and:SI (reg:SI 99)
            (const_int 1044480 [0xff000]))))


Is this because of x0 (a hard register) at the destination in insn 15?


More information about the Gcc-bugs mailing list