Browse Source

[analyzer] avoid dead blocks in try/catch

Simon Krajewski 9 years ago
parent
commit
4cb7214fe5
1 changed files with 3 additions and 3 deletions
  1. 3 3
      src/optimization/analyzer.ml

+ 3 - 3
src/optimization/analyzer.ml

@@ -1392,7 +1392,7 @@ module TexprTransformer = struct
 				close();
 				close();
 				scope();
 				scope();
 				let bb_next = create_node BKNormal bb_try bb.bb_type bb.bb_pos in
 				let bb_next = create_node BKNormal bb_try bb.bb_type bb.bb_pos in
-				add_cfg_edge g bb_try_next bb_next CFGGoto;
+				if bb_try_next != g.g_unreachable then add_cfg_edge g bb_try_next bb_next CFGGoto;
 				close_node g bb_try_next;
 				close_node g bb_try_next;
 				if bb_exc.bb_incoming = [] then
 				if bb_exc.bb_incoming = [] then
 					set_syntax_edge g bb (SESubBlock(bb_try,bb_next))
 					set_syntax_edge g bb (SESubBlock(bb_try,bb_next))
@@ -1405,7 +1405,7 @@ module TexprTransformer = struct
 						add_cfg_edge g bb_exc bb_catch CFGGoto;
 						add_cfg_edge g bb_exc bb_catch CFGGoto;
 						let bb_catch_next = block bb_catch e in
 						let bb_catch_next = block bb_catch e in
 						scope();
 						scope();
-						add_cfg_edge g bb_catch_next bb_next CFGGoto;
+						if bb_catch_next != g.g_unreachable then add_cfg_edge g bb_catch_next bb_next CFGGoto;
 						close_node g bb_catch_next;
 						close_node g bb_catch_next;
 						v,bb_catch
 						v,bb_catch
 					) catches in
 					) catches in
@@ -1413,7 +1413,7 @@ module TexprTransformer = struct
 				end;
 				end;
 				close_node g bb_exc;
 				close_node g bb_exc;
 				close_node g bb;
 				close_node g bb;
-				bb_next
+				if bb_next.bb_incoming = [] then g.g_unreachable else bb_next
 			(* control flow *)
 			(* control flow *)
 			| TReturn None ->
 			| TReturn None ->
 				add_cfg_edge g bb bb_exit CFGGoto;
 				add_cfg_edge g bb bb_exit CFGGoto;