let get_loop_annots config vloop s =
  let do_annot a (assigns, loop_entry, loop_back , loop_core as acc) =
    let ca = match a with User ca | AI (_, ca) -> ca in
    match ca.annot_content with
      | AInvariant (b_list, true, inv) ->
          add_loop_invariant_annot config vloop s ca b_list inv acc
      | AVariant (var_exp, None->
          let loop_entry, loop_back = 
            add_variant_annot config s ca var_exp loop_entry loop_back 
          in assigns, loop_entry , loop_back , loop_core
      | AVariant (_v, _rel) ->
            Wp_parameters.warning "Ignoring loop variant with measure : %a"
              !Ast_printer.d_code_annotation ca;
            acc
      | AAssigns (_,WritesAny-> assert false
      | AAssigns (b_list, Writes a) -> (* loop assigns *)
          let h_assigns, g_assigns = assigns in
          let check_assigns old cur =
            match old with
                None -> Some cur
              | Some _ ->
                Wp_parameters.fatal
                  "At most one loop assigns can be associated to a behavior"
          in
          let assigns =
            match is_annot_for_config config vloop s b_list with
            | TBRok | TBRpart ->
              check_assigns h_assigns (ca,a), check_assigns g_assigns (ca,a)
            | TBRhyp ->
              check_assigns h_assigns (ca,a), g_assigns
            | TBRno -> assigns
          in (assigns, loop_entry , loop_back , loop_core)
      | _ -> acc (* see get_stmt_annots *)
  in
  let acc = ((None,None), 
             WpStrategy.empty_acc, WpStrategy.empty_acc, WpStrategy.empty_acc) 
  in
  let (h_assigns, g_assigns), loop_entry , loop_back , loop_core =
    Annotations.single_fold_stmt do_annot s acc
  in
  let loop_back = match g_assigns with 
    | None -> loop_back
    | Some a -> add_loop_assigns_goal config s a loop_back 
  in
  let loop_core = 
    WpStrategy.add_loop_assigns_hyp loop_core config.kf s h_assigns
  in (loop_entry , loop_back , loop_core)