let rec print_il1 expr = match expr.il1_t with
  | IL1stmtDeclAutoScalar( c, t, s, i ) ->
      "\tDECL_SCALAR "^(print_local_storage_class c)^" "^(print_c_type t)^"\t"^s
      ^(match i with
        None -> ";\n"
      | Some i -> " = "^(print_tempid i)^";\n")
  | IL1stmtDeclBulk( c, t, s, i ) ->
      "\tDECL_BULK "^(print_local_storage_class c)^" "^(print_c_type t)^"\t"^s
      ^(match i with
        None -> ";\n"
      | Some i -> " = "^(print_cttm_initializer i)^";\n")
  | IL1stmtIf( f, e, n ) -> 
      "\tif ("^
      (if f = IFNOT then "! " else "")^
      (print_tempid e)^" ) goto "^(string_of_int n)^";\n"
  | IL1stmtSwitch( e, jump_table ) ->
      let print = function
          CASE c, n -> (string_of_big_int c)^"=>"^(string_of_int n)
        | DEFAULT, n -> "default=>"^(string_of_int n)
      in
      "\tswitch ( "^(print_tempid e)^" ) {"^(print_list print "," jump_table)^"}\n"
  | IL1stmtGoto s -> "\tgoto "^(string_of_int s)^";\n"
  | IL1stmtReturn None -> "\treturn;\n"
  | IL1stmtReturn (Some e) -> "\treturn "^(print_tempid e)^";\n"
  | IL1stmtDefTemp(id,typ,exp) ->
      "\t" ^ print_tempid id ^ " : "^(print_c_type typ)^" := "^(print_il0expr exp)^";\n"
  | IL1stmtReadToTemp(id,typ,lv,fs) ->
      "\t" ^ print_tempid id ^ " : "^(print_c_type typ)^" := READ("^(print_il0lv lv fs)^");\n"
  | IL1stmtWrite(lv,fs,id) ->
      "\twrite(" ^ (print_il0lv lv fs) ^ " <- "^ print_tempid id ^");\n"
  | IL1stmtSequence(l) ->
      "\t<\n" ^ (String.concat "" (List.map print_il1 l)) ^ "\t>\n"
  | IL1stmtParallel(l) ->
      "\t[\n" ^ (String.concat "" (List.map print_il1 l)) ^ "\t]\n"