Преглед на файлове

support loop unrolling for `for (i in [1, 2, 3])` (see #3784)

Simon Krajewski преди 10 години
родител
ревизия
b9010e7321
променени са 2 файла, в които са добавени 40 реда и са изтрити 1 реда
  1. 14 0
      optimizer.ml
  2. 26 1
      tests/optimization/src/TestLocalDce.hx

+ 14 - 0
optimizer.ml

@@ -665,6 +665,20 @@ let rec optimize_for_loop ctx (i,pi) e1 e2 p =
 					NormalWhile
 				)) t_void p;
 			])
+	| TArrayDecl el, TInst({ cl_path = [],"Array" },[pt]) ->
+		begin try
+			let v = add_local ctx i pt in
+			let e2 = type_expr ctx e2 NoValue in
+			let eloc = mk (TLocal v) v.v_type p in
+			let el = List.map (fun e ->
+				let e_assign = mk (TBinop(OpAssign,eloc,e)) e.etype e.epos in
+				concat e_assign e2
+			) el in
+			let ev = mk (TVar(v, None)) ctx.t.tvoid p in
+			Some (mk (TBlock (ev :: el)) ctx.t.tvoid p)
+		with Exit ->
+			gen_int_iter pt get_next_array_element get_array_length
+		end
 	| _ , TInst({ cl_path = [],"Array" },[pt])
 	| _ , TInst({ cl_path = ["flash"],"Vector" },[pt]) ->
 		gen_int_iter pt get_next_array_element get_array_length

+ 26 - 1
tests/optimization/src/TestLocalDce.hx

@@ -128,5 +128,30 @@ class TestLocalDce {
 		trace(s);
 	}
 
-	static function keep(v) { return v; }
+	@:js('
+		var s = TestLocalDce.keep(1);
+		s += 0;
+		s += 6;
+		s += 8;
+		console.log(s);
+	')
+	static function testLoopUnroll() {
+		var s = keep(1);
+		for (i in [0, 3, 4]) {
+			s += i * 2;
+		}
+		trace(s);
+	}
+
+	@:js('console.log(5.);')
+	static function testLoopUnrollDavid() {
+		var s = 0.0;
+		inline function foo(r)
+			return 2.0 + r;
+		for ( r in [0.0,1.0] )
+			s+=foo(r);
+		trace(s);
+	}
+
+	static function keep(v:Dynamic) { return v; }
 }