Definition freeable_blocks: list (block * BinInt.Z * BinInt.Z) -> mpred :=
  fold_right (fun (bb: block*BinInt.Z * BinInt.Z) a => 
                        match bb with (b,lo,hi) => 
                                          sepcon (VALspec_range (hi-lo) Share.top (b,lo)) a
                        end)
                    emp.

Lemma can_free_list: forall Delta F f jm ge ve te (NOREP: list_norepet (map (@fst _ _) (fn_vars f))) (COMPLETE: Forall (fun it => complete_type cenv_cs (snd it) = true) (fn_vars f)) (HGG: genv_cenv ge = cenv_cs), guard_environ (func_tycontext' f Delta) (Some f) (construct_rho (filter_genv ge) ve te) -> (F * stackframe_of f (construct_rho (filter_genv ge)ve te))%pred (m_phi jm) -> exists m2, free_list (m_dry jm) (blocks_of_env ge ve) = Some m2.