Question on operand_equal_p on different type conversion expressions

Bin.Cheng amker.cheng@gmail.com
Tue May 21 05:50:00 GMT 2013


Hi,
I ran into a call of operand_equal_p for two type conversion tree nodes like:
arg0:
 <nop_expr 0xb737a974
    type <integer_type 0xb74faae0 public unsigned HI
        size <integer_cst 0xb74e87c4 constant 16>
        unit size <integer_cst 0xb74e87e0 constant 2>
        align 16 symtab 0 alias set -1 canonical type 0xb74faae0
precision 16 min <integer_cst 0xb74e8b28 0> max <integer_cst
0xb74e8a64 65535>>

    arg 0 <ssa_name 0xb73222f8
        type <integer_type 0xb74fa420 long int sizes-gimplified public SI
            size <integer_cst 0xb74e855c constant 32>
            unit size <integer_cst 0xb74e8578 constant 4>
            align 32 symtab 0 alias set 5 canonical type 0xb74fa420
precision 32 min <integer_cst 0xb74e8888 -2147483648> max <integer_cst
0xb74e88a4 2147483647> context <translation_unit_decl 0xb76a7d80
D.6120>
            pointer_to_this <pointer_type 0xb75017e0>>
        visiteddef_stmt _23 = *_22;

        version 23>>

arg1:
 <convert_expr 0xb737a3e8
    type <integer_type 0xb74fa2a0 short int sizes-gimplified public HI
        size <integer_cst 0xb74e87c4 constant 16>
        unit size <integer_cst 0xb74e87e0 constant 2>
        align 16 symtab 0 alias set 4 canonical type 0xb74fa2a0
precision 16 min <integer_cst 0xb74e8770 -32768> max <integer_cst
0xb74e878c 32767> context <translation_unit_decl 0xb76a7d80 D.6120>
        pointer_to_this <pointer_type 0xb72db600>>

    arg 0 <ssa_name 0xb73222f8
        type <integer_type 0xb74fa420 long int sizes-gimplified public SI
            size <integer_cst 0xb74e855c constant 32>
            unit size <integer_cst 0xb74e8578 constant 4>
            align 32 symtab 0 alias set 5 canonical type 0xb74fa420
precision 32 min <integer_cst 0xb74e8888 -2147483648> max <integer_cst
0xb74e88a4 2147483647> context <translation_unit_decl 0xb76a7d80
D.6120>
            pointer_to_this <pointer_type 0xb75017e0>>
        visiteddef_stmt _23 = *_22;

        version 23>>

Though arg0 is a nop_expr, the conversion is actually not NOP and it
seems arg0 equals arg1.

The problem is operand_equal_q simply return false because arg0/arg1
have different tree code.

Should operand_equal_q take two kinds of conversion expression into
consideration, or arg0/arg1 are not equal? Thanks.

--
Best Regards.



More information about the Gcc mailing list