- skip Confirm and Cast for address calculation
[libfirm] / ir / opt / return.c
index ad417aa..ebfb2f3 100644 (file)
@@ -62,8 +62,9 @@ void normalize_one_return(ir_graph *irg) {
        int i, j, k, n, last_idx, n_rets, n_ret_vals = -1;
        unsigned char *returns;
        ir_node **in, **retvals, **endbl_in;
-
        ir_node *block;
+       int       filter_dbgi   = 0;
+       dbg_info *combined_dbgi = NULL;
 
        /* look, if we have more than one return */
        n = get_Block_n_cfgpreds(endbl);
@@ -79,6 +80,17 @@ void normalize_one_return(ir_graph *irg) {
                ir_node *node = get_Block_cfgpred(endbl, i);
 
                if (is_Return(node)) {
+                       dbg_info *dbgi = get_irn_dbg_info(node);
+
+                       if (dbgi != NULL && dbgi != combined_dbgi) {
+                               if (filter_dbgi) {
+                                       combined_dbgi = NULL;
+                               } else {
+                                       combined_dbgi = dbgi;
+                                       filter_dbgi   = 1;
+                               }
+                       }
+
                        ++n_rets;
 
                        set_bit(i);
@@ -140,7 +152,7 @@ void normalize_one_return(ir_graph *irg) {
                        in[i] = new_r_Phi(irg, block, n_rets, &retvals[j], get_irn_mode(retvals[j]));
        }
 
-       endbl_in[last_idx++] = new_r_Return(irg, block, in[0], n_ret_vals-1, &in[1]);
+       endbl_in[last_idx++] = new_rd_Return(combined_dbgi, irg, block, in[0], n_ret_vals-1, &in[1]);
 
        set_irn_in(endbl, last_idx, endbl_in);
 
@@ -186,7 +198,8 @@ static int can_move_ret(ir_node *ret) {
 
        /* check, that predecessors are Jmps */
        n = get_Block_n_cfgpreds(retbl);
-       if (n <= 1)
+       /* we cannot move above a labeled block, as this might kill the block */
+       if (n <= 1 || has_Block_label(retbl))
                return 0;
        for (i = 0; i < n; ++i) {
                ir_node *pred = get_Block_cfgpred(retbl, i);
@@ -269,9 +282,10 @@ void normalize_n_returns(ir_graph *irg) {
        n_ret_vals = get_irn_arity(list);
        in         = ALLOCAN(ir_node*, n_ret_vals);
        while (list) {
-               ir_node *ret   = list;
-               ir_node *block = get_nodes_block(ret);
-               ir_node *phiM;
+               ir_node  *ret   = list;
+               ir_node  *block = get_nodes_block(ret);
+               dbg_info *dbgi  = get_irn_dbg_info(ret);
+               ir_node  *phiM;
 
                list = get_irn_link(ret);
                --n_rets;
@@ -294,7 +308,7 @@ void normalize_n_returns(ir_graph *irg) {
                                in[j] = (is_Phi(pred) && get_nodes_block(pred) == block) ? get_Phi_pred(pred, i) : pred;
                        }
 
-                       new_ret = new_r_Return(irg, new_bl, in[0], n_ret_vals - 1, &in[1]);
+                       new_ret = new_rd_Return(dbgi, irg, new_bl, in[0], n_ret_vals - 1, &in[1]);
 
                        if (! is_Bad(new_ret)) {
                                /*