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, pretty-ipa] Fix wave ICE in SRA


2009/4/30 Martin Jambor <mjambor@suse.cz>:
> Hi,
>
> On Wed, Apr 29, 2009 at 03:05:51PM +0200, Richard Guenther wrote:
>> 2009/4/29 Martin Jambor <mjambor@suse.cz>:
>> > Hi,
>> >
>> > the patch ?below fixes ?an ICE on ?assert in intra-SRA ?when compiling
>> > boost (this issue is already fixed in the trunk patch).
>> >
>> > The problem is that I wrongly assumed that in an assignment in between
>> > types ?conforming ?to useless_type_conversion_p() ?the ?sizes of ?both
>> > sides would be the same. ?Obviously ?they need not to be. ?In fact the
>>
>> Err ...
>>
>> > RHS ?was ?substantially ?bigger ?in ?this case, ?which ?might ?confuse
>> > propagating accesses.
>>
>> ... can you share this case? ?It looks bogus.
>>
>
> I would be glad if that turned out to be indeed bogus.
>
> This happens when compiling the wave boost benchmark from frescobaldi,
> specifically when compiling file instantiate_cpp_exprgrammar.cpp
> (preprocessed source attached), function
>
> phoenix::actor<phoenix::logical_or_composite<phoenix::actor<BaseT>, phoenix::actor<BaseT> > > phoenix::operator||(const phoenix::actor<BaseT>&, const phoenix::actor<BaseT>&) [with BaseT0 = phoenix::closure_member<0, phoenix::closure<boost::wave::grammars::closures::closure_value> >, BaseT1 = phoenix::argument<0>]
>
> I have ?modified the source to ?print the statement, its ?LHS, type of
> the LHS and RHS. ?The left access size was reported to be 72, the
> right one 128. ?The result was:
>
> Statement (72, 128):
> # .MEM_9 = VDEF <.MEM_8>
> D.139123.D.105085 = D.139113;

So ...

> LHS:
> ?<component_ref 0x7f3f3fee0d70
> ? ?type <record_type 0x7f3f3c0c5780 logical_or_composite asm_written needs-constructing type_1 type_5 type_6 BLK
> ? ? ? ?size <integer_cst 0x7f3f41ed6db0 constant 128>

the type size is 128, but get_ref_base_and_extent looks at ...

