|  |  |  | @ -219,6 +219,30 @@ let pi_of_subst sub = List.map ~f:(fun (id1, e2) -> Sil.Aeq (Var id1, e2)) (Sil. | 
			
		
	
		
			
				
					|  |  |  |  | (** Return the pure part of [prop]. *) | 
			
		
	
		
			
				
					|  |  |  |  | let get_pure (p: 'a t) : pi = pi_of_subst p.sub @ p.pi | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | (* Same with get_pure, except that when we have both "x = t" and "y = t" where t is a primed ident,  | 
			
		
	
		
			
				
					|  |  |  |  | * we add "x = y" to the result. This is crucial for the normalizer, as it tend to drop "x = t" before  | 
			
		
	
		
			
				
					|  |  |  |  | * processing "y = t". If we don't explicitly preserve "x = y", the normalizer cannot pick it up *) | 
			
		
	
		
			
				
					|  |  |  |  | let get_pure_extended p = | 
			
		
	
		
			
				
					|  |  |  |  |   let base = get_pure p in | 
			
		
	
		
			
				
					|  |  |  |  |   let primed_atoms, _ = | 
			
		
	
		
			
				
					|  |  |  |  |     List.fold base ~init:([], Ident.IdentMap.empty) ~f:(fun (atoms, primed_map as acc) base_atom -> | 
			
		
	
		
			
				
					|  |  |  |  |         let extend_atoms id pid = | 
			
		
	
		
			
				
					|  |  |  |  |           try | 
			
		
	
		
			
				
					|  |  |  |  |             let old_id = Ident.IdentMap.find pid primed_map in | 
			
		
	
		
			
				
					|  |  |  |  |             let new_atom = Sil.Aeq (Var id, Var old_id) in | 
			
		
	
		
			
				
					|  |  |  |  |             (new_atom :: atoms, primed_map) | 
			
		
	
		
			
				
					|  |  |  |  |           with Not_found -> (atoms, Ident.IdentMap.add pid id primed_map) | 
			
		
	
		
			
				
					|  |  |  |  |         in | 
			
		
	
		
			
				
					|  |  |  |  |         match base_atom with | 
			
		
	
		
			
				
					|  |  |  |  |         | Sil.Aeq (Exp.Var id0, Exp.Var id1) when Ident.is_primed id0 && not (Ident.is_primed id1) | 
			
		
	
		
			
				
					|  |  |  |  |          -> extend_atoms id1 id0 | 
			
		
	
		
			
				
					|  |  |  |  |         | Sil.Aeq (Exp.Var id0, Exp.Var id1) when Ident.is_primed id1 && not (Ident.is_primed id0) | 
			
		
	
		
			
				
					|  |  |  |  |          -> extend_atoms id0 id1 | 
			
		
	
		
			
				
					|  |  |  |  |         | _ | 
			
		
	
		
			
				
					|  |  |  |  |          -> acc ) | 
			
		
	
		
			
				
					|  |  |  |  |   in | 
			
		
	
		
			
				
					|  |  |  |  |   primed_atoms @ base | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | (** Print existential quantification *) | 
			
		
	
		
			
				
					|  |  |  |  | let pp_evars pe f evars = | 
			
		
	
		
			
				
					|  |  |  |  |   if evars <> [] then | 
			
		
	
	
		
			
				
					|  |  |  | @ -1610,7 +1634,7 @@ module Normalize = struct | 
			
		
	
		
			
				
					|  |  |  |  |     let p0 = | 
			
		
	
		
			
				
					|  |  |  |  |       unsafe_cast_to_normal (set prop_emp ~sigma:(sigma_normalize tenv Sil.sub_empty eprop.sigma)) | 
			
		
	
		
			
				
					|  |  |  |  |     in | 
			
		
	
		
			
				
					|  |  |  |  |     let nprop = List.fold ~f:(prop_atom_and tenv) ~init:p0 (get_pure eprop) in | 
			
		
	
		
			
				
					|  |  |  |  |     let nprop = List.fold ~f:(prop_atom_and tenv) ~init:p0 (get_pure_extended eprop) in | 
			
		
	
		
			
				
					|  |  |  |  |     unsafe_cast_to_normal | 
			
		
	
		
			
				
					|  |  |  |  |       (footprint_normalize tenv (set nprop ~pi_fp:eprop.pi_fp ~sigma_fp:eprop.sigma_fp)) | 
			
		
	
		
			
				
					|  |  |  |  | end | 
			
		
	
	
		
			
				
					|  |  |  | 
 |