This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch] Relax assertion in vn_reference_lookup_3


On Fri, Oct 30, 2009 at 7:43 PM, Eric Botcazou <ebotcazou@adacore.com> wrote:
> Hi,
>
> the attached testcase triggers the assertion in vn_reference_lookup_3
>
> ? ? /* Adjust *ref from the new operands. ?*/
> ? ? if (!ao_ref_init_from_vn_reference (&r, vr->set, vr->type, vr->operands))
> ? ? ? return (void *)-1;
> ? ? gcc_assert (ref->size == r.size);
>
> when compiled at -O on x86:
>
> (gdb) p ref->size
> $4 = 64
> (gdb) p r.size
> $5 = 48
> (gdb) p debug_gimple_stmt(def_stmt)
> # .MEM_6 = VDEF <.MEM_2(D)>
> _init = _init_1(D)->field1;
>
> $6 = void
> (gdb) p debug_tree(gimple_assign_rhs1 (def_stmt))
> ?<component_ref 0xf7cf84b0
> ? ?type <record_type 0xf7d8af3c p__rec48 sizes-gimplified visited packed DI
> ? ? ? ?size <integer_cst 0xf7cda594 constant visited 64>
> ? ? ? ?unit size <integer_cst 0xf7cda5b0 constant visited 8>
> ? ? ? ?align 32 symtab 0 alias set -1 canonical type 0xf7d8af3c
> ? ? ? ?fields <field_decl 0xf7d1e3f4 w1andw2 type <record_type 0xf7d8adac
> p__rec32>
> ? ? ? ? ? ?SI file p.ads line 22 col 7
> ? ? ? ? ? ?size <integer_cst 0xf7cda498 constant visited 32>
> ? ? ? ? ? ?unit size <integer_cst 0xf7cda284 constant 4>
> ? ? ? ? ? ?align 32 offset_align 128
> ? ? ? ? ? ?offset <integer_cst 0xf7cda834 constant visited 0>
> ? ? ? ? ? ?bit offset <integer_cst 0xf7cda850 constant 0> context
> <record_type 0xf7d8af3c p__rec48> chain <field_decl 0xf7d1e450 w3>>
> ? ? ? ?Ada size <integer_cst 0xf7d95690 constant visited 48>
> ? ? ? ?pointer_to_this <pointer_type 0xf7d98514>>
>
> ? ?arg 0 <indirect_ref 0xf7d968a0
> ? ? ? ?type <record_type 0xf7d98190 p__rec_type sizes-gimplified visited
> packed BLK size <integer_cst 0xf7d95690 48>
> ? ? ? ? ? ?unit size <integer_cst 0xf7cdaad4 constant visited 6>
> ? ? ? ? ? ?align 8 symtab 0 alias set -1 canonical type 0xf7d98190 fields
> <field_decl 0xf7d1e678 field1> Ada size <integer_cst 0xf7d95690 48>
> reference_to_this <reference_type 0xf7d982bc>>
>
> ? ? ? ?arg 0 <ssa_name 0xf7ce87b8 type <reference_type 0xf7d982bc>
> ? ? ? ? ? ?visited var <parm_decl 0xf7cfe4b0 _init>def_stmt GIMPLE_NOP
>
> ? ? ? ? ? ?version 1
> ? ? ? ? ? ?ptr-info 0xf7d6d488>>
> ? ?arg 1 <field_decl 0xf7d1e678 field1 type <record_type 0xf7d8af3c p__rec48>
> ? ? ? ?external packed bit-field nonaddressable DI file p.ads line 34 col 7
> size <integer_cst 0xf7d95690 48> unit size <integer_cst 0xf7cdaad4 6>
> ? ? ? ?align 1 offset_align 128 offset <integer_cst 0xf7cda834 0> bit offset
> <integer_cst 0xf7cda850 0> bit_field_type <record_type 0xf7d8af3c p__rec48>
> context <record_type 0xf7d98190 p__rec_type>>
> ? ?p.ads:34:7>
>
> field1 is a 48-bit aggregate bitfield so _init_1(D)->field1 is a 48-bit
> extraction, despite its 64-bit access type. ?This is a common pattern in Ada.
>
> So I'm proposing to relax the assertion and bail out if the sizes don't match.
>
> Tested on i586-suse-linux, OK for mainline?

Let me dig into this a bit.

Richard.

>
> 2009-10-30 ?Eric Botcazou ?<ebotcazou@adacore.com>
>
> ? ? ? ?* tree-ssa-sccvn.c (vn_reference_lookup_3): Bail out instead of
> ? ? ? ?aborting if the sizes of the two references don't match.
>
>
> 2009-10-30 ?Eric Botcazou ?<ebotcazou@adacore.com>
>
> ? ? ? ?* gnat.dg/specs/rep_clause4.ads: New test.
>
>
> --
> Eric Botcazou
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]