https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64550

--- Comment #3 from Martin Liška <marxin at gcc dot gnu.org> ---
The problem is hidden in missing volatile side-effect comparison for:

# VUSE <.MEM_5(D)>
__mptr_8 ={v} _17->first;
(gdb) call debug_gimple_stmt(s2)
# VUSE <.MEM_5(D)>
__mptr_8 = _17->first;

where compare_memory_operand is called for:

 <component_ref 0x7ffff6d65ed0
    type <pointer_type 0x7ffff6d54bd0
        type <record_type 0x7ffff6d54b28 __hlist_node type_0 TI
            size <integer_cst 0x7ffff6c36cf0 constant 128>
            unit size <integer_cst 0x7ffff6c36d08 constant 16>
            align 64 symtab 0 alias set 5 canonical type 0x7ffff6d54b28 fields
<field_decl 0x7ffff6c5aed8 next> context <translation_unit_decl 0x7ffff7fee3c0
D.1890>
            pointer_to_this <pointer_type 0x7ffff6d54bd0> chain <type_decl
0x7ffff6c5ada8 D.1830>>
        sizes-gimplified public unsigned DI
        size <integer_cst 0x7ffff6c36ca8 constant 64>
        unit size <integer_cst 0x7ffff6c36cc0 constant 8>
        align 64 symtab 0 alias set 3 canonical type 0x7ffff6d54bd0
        pointer_to_this <pointer_type 0x7ffff6d54c78>>
    side-effects volatile
    arg 0 <mem_ref 0x7ffff6d70f78
        type <record_type 0x7ffff6d54a80 __hlist_head type_0 DI size
<integer_cst 0x7ffff6c36ca8 64> unit size <integer_cst 0x7ffff6c36cc0 8>
            align 64 symtab 0 alias set 4 canonical type 0x7ffff6d54a80 fields
<field_decl 0x7ffff6c5ae40 first> context <translation_unit_decl 0x7ffff7fee3c0
D.1890>
            pointer_to_this <pointer_type 0x7ffff6d54dc8> chain <type_decl
0x7ffff6c5ad10 D.1829>>

        arg 0 <ssa_name 0x7ffff6d83288 type <pointer_type 0x7ffff6d54dc8>
            visiteddef_stmt _17 = _13 + _16;

            version 17
            ptr-info 0x7ffff6d71750>
        arg 1 <integer_cst 0x7ffff6d71078 constant 0>
        /home/marxin/Programming/testcases/ppc64-linux-bug.c:41:664>
    arg 1 <field_decl 0x7ffff6c5ae40 first type <pointer_type 0x7ffff6d54bd0>
        unsigned DI file /home/marxin/Programming/testcases/ppc64-linux-bug.c
line 2 col 23 size <integer_cst 0x7ffff6c36ca8 64> unit size <integer_cst
0x7ffff6c36cc0 8>
        align 64 offset_align 128
        offset <integer_cst 0x7ffff6c36cd8 constant 0>
        bit offset <integer_cst 0x7ffff6c36d20 constant 0> context <record_type
0x7ffff6d54a80 __hlist_head>>
    /home/marxin/Programming/testcases/ppc64-linux-bug.c:41:630>

Where volatile is correctly set, but after refactoring our volatile comparison
is based on result of ao_ref_base which is:
<mem_ref 0x7ffff6d70f78

Shouldn't be Richard TREE_THIS_VOLATILE called for arguments given to
func_checker::compare_memory_operand function in case we know it's a memory
reference?
Thanks,
Martin

Reply via email to