A newly created Return may be bad due to dead block. Handle that case.
authorMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Tue, 22 Mar 2005 13:21:50 +0000 (13:21 +0000)
committerMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Tue, 22 Mar 2005 13:21:50 +0000 (13:21 +0000)
[r5447]

ir/opt/return.c

index cc10e1d..ad66d18 100644 (file)
@@ -251,15 +251,24 @@ void normalize_n_returns(ir_graph *irg)
 
       new_ret = new_r_Return(irg, new_bl, in[0], n_ret_vals - 1, &in[1]);
 
-      if (can_move_ret(new_ret)) {
-        set_irn_link(new_ret, list);
-        list = new_ret;
-        ++n_rets;
-      }
-      else {
-        set_irn_link(new_ret, final);
-        final = new_ret;
-        ++n_finals;
+      if (! is_Bad(new_ret)) {
+        /*
+         * The newly created node might be bad, if we
+         * create it in a block with only Bad predecessors.
+         * In that case ignore this block.
+         *
+         * We could even kill the jmp then ...
+         */
+        if (can_move_ret(new_ret)) {
+          set_irn_link(new_ret, list);
+          list = new_ret;
+          ++n_rets;
+        }
+        else {
+          set_irn_link(new_ret, final);
+          final = new_ret;
+          ++n_finals;
+        }
       }
     }