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

Roger Sayle <roger at nextmovesoftware dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
     Ever confirmed|0                           |1
   Last reconfirmed|                            |2024-06-08
           Assignee|unassigned at gcc dot gnu.org      |roger at 
nextmovesoftware dot com
             Status|UNCONFIRMED                 |ASSIGNED

--- Comment #4 from Roger Sayle <roger at nextmovesoftware dot com> ---
Created attachment 58386
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=58386&action=edit
proposed patch

This patch appears to fix (or more accurately workaround) the issue with this
testcase.
The (immediate) constant operand is:
(const_vector:V8SI [
        (const_int 1 [0x1]) repeated x8
    ])
After the call to force_const_mem this becomes:
(mem/u/c:V8SI (symbol_ref/u:SI ("*.LC1") [flags 0x2]) [0  S32 A256])
But after the call to validize_mem it becomes:
(mem/u/c:V8SI (plus:SI (reg:SI 98)
        (const:SI (unspec:SI [
                    (symbol_ref/u:SI ("*.LC1") [flags 0x2])
                ] UNSPEC_GOTOFF))) [0  S32 A256])

The call get_pool_constant (and ix86_broadcast_from_constant) can correctly
handle the intermediate form, but not the "validized" MEM.
Currently bootstrapping and regression testing...

Reply via email to