> ? ? ? ?unit size <integer_cst 0x7f3f41ed6de0 constant 16>
> ? ? ? ?align 64 symtab 1007472928 alias set 403 canonical type 0x7f3f3c0c5780
> ? ? ? ?fields <template_decl 0x7f3f3c0ce3c0 result type <record_type 0x7f3f3c0ce540 result>
> ? ? ? ? ? ?ignored decl_1 VOID file /localhome/jamborm/gcc/test/boost/tmp/boost_1_33_1/boost/spirit/phoenix/operators.hpp line 2146 col 12
> ? ? ? ? ? ?align 1 context <record_type 0x7f3f3c0c5780 logical_or_composite>
> ? ? ? ? ? ?arguments <tree_list 0x7f3f3c0cbc00
> ? ? ? ? ? ? ? ?purpose <integer_cst 0x7f3f41ed67e0 constant 1>
> ? ? ? ? ? ? ? ?value <tree_vec 0x7f3f3c0cbba0 type <template_decl 0x7f3f3c0ce3c0 result>
>
> ? ? ? ? ? ? ? ? ? ?elt 0 <tree_list 0x7f3f3c0cbbd0>>> result <type_decl 0x7f3f3c0ce600 result>
> ? ? ? ? ? ?full-name "template<class TupleT> struct phoenix::logical_or_composite<phoenix::actor<phoenix::closure_member<0, phoenix::closure<boost::wave::grammars::closures::closure_value> > >, phoenix::actor<phoenix::argument<0> > >::result"
> ? ? ? ? ? ?chain <field_decl 0x7f3f3c0c9460 a0>> context <namespace_decl 0x7f3f3ded0180 phoenix>
> ? ? ? ?full-name "struct phoenix::logical_or_composite<phoenix::actor<phoenix::closure_member<0, phoenix::closure<boost::wave::grammars::closures::closure_value> > >, phoenix::actor<phoenix::argument<0> > >"
> ? ? ? ?needs-constructor X(constX&) this=(X&) n_parents=0 use_template=1 interface-unknown
> ? ? ? ?pointer_to_this <pointer_type 0x7f3f3c0ce840> reference_to_this <reference_type 0x7f3f3c0e93c0> chain <type_decl 0x7f3f3c0c5840 logical_or_composite>>
>
> ? ?arg 0 <var_decl 0x7f3f3cda70a0 D.139123
> ? ? ? ?type <record_type 0x7f3f3c0c5900 actor asm_written needs-constructing type_1 type_5 type_6 BLK size <integer_cst 0x7f3f41ed6db0 128> unit size <integer_cst 0x7f3f41ed6de0 16>
> ? ? ? ? ? ?align 64 symtab 1007476576 alias set 402 canonical type 0x7f3f3c0c5900 fields <field_decl 0x7f3f3c0c9aa0 D.105085> context <namespace_decl 0x7f3f3ded0180 phoenix>
> ? ? ? ? ? ?full-name "struct phoenix::actor<phoenix::logical_or_composite<phoenix::actor<phoenix::closure_member<0, phoenix::closure<boost::wave::grammars::closures::closure_value> > >, phoenix::actor<phoenix::argument<0> > > >"
> ? ? ? ? ? ?needs-constructor X() X(constX&) this=(X&) n_parents=1 use_template=1 interface-unknown
> ? ? ? ? ? ?pointer_to_this <pointer_type 0x7f3f3c0d0c00> reference_to_this <reference_type 0x7f3f3c1156c0> chain <type_decl 0x7f3f3c0c59c0 actor>>
> ? ? ? ?used ignored BLK file /localhome/jamborm/gcc/test/boost/tmp/boost_1_33_1/boost/spirit/phoenix/operators.hpp line 2197 col 16 size <integer_cst 0x7f3f41ed6db0 128> unit size <integer_cst 0x7f3f41ed6de0 16>
> ? ? ? ?align 64 context <function_decl 0x7f3f3c0bed00 operator||>
> ? ? ? ?chain <var_decl 0x7f3f3cd9ae60 D.139113 type <record_type 0x7f3f3c0c5780 logical_or_composite>
> ? ? ? ? ? ?used ignored BLK file /localhome/jamborm/gcc/test/boost/tmp/boost_1_33_1/boost/spirit/phoenix/operators.hpp line 2197 col 16 size <integer_cst 0x7f3f41ed6db0 128> unit size <integer_cst 0x7f3f41ed6de0 16>
> ? ? ? ? ? ?align 64 context <function_decl 0x7f3f3c0bed00 operator||>>>
> ? ?arg 1 <field_decl 0x7f3f3c0c9aa0 D.105085 type <record_type 0x7f3f3c0c5780 logical_or_composite>
> ? ? ? ?ignored decl_6 BLK file /localhome/jamborm/gcc/test/boost/tmp/boost_1_33_1/boost/spirit/phoenix/actor.hpp line 129 col 29
> ? ? ? ?size <integer_cst 0x7f3f3fb1bfc0 constant 72>

... this, the FIELD_DECLs DECL_SIZE which is 72.

> ? ? ? ?unit size <integer_cst 0x7f3f3fb2a090 constant 9>
> ? ? ? ?align 64 offset_align 128
> ? ? ? ?offset <integer_cst 0x7f3f41ed66f0 constant 0>
> ? ? ? ?bit offset <integer_cst 0x7f3f41efa330 constant 0> context <record_type 0x7f3f3c0c5900 actor>
> ? ? ? ?chain <type_decl 0x7f3f3c0d0b40 actor type <record_type 0x7f3f3c0c5900 actor>
> ? ? ? ? ? ?external nonlocal suppress-debug decl_4 VOID file /localhome/jamborm/gcc/test/boost/tmp/boost_1_33_1/boost/spirit/phoenix/actor.hpp line 129 col 29
> ? ? ? ? ? ?align 8 context <record_type 0x7f3f3c0c5900 actor>
> ? ? ? ? ? >>>
>
>
> LHS op 1 type:

