Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 30 additions & 15 deletions asmcomp/debug/compute_ranges.ml
Original file line number Diff line number Diff line change
Expand Up @@ -241,32 +241,47 @@ module Make (S : Compute_ranges_intf.S_functor) = struct
| None -> KS.empty
| Some prev_insn -> S.available_across prev_insn
in
let exactly_one ~is_in ~is_out1 ~is_out2 =
KS.diff (KS.diff is_in is_out1) is_out2
in
let exactly_two ~is_in1 ~is_in2 ~is_out =
KS.diff (KS.inter is_in1 is_in2) is_out
in
let case_1b =
KS.diff
(KS.diff available_across available_before)
opt_available_across_prev_insn
exactly_one
~is_in: available_across
~is_out1:available_before
~is_out2:opt_available_across_prev_insn
in
let case_1c =
KS.diff
(KS.diff available_before available_across)
opt_available_across_prev_insn
exactly_one
~is_out1:available_across
~is_in: available_before
~is_out2:opt_available_across_prev_insn
in
let case_1d =
KS.diff (KS.inter available_before available_across)
opt_available_across_prev_insn
exactly_two
~is_in1: available_across
~is_in2: available_before
~is_out: opt_available_across_prev_insn
in
let case_2a =
KS.inter
(KS.diff opt_available_across_prev_insn available_before)
(KS.diff opt_available_across_prev_insn available_across)
exactly_one
~is_out1:available_across
~is_out2:available_before
~is_in: opt_available_across_prev_insn
in
let case_2b =
KS.inter opt_available_across_prev_insn
(KS.diff available_across available_before)
exactly_two
~is_in1: available_across
~is_out: available_before
~is_in2: opt_available_across_prev_insn
in
let case_2c =
KS.inter opt_available_across_prev_insn
(KS.diff available_before available_across)
exactly_two
~is_out: available_across
~is_in1: available_before
~is_in2: opt_available_across_prev_insn
in
let handle case action result =
(* We use [K.all_parents] here to circumvent a potential performance
Expand Down
19 changes: 18 additions & 1 deletion asmcomp/debug/reg_with_debug_info.ml
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,13 @@ module Canonical_availability_map = struct
end

(* [diff] and [inter], by construction, preserve the canonical form. *)
(* [Compute_ranges] expects the [diff] and [inter] functions to satisfy
the usual axioms of set theory. Here we will consider elements of
type t to be representing sets of pairs (register, debug_info),
which means that the function [Availability_map.inter] is not
suitable for that purpose (it merges registers with different debug info).
Because of the representation as maps, we could not define a [union]
function, but fortunately this isn't necessary for [Compute_ranges]. *)

let diff t1 t2 =
let t =
Expand All @@ -367,7 +374,17 @@ module Canonical_availability_map = struct
t

let inter t1 t2 =
let t = Availability_map.inter t1 t2 in
let t =
Reg.Map.filter (fun reg debug_info_t1 ->
let occurs_in_t2 =
match Reg.Map.find reg t2 with
| exception Not_found -> false
| debug_info_t2 ->
Option.equal Debug_info.equal debug_info_t1 debug_info_t2
in
occurs_in_t2)
t1
in
invariant t;
t

Expand Down