http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52883

--- Comment #4 from Uros Bizjak <ubizjak at gmail dot com> 2012-04-06 11:18:35 
UTC ---
(In reply to comment #3)
> > simplify_const_unary_operation tries to simplify:
> > 
> > (zero_extend:DI (const_int 0 [0]))
> > 
> > and trips on assert where:
> > 
> >       /* When zero-extending a CONST_INT, we need to know its
> >              original mode.  */
> > 
> > There is nothing wrong with the above RTX, so there is no justification to
> > trigger the ICE.
> 
> Just that it makes no sense.  Please fix whoever generated it instead.

It is allowed in *zero_extendsidi2_rex64, and "0" propagates into the pattern
for some corner case. For the affected part, 4.7 generates:

.L3:
        movl    $0, %eax        # 42    *zero_extendsidi2_rex64/1
        movl    g(,%rax,4), %ebx        # 44    *movsi_internal/1
        jmp     .L8     # 60    jump

while 4.8 (with the above fix) generates:

.L3:
        movl    $0, %eax        # 42    *zero_extendsidi2_rex64/1
        movl    g(,%rax,4), %ebx        # 44    *movsi_internal/1
        jmp     .L8     # 60    jump

I fail to see why zero_extending a constant should trigger an ICE, while at the
same time sign_extending a constant is allowed (please see following lines in
both cases).

Reply via email to