this is the field decls DECL_CONTEXT

> ?<record_type 0x7ff7c0be0900 actor asm_written needs-constructing type_1 type_5 type_6 BLK
> ? ?size <integer_cst 0x7ff7c69f1db0 type <integer_type 0x7ff7c6a050c0 bit_size_type> constant 128>
> ? ?unit size <integer_cst 0x7ff7c69f1de0 type <integer_type 0x7ff7c6a05000 long unsigned int> constant 16>
> ? ?align 64 symtab -1061253280 alias set 402 canonical type 0x7ff7c0be0900

and here's the full field decl again.

> ? ?fields <field_decl 0x7ff7c0be4aa0 D.105085
> ? ? ? ?type <record_type 0x7ff7c0be0780 logical_or_composite asm_written needs-constructing type_1 type_5 type_6 BLK size <integer_cst 0x7ff7c69f1db0 128> unit size <integer_cst 0x7ff7c69f1de0 16>

type size 128

> ? ? ? ? ? ?align 64 symtab -1061256928 alias set 403 canonical type 0x7ff7c0be0780 fields <template_decl 0x7ff7c0be93c0 result> context <namespace_decl 0x7ff7c29eb180 phoenix>
> ? ? ? ? ? ?full-name "struct phoenix::logical_or_composite<phoenix::actor<phoenix::closure_member<0, phoenix::closure<boost::wave::grammars::closures::closure_value> > >, phoenix::actor<phoenix::argument<0> > >"
> ? ? ? ? ? ?needs-constructor X(constX&) this=(X&) n_parents=0 use_template=1 interface-unknown
> ? ? ? ? ? ?pointer_to_this <pointer_type 0x7ff7c0be9840> reference_to_this <reference_type 0x7ff7c0c043c0> chain <type_decl 0x7ff7c0be0840 logical_or_composite>>
> ? ? ? ?ignored decl_6 BLK file /localhome/jamborm/gcc/test/boost/tmp/boost_1_33_1/boost/spirit/phoenix/actor.hpp line 129 col 29
> ? ? ? ?size <integer_cst 0x7ff7c4636fc0 constant 72>

decl size 72

odd and bogus(?).  Does one maybe include padding and the other not?

