aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xconfigure2
-rw-r--r--mppa_k1c/PostpassSchedulingOracle.ml24
2 files changed, 16 insertions, 10 deletions
diff --git a/configure b/configure
index d1880167..fd18d784 100755
--- a/configure
+++ b/configure
@@ -806,7 +806,7 @@ ARCHDIRS=$arch $arch/lib $arch/abstractbb $arch/abstractbb/Impure
BACKENDLIB=Machblock.v Machblockgen.v Machblockgenproof.v\\
Asmblock.v Asmblockgen.v Asmblockgenproof0.v Asmblockgenproof1.v Asmblockgenproof.v Asmvliw.v\\
ForwardSimulationBlock.v PostpassScheduling.v PostpassSchedulingproof.v\\
- Asmblockdeps.v\\
+ Asmblockdeps.v Chunks.v Peephole.v ExtValues.v\\
AbstractBasicBlocksDef.v DepTreeTheory.v ImpDep.v Parallelizability.v\\
ImpConfig.v ImpCore.v ImpExtern.v ImpHCons.v ImpIO.v ImpLoops.v ImpMonads.v ImpPrelude.v
EOF
diff --git a/mppa_k1c/PostpassSchedulingOracle.ml b/mppa_k1c/PostpassSchedulingOracle.ml
index d3f16366..bdf72ec5 100644
--- a/mppa_k1c/PostpassSchedulingOracle.ml
+++ b/mppa_k1c/PostpassSchedulingOracle.ml
@@ -827,19 +827,25 @@ let is_opaque = function
| PBasic (Pallocframe _) | PBasic (Pfreeframe _) | PControl (PExpand (Pbuiltin _)) -> true
| _ -> false
+(* Returns : (accumulated instructions, remaining instructions, opaque instruction if found) *)
let rec biggest_wo_opaque = function
- | [] -> ([], [])
- | [i] -> ([i], [])
- | i1 :: i2 :: li -> if is_opaque i2 || is_opaque i1 then ([i1], i2::li)
- else let big, rem = biggest_wo_opaque li in (i1 :: i2 :: big, rem)
+ | [] -> ([], [], None)
+ | i :: li -> if is_opaque i then ([], li, Some i)
+ else let big, rem, opaque = biggest_wo_opaque li in (i :: big, rem, opaque);;
let separate_opaque bb =
let instrs = bb_to_instrs bb
- in let rec f hd = function
- | [] -> []
- | li ->
- let sub_li, li = biggest_wo_opaque li
- in (bundlize sub_li hd) :: (f [] li)
+ in let rec f hd li =
+ match li with
+ | [] -> []
+ | li -> let big, rem, opaque = biggest_wo_opaque li in
+ match opaque with
+ | Some i ->
+ (match big with
+ | [] -> (bundlize [i] hd) :: (f [] rem)
+ | big -> (bundlize big hd) :: (bundlize [i] []) :: (f [] rem)
+ )
+ | None -> (bundlize big hd) :: (f [] rem)
in f bb.header instrs
let smart_schedule bb =