]> matita.cs.unibo.it Git - helm.git/commitdiff
Performance improvement by preserving more sharing. Visible in Oliboni's
authorClaudio Sacerdoti Coen <claudio.sacerdoticoen@unibo.it>
Wed, 7 Oct 2009 18:18:00 +0000 (18:18 +0000)
committerClaudio Sacerdoti Coen <claudio.sacerdoticoen@unibo.it>
Wed, 7 Oct 2009 18:18:00 +0000 (18:18 +0000)
development. But still slower then old matita (but pheraps on different data...)

helm/software/components/ng_kernel/nCicReduction.ml

index e1e5bc7cb566d45fa4fa6a15c3b3aeb222a362b3..2417f718b8e4576fca9ffc16a6024a456a615e1c 100644 (file)
@@ -141,46 +141,32 @@ module Reduction(RS : Strategy) = struct
          (Ref.Decl|Ref.Ind _|Ref.Con _|Ref.CoFix _))), _) as config -> 
            config, true
      | (_, _, (C.Const (Ref.Ref 
-          (_,Ref.Fix (fixno,recindex,height)) as refer) as head),s) as config ->
-        (match
-          try 
-            let recarg = RS.from_stack ~delta:max_int (List.nth s recindex) in
-            let fixes,(_,_,pragma),_ = 
+          (_,Ref.Fix (fixno,recindex,height)) as refer)),s) as config ->
+        (let arg = try Some (List.nth s recindex) with Failure _ -> None in
+         match arg with
+            None -> config, true
+          | Some arg ->
+             let fixes,(_,_,pragma),_ = 
               NCicEnvironment.get_checked_fixes_or_cofixes refer in
-            Some (recarg, fixes, pragma)
-          with Failure _ -> None
-        with 
-        | None -> config, true
-        | Some((_,_,C.Const(Ref.Ref(_,Ref.Con _)),_::_ as c),fs,`Projection) ->
-            let new_s = 
-              replace recindex s (RS.compute_to_stack ~reduce:(reduce ~subst
-              context) ~unwind c)
-            in
-            let _,_,_,_,body = List.nth fs fixno in
-            aux (0, [], body, new_s)
-        | Some (recparam, fixes, pragma) ->
-           match reduce ~delta:0 ~subst context recparam with
-           | (_,_,C.Const (Ref.Ref (_,Ref.Con _)), _) as c, _ 
-              when delta >= height ->
-               let new_s =
-                       (* FIXME, we should push on the stack
-                        * c for CBV and recparam for CBN *)
-                 if pragma = `Projection then
-                  replace recindex s (RS.compute_to_stack ~reduce:(reduce ~subst
-                  context) ~unwind recparam)
-                 else
-                  replace recindex s (RS.compute_to_stack ~reduce:(reduce ~subst
-                  context) ~unwind c)
-               in
-               (0, [], head, new_s), false
-           | (_,_,C.Const (Ref.Ref (_,Ref.Con _)), _) as c, _ ->
-               let new_s =
-                 replace recindex s (RS.compute_to_stack ~reduce:(reduce ~subst
-                 context) ~unwind c)
-               in
-               let _,_,_,_,body = List.nth fixes fixno in
-               aux (0, [], body, new_s)
-           | _ -> config, true)
+             if delta >= height then
+              match pragma with
+               | `Projection ->
+                   (match RS.from_stack ~delta:max_int arg with
+                     | _,_,C.Const(Ref.Ref(_,Ref.Con _)),_::_ ->
+                       let _,_,_,_,body = List.nth fixes fixno in
+                        aux (0, [], body, s)
+                     | _ -> config,false)
+               | _ -> config,false
+             else
+              match RS.from_stack ~delta:0 arg with
+               | (_,_,C.Const (Ref.Ref (_,Ref.Con _)), _) as c ->
+                 let new_s =
+                  replace recindex s
+                   (RS.compute_to_stack ~reduce:(reduce ~subst context)
+                   ~unwind c) in
+                 let _,_,_,_,body = List.nth fixes fixno in
+                  aux (0, [], body, new_s)
+               | _ -> config, true)
      | (k, e, C.Match (_,_,term,pl),s) as config ->
         let decofix = function
           | (_,_,C.Const(Ref.Ref(_,Ref.CoFix c)as refer),s)->