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

--- Comment #6 from rsandifo at gcc dot gnu.org <rsandifo at gcc dot gnu.org> 
---
(In reply to Uroš Bizjak from comment #5)
> Wrong expansion, adding CC.

The expand code looks OK to me.  Assigning to one DImode word
of a TImode isn't supposed to change the other half.

I think the problem is in LRA.  It tries to reload the low half
of the TImode as follows:

      Creating newreg=104, assigning class NO_REGS to secondary r104
   51: r104:DI=r103:DI
    Inserting the sec. move after:
   52: r90:TI#0=r104:DI

then allocates it as an xmm<-mem move:

         Choosing alt 14 in insn 52:  (0) *v  (1) m {*movdi_internal}

That isn't right because the move won't preserve the high half
of the xmm register.  It would need to be a strict_lowpart to do that.

Reply via email to