summaryrefslogtreecommitdiff
path: root/src/jib
diff options
context:
space:
mode:
authorAlasdair Armstrong2019-03-19 17:06:48 +0000
committerAlasdair Armstrong2019-03-19 17:11:54 +0000
commitc7e5eae97e75036d700ba437a5c295c6fb3874a4 (patch)
tree8057878d548a6f843d62121ef762ca478c6f89b0 /src/jib
parent3f08b437b3b794cf89bde54fdb2e620534793f4d (diff)
C: Some simplification
Remove unused experimental optimizations
Diffstat (limited to 'src/jib')
-rw-r--r--src/jib/c_backend.ml66
-rw-r--r--src/jib/c_backend.mli1
-rw-r--r--src/jib/jib_compile.ml2
-rw-r--r--src/jib/jib_optimize.ml15
-rw-r--r--src/jib/jib_util.ml17
5 files changed, 7 insertions, 94 deletions
diff --git a/src/jib/c_backend.ml b/src/jib/c_backend.ml
index 301006d4..4d6db514 100644
--- a/src/jib/c_backend.ml
+++ b/src/jib/c_backend.ml
@@ -86,7 +86,6 @@ let optimize_primops = ref false
let optimize_hoist_allocations = ref false
let optimize_struct_updates = ref false
let optimize_alias = ref false
-let optimize_experimental = ref false
let c_debug str =
if !c_verbosity > 0 then prerr_endline (Lazy.force str) else ()
@@ -1156,63 +1155,6 @@ let combine_variables =
[CDEF_fundef (function_id, heap_return, args, opt body)]
| cdef -> [cdef]
-(** hoist_alias looks for patterns like
-
- recreate x; y = x; // no furthner mentions of x
-
- Provided x has a certain type, then we can make y an alias to x
- (denoted in the IR as 'alias y = x'). This only works if y also has
- a lifespan that also spans the entire function body. It's possible
- we may need to do a more thorough lifetime evaluation to get this
- to be 100% correct - so it's behind the -Oexperimental flag
- for now. Some benchmarking shows that this kind of optimization
- is very valuable however! *)
-let hoist_alias =
- (* Must return true for a subset of the types hoist_ctyp would return true for. *)
- let is_struct = function
- | CT_struct _ -> true
- | _ -> false
- in
- let pattern heap_return id ctyp instrs =
- let rec scan instrs =
- match instrs with
- (* The only thing that has a longer lifetime than id is the
- function return, so we want to make sure we avoid that
- case. *)
- | (I_aux (I_copy (clexp, (F_id id', ctyp')), aux) as instr) :: instrs
- when not (NameSet.mem heap_return (instr_writes instr)) && Name.compare id id' = 0
- && ctyp_equal (clexp_ctyp clexp) ctyp && ctyp_equal ctyp ctyp' ->
- if List.exists (NameSet.mem id) (List.map instr_ids instrs) then
- instr :: scan instrs
- else
- I_aux (I_alias (clexp, (F_id id', ctyp')), aux) :: instrs
-
- | instr :: instrs -> instr :: scan instrs
- | [] -> []
- in
- scan instrs
- in
- let optimize heap_return =
- let rec opt = function
- | (I_aux (I_reset (ctyp, id), _) as instr) :: instrs when not (is_stack_ctyp ctyp) && is_struct ctyp ->
- instr :: opt (pattern heap_return id ctyp instrs)
-
- | I_aux (I_block block, aux) :: instrs -> I_aux (I_block (opt block), aux) :: opt instrs
- | I_aux (I_try_block block, aux) :: instrs -> I_aux (I_try_block (opt block), aux) :: opt instrs
- | I_aux (I_if (cval, then_instrs, else_instrs, ctyp), aux) :: instrs ->
- I_aux (I_if (cval, opt then_instrs, opt else_instrs, ctyp), aux) :: opt instrs
-
- | instr :: instrs ->
- instr :: opt instrs
- | [] -> []
- in
- opt
- in
- function
- | CDEF_fundef (function_id, Some heap_return, args, body) ->
- [CDEF_fundef (function_id, Some heap_return, args, optimize (name heap_return) body)]
- | cdef -> [cdef]
-
let concatMap f xs = List.concat (List.map f xs)
let optimize recursive_functions cdefs =
@@ -1223,7 +1165,6 @@ let optimize recursive_functions cdefs =
|> (if !optimize_alias then concatMap combine_variables else nothing)
(* We need the runtime to initialize hoisted allocations *)
|> (if !optimize_hoist_allocations && not !opt_no_rts then concatMap (hoist_allocations recursive_functions) else nothing)
- |> (if !optimize_hoist_allocations && !optimize_experimental then concatMap hoist_alias else nothing)
(**************************************************************************)
(* 6. Code generation *)
@@ -1361,9 +1302,6 @@ let rec codegen_instr fid ctx (I_aux (instr, (_, l))) =
| I_copy (clexp, cval) -> codegen_conversion l clexp cval
- | I_alias (clexp, cval) ->
- ksprintf string " %s = %s;" (sgen_clexp_pure clexp) (sgen_cval cval)
-
| I_jump (cval, label) ->
ksprintf string " if (%s) goto %s;" (sgen_cval cval) label
@@ -1445,9 +1383,7 @@ let rec codegen_instr fid ctx (I_aux (instr, (_, l))) =
| "undefined_vector", _ -> Printf.sprintf "UNDEFINED(vector_%s)" (sgen_ctyp_name ctyp)
| fname, _ -> fname
in
- if fname = "sail_assert" && !optimize_experimental then
- empty
- else if fname = "reg_deref" then
+ if fname = "reg_deref" then
if is_stack_ctyp ctyp then
string (Printf.sprintf " %s = *(%s);" (sgen_clexp_pure x) c_args)
else
diff --git a/src/jib/c_backend.mli b/src/jib/c_backend.mli
index 7314eb5a..3e8c426b 100644
--- a/src/jib/c_backend.mli
+++ b/src/jib/c_backend.mli
@@ -100,7 +100,6 @@ val optimize_primops : bool ref
val optimize_hoist_allocations : bool ref
val optimize_struct_updates : bool ref
val optimize_alias : bool ref
-val optimize_experimental : bool ref
(** Convert a typ to a IR ctyp *)
val ctyp_of_typ : Jib_compile.ctx -> Ast.typ -> ctyp
diff --git a/src/jib/jib_compile.ml b/src/jib/jib_compile.ml
index 85a77d2e..87e0b050 100644
--- a/src/jib/jib_compile.ml
+++ b/src/jib/jib_compile.ml
@@ -964,7 +964,7 @@ let rec map_try_block f (I_aux (instr, aux)) =
| I_decl _ | I_reset _ | I_init _ | I_reinit _ -> instr
| I_if (cval, instrs1, instrs2, ctyp) ->
I_if (cval, List.map (map_try_block f) instrs1, List.map (map_try_block f) instrs2, ctyp)
- | I_funcall _ | I_copy _ | I_alias _ | I_clear _ | I_throw _ | I_return _ -> instr
+ | I_funcall _ | I_copy _ | I_clear _ | I_throw _ | I_return _ -> instr
| I_block instrs -> I_block (List.map (map_try_block f) instrs)
| I_try_block instrs -> I_try_block (f (List.map (map_try_block f) instrs))
| I_comment _ | I_label _ | I_goto _ | I_raw _ | I_jump _ | I_match_failure | I_undefined _ | I_end -> instr
diff --git a/src/jib/jib_optimize.ml b/src/jib/jib_optimize.ml
index 4e24315c..d2b7d908 100644
--- a/src/jib/jib_optimize.ml
+++ b/src/jib/jib_optimize.ml
@@ -71,12 +71,6 @@ let optimize_unit instrs =
I_aux (I_copy (CL_void, unit_cval cval), annot)
| _ -> instr
end
- | I_aux (I_alias (clexp, cval), annot) as instr ->
- begin match clexp_ctyp clexp with
- | CT_unit ->
- I_aux (I_alias (CL_void, unit_cval cval), annot)
- | _ -> instr
- end
| instr -> instr
in
let non_pointless_copy (I_aux (aux, annot)) =
@@ -136,19 +130,14 @@ let unique_per_function_ids cdefs =
let rec unique_instrs i = function
| I_aux (I_decl (ctyp, id), aux) :: rest ->
I_aux (I_decl (ctyp, unique_id i id), aux) :: unique_instrs i (instrs_rename id (unique_id i id) rest)
-
| I_aux (I_init (ctyp, id, cval), aux) :: rest ->
I_aux (I_init (ctyp, unique_id i id, cval), aux) :: unique_instrs i (instrs_rename id (unique_id i id) rest)
-
| I_aux (I_block instrs, aux) :: rest ->
I_aux (I_block (unique_instrs i instrs), aux) :: unique_instrs i rest
-
| I_aux (I_try_block instrs, aux) :: rest ->
I_aux (I_try_block (unique_instrs i instrs), aux) :: unique_instrs i rest
-
| I_aux (I_if (cval, then_instrs, else_instrs, ctyp), aux) :: rest ->
I_aux (I_if (cval, unique_instrs i then_instrs, unique_instrs i else_instrs, ctyp), aux) :: unique_instrs i rest
-
| instr :: instrs -> instr :: unique_instrs i instrs
| [] -> []
in
@@ -214,7 +203,6 @@ let rec instrs_subst id subst =
| I_return cval -> I_return cval
| I_reset (ctyp, id') -> I_reset (ctyp, id')
| I_reinit (ctyp, id', cval) -> I_reinit (ctyp, id', cval_subst id subst cval)
- | I_alias (clexp, cval) -> I_alias (clexp, cval_subst id subst cval)
in
I_aux (instr, aux) :: instrs
@@ -246,13 +234,12 @@ let inline cdefs should_inline instrs =
I_aux (I_funcall (clexp_subst return subst clexp, extern, fid, args), aux)
| I_aux (I_copy (clexp, cval), aux) ->
I_aux (I_copy (clexp_subst return subst clexp, cval), aux)
- | I_aux (I_alias (clexp, cval), aux) ->
- I_aux (I_alias (clexp_subst return subst clexp, cval), aux)
| instr -> instr
in
let replace_end label = function
| I_aux (I_end, aux) -> I_aux (I_goto label, aux)
+ | I_aux (I_undefined _, aux) -> I_aux (I_goto label, aux)
| instr -> instr
in
diff --git a/src/jib/jib_util.ml b/src/jib/jib_util.ml
index 22b983ff..99de19ef 100644
--- a/src/jib/jib_util.ml
+++ b/src/jib/jib_util.ml
@@ -88,9 +88,6 @@ let icall ?loc:(l=Parse_ast.Unknown) clexp extern id cvals =
let icopy l clexp cval =
I_aux (I_copy (clexp, cval), (instr_number (), l))
-let ialias l clexp cval =
- I_aux (I_alias (clexp, cval), (instr_number (), l))
-
let iclear ?loc:(l=Parse_ast.Unknown) ctyp id =
I_aux (I_clear (ctyp, id), (instr_number (), l))
@@ -205,7 +202,6 @@ let rec instr_rename from_id to_id (I_aux (instr, aux)) =
I_funcall (clexp_rename from_id to_id clexp, extern, id, List.map (cval_rename from_id to_id) args)
| I_copy (clexp, cval) -> I_copy (clexp_rename from_id to_id clexp, cval_rename from_id to_id cval)
- | I_alias (clexp, cval) -> I_alias (clexp_rename from_id to_id clexp, cval_rename from_id to_id cval)
| I_clear (ctyp, id) when Name.compare id from_id = 0 -> I_clear (ctyp, to_id)
| I_clear (ctyp, id) -> I_clear (ctyp, id)
@@ -553,8 +549,6 @@ let rec pp_instr ?short:(short=false) (I_aux (instr, aux)) =
string (string_of_id f |> Util.green |> Util.clear) ^^ parens (separate_map (string ", ") pp_cval args) ]
| I_copy (clexp, cval) ->
separate space [pp_clexp clexp; string "="; pp_cval cval]
- | I_alias (clexp, cval) ->
- pp_keyword "alias" ^^ separate space [pp_clexp clexp; string "="; pp_cval cval]
| I_clear (ctyp, id) ->
pp_keyword "kill" ^^ pp_name id ^^ string " : " ^^ pp_ctyp ctyp
| I_return cval ->
@@ -644,7 +638,6 @@ let instr_deps = function
| I_jump (cval, label) -> cval_deps cval, NameSet.empty
| I_funcall (clexp, _, _, cvals) -> List.fold_left NameSet.union NameSet.empty (List.map cval_deps cvals), clexp_deps clexp
| I_copy (clexp, cval) -> cval_deps cval, clexp_deps clexp
- | I_alias (clexp, cval) -> cval_deps cval, clexp_deps clexp
| I_clear (_, id) -> NameSet.singleton id, NameSet.empty
| I_throw cval | I_return cval -> cval_deps cval, NameSet.empty
| I_block _ | I_try_block _ -> NameSet.empty, NameSet.empty
@@ -672,7 +665,6 @@ let rec map_instr_ctyp f (I_aux (instr, aux)) =
| I_funcall (clexp, extern, id, cvals) ->
I_funcall (map_clexp_ctyp f clexp, extern, id, List.map (fun (frag, ctyp) -> frag, f ctyp) cvals)
| I_copy (clexp, (frag, ctyp)) -> I_copy (map_clexp_ctyp f clexp, (frag, f ctyp))
- | I_alias (clexp, (frag, ctyp)) -> I_alias (map_clexp_ctyp f clexp, (frag, f ctyp))
| I_clear (ctyp, id) -> I_clear (f ctyp, id)
| I_return (frag, ctyp) -> I_return (frag, f ctyp)
| I_block instrs -> I_block (List.map (map_instr_ctyp f) instrs)
@@ -690,7 +682,7 @@ let rec map_instr_ctyp f (I_aux (instr, aux)) =
let rec map_instr f (I_aux (instr, aux)) =
let instr = match instr with
| I_decl _ | I_init _ | I_reset _ | I_reinit _
- | I_funcall _ | I_copy _ | I_alias _ | I_clear _ | I_jump _ | I_throw _ | I_return _
+ | I_funcall _ | I_copy _ | I_clear _ | I_jump _ | I_throw _ | I_return _
| I_comment _ | I_label _ | I_goto _ | I_raw _ | I_match_failure | I_undefined _ | I_end -> instr
| I_if (cval, instrs1, instrs2, ctyp) ->
I_if (cval, List.map (map_instr f) instrs1, List.map (map_instr f) instrs2, ctyp)
@@ -705,7 +697,7 @@ let rec map_instr f (I_aux (instr, aux)) =
let rec iter_instr f (I_aux (instr, aux)) =
match instr with
| I_decl _ | I_init _ | I_reset _ | I_reinit _
- | I_funcall _ | I_copy _ | I_alias _ | I_clear _ | I_jump _ | I_throw _ | I_return _
+ | I_funcall _ | I_copy _ | I_clear _ | I_jump _ | I_throw _ | I_return _
| I_comment _ | I_label _ | I_goto _ | I_raw _ | I_match_failure | I_undefined _ | I_end -> f (I_aux (instr, aux))
| I_if (cval, instrs1, instrs2, ctyp) ->
List.iter (iter_instr f) instrs1;
@@ -744,7 +736,7 @@ let rec map_instrs f (I_aux (instr, aux)) =
| I_decl _ | I_init _ | I_reset _ | I_reinit _ -> instr
| I_if (cval, instrs1, instrs2, ctyp) ->
I_if (cval, f (List.map (map_instrs f) instrs1), f (List.map (map_instrs f) instrs2), ctyp)
- | I_funcall _ | I_copy _ | I_alias _ | I_clear _ | I_jump _ | I_throw _ | I_return _ -> instr
+ | I_funcall _ | I_copy _ | I_clear _ | I_jump _ | I_throw _ | I_return _ -> instr
| I_block instrs -> I_block (f (List.map (map_instrs f) instrs))
| I_try_block instrs -> I_try_block (f (List.map (map_instrs f) instrs))
| I_comment _ | I_label _ | I_goto _ | I_raw _ | I_match_failure | I_undefined _ | I_end -> instr
@@ -829,7 +821,7 @@ let rec instr_ctyps (I_aux (instr, aux)) =
| I_funcall (clexp, _, _, cvals) ->
List.fold_left (fun m ctyp -> CTSet.add ctyp m) CTSet.empty (List.map cval_ctyp cvals)
|> CTSet.add (clexp_ctyp clexp)
- | I_copy (clexp, cval) | I_alias (clexp, cval) ->
+ | I_copy (clexp, cval) ->
CTSet.add (clexp_ctyp clexp) (CTSet.singleton (cval_ctyp cval))
| I_block instrs | I_try_block instrs ->
instrs_ctyps instrs
@@ -888,7 +880,6 @@ let rec instrs_rename from_id to_id =
| I_aux (I_funcall (clexp, extern, function_id, cvals), aux) :: instrs ->
I_aux (I_funcall (lrename clexp, extern, function_id, List.map crename cvals), aux) :: irename instrs
| I_aux (I_copy (clexp, cval), aux) :: instrs -> I_aux (I_copy (lrename clexp, crename cval), aux) :: irename instrs
- | I_aux (I_alias (clexp, cval), aux) :: instrs -> I_aux (I_alias (lrename clexp, crename cval), aux) :: irename instrs
| I_aux (I_clear (ctyp, id), aux) :: instrs -> I_aux (I_clear (ctyp, rename id), aux) :: irename instrs
| I_aux (I_return cval, aux) :: instrs -> I_aux (I_return (crename cval), aux) :: irename instrs
| I_aux (I_block block, aux) :: instrs -> I_aux (I_block (irename block), aux) :: irename instrs