On Thu, Feb 21, 2013 at 8:31 PM, Bin.Cheng <amker.ch...@gmail.com> wrote: > On Fri, Feb 22, 2013 at 12:14 PM, Andrew Pinski <pins...@gmail.com> wrote: >> On Thu, Feb 21, 2013 at 7:16 PM, Bin.Cheng <amker.ch...@gmail.com> wrote: >>> Hi, >>> GCCINT says that nop_expr is used to represent conversions that do not >>> require any code generation, while function tree_strip_nop_conversions >>> calls tree_nop_conversion, which returns false even for NOP_EXPR node >>> like "(unsigned int)a", where a has type int. >> >> Are you sure a has the type of int? >> >> The code does: >> if ((INTEGRAL_TYPE_P (outer_type) >> || POINTER_TYPE_P (outer_type) >> || TREE_CODE (outer_type) == OFFSET_TYPE) >> && (INTEGRAL_TYPE_P (inner_type) >> || POINTER_TYPE_P (inner_type) >> || TREE_CODE (inner_type) == OFFSET_TYPE)) >> return TYPE_PRECISION (outer_type) == TYPE_PRECISION (inner_type); >> >> Which will return true for the case you mentioned. Also NOP_EXPR and >> CONVERT_EXPR are handled almost the same through out the whole >> compiler. >> > Oh, sorry about the mistake, a has type of signed short. Maybe we can > improve tree_nop_conversion with this case.
No because it is not a true nop conversion. The whole NOP_EXPR vs CONVERT_EXPR has been going on for a while now. I was trying to make the point to the middle-end NOP_EXPR and CONVERT_EXPR are exactly the same and the documentation about NOP_EXPR being a conversion which makes no code is incorrect. Thanks, Andrew Pinski