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

mrs at gcc dot gnu.org <mrs at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
          Component|rtl-optimization            |target

--- Comment #5 from mrs at gcc dot gnu.org <mrs at gcc dot gnu.org> ---
Ok, at least ia64-elf works.

      /* This assert keeps the simplification from producing a result           
         that cannot be represented in a CONST_DOUBLE but a lot of              
         upstream callers expect that this function never fails to              
         simplify something and so you if you added this to the test            
         above the code would die later anyway.  If this assert                 
         happens, you just need to make the port support wide int.  */
=>    gcc_assert (width <= HOST_BITS_PER_DOUBLE_INT);

So, the meaning is entirely clear.  You can either have bad answers and remove
the assert, or fix the port to use wide-int, those are the only two options. 
Anyway, the wide-int code was done, because gcc can't work without it.  You're
just hitting one of those corners.

gcc is processing:

  (set (zero_extract:DI (subreg:DI (reg:OI 381) 0)
          (const_int 32 [0x20])
          (const_int 0 [0]))
      (subreg:DI (reg:SI 382) 0))

with expand_field_assignment, and inner is:

  (reg:OI 381)

and compute_mode winds up being OImode.  It then goes on to end the world
trying in vein to do wide-int things, but can't.  So, I'd recommend fixing the
port to be wide-int based.

Reply via email to