Hi, On Mon, 19 Nov 2012, Steven Bosscher wrote:
> On Mon, Nov 19, 2012 at 2:10 PM, Michael Matz wrote: > > Hi, > > > > On Fri, 16 Nov 2012, Andrew Pinski wrote: > > > >> >> Ah, yes. This one was amusing. When we were drafting the proposal, > >> >> Lawrence kept wondering what this NOP_EXPR thing is. I've been > >> >> suffering this name for so long, that it no longer irritates me. > >> >> Had it been named CAST_EXPR, or even NOP_CAST_EXPR, he would have > >> >> probably kept it in the example code :) > >> > > >> > We have CONVERT_EXPR, but it currently doesn't do _quite_ the same as > >> > NOP_EXPR. I once wanted to merge them (with CONVERT_EXPR surviving), > >> > but it stalled somewhere, couple years ago. > >> > >> I think the only difference now is in the front-ends IIRC. > > > > No, because my patch didn't go in. There are still various cases in the > > middle end that explicitely check for equality with NOP_EXPR, instead of > > using CONVERT_EXPR_P or CONVERT_EXPR_CODE_P or CASE_CONVERT to work with > > both. > > > > See the patch below from three years ago. Of course it doesn't apply > > anymore, but I can update it if there's some consensus that we want to go > > that route. > > At this point, you probably wanted to attach a patch :-) I thought everybody can look into my head. Well, if you can't due to my aluminium hat, here it is electronically :) Ciao, Michael. Index: gcc/builtins.c =================================================================== --- gcc.orig/builtins.c 2009-09-28 13:06:24.000000000 +0200 +++ gcc/builtins.c 2009-09-29 15:01:44.000000000 +0200 @@ -6873,7 +6873,7 @@ fold_builtin_expect (location_t loc, tre /* Distribute the expected value over short-circuiting operators. See through the cast from truthvalue_type_node to long. */ inner = arg0; - while (TREE_CODE (inner) == NOP_EXPR + while (CONVERT_EXPR_P (inner) && INTEGRAL_TYPE_P (TREE_TYPE (inner)) && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (inner, 0)))) inner = TREE_OPERAND (inner, 0); @@ -7028,7 +7028,7 @@ integer_valued_real_p (tree t) case REAL_CST: return real_isinteger (TREE_REAL_CST_PTR (t), TYPE_MODE (TREE_TYPE (t))); - case NOP_EXPR: + CASE_CONVERT: { tree type = TREE_TYPE (TREE_OPERAND (t, 0)); if (TREE_CODE (type) == INTEGER_TYPE) @@ -13843,7 +13843,7 @@ fold_call_stmt (gimple stmt, bool ignore if (gimple_has_location (stmt)) { tree realret = ret; - if (TREE_CODE (ret) == NOP_EXPR) + if (CONVERT_EXPR_P (ret)) realret = TREE_OPERAND (ret, 0); if (CAN_HAVE_LOCATION_P (realret) && !EXPR_HAS_LOCATION (realret)) Index: gcc/c-common.c =================================================================== --- gcc.orig/c-common.c 2009-09-24 14:54:14.000000000 +0200 +++ gcc/c-common.c 2009-09-29 15:02:49.000000000 +0200 @@ -8348,7 +8348,7 @@ fold_offsetof_1 (tree expr, tree stop_re gcc_assert (integer_zerop (expr)); return size_zero_node; - case NOP_EXPR: + CASE_CONVERT: case INDIRECT_REF: base = fold_offsetof_1 (TREE_OPERAND (expr, 0), stop_ref); gcc_assert (base == error_mark_node || base == size_zero_node); Index: gcc/c-omp.c =================================================================== --- gcc.orig/c-omp.c 2009-07-20 07:12:40.000000000 +0200 +++ gcc/c-omp.c 2009-09-29 15:04:13.000000000 +0200 @@ -318,7 +318,7 @@ c_finish_omp_for (location_t locus, tree We want to force: i < (int)n; */ - if (TREE_CODE (op0) == NOP_EXPR + if (CONVERT_EXPR_P (op0) && decl == TREE_OPERAND (op0, 0)) { TREE_OPERAND (cond, 0) = TREE_OPERAND (op0, 0); @@ -326,7 +326,7 @@ c_finish_omp_for (location_t locus, tree = fold_build1_loc (elocus, NOP_EXPR, TREE_TYPE (decl), TREE_OPERAND (cond, 1)); } - else if (TREE_CODE (op1) == NOP_EXPR + else if (CONVERT_EXPR_P (op1) && decl == TREE_OPERAND (op1, 0)) { TREE_OPERAND (cond, 1) = TREE_OPERAND (op1, 0); Index: gcc/c-pretty-print.c =================================================================== --- gcc.orig/c-pretty-print.c 2009-09-15 15:02:55.000000000 +0200 +++ gcc/c-pretty-print.c 2009-09-29 15:07:48.000000000 +0200 @@ -992,8 +992,8 @@ pp_c_complex_expr (c_pretty_printer *pp, tree imagexpr = TREE_OPERAND (e, 1); /* Cast of an COMPLEX_TYPE expression to a different COMPLEX_TYPE. */ - if (TREE_CODE (realexpr) == NOP_EXPR - && TREE_CODE (imagexpr) == NOP_EXPR + if (CONVERT_EXPR_P (realexpr) + && CONVERT_EXPR_P (imagexpr) && TREE_TYPE (realexpr) == TREE_TYPE (type) && TREE_TYPE (imagexpr) == TREE_TYPE (type) && TREE_CODE (TREE_OPERAND (realexpr, 0)) == REALPART_EXPR @@ -1011,7 +1011,7 @@ pp_c_complex_expr (c_pretty_printer *pp, && TREE_TYPE (realexpr) == TREE_TYPE (type)) { pp_c_type_cast (pp, type); - if (TREE_CODE (realexpr) == NOP_EXPR) + if (CONVERT_EXPR_P (realexpr)) realexpr = TREE_OPERAND (realexpr, 0); pp_expression (pp, realexpr); return; Index: gcc/c-typeck.c =================================================================== --- gcc.orig/c-typeck.c 2009-09-28 13:30:24.000000000 +0200 +++ gcc/c-typeck.c 2009-09-29 15:56:14.000000000 +0200 @@ -2630,7 +2630,7 @@ build_function_call_vec (location_t loc, else result = fold_build_call_array_loc (loc, TREE_TYPE (fntype), function, nargs, argarray); - if (TREE_CODE (result) == NOP_EXPR + if (CONVERT_EXPR_P (result) && TREE_CODE (TREE_OPERAND (result, 0)) == INTEGER_CST) STRIP_TYPE_NOPS (result); } @@ -3193,7 +3193,7 @@ build_unary_op (location_t location, switch (code) { - case CONVERT_EXPR: + CASE_CONVERT: /* This is used for unary plus, because a CONVERT_EXPR is enough to prevent anybody from looking inside for associativity, but won't generate any code. */ @@ -4537,6 +4537,7 @@ build_modify_expr (location_t location, /* If a binary op has been requested, combine the old LHS value with the RHS producing the value we should actually store into the LHS. */ + gcc_assert (modifycode != CONVERT_EXPR); if (modifycode != NOP_EXPR) { lhs = c_fully_fold (lhs, false, NULL); @@ -8693,7 +8694,7 @@ c_finish_stmt_expr (location_t loc, tree /* Unwrap a no-op NOP_EXPR as added by c_finish_expr_stmt. This avoids tree_expr_nonnegative_p giving up immediately. */ val = last; - if (TREE_CODE (val) == NOP_EXPR + if (CONVERT_EXPR_P (val) && TREE_TYPE (val) == TREE_TYPE (TREE_OPERAND (val, 0))) val = TREE_OPERAND (val, 0); Index: gcc/cfgexpand.c =================================================================== --- gcc.orig/cfgexpand.c 2009-09-24 14:54:14.000000000 +0200 +++ gcc/cfgexpand.c 2009-09-29 15:03:33.000000000 +0200 @@ -2383,8 +2383,7 @@ expand_debug_expr (tree exp) adjust_mode: case PAREN_EXPR: - case NOP_EXPR: - case CONVERT_EXPR: + CASE_CONVERT: { enum machine_mode inner_mode = GET_MODE (op0); Index: gcc/convert.c =================================================================== --- gcc.orig/convert.c 2009-08-25 08:12:36.000000000 +0200 +++ gcc/convert.c 2009-09-29 15:05:16.000000000 +0200 @@ -772,7 +772,7 @@ convert_to_integer (tree type, tree expr TREE_OPERAND (expr, 0)))); } - case NOP_EXPR: + CASE_CONVERT: /* Don't introduce a "can't convert between vector values of different size" error. */ if (TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0))) == VECTOR_TYPE Index: gcc/dojump.c =================================================================== --- gcc.orig/dojump.c 2009-08-27 18:33:37.000000000 +0200 +++ gcc/dojump.c 2009-09-29 15:13:38.000000000 +0200 @@ -363,13 +363,12 @@ do_jump (tree exp, rtx if_false_label, r break; #endif - case NOP_EXPR: + CASE_CONVERT: if (TREE_CODE (TREE_OPERAND (exp, 0)) == COMPONENT_REF || TREE_CODE (TREE_OPERAND (exp, 0)) == BIT_FIELD_REF || TREE_CODE (TREE_OPERAND (exp, 0)) == ARRAY_REF || TREE_CODE (TREE_OPERAND (exp, 0)) == ARRAY_RANGE_REF) goto normal; - case CONVERT_EXPR: /* If we are narrowing the operand, we have to do the compare in the narrower mode. */ if ((TYPE_PRECISION (TREE_TYPE (exp)) Index: gcc/except.c =================================================================== --- gcc.orig/except.c 2009-09-15 15:02:55.000000000 +0200 +++ gcc/except.c 2009-09-29 15:15:06.000000000 +0200 @@ -674,6 +674,7 @@ add_type_for_runtime (tree type) tree *slot; /* If TYPE is NOP_EXPR, it means that it already is a runtime type. */ + gcc_assert (TREE_CODE (type) != CONVERT_EXPR); if (TREE_CODE (type) == NOP_EXPR) return; @@ -692,6 +693,7 @@ lookup_type_for_runtime (tree type) tree *slot; /* If TYPE is NOP_EXPR, it means that it already is a runtime type. */ + gcc_assert (TREE_CODE (type) != CONVERT_EXPR); if (TREE_CODE (type) == NOP_EXPR) return type; Index: gcc/fold-const.c =================================================================== --- gcc.orig/fold-const.c 2009-09-28 13:30:24.000000000 +0200 +++ gcc/fold-const.c 2009-09-29 15:55:34.000000000 +0200 @@ -1197,7 +1197,7 @@ negate_expr_p (tree t) return negate_expr_p (TREE_OPERAND (t, 1)) || negate_expr_p (TREE_OPERAND (t, 0)); - case NOP_EXPR: + CASE_CONVERT: /* Negate -((double)float) as (double)(-float). */ if (TREE_CODE (type) == REAL_TYPE) { @@ -1388,7 +1388,7 @@ fold_negate_expr (location_t loc, tree t } break; - case NOP_EXPR: + CASE_CONVERT: /* Convert -((double)float) into (double)(-float). */ if (TREE_CODE (type) == REAL_TYPE) { @@ -4471,7 +4471,7 @@ sign_bit_p (tree exp, const_tree val) return exp; /* Handle extension from a narrower type. */ - if (TREE_CODE (exp) == NOP_EXPR + if (CONVERT_EXPR_P (exp) && TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (exp, 0))) < width) return sign_bit_p (TREE_OPERAND (exp, 0), val); @@ -8626,8 +8626,8 @@ fold_unary_loc (location_t loc, enum tre if (POINTER_TYPE_P (type) && TREE_CODE (arg0) == POINTER_PLUS_EXPR && (TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST - || TREE_CODE (TREE_OPERAND (arg0, 0)) == NOP_EXPR - || TREE_CODE (TREE_OPERAND (arg0, 1)) == NOP_EXPR)) + || CONVERT_EXPR_P (TREE_OPERAND (arg0, 0)) + || CONVERT_EXPR_P (TREE_OPERAND (arg0, 1)))) { tree arg00 = TREE_OPERAND (arg0, 0); tree arg01 = TREE_OPERAND (arg0, 1); @@ -8727,7 +8727,7 @@ fold_unary_loc (location_t loc, enum tre else if (TREE_CODE (arg0) == NEGATE_EXPR) return fold_build1_loc (loc, ABS_EXPR, type, TREE_OPERAND (arg0, 0)); /* Convert fabs((double)float) into (double)fabsf(float). */ - else if (TREE_CODE (arg0) == NOP_EXPR + else if (CONVERT_EXPR_P (arg0) && TREE_CODE (type) == REAL_TYPE) { tree targ0 = strip_float_extensions (arg0); @@ -11649,7 +11649,7 @@ fold_binary_loc (location_t loc, if (t1 != NULL_TREE) return t1; /* Simplify ((int)c & 0377) into (int)c, if c is unsigned char. */ - if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR + if (TREE_CODE (arg1) == INTEGER_CST && CONVERT_EXPR_P (arg0) && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0)))) { unsigned int prec @@ -11725,7 +11725,7 @@ fold_binary_loc (location_t loc, tree arg00 = TREE_OPERAND (arg0, 0); /* See if more bits can be proven as zero because of zero extension. */ - if (TREE_CODE (arg00) == NOP_EXPR + if (CONVERT_EXPR_P (arg00) && TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg00, 0)))) { tree inner_type = TREE_TYPE (TREE_OPERAND (arg00, 0)); @@ -14771,7 +14771,7 @@ multiple_of_p (tree type, const_tree top } return 0; - case NOP_EXPR: + CASE_CONVERT: /* Can't handle conversions from non-integral or wider integral type. */ if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (top, 0))) != INTEGER_TYPE) || (TYPE_PRECISION (type) @@ -14843,7 +14843,7 @@ tree_unary_nonnegative_warnv_p (enum tre return tree_expr_nonnegative_warnv_p (op0, strict_overflow_p); - case NOP_EXPR: + CASE_CONVERT: { tree inner_type = TREE_TYPE (op0); tree outer_type = type; @@ -14906,8 +14906,8 @@ tree_binary_nonnegative_warnv_p (enum tr /* zero_extend(x) + zero_extend(y) is non-negative if x and y are both unsigned and at least 2 bits shorter than the result. */ if (TREE_CODE (type) == INTEGER_TYPE - && TREE_CODE (op0) == NOP_EXPR - && TREE_CODE (op1) == NOP_EXPR) + && CONVERT_EXPR_P (op0) + && CONVERT_EXPR_P (op1)) { tree inner1 = TREE_TYPE (TREE_OPERAND (op0, 0)); tree inner2 = TREE_TYPE (TREE_OPERAND (op1, 0)); @@ -14936,13 +14936,13 @@ tree_binary_nonnegative_warnv_p (enum tr /* zero_extend(x) * zero_extend(y) is non-negative if x and y are both unsigned and their total bits is shorter than the result. */ if (TREE_CODE (type) == INTEGER_TYPE - && (TREE_CODE (op0) == NOP_EXPR || TREE_CODE (op0) == INTEGER_CST) - && (TREE_CODE (op1) == NOP_EXPR || TREE_CODE (op1) == INTEGER_CST)) + && (CONVERT_EXPR_P (op0) || TREE_CODE (op0) == INTEGER_CST) + && (CONVERT_EXPR_P (op1) || TREE_CODE (op1) == INTEGER_CST)) { - tree inner0 = (TREE_CODE (op0) == NOP_EXPR) + tree inner0 = CONVERT_EXPR_P (op0) ? TREE_TYPE (TREE_OPERAND (op0, 0)) : TREE_TYPE (op0); - tree inner1 = (TREE_CODE (op1) == NOP_EXPR) + tree inner1 = CONVERT_EXPR_P (op1) ? TREE_TYPE (TREE_OPERAND (op1, 0)) : TREE_TYPE (op1); @@ -15353,7 +15353,7 @@ tree_unary_nonzero_warnv_p (enum tree_co return tree_expr_nonzero_warnv_p (op0, strict_overflow_p); - case NOP_EXPR: + CASE_CONVERT: { tree inner_type = TREE_TYPE (op0); tree outer_type = type; Index: gcc/gimple.c =================================================================== --- gcc.orig/gimple.c 2009-09-15 15:02:55.000000000 +0200 +++ gcc/gimple.c 2009-09-29 15:27:24.000000000 +0200 @@ -2927,7 +2927,7 @@ tree canonicalize_cond_expr_cond (tree t) { /* For (bool)x use x != 0. */ - if (TREE_CODE (t) == NOP_EXPR + if (CONVERT_EXPR_P (t) && TREE_TYPE (t) == boolean_type_node) { tree top0 = TREE_OPERAND (t, 0); Index: gcc/gimplify.c =================================================================== --- gcc.orig/gimplify.c 2009-09-15 15:02:55.000000000 +0200 +++ gcc/gimplify.c 2009-09-29 15:28:01.000000000 +0200 @@ -6966,7 +6966,7 @@ gimplify_expr (tree *expr_p, gimple_seq break; } /* Convert (void *)&a + 4 into (void *)&a[1]. */ - if (TREE_CODE (TREE_OPERAND (*expr_p, 0)) == NOP_EXPR + if (CONVERT_EXPR_P (TREE_OPERAND (*expr_p, 0)) && TREE_CODE (TREE_OPERAND (*expr_p, 1)) == INTEGER_CST && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (*expr_p, 0),0))) Index: gcc/ipa-cp.c =================================================================== --- gcc.orig/ipa-cp.c 2009-08-17 10:53:09.000000000 +0200 +++ gcc/ipa-cp.c 2009-09-29 15:29:05.000000000 +0200 @@ -298,7 +298,7 @@ ipcp_lattice_from_jfunc (struct ipa_node return; cst = caller_lat->constant; - if (jfunc->value.pass_through.operation != NOP_EXPR) + if (! CONVERT_EXPR_CODE_P (jfunc->value.pass_through.operation)) cst = fold_binary (jfunc->value.pass_through.operation, TREE_TYPE (cst), cst, jfunc->value.pass_through.operand); Index: gcc/ipa-inline.c =================================================================== --- gcc.orig/ipa-inline.c 2009-09-20 22:05:01.000000000 +0200 +++ gcc/ipa-inline.c 2009-09-29 15:29:34.000000000 +0200 @@ -1674,8 +1674,7 @@ likely_eliminated_by_inlining_p (gimple /* Casts of parameters, loads from parameters passed by reference and stores to return value or parameters are probably free after inlining. */ - if (gimple_assign_rhs_code (stmt) == CONVERT_EXPR - || gimple_assign_rhs_code (stmt) == NOP_EXPR + if (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (stmt)) || gimple_assign_rhs_code (stmt) == VIEW_CONVERT_EXPR || gimple_assign_rhs_class (stmt) == GIMPLE_SINGLE_RHS) { Index: gcc/ipa-prop.c =================================================================== --- gcc.orig/ipa-prop.c 2009-08-17 10:53:09.000000000 +0200 +++ gcc/ipa-prop.c 2009-09-29 15:30:58.000000000 +0200 @@ -304,7 +304,7 @@ ipa_print_node_jump_functions (FILE *f, jump_func->value.pass_through.formal_id, tree_code_name[(int) jump_func->value.pass_through.operation]); - if (jump_func->value.pass_through.operation != NOP_EXPR) + if (! CONVERT_EXPR_CODE_P (jump_func->value.pass_through.operation)) print_generic_expr (dump_file, jump_func->value.pass_through.operand, 0); fprintf (dump_file, "\n"); @@ -997,7 +997,7 @@ update_jump_functions_after_inlining (st /* We must check range due to calls with variable number of arguments and we cannot combine jump functions with operations. */ - if (dst->value.pass_through.operation != NOP_EXPR + if (! CONVERT_EXPR_CODE_P (dst->value.pass_through.operation) || (dst->value.pass_through.formal_id >= ipa_get_cs_argument_count (top))) { @@ -1064,7 +1064,7 @@ update_call_notes_after_inlining (struct jfunc = ipa_get_ith_jump_func (top, nt->formal_id); if (jfunc->type == IPA_JF_PASS_THROUGH - && jfunc->value.pass_through.operation == NOP_EXPR) + && CONVERT_EXPR_CODE_P (jfunc->value.pass_through.operation)) nt->formal_id = jfunc->value.pass_through.formal_id; else if (jfunc->type == IPA_JF_CONST || jfunc->type == IPA_JF_CONST_MEMBER_PTR) Index: gcc/tree-affine.c =================================================================== --- gcc.orig/tree-affine.c 2009-04-05 08:06:20.000000000 +0200 +++ gcc/tree-affine.c 2009-09-29 15:32:14.000000000 +0200 @@ -588,7 +588,7 @@ aff_combination_expand (aff_tree *comb A type = TREE_TYPE (e); name = e; /* Look through some conversions. */ - if (TREE_CODE (e) == NOP_EXPR + if (CONVERT_EXPR_P (e) && (TYPE_PRECISION (type) >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (e, 0))))) name = TREE_OPERAND (e, 0); Index: gcc/tree-data-ref.c =================================================================== --- gcc.orig/tree-data-ref.c 2009-08-06 08:00:59.000000000 +0200 +++ gcc/tree-data-ref.c 2009-09-29 15:33:23.000000000 +0200 @@ -1924,7 +1924,7 @@ initialize_matrix_A (lambda_matrix A, tr return chrec_fold_op (TREE_CODE (chrec), chrec_type (chrec), op0, op1); } - case NOP_EXPR: + CASE_CONVERT: { tree op = initialize_matrix_A (A, TREE_OPERAND (chrec, 0), index, mult); return chrec_convert (chrec_type (chrec), op, NULL); Index: gcc/tree-inline.c =================================================================== --- gcc.orig/tree-inline.c 2009-09-28 13:26:31.000000000 +0200 +++ gcc/tree-inline.c 2009-09-29 15:33:55.000000000 +0200 @@ -1505,7 +1505,7 @@ copy_bb (copy_body_data *id, basic_block /* With return slot optimization we can end up with non-gimple (foo *)&this->m, fix that here. */ if (is_gimple_assign (stmt) - && gimple_assign_rhs_code (stmt) == NOP_EXPR + && CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (stmt)) && !is_gimple_val (gimple_assign_rhs1 (stmt))) { tree new_rhs; Index: gcc/tree-pretty-print.c =================================================================== --- gcc.orig/tree-pretty-print.c 2009-09-15 15:02:55.000000000 +0200 +++ gcc/tree-pretty-print.c 2009-09-29 15:34:52.000000000 +0200 @@ -196,7 +196,7 @@ dump_decl_name (pretty_printer *buffer, static void dump_function_name (pretty_printer *buffer, tree node, int flags) { - if (TREE_CODE (node) == NOP_EXPR) + if (CONVERT_EXPR_P (node)) node = TREE_OPERAND (node, 0); if (DECL_NAME (node) && (flags & TDF_ASMNAME) == 0) pp_string (buffer, lang_hooks.decl_printable_name (node, 1)); @@ -2679,7 +2679,7 @@ print_call_name (pretty_printer *buffer, case ADDR_EXPR: case INDIRECT_REF: - case NOP_EXPR: + CASE_CONVERT: op0 = TREE_OPERAND (op0, 0); goto again; Index: gcc/tree-sra.c =================================================================== --- gcc.orig/tree-sra.c 2009-09-20 22:05:01.000000000 +0200 +++ gcc/tree-sra.c 2009-09-29 15:35:22.000000000 +0200 @@ -3517,7 +3517,7 @@ sra_ipa_modify_expr (tree *expr, gimple_ || TREE_CODE (*expr) == IMAGPART_EXPR || TREE_CODE (*expr) == REALPART_EXPR) expr = &TREE_OPERAND (*expr, 0); - while (TREE_CODE (*expr) == NOP_EXPR + while (CONVERT_EXPR_P (*expr) || TREE_CODE (*expr) == VIEW_CONVERT_EXPR) expr = &TREE_OPERAND (*expr, 0); Index: gcc/tree-ssa-forwprop.c =================================================================== --- gcc.orig/tree-ssa-forwprop.c 2009-09-26 00:47:05.000000000 +0200 +++ gcc/tree-ssa-forwprop.c 2009-09-29 15:36:06.000000000 +0200 @@ -1167,7 +1167,7 @@ simplify_gimple_switch (gimple stmt) def_stmt = SSA_NAME_DEF_STMT (cond); if (is_gimple_assign (def_stmt)) { - if (gimple_assign_rhs_code (def_stmt) == NOP_EXPR) + if (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def_stmt))) { int need_precision; bool fail; Index: gcc/tree-ssa-math-opts.c =================================================================== --- gcc.orig/tree-ssa-math-opts.c 2009-07-01 12:56:16.000000000 +0200 +++ gcc/tree-ssa-math-opts.c 2009-09-29 15:36:39.000000000 +0200 @@ -993,8 +993,7 @@ find_bswap_1 (gimple stmt, struct symbol && code != RSHIFT_EXPR && code != LROTATE_EXPR && code != RROTATE_EXPR - && code != NOP_EXPR - && code != CONVERT_EXPR) + && !CONVERT_EXPR_CODE_P (code)) return NULL_TREE; source_expr1 = find_bswap_1 (rhs1_stmt, n, limit - 1); Index: gcc/tree-ssa-pre.c =================================================================== --- gcc.orig/tree-ssa-pre.c 2009-09-15 15:02:55.000000000 +0200 +++ gcc/tree-ssa-pre.c 2009-09-29 15:37:22.000000000 +0200 @@ -1227,7 +1227,7 @@ do_unary: arg0->op0, arg1 ? arg1->op0 : NULL); if (folded - && TREE_CODE (folded) == NOP_EXPR) + && CONVERT_EXPR_P (folded)) folded = TREE_OPERAND (folded, 0); if (folded && is_gimple_min_invariant (folded)) Index: gcc/tree-vect-generic.c =================================================================== --- gcc.orig/tree-vect-generic.c 2009-07-01 12:56:16.000000000 +0200 +++ gcc/tree-vect-generic.c 2009-09-29 15:37:56.000000000 +0200 @@ -417,14 +417,12 @@ expand_vector_operations_1 (gimple_stmt_ if (TREE_CODE (type) != VECTOR_TYPE) return; - if (code == NOP_EXPR + if (CONVERT_EXPR_CODE_P (code) || code == FLOAT_EXPR || code == FIX_TRUNC_EXPR || code == VIEW_CONVERT_EXPR) return; - gcc_assert (code != CONVERT_EXPR); - /* The signedness is determined from input argument. */ if (code == VEC_UNPACK_FLOAT_HI_EXPR || code == VEC_UNPACK_FLOAT_LO_EXPR) Index: gcc/tree-vect-patterns.c =================================================================== --- gcc.orig/tree-vect-patterns.c 2009-08-19 09:04:09.000000000 +0200 +++ gcc/tree-vect-patterns.c 2009-09-29 15:38:21.000000000 +0200 @@ -91,7 +91,7 @@ widened_name_p (tree name, gimple use_st if (!is_gimple_assign (*def_stmt)) return false; - if (gimple_assign_rhs_code (*def_stmt) != NOP_EXPR) + if (! CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (*def_stmt))) return false; oprnd0 = gimple_assign_rhs1 (*def_stmt); Index: gcc/tree-vrp.c =================================================================== --- gcc.orig/tree-vrp.c 2009-09-24 14:54:13.000000000 +0200 +++ gcc/tree-vrp.c 2009-09-29 15:41:01.000000000 +0200 @@ -1399,7 +1399,7 @@ extract_range_from_assert (value_range_t /* Find VAR in the ASSERT_EXPR conditional. */ if (var == TREE_OPERAND (cond, 0) || TREE_CODE (TREE_OPERAND (cond, 0)) == PLUS_EXPR - || TREE_CODE (TREE_OPERAND (cond, 0)) == NOP_EXPR) + || CONVERT_EXPR_P (TREE_OPERAND (cond, 0))) { /* If the predicate is of the form VAR COMP LIMIT, then we just take LIMIT from the RHS and use the same comparison code. */ @@ -1461,7 +1461,7 @@ extract_range_from_assert (value_range_t as well build the range [b_4, +INF] for it. One special case we handle is extracting a range from a range test encoded as (unsigned)var + CST <= limit. */ - if (TREE_CODE (cond) == NOP_EXPR + if (CONVERT_EXPR_P (cond) || TREE_CODE (cond) == PLUS_EXPR) { if (TREE_CODE (cond) == PLUS_EXPR) @@ -4680,7 +4680,8 @@ find_assert_locations_1 (basic_block bb, gimple def_stmt = SSA_NAME_DEF_STMT (t); while (is_gimple_assign (def_stmt) - && gimple_assign_rhs_code (def_stmt) == NOP_EXPR + && CONVERT_EXPR_CODE_P + (gimple_assign_rhs_code (def_stmt)) && TREE_CODE (gimple_assign_rhs1 (def_stmt)) == SSA_NAME && POINTER_TYPE_P Index: gcc/tree.c =================================================================== --- gcc.orig/tree.c 2009-09-28 17:47:20.000000000 +0200 +++ gcc/tree.c 2009-09-29 15:45:30.000000000 +0200 @@ -3547,7 +3547,7 @@ build1_stat (enum tree_code code, tree t #endif tree t; - if (code == CONVERT_EXPR) + if (0 && code == CONVERT_EXPR) code = NOP_EXPR; #ifdef GATHER_STATISTICS @@ -7593,7 +7593,7 @@ get_narrower (tree op, int *unsignedp_pt tree win = op; int typekind = kind_of_type (TREE_TYPE (op)); - while (TREE_CODE (op) == NOP_EXPR) + while (CONVERT_EXPR_P (op)) { int bitschange = (TYPE_PRECISION (TREE_TYPE (op)) Index: gcc/varasm.c =================================================================== --- gcc.orig/varasm.c 2009-09-24 14:54:14.000000000 +0200 +++ gcc/varasm.c 2009-09-29 15:42:00.000000000 +0200 @@ -4449,7 +4449,7 @@ output_constant (tree exp, unsigned HOST to the address of some declaration somewhere. If the target says the mode is valid for pointers, assume the target has a way of resolving it. */ - if (TREE_CODE (exp) == NOP_EXPR + if (CONVERT_EXPR_P (exp) && POINTER_TYPE_P (TREE_TYPE (exp)) && targetm.valid_pointer_mode (TYPE_MODE (TREE_TYPE (exp)))) { @@ -4457,7 +4457,7 @@ output_constant (tree exp, unsigned HOST /* Peel off any intermediate conversions-to-pointer for valid pointer modes. */ - while (TREE_CODE (exp) == NOP_EXPR + while (CONVERT_EXPR_P (exp) && POINTER_TYPE_P (TREE_TYPE (exp)) && targetm.valid_pointer_mode (TYPE_MODE (TREE_TYPE (exp)))) exp = TREE_OPERAND (exp, 0);