------- Comment #5 from ubizjak at gmail dot com  2010-05-08 11:19 -------
(In reply to comment #4)
> Uros your proposed patch seems to cause:
> 
> /src/gcc-4.5.0/libgcc/../gcc/libgcc2.c: In function '__negti2':
> /src/gcc-4.5.0/libgcc/../gcc/libgcc2.c:76:1: error: insn does not satisfy its
> constraints:
> (insn 31 16 20 2 /src/gcc-4.5.0/libgcc/../gcc/libgcc2.c:75 (set (mem/c/i:TI
> (reg/f:DI 16 $16 [orig:78 D.3782 ] [78]) [6 <retval>+0 S16 A128])
>         (reg:TI 22 $22)) 228 {*movti_internal} (nil))

This pattern expects "offsetable" memory operand, and substituting SImode
addition with a temporary register violates this requirement.  As noted
elsewhere [1],

<quote>
I suppose you have hit a 32/64 pointer issue.  This requires some
investigation!  We plan to fix them, but we haven't yet started this work on
gcc 4.5
</quote>

Since HW pointers are 64bit wide, and OS uses 32bit pointers, it looks to me
that "offsetable" addresses are invalid, since they can't be substituted with
teporary register. However, the precise details of VMS (address wrapping and
similar issues) are not known to me, so I can't say for sure.

Anyway, operands with "address_operand" predicate are processed as if they were
always in DImode (see unaligned_* patterns in alpha.md), which is not the case
with 32bit pointers.  This leads to invalid RTXes with mixed-up modes, see
Comment #2.

[1] http://gcc.gnu.org/ml/gcc/2010-05/msg00030.html


-- 


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

Reply via email to