(*The blocks explicitly exported via call arguments, plus the already shared blocks*)
Definition exportedSrc mu vals b := orb (getBlocks vals b) (sharedSrc mu b).Definition exportedTgt mu vals b := orb (getBlocks vals b) (sharedTgt mu b).

Lemma REACH_shared_of: forall mu (WD: SM_wd mu) m1 m2 vals1 vals2 (MemInjMu : Mem.inject (shared_of mu) m1 m2) (ValInjMu : Forall2 (val_inject (shared_of mu)) vals1 vals2) b1 (R : REACH m1 (exportedSrc mu vals1) b1 = true) B (HB: forall b b2 d, shared_of mu b = Some(b2,d) -> B b2 = true), exists b2 d, shared_of mu b1 = Some (b2, d) /\ REACH m2 (fun b => orb (getBlocks vals2 b) (B b)) b2 = true.