Bladeren bron

[analyzer] support some local DCE during fusion

Simon Krajewski 9 jaren geleden
bovenliggende
commit
1e83a84e22
2 gewijzigde bestanden met toevoegingen van 26 en 19 verwijderingen
  1. 2 0
      src/generators/genlua.ml
  2. 24 19
      src/optimization/analyzerTexpr.ml

+ 2 - 0
src/generators/genlua.ml

@@ -362,6 +362,8 @@ let rec gen_call ctx e el in_value =
 		spr ctx ")";
 	| TLocal { v_name = "__lua_length__" }, [e]->
 		spr ctx "#"; gen_value ctx e;
+	| TLocal { v_name = "__lua_table__" }, _ when not in_value ->
+		()
 	| TLocal { v_name = "__lua_table__" }, el ->
 		let count = ref 0 in
 		spr ctx "({";

+ 24 - 19
src/optimization/analyzerTexpr.ml

@@ -454,13 +454,34 @@ module Fusion = struct
 	open InterferenceReport
 
 	let apply com config e =
+		let changed = ref false in
+		let var_uses = Hashtbl.create 0 in
+		let var_writes = Hashtbl.create 0 in
+		let get_num_uses v =
+			try Hashtbl.find var_uses v.v_id with Not_found -> 0
+		in
+		let get_num_writes v =
+			try Hashtbl.find var_writes v.v_id with Not_found -> 0
+		in
+		let change map v delta =
+			Hashtbl.replace map v.v_id ((try Hashtbl.find map v.v_id with Not_found -> 0) + delta);
+		in
+		let change_num_uses v delta =
+			change var_uses v delta
+		in
+		let change_num_writes v delta =
+			change var_writes v delta
+		in
 		let rec block_element acc el = match el with
 			| {eexpr = TBinop((OpAssign | OpAssignOp _),_,_) | TUnop((Increment | Decrement),_,_)} as e1 :: el ->
 				block_element (e1 :: acc) el
 			| {eexpr = TLocal _} as e1 :: el when not config.local_dce ->
 				block_element (e1 :: acc) el
+			| {eexpr = TLocal v} :: el ->
+				change_num_uses v (-1);
+				block_element acc el
 			(* no-side-effect *)
-			| {eexpr = TEnumParameter _ | TFunction _ | TConst _ | TTypeExpr _ | TLocal _} :: el ->
+			| {eexpr = TEnumParameter _ | TFunction _ | TConst _ | TTypeExpr _} :: el ->
 				block_element acc el
 			(* no-side-effect composites *)
 			| {eexpr = TParenthesis e1 | TMeta(_,e1) | TCast(e1,None) | TField(e1,_) | TUnop(_,_,e1)} :: el ->
@@ -482,24 +503,6 @@ module Fusion = struct
 			| [] ->
 				acc
 		in
-		let changed = ref false in
-		let var_uses = Hashtbl.create 0 in
-		let var_writes = Hashtbl.create 0 in
-		let get_num_uses v =
-			try Hashtbl.find var_uses v.v_id with Not_found -> 0
-		in
-		let get_num_writes v =
-			try Hashtbl.find var_writes v.v_id with Not_found -> 0
-		in
-		let change map v delta =
-			Hashtbl.replace map v.v_id ((try Hashtbl.find map v.v_id with Not_found -> 0) + delta);
-		in
-		let change_num_uses v delta =
-			change var_uses v delta
-		in
-		let change_num_writes v delta =
-			change var_writes v delta
-		in
 		let rec loop e = match e.eexpr with
 			| TLocal v ->
 				change_num_uses v 1;
@@ -582,6 +585,8 @@ module Fusion = struct
 				with Exit ->
 					fuse (e1 :: acc) (e2 :: el)
 				end
+			| {eexpr = TVar(v1,Some e1)} :: el when config.optimize && config.local_dce && get_num_uses v1 = 0 && get_num_writes v1 = 0 ->
+				fuse acc (e1 :: el)
 			| ({eexpr = TVar(v1,Some e1)} as ev) :: el when can_be_fused v1 e1 ->
 				let found = ref false in
 				let blocked = ref false in