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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |ebotcazou at gcc dot gnu.org

--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> ---
The "simplest" way would be to have separate UNSPECs for all ops (but that
explodes the number of unspecs I guess).  Currently we get

(insn 21 20 22 (parallel [
            (set (reg:V16SF 110)
                (vec_merge:V16SF (plus:V16SF (reg:V16SF 111)
                        (reg:V16SF 112))
                    (reg:V16SF 113)
                    (reg:HI 114)))
            (unspec [
                    (const_int 9 [0x9])
                ] UNSPEC_EMBEDDED_ROUNDING)
        ])
"/home/space/rguenther/install/gcc-7.0/lib64/gcc/x86_64-pc-linux-gnu/7.0.0/include/avx512fintrin.h":2113
-1
     (nil))

and CSE happily looks into parallels, not interpreting the unspec to affect
the set.  So another way would be sth like

(insn (set (reg:V16SF 110)
                (vec_merge:V16SF (plus:V16SF (reg:V16SF 111)
                        (reg:V16SF 112))
                    (reg:V16SF 113)
                    (reg:HI 114))))

(insn (set (reg:V16SF 110) (unspec [ (reg:V16SF 110) (const_int 9) ]
UNSPEC_EMBEDDED_ROUNDING) ])

or merging this "rounding operation" into the operation (around the
plus, one of its operands or around the merge).

Reply via email to