diff options
Diffstat (limited to 'gcc/tree-cfg.c')
-rw-r--r-- | gcc/tree-cfg.c | 79 |
1 files changed, 60 insertions, 19 deletions
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index bdbff33fdea..e4733a2012f 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -314,8 +314,8 @@ factor_computed_gotos (void) } /* Copy the original computed goto's destination into VAR. */ - assignment = build2 (MODIFY_EXPR, ptr_type_node, - var, GOTO_DESTINATION (last)); + assignment = build2_gimple (GIMPLE_MODIFY_STMT, + var, GOTO_DESTINATION (last)); bsi_insert_before (&bsi, assignment, BSI_SAME_STMT); /* And re-vector the computed goto to the new destination. */ @@ -501,11 +501,14 @@ make_edges (void) break; case MODIFY_EXPR: + gcc_unreachable (); + + case GIMPLE_MODIFY_STMT: if (is_ctrl_altering_stmt (last)) { - /* A MODIFY_EXPR may have a CALL_EXPR on its RHS and the - CALL_EXPR may have an abnormal edge. Search the RHS for - this case and create any required edges. */ + /* A GIMPLE_MODIFY_STMT may have a CALL_EXPR on its RHS and + the CALL_EXPR may have an abnormal edge. Search the RHS + for this case and create any required edges. */ if (tree_can_make_abnormal_goto (last)) make_abnormal_goto_edges (bb, true); @@ -1330,7 +1333,7 @@ tree_merge_blocks (basic_block a, basic_block b) with ordering of phi nodes. This is because A is the single predecessor of B, therefore results of the phi nodes cannot appear as arguments of the phi nodes. */ - copy = build2 (MODIFY_EXPR, void_type_node, def, use); + copy = build2_gimple (GIMPLE_MODIFY_STMT, def, use); bsi_insert_after (&bsi, copy, BSI_NEW_STMT); SET_PHI_RESULT (phi, NULL_TREE); SSA_NAME_DEF_STMT (def) = copy; @@ -1559,9 +1562,9 @@ remove_useless_stmts_cond (tree *stmt_p, struct rus_data *data) else if (TREE_CODE (cond) == VAR_DECL || TREE_CODE (cond) == PARM_DECL) { if (else_stmt - && TREE_CODE (else_stmt) == MODIFY_EXPR - && TREE_OPERAND (else_stmt, 0) == cond - && integer_zerop (TREE_OPERAND (else_stmt, 1))) + && TREE_CODE (else_stmt) == GIMPLE_MODIFY_STMT + && GIMPLE_STMT_OPERAND (else_stmt, 0) == cond + && integer_zerop (GIMPLE_STMT_OPERAND (else_stmt, 1))) COND_EXPR_ELSE (*stmt_p) = alloc_stmt_list (); } else if ((TREE_CODE (cond) == EQ_EXPR || TREE_CODE (cond) == NE_EXPR) @@ -1576,9 +1579,9 @@ remove_useless_stmts_cond (tree *stmt_p, struct rus_data *data) : &COND_EXPR_ELSE (*stmt_p)); if (stmt - && TREE_CODE (stmt) == MODIFY_EXPR - && TREE_OPERAND (stmt, 0) == TREE_OPERAND (cond, 0) - && TREE_OPERAND (stmt, 1) == TREE_OPERAND (cond, 1)) + && TREE_CODE (stmt) == GIMPLE_MODIFY_STMT + && GIMPLE_STMT_OPERAND (stmt, 0) == TREE_OPERAND (cond, 0) + && GIMPLE_STMT_OPERAND (stmt, 1) == TREE_OPERAND (cond, 1)) *location = alloc_stmt_list (); } } @@ -1871,6 +1874,9 @@ remove_useless_stmts_1 (tree *tp, struct rus_data *data) break; case MODIFY_EXPR: + gcc_unreachable (); + + case GIMPLE_MODIFY_STMT: data->last_goto = NULL; fold_stmt (tp); op = get_call_expr_in (t); @@ -2508,8 +2514,8 @@ tree_can_make_abnormal_goto (tree t) { if (computed_goto_p (t)) return true; - if (TREE_CODE (t) == MODIFY_EXPR) - t = TREE_OPERAND (t, 1); + if (TREE_CODE (t) == GIMPLE_MODIFY_STMT) + t = GIMPLE_STMT_OPERAND (t, 1); if (TREE_CODE (t) == WITH_SIZE_EXPR) t = TREE_OPERAND (t, 0); if (TREE_CODE (t) == CALL_EXPR) @@ -3011,9 +3017,9 @@ tree_find_edge_insert_loc (edge e, block_stmt_iterator *bsi, tree op = TREE_OPERAND (tmp, 0); if (op && !is_gimple_val (op)) { - gcc_assert (TREE_CODE (op) == MODIFY_EXPR); + gcc_assert (TREE_CODE (op) == GIMPLE_MODIFY_STMT); bsi_insert_before (bsi, op, BSI_NEW_STMT); - TREE_OPERAND (tmp, 0) = TREE_OPERAND (op, 0); + TREE_OPERAND (tmp, 0) = GIMPLE_STMT_OPERAND (op, 0); } bsi_prev (bsi); return true; @@ -3232,7 +3238,10 @@ verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED) break; case MODIFY_EXPR: - x = TREE_OPERAND (t, 0); + gcc_unreachable (); + + case GIMPLE_MODIFY_STMT: + x = GIMPLE_STMT_OPERAND (t, 0); if (TREE_CODE (x) == BIT_FIELD_REF && is_gimple_reg (TREE_OPERAND (x, 0))) { @@ -3536,6 +3545,35 @@ verify_node_sharing (tree * tp, int *walk_subtrees, void *data) } +/* Helper function for verify_gimple_tuples. */ + +static tree +verify_gimple_tuples_1 (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED, + void *data ATTRIBUTE_UNUSED) +{ + switch (TREE_CODE (*tp)) + { + case MODIFY_EXPR: + error ("unexpected non-tuple"); + debug_tree (*tp); + gcc_unreachable (); + return NULL_TREE; + + default: + return NULL_TREE; + } +} + +/* Verify that there are no trees that should have been converted to + gimple tuples. Return true if T contains a node that should have + been converted to a gimple tuple, but hasn't. */ + +static bool +verify_gimple_tuples (tree t) +{ + return walk_tree (&t, verify_gimple_tuples_1, NULL, NULL) != NULL; +} + /* Verify the GIMPLE statement chain. */ void @@ -3604,6 +3642,8 @@ verify_stmts (void) { tree stmt = bsi_stmt (bsi); + err |= verify_gimple_tuples (stmt); + if (bb_for_stmt (stmt) != bb) { error ("bb_for_stmt (stmt) is set to a wrong basic block"); @@ -4570,7 +4610,8 @@ move_stmt_r (tree *tp, int *walk_subtrees, void *data) struct move_stmt_d *p = (struct move_stmt_d *) data; tree t = *tp; - if (p->block && IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (t)))) + if (p->block + && (EXPR_P (t) || GIMPLE_STMT_P (t))) TREE_BLOCK (t) = p->block; if (OMP_DIRECTIVE_P (t) @@ -5638,7 +5679,7 @@ gimplify_val (block_stmt_iterator *bsi, tree type, tree exp) return exp; t = make_rename_temp (type, NULL); - new_stmt = build2 (MODIFY_EXPR, type, t, exp); + new_stmt = build2_gimple (GIMPLE_MODIFY_STMT, t, exp); orig_stmt = bsi_stmt (*bsi); SET_EXPR_LOCUS (new_stmt, EXPR_LOCUS (orig_stmt)); |