aboutsummaryrefslogtreecommitdiffstats
path: root/backend/Selectionaux.ml
diff options
context:
space:
mode:
Diffstat (limited to 'backend/Selectionaux.ml')
-rw-r--r--backend/Selectionaux.ml17
1 files changed, 13 insertions, 4 deletions
diff --git a/backend/Selectionaux.ml b/backend/Selectionaux.ml
index de8127c6..818660c1 100644
--- a/backend/Selectionaux.ml
+++ b/backend/Selectionaux.ml
@@ -71,13 +71,13 @@ let fast_cmove ty =
| "arm", _ ->
(match ty with Tint | Tfloat | Tsingle -> true | _ -> false)
| "powerpc", "e5500" ->
- (match ty with Tint -> true | Tlong -> true | _ -> false)
+ (match ty with Tint | Tlong -> true | _ -> false)
| "powerpc", _ -> false
| "riscV", _ -> false
| "x86", _ ->
- (match ty with Tint -> true | Tlong -> Archi.ptr64 | _ -> false)
- | _, _ ->
- assert false
+ (match ty with Tint -> true | Tlong -> Archi.ptr64 | _ -> false)
+ | "mppa_k1c", _ -> true
+ | a, m -> failwith (Printf.sprintf "fast_cmove: unknown arch %s %s" a m)
(* The if-conversion heuristic depend on the
-fif-conversion and -ffavor-branchless flags.
@@ -96,12 +96,17 @@ If-conversion seems beneficial if:
Intuition: on a modern processor, the "then" and the "else" branches
can generally be computed in parallel, there is enough ILP for that.
So, the bad case is if the most taken branch is much cheaper than the
+<<<<<<< HEAD
+other branch. Since our cost estimates are very imprecise, the
+bound on the total cost acts as a safety guard,
+=======
other branch. Another bad case is if both branches are big: since the
code for one branch precedes entirely the code for the other branch,
if the first branch contains a lot of instructions,
dynamic reordering of instructions will not look ahead far enough
to execute instructions from the other branch in parallel with
instructions from the first branch.
+>>>>>>> ddb2c968e6c57d2117434f169471d87f643d831a
*)
let if_conversion_heuristic cond ifso ifnot ty =
@@ -109,5 +114,9 @@ let if_conversion_heuristic cond ifso ifnot ty =
if !Clflags.option_ffavor_branchless then true else
if not (fast_cmove ty) then false else
let c1 = cost_expr ifso and c2 = cost_expr ifnot in
+<<<<<<< HEAD
+ c1 + c2 <= 30 && abs (c1 - c2) <= 8
+=======
c1 + c2 <= 24 && abs (c1 - c2) <= 8
+>>>>>>> ddb2c968e6c57d2117434f169471d87f643d831a