[sledge] Revise solver existential instantiation

Summary:
In case the starting locations of two heap segments are
related (provably equal up to some offset), add equations between
their enclosing block to the goal. In these cases, the enclosing
blocks must be the same, so no completeness is lost. This has the
effect of instantiating existentials in the enclosing block prior to
others, which can avoid incomplete instantiation guesses.

Reviewed By: mbouaziz

Differential Revision: D14323550

fbshipit-source-id: 89a34a2c8
master
Josh Berdine 6 years ago committed by Facebook Github Bot
parent 29f7f30b1a
commit 0578064a7f

@ -486,10 +486,17 @@ let excise_seg_sub_skew ({us; com; min; xs; sub; zs} as goal) msg ssg k_l
(* C k-[b;m)->⟨o,α⟩ * M ⊢ ∃xs. l-[b';m')->⟨n,α'⟩ * S R *)
let excise_seg ({sub} as goal) msg ssg =
[%Trace.info "@[<2>excise_seg@ %a@ |- %a@]" Sh.pp_seg msg Sh.pp_seg ssg] ;
let {Sh.loc= k; siz= o} = msg in
let {Sh.loc= l; siz= n} = ssg in
let {Sh.loc= k; bas= b; len= m; siz= o} = msg in
let {Sh.loc= l; bas= b'; len= m'; siz= n} = ssg in
Equality.difference sub.cong k l
>>= fun k_l ->
if
(not (Equality.entails_eq sub.cong b b'))
|| not (Equality.entails_eq sub.cong m m')
then
Some
{goal with sub= Sh.and_ (Exp.eq b b') (Sh.and_ (Exp.eq m m') goal.sub)}
else
match[@warning "-p"] Z.sign k_l with
(* k-l < 0 so k < l *)
| -1 -> (
@ -552,7 +559,8 @@ let excise_seg ({sub} as goal) msg ssg =
(* k-(l+n) < 0 [k; o)
* so k < l+n [l; n) *)
| -1 ->
Some (excise_seg_sub_skew goal msg ssg k_l (Z.neg k_ln) ko_ln)
Some
(excise_seg_sub_skew goal msg ssg k_l (Z.neg k_ln) ko_ln)
| _ -> None ) )
let excise_heap ({min; sub} as goal) =

@ -130,4 +130,26 @@ let%test_module _ =
%a_2 = %a1_8
16 = %m_7
emp |}]
let%expect_test _ =
check_frame
(Sh.star
(Sh.seg {loc= l; bas= l; len= !16; siz= !8; arr= a})
(Sh.seg {loc= l + !8; bas= l; len= !16; siz= !8; arr= a2}))
[a3_; m_]
(Sh.seg {loc= l; bas= l; len= m; siz= m; arr= a3}) ;
[%expect
{|
( infer_frame:
(%l_5 + 8) -[ %l_5, 16 )-> 8,%a_2
* %l_5 -[ %l_5, 16 )-> 8,%a_1
\- %a_3, %m_7 .
%l_5 -[)-> %m_7,%a_3
) infer_frame:
.
%a1_8 .
%m_7,%a_3 = 8,%a_1^8,%a1_8
%a_2 = %a1_8
16 = %m_7
emp |}]
end )

Loading…
Cancel
Save