Browse Source

[hl] optimize out null checks on packed fields

Nicolas Cannasse 3 years ago
parent
commit
1f8b854682
1 changed files with 19 additions and 0 deletions
  1. 19 0
      src/generators/hlopt.ml

+ 19 - 0
src/generators/hlopt.ml

@@ -746,6 +746,18 @@ let _optimize (f:fundecl) =
 		r.ralias <- r;
 		r
 	) in
+
+	let is_packed_field o fid =
+		match f.regs.(o) with
+		| HStruct p | HObj p ->
+			let ft = (try snd (resolve_field p fid) with Not_found -> assert false) in
+			(match ft with
+			| HPacked _ -> true
+			| _ -> false)
+		| _ ->
+			false
+	in
+
 (*
 	let print_state i s =
 		let state_str s =
@@ -856,6 +868,13 @@ let _optimize (f:fundecl) =
 				do_read o;
 				do_write v;
 				state.(v).rnullcheck <- state.(o).rnullcheck
+			| OField (r,o,fid) when (match f.regs.(r) with HStruct _ -> true | _ -> false) ->
+				do_read o;
+				do_write r;
+				if is_packed_field o fid then state.(r).rnullcheck <- true;
+			| OGetThis (r,fid) when (match f.regs.(r) with HStruct _ -> true | _ -> false) ->
+				do_write r;
+				if is_packed_field 0 fid then state.(r).rnullcheck <- true;
 			| _ ->
 				opcode_fx (fun r read ->
 					if read then do_read r else do_write r