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

--- Comment #11 from Haochen Jiang <haochen.jiang at intel dot com> ---
(In reply to Jakub Jelinek from comment #8)
> (In reply to Haochen Jiang from comment #4)
> > (In reply to Jakub Jelinek from comment #2)
> > > Anyway, the RTL patterns look just weird:
> > > (define_insn "tilezero"
> > >   [(set (reg:V32SI TMM_REGNUM)
> > >         (unspec_volatile:V32SI
> > >           [(match_operand:QI 0 "const_0_to_7_operand")]
> > >           UNSPECV_TILEZERO))]
> > >   "TARGET_ACEV1"
> > >   "tilezero\t{%%tmm%c0|tmm%c0}"
> > >   [(set_attr "prefix" "vex")])
> > > That is as if there is just one TMM_REGNUM register fully set by the
> > > instruction, but it seems that there are 8 of the tmm registers (and each 
> > > of
> > > those is 8192 bit, so that would be V256SI)?
> > 
> > tilezero should only zero the corresponding tmm register, not all tmm
> > registers. That operand is for the reg number want to be zeroed.
> 
> Yes, but the above representation pretends that there is just one tmm
> register and that it sets it to something.  So, say if you set one %tmm1 to
> something and then tilezero on %tmm0, then RTL DCE could optimize the first
> store away.
> Either you need 8 tmm registers in RTL too, and (set (reg:V256SI
> TMM_FIRST_REGNUM + 1) (V256SI zero)), or, if all the tmm regs are
> (incorrectly) represented by a single TMM_REGNUM, I think safer
> representation would be (set (reg:BLK TMM_REGNUM) (unspec_volatile:BLK
> [(reg:BLK TMM_REGNUM) (match_operand:QI 0 "const_0_to_7_operand")]
> UNSPECV_TILEZERO)).  You have some large set of registers and you change
> something in it.

I get your concern here. Let me consider which way we should go for a while.

Reply via email to