------- Additional Comments From ebotcazou at libertysurf dot fr  2005-03-31 
06:30 -------
Subject: Re:  [3.4 Regression] -fstrict-aliasing causes incorrect scheduling

> I think it's fixable.  I'm not sure exactly why the C++ front-end is
> inserting the additional operations, but they're certainly not essential
> from a C++ semantics point of view.  Please reassign the bug to me; I'll
> try to take a look.

Thanks, will do.  For the records, here's the tree for the first assignment 
with the C compiler:

 <modify_expr 0x40186390
    type <record_type 0x40220074 x_uint64_t type_0 DI
        size <integer_cst 0x401797c0 constant 64>
        unit size <integer_cst 0x401799e0 constant 8>
        align 64 symtab 0 alias set -1
        fields <field_decl 0x4021ef68 a type <array_type 0x4021eef4>
            DI file ../pr20607.c line 17 size <integer_cst 0x401797c0 64> 
unit size <integer_cst 0x401799e0 8>
            align 64 offset_align 64
            offset <integer_cst 0x40179ac0 constant 0>
            bit offset <integer_cst 0x40179b80 constant 0> context 
<record_type 0x4021ed24 __x_uint64_t> arguments <integer_cst 0x40179ac0 0>> 
context <translation_unit_decl 0x4017c15c>>
    side-effects
    arg 0 <component_ref 0x40186378 type <record_type 0x40220074 x_uint64_t>

        arg 0 <var_decl 0x402205e4 conv type <union_type 0x40220414 u>
            used BLK file ../pr20607.c line 31 size <integer_cst 0x401797c0 
64> unit size <integer_cst 0x401799e0 8>
            align 64 context <function_decl 0x4022015c dotests_1>
            (mem/s:BLK (plus:SI (reg/f:SI 103 virtual-stack-vars)
        (const_int -16 [0xfffffffffffffff0])) [8 conv+0 S8 A64])>
        arg 1 <field_decl 0x402204fc first type <record_type 0x40220074 
x_uint64_t>
            DI file ../pr20607.c line 28 size <integer_cst 0x401797c0 64> 
unit size <integer_cst 0x401799e0 8>
            align 64 offset_align 64 offset <integer_cst 0x40179ac0 0> bit 
offset <integer_cst 0x40179b80 0> context <union_type 0x40220414 u> 
arguments <integer_cst 0x40179ac0 0> chain <field_decl 0x40220570 second>>>
    arg 1 <var_decl 0x4022032c arg1 type <record_type 0x40220074 x_uint64_t>
        used DI file ../pr20607.c line 23 size <integer_cst 0x401797c0 64> 
unit size <integer_cst 0x401799e0 8>
        align 64 context <function_decl 0x4022015c dotests_1>
        (reg/v:DI 107 [ arg1 ])
        chain <var_decl 0x402203a0 result type <record_type 0x4021ecb0 
x_uint32_t>
            used BLK file ../pr20607.c line 24 size <integer_cst 0x401797c0 
64> unit size <integer_cst 0x401799e0 8>
            align 64 context <function_decl 0x4022015c dotests_1>
            (mem/s:BLK (plus:SI (reg/f:SI 103 virtual-stack-vars)
        (const_int -8 [0xfffffffffffffff8])) [2 result+0 S8 A64])>>>

and with the C++ compiler:

 <modify_expr 0x40188510
    type <record_type 0x40255000 __x_uint64_t type_1 type_5 DI
        size <integer_cst 0x401797c0 constant 64>
        unit size <integer_cst 0x401799e0 constant 8>
        align 64 symtab 0 alias set 2
        fields <field_decl 0x402553a0 a type <array_type 0x4025532c>
            used nonlocal decl_3 DI file ../pr20607.C line 17 size 
<integer_cst 0x401797c0 64> unit size <integer_cst 0x401799e0 8>
            align 64 offset_align 64
            offset <integer_cst 0x40179ac0 constant 0>
            bit offset <integer_cst 0x40179b80 constant 0> context 
<record_type 0x40255000 __x_uint64_t> arguments <integer_cst 0x40179ac0 0> 
chain <type_decl 0x402551d0 __x_uint64_t>>
        X() X(constX&) this=(X&) n_parents 0 use_template=0 interface-unknown
        member-functions <tree_vec 0x40253f40
            elt 0 <overload 0x402510f0>
            elt 2 <function_decl 0x40255cb0 operator=>
            elt 3 <overload 0x40251130>
            elt 4 <overload 0x40251110>>
        pointer_to_this <pointer_type 0x402550e8> reference_to_this 
<reference_type 0x40255a6c> chain <type_decl 0x4025515c __x_uint64_t>>
    side-effects
    arg 0 <indirect_ref 0x402586cc type <record_type 0x40255000 __x_uint64_t>

        arg 0 <nop_expr 0x402586b8 type <pointer_type 0x402550e8>

            arg 0 <nop_expr 0x402586a4 type <pointer_type 0x402550e8>

                arg 0 <non_lvalue_expr 0x40258690 type <pointer_type 
0x402599f8>

                    arg 0 <nop_expr 0x4025867c type <pointer_type 0x402599f8>

                        arg 0 <addr_expr 0x40258514 type <pointer_type 
0x4025789c>
                            arg 0 <var_decl 0x40259984 conv>>>>>>>
    arg 1 <indirect_ref 0x402586e0
        type <record_type 0x402556cc __x_uint64_t readonly type_1 type_5 DI 
size <integer_cst 0x401797c0 64> unit size <integer_cst 0x401799e0 8>
            align 64 symtab 0 alias set -1 fields <field_decl 0x402553a0 a>
            X() X(constX&) this=(X&) n_parents 0 use_template=0 
interface-unknown member-functions <tree_vec 0x40253f40>
            pointer_to_this <pointer_type 0x40259a6c> reference_to_this 
<reference_type 0x40255740>>
        readonly
        arg 0 <nop_expr 0x40258640 type <reference_type 0x40255740>

            arg 0 <nop_expr 0x4025862c type <pointer_type 0x40259a6c>

                arg 0 <addr_expr 0x40258618 type <pointer_type 0x402599f8>
                    arg 0 <var_decl 0x40257658 arg1>>>>>>


Type punning needs a COMPONENT_REF to work (see c_common_get_alias_set).



-- 


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

Reply via email to