> ? ? ? ?unit size <integer_cst 0x7ff7c4645090 constant 9>
> ? ? ? ?align 64 offset_align 128
> ? ? ? ?offset <integer_cst 0x7ff7c69f16f0 constant 0>
> ? ? ? ?bit offset <integer_cst 0x7ff7c6a15330 constant 0> context <record_type 0x7ff7c0be0900 actor>
> ? ? ? ?chain <type_decl 0x7ff7c0bebb40 actor type <record_type 0x7ff7c0be0900 actor>
> ? ? ? ? ? ?external nonlocal suppress-debug decl_4 VOID file /localhome/jamborm/gcc/test/boost/tmp/boost_1_33_1/boost/spirit/phoenix/actor.hpp line 129 col 29
> ? ? ? ? ? ?align 8 context <record_type 0x7ff7c0be0900 actor>
> ? ? ? ? ? >> context <namespace_decl 0x7ff7c29eb180 phoenix>
> ? ?full-name "struct phoenix::actor<phoenix::logical_or_composite<phoenix::actor<phoenix::closure_member<0, phoenix::closure<boost::wave::grammars::closures::closure_value> > >, phoenix::actor<phoenix::argument<0> > > >"
> ? ?needs-constructor X() X(constX&) this=(X&) n_parents=1 use_template=1 interface-unknown
> ? ?pointer_to_this <pointer_type 0x7ff7c0bebc00> reference_to_this <reference_type 0x7ff7c0c306c0> chain <type_decl 0x7ff7c0be09c0 actor>>
>
>
>
> RHS:
> ?<var_decl 0x7f0e4a30be60 D.139113
> ? ?type <record_type 0x7f0e49636780 logical_or_composite asm_written needs-constructing type_1 type_5 type_6 BLK
> ? ? ? ?size <integer_cst 0x7f0e4f447db0 constant 128>
> ? ? ? ?unit size <integer_cst 0x7f0e4f447de0 constant 16>
> ? ? ? ?align 64 symtab 1231282464 alias set 403 canonical type 0x7f0e49636780
> ? ? ? ?fields <template_decl 0x7f0e4963f3c0 result type <record_type 0x7f0e4963f540 result>
> ? ? ? ? ? ?ignored decl_1 VOID file /localhome/jamborm/gcc/test/boost/tmp/boost_1_33_1/boost/spirit/phoenix/operators.hpp line 2146 col 12
> ? ? ? ? ? ?align 1 context <record_type 0x7f0e49636780 logical_or_composite>
> ? ? ? ? ? ?arguments <tree_list 0x7f0e4963cc00
> ? ? ? ? ? ? ? ?purpose <integer_cst 0x7f0e4f4477e0 constant 1>
> ? ? ? ? ? ? ? ?value <tree_vec 0x7f0e4963cba0 type <template_decl 0x7f0e4963f3c0 result>
> ? ? ? ? ? ? ? ? ? ?elt 0 <tree_list 0x7f0e4963cbd0>>> result <type_decl 0x7f0e4963f600 result>
> ? ? ? ? ? ?full-name "template<class TupleT> struct phoenix::logical_or_composite<phoenix::actor<phoenix::closure_member<0, phoenix::closure<boost::wave::grammars::closures::closure_value> > >, phoenix::actor<phoenix::argument<0> > >::result"
> ? ? ? ? ? ?chain <field_decl 0x7f0e4963a460 a0>> context <namespace_decl 0x7f0e4b441180 phoenix>
> ? ? ? ?full-name "struct phoenix::logical_or_composite<phoenix::actor<phoenix::closure_member<0, phoenix::closure<boost::wave::grammars::closures::closure_value> > >, phoenix::actor<phoenix::argument<0> > >"
> ? ? ? ?needs-constructor X(constX&) this=(X&) n_parents=0 use_template=1 interface-unknown
> ? ? ? ?pointer_to_this <pointer_type 0x7f0e4963f840> reference_to_this <reference_type 0x7f0e4965a3c0> chain <type_decl 0x7f0e49636840 logical_or_composite>>
> ? ?used ignored BLK file /localhome/jamborm/gcc/test/boost/tmp/boost_1_33_1/boost/spirit/phoenix/operators.hpp line 2197 col 16 size <integer_cst 0x7f0e4f447db0 128> unit size <integer_cst 0x7f0e4f447de0 16>
> ? ?align 64 context <function_decl 0x7f0e4962fd00 operator||>>
>
>
> Note that the size of the ?declaration size of declaration in arg 1 is
> different from ?the size of ?its type (which ?is also the type ?of the
> COMPONENT_REF). ? An that ?is where ?get_ref_base_and_extent ?gets the
> size from (in fact it's even special-cased).
>
> Note that ?these dumps are ?from the pretty-ipa ?branch but I ?had the
> same problem on the ?mainline a few days ago so I ?believe they do not
> differ.
>
> Do you have any idea where this can come from? ?Or where I should look
> next?

If the above is indeed valid, then get_ref_base_and_extent should IMHO
be changed to be consistent here by simply always looking at the types
size (I wonder why we do not special case for ARRAY_REFs operand 4
if present).

Maybe someone can explain the difference between a field decls
DECL_SIZE and its type TYPE_SIZE?

Thanks,
Richard.

> Thanks a lot for your interest,
>
> Martin
>


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