On Tue, May 21, 2013 at 8:38 AM, Bin.Cheng <amker.ch...@gmail.com> wrote: > On Tue, May 21, 2013 at 1:55 PM, Andrew Pinski <pins...@gmail.com> wrote: >> On Mon, May 20, 2013 at 10:50 PM, Bin.Cheng <amker.ch...@gmail.com> wrote: > >> >> >> NOP_EXPR here is a misnamed tree really. It could also be a >> CONVERT_EXPR and still have the same issue as the types are not the >> same. >> >> >>> The problem is operand_equal_q simply return false because arg0/arg1 >>> have different tree code. >> >> No it returns false because the types are two different. One is >> signed and the other is unsigned. >> >>> >>> Should operand_equal_q take two kinds of conversion expression into >>> consideration, or arg0/arg1 are not equal? Thanks. >> >> Yes why would it not? Look at the resulting types again. > > Thanks very much. The dumped tree codes are different (my mistake). > But the problem still exists in operand_equal_q. > For now with below tree nodes, > arg0: > <convert_expr 0xb72ddb04 > type <integer_type 0xb74602a0 short int sizes-gimplified public HI > size <integer_cst 0xb744e7c4 constant 16> > unit size <integer_cst 0xb744e7e0 constant 2> > align 16 symtab 0 alias set 4 canonical type 0xb74602a0 > precision 16 min <integer_cst 0xb744e770 -32768> max <integer_cst > 0xb744e78c 32767> context <translation_unit_decl 0xb760dd80 D.6120> > pointer_to_this <pointer_type 0xb7241600>> > > arg 0 <ssa_name 0xb72882f8 > type <integer_type 0xb7460420 long int sizes-gimplified public SI > size <integer_cst 0xb744e55c constant 32> > unit size <integer_cst 0xb744e578 constant 4> > align 32 symtab 0 alias set 5 canonical type 0xb7460420 > precision 32 min <integer_cst 0xb744e888 -2147483648> max <integer_cst > 0xb744e8a4 2147483647> context <translation_unit_decl 0xb760dd80 > D.6120> > pointer_to_this <pointer_type 0xb74677e0>> > visiteddef_stmt _23 = *_22; > > version 23>> > > arg1: > <nop_expr 0xb72e1b54 > type <integer_type 0xb74602a0 short int sizes-gimplified public HI > size <integer_cst 0xb744e7c4 constant 16> > unit size <integer_cst 0xb744e7e0 constant 2> > align 16 symtab 0 alias set 4 canonical type 0xb74602a0 > precision 16 min <integer_cst 0xb744e770 -32768> max <integer_cst > 0xb744e78c 32767> context <translation_unit_decl 0xb760dd80 D.6120> > pointer_to_this <pointer_type 0xb7241600>> > > arg 0 <ssa_name 0xb72882f8 > type <integer_type 0xb7460420 long int sizes-gimplified public SI > size <integer_cst 0xb744e55c constant 32> > unit size <integer_cst 0xb744e578 constant 4> > align 32 symtab 0 alias set 5 canonical type 0xb7460420 > precision 32 min <integer_cst 0xb744e888 -2147483648> max <integer_cst > 0xb744e8a4 2147483647> context <translation_unit_decl 0xb760dd80 > D.6120> > pointer_to_this <pointer_type 0xb74677e0>> > visiteddef_stmt _23 = *_22; > > version 23>> > > The operand_equal_p still returns false because below piece of code in it: > > #if 1 > if (TREE_CODE (arg0) != TREE_CODE (arg1) > /* This is needed for conversions and for COMPONENT_REF. > Might as well play it safe and always test this. */ > || TREE_CODE (TREE_TYPE (arg0)) == ERROR_MARK > || TREE_CODE (TREE_TYPE (arg1)) == ERROR_MARK > || TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1))) > #else > if ((TREE_CODE (arg0) != TREE_CODE (arg1) > && !(CONVERT_EXPR_P (arg0) && CONVERT_EXPR_P (arg1))) > /* This is needed for conversions and for COMPONENT_REF. > Might as well play it safe and always test this. */ > || TREE_CODE (TREE_TYPE (arg0)) == ERROR_MARK > || TREE_CODE (TREE_TYPE (arg1)) == ERROR_MARK > || TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1))) > #endif > return 0; > > > The code in else part should be used instead, right?
As this code is used by frontends who may actually have different behaviors for NOP_EXPR vs. CONVERT_EXPR (which is the only reason the two tree codes still exist!) it isn't 100% obvious. Though if it passes testing then it's ok IMHO, but I'd like you to refactor the above to if (TREE_CODE (arg0) != TREE_CODE (arg1) /* NOP_EXPR and CONVERT_EXPR are considered equal. */ && !(CONVERT_EXPR_P (arg0) && CONVERT_EXPR_P (arg1))) return 0; /* This is needed for conversions and for COMPONENT_REF. Might as well play it safe and always test this. */ if (TREE_CODE (TREE_TYPE (arg0)) == ERROR_MARK || TREE_CODE (TREE_TYPE (arg1)) == ERROR_MARK || TYPE_MODE (TREE_TYPE (arg0)) != TYPE_MODE (TREE_TYPE (arg1))) return 0; ok if that passes testing. Thanks, Richard. > Thanks. > > -- > Best Regards.