------- Comment #3 from jakub at gcc dot gnu dot org  2010-07-26 12:58 -------
Works if b[] has unsigned int type instead of T.
Sounds like a type mismatch.
The VAR_DECL b has ARRAY_TYPE with T element type and b's CONSTRUCTOR has the
same type, but the values in the constructor doesn't have T type, but unsigned
int:
 <constructor 0x7ffff1f2f420
    type <array_type 0x7ffff1f23498
        type <integer_type 0x7ffff1f232a0 T unsigned SI
            size <integer_cst 0x7ffff202d708 constant 32>
            unit size <integer_cst 0x7ffff202d410 constant 4>
            align 32 symtab 0 alias set -1 canonical type 0x7ffff2042540
precision 32 min <integer_cst 0x7ffff202d730 0> max <integer_cst 0x7ffff202d6e0
4294967295>
            pointer_to_this <pointer_type 0x7ffff1f23540>>
        SI size <integer_cst 0x7ffff202d708 32> unit size <integer_cst
0x7ffff202d410 4>
        align 32 symtab 0 alias set -1 canonical type 0x7ffff1f235e8
        domain <integer_type 0x7ffff2055690 type <integer_type 0x7ffff2042000
long unsigned int>
            DI
            size <integer_cst 0x7ffff202d7d0 constant 64>
            unit size <integer_cst 0x7ffff202d7f8 constant 8>
            align 64 symtab 0 alias set -1 canonical type 0x7ffff2055690
precision 64 min <integer_cst 0x7ffff202d438 0> max <integer_cst 0x7ffff202d438
0>>>
    constant static lngt 1
    idx <integer_cst 0x7ffff202db40 type <integer_type 0x7ffff20420a8
bit_size_type> constant 0>
    val <integer_cst 0x7ffff202d6e0 type <integer_type 0x7ffff2042540 unsigned
int> constant 4294967295>>

When ccp propagates b[0] into the comparison, the comparison uses T on one side
and unsigned int on the other side.  When b has T type, ccp doesn't optimize
the ... < 4294967295 comparison into ... != 4294967295, while when b has
unsigned int type, it does.
T's TYPE_MAIN_VARIANT is unsigned int.
So, it isn't clear if the middle-end is considering the two types as
incompatible or what.


-- 


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

Reply via email to