On Tue, May 21, 2013 at 4:50 PM, Richard Biener <richard.guent...@gmail.com> wrote: > 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. > Will be done. Thanks.
-- Best Regards.