Closed jkzinzindohoue closed 5 years ago
I'm looking into this actively. There are several efficiency problems interacting and making this perform extremely poorly. I hope to have a some improvements relatively soon ...
In the meantime, a temporary workaround (obviously unsatisfactory) is to do
fstar --eager_inference --lax --codegen OCaml Bug971.fst
which typechecks and extracts promptly (without verifying).
An update:
I found and fixed a case where F* was producing a quadratically large VC. This still doesn't solve the original problem completely, but at least now, large terms like this don't totally explode the VC generator.
This was part of the problem with the original issue. Still working on fixing the remaining problems there.
module Ret
let good (n:list nat) = true
val revise : unit
let revise =
let f =
Cons #nat 2
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Cons #nat 0
(Nil #nat))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) in
assert (good f)
The original program now verifies and extracts in about 41sec on my machine. Of that, most of the time is spent in Z3 (~ 38sec).
You still need to use --eager_inference for this program though. Without it, things still balloon out of control.
Here's how I invoke it:
fstar test.fst --z3rlimit 100 --eager_inference --include ../everest/FStar/ulib/hyperstack/ --codegen OCaml --max_fuel 0 --max_ifuel 0
One significant change is that now constants like 0x08uy
are checked to be within bounds of FStar.UInt8.t
during desugaring, rather than producing verification conditions.
cf a8c1fbc
Using a wrapper of createL with a weaker post-condition makes things way faster (~3x speedup in Z3 time).
For example, this variant of createL is sufficient to prove this program
val createL: #a:Type0 -> init:list a -> StackInline (buffer a)
(requires (fun h -> p #a init))
(ensures (fun h0 b h1 ->
b `unused_in` h0
/\ live h1 b
/\ idx b = 0
/\ frameOf b = h0.tip
/\ Map.domain h1.h == Map.domain h0.h
/\ modifies_0 h0 h1))
@tahina-pro @jkzinzindohoue @nikswamy what do you think of a variant of createL that's only used for test purposes and doesn't have the performance problems of the original one, but also doesn't reveal the contents of the freshly-created buffer? kind of suboptimal but this may be what we want
@msprotz, we are using createL
now and it seems to work. Can you confirm and close the issue? Thanks!
Closing this issue, we have a new buffer library with gcmalloc_of_list
, with no known performance issues like this one.
The following (verbose) module exhausts my ram when trying to extract (either to OCaml or Kremlin):
With only the declaration of
msg4
it does not seem to require so much RAM but it does not terminate in a reasonable amount of time (several minutes).Even
lax
typechecking takes several seconds on such literals.