Changeset 1664


Ignore:
Timestamp:
Jan 27, 2012, 12:11:54 AM (6 years ago)
Author:
tranquil
Message:

corrected a bug in loop peeling where continue and breaks were not handled right

Location:
Deliverables/D2.2/8051/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • Deliverables/D2.2/8051/src/clight/loopPeeling.ml

    r1580 r1664  
    7070  ClightFold.statement2 ClightFold.expr_fill_exprs f_stmt
    7171
     72let remove_cnt_brk cnt_lbl brk_lbl =
     73  let f_stmt stmt exprs stmts =
     74    match stmt with
     75      | Clight.Sbreak -> Clight.Sgoto brk_lbl
     76      | Clight.Scontinue -> Clight.Sgoto cnt_lbl
     77      | _ ->ClightFold. statement_fill_subs stmt exprs stmts in
     78  ClightFold.statement2 ClightFold.expr_fill_exprs f_stmt
     79
    7280let peel fresh info =
    73   let f_stmt stmt exprs stmts =
     81  let process_cnt_brk peeled_body has_brk has_cnt =
     82    let (brk_lbl, add_tail) = if has_brk then
     83        let new_lbl = fresh () in
     84        (new_lbl, fun stmt ->
     85          Clight.Ssequence (stmt, Clight.Slabel (new_lbl, Clight.Sskip)))
     86      else
     87        (Label.dummy, fun stmt -> stmt) in
     88    let (cnt_lbl, add_head) = if has_cnt then
     89        let new_lbl = fresh () in
     90        (new_lbl, fun stmt -> Clight.Slabel(new_lbl, stmt))
     91      else
     92        (Label.dummy, fun stmt -> stmt) in
     93          (* we could avoid making a further pass, but sacrificing the use
     94             of the fold machinery *)
     95    let peeled_body = if has_brk || has_cnt then
     96        remove_cnt_brk cnt_lbl brk_lbl peeled_body
     97      else peeled_body in
     98    (add_head, peeled_body, add_tail) in
     99
     100  let f_stmt stmt exprs stmts_w_flags =
    74101    if heuristics info stmt then
    75       match stmt, exprs, stmts with
    76         | Clight.Swhile (Some i, _, _), e :: _, s :: _  ->
     102      match stmt, exprs, stmts_w_flags with
     103        | Clight.Swhile (Some i, _, _), e :: _, (s, (has_brk, has_cnt)) :: _  ->
    77104      (* we can suppose no label in stmt is target of a goto outside of stmt, *)
    78105      (* as loop is indexed and thus single entry. So we can freely rename *)
     
    88115          (* rebuild the loop *)
    89116          let loop = Clight.Swhile(Some i, e_next, s_next) in
     117          (* all break and continue statements, if any, must be replaced by
     118             gotos in the peeled body *)
     119          let (head, s_first, tail) = process_cnt_brk s_first has_brk has_cnt in
    90120          (* build the peeled loop *)
    91           let peeled = Clight.Ssequence(s_first, loop) in
    92           (* add the guard at the start *)
    93           Clight.Sifthenelse(e_first, peeled, Clight.Sskip)
    94         | Clight.Sdowhile (Some i, _, _), e :: _, s :: _  ->
    95         (* we can suppose no label in stmt is target of a goto outside of stmt, *)
     121          let peeled = Clight.Ssequence(s_first, head loop) in
     122          (tail (Clight.Sifthenelse(e_first, peeled, Clight.Sskip)),
     123           (false, false))
     124        | Clight.Sdowhile (Some i, _, _), e :: _,
     125           (s, (has_brk, has_cnt)) :: _  ->
     126        (* we can suppose no label in stmt is target of a goto outside, *)
    96127        (* as loop is indexed and thus single entry. So we can freely rename *)
    97128        (* labels in stmt. *)
     
    106137          (* rebuild the loop *)
    107138          let loop = Clight.Sdowhile(Some i, e_next, s_next) in
     139          let (head, s_first, tail) = process_cnt_brk s_first has_brk has_cnt in
    108140          (* put a guard before the following iterations of the loop *)
    109           let guarded_loop = Clight.Sifthenelse(e_first, loop, Clight.Sskip) in
     141          let guarded_loop =
     142            Clight.Sifthenelse(e_first, head loop, Clight.Sskip) in
    110143          (* build the peeled loop *)
    111           Clight.Ssequence(s_first, guarded_loop)
    112         | Clight.Sfor (Some i, _, _, _, _), e :: _, s1 :: s2 :: s3 ::_ ->
     144          (tail (Clight.Ssequence(s_first, guarded_loop)), (false, false))
     145        | Clight.Sfor (Some i, _, _, _, _), e :: _,
     146           (s1, _) :: (s2, _) :: (s3, (has_brk, has_cnt)) ::_ ->
    113147        (* we can suppose no label in s3 is target of a goto outside of stmt, *)
    114148        (* as loop is indexed and thus single entry. So we can freely rename *)
     
    127161          (* rebuild the loop *)
    128162          let loop = Clight.Sfor(Some i, s2_first, e_next, s2_next, s3_next) in
     163          let (head, s3_first, tail) =
     164            process_cnt_brk s3_first has_brk has_cnt in
    129165          (* build the peeled loop *)
    130           let peeled = Clight.Ssequence(s3_first, loop) in
     166          let peeled = Clight.Ssequence(s3_first, head loop) in
     167          let guarded = Clight.Sifthenelse(e_first, peeled, Clight.Sskip) in
    131168          (* add the guard at the start *)
    132           Clight.Ssequence(s1,Clight.Sifthenelse(e_first, peeled, Clight.Sskip))
     169          (tail (Clight.Ssequence(s1, guarded)), (false, false))
    133170        | _ -> assert false (* heuristics should have crossed out other cases *)
    134     else ClightFold.statement_fill_subs stmt exprs stmts in
     171    else match stmt with
     172      | Clight.Sbreak -> (Clight.Sbreak, (true, false))
     173      | Clight.Scontinue -> (Clight.Scontinue, (false, true))
     174      | _ ->
     175        let stmts, flags = List.split stmts_w_flags in
     176        let f (b1, b2) (c1, c2) = (b1 || c1, b2 || c2) in
     177        (ClightFold.statement_fill_subs stmt exprs stmts,
     178         List.fold_left f (false, false) flags) in
    135179  ClightFold.statement2 ClightFold.expr_fill_exprs f_stmt
    136180
    137181let peel_funct fresh info = function
    138182  | (id, Clight.Internal def) ->
    139     let body = peel fresh info def.Clight.fn_body in
     183    let body, _ = peel fresh info def.Clight.fn_body in
    140184    (id, Clight.Internal {def with Clight.fn_body = body})
    141185  | _ as p -> p
  • Deliverables/D2.2/8051/src/options.ml

    r1580 r1664  
    5959  reindexing_transformations := !reindexing_transformations @ reindexing
    6060let get_transformations () =
    61   if !reindex_flag then !transformations else
    62   !transformations @ !reindexing_transformations
     61  if !reindex_flag then
     62    !transformations @ !reindexing_transformations
     63  else !transformations
    6364
    6465let cost_ternary_flag           = ref true
Note: See TracChangeset for help on using the changeset viewer.