sig
  type temp_id = int
  and identifier = string
  and field = Il.identifier * Ctt_abstree.c_type
  and il_switch_label =
    Il1.il_switch_label =
      CASE of Big_int.big_int
    | DEFAULT
  and il_if_type = Il1.il_if_type = IFNOT | IFTRUE
  and il_binop =
    Il1.il_binop =
      ILbinTimes
    | ILbinDiv
    | ILbinPlusVV
    | ILbinMinusVV
    | ILbinPlusPV
    | ILbinMinusPP
    | ILbinMinusPV
    | ILbinModulo
    | ILbinLshift
    | ILbinRshift
    | ILbinLogAnd
    | ILbinLogOr
    | ILbinIntAnd
    | ILbinIntOr
    | ILbinIntXor
    | ILbinLessThan
    | ILbinLessEqual
    | ILbinGtrThan
    | ILbinGtrEqual
    | ILbinEqual
    | ILbinNotEqual
  and il_lvalue =
    Il1.il_lvalue =
      ILlvPtr of Il.temp_id
    | ILlvVar of Il.identifier * Ctt_abstree.c_type
    | ILlvTemp of Il.temp_id
  and il_expr =
    Il1.il_expr =
      ILexpCoerce of Ctt_abstree.c_type * Il.temp_id
    | ILexpConstant of Cttm_abstree.c_constants
    | ILexpUndefined
    | ILexpBinop of Il.il_binop * Il.temp_id * Il.temp_id
    | ILexpUnaryop of Cttm_abstree.unaryop * Il.temp_id
    | ILexpInvoke of Il.il_lvalue * Il.temp_id list
    | ILexpAddress of Il.il_lvalue * Il.field list
    | ILexpArgument of int
    | ILexpIdent of Il.temp_id
  and il =
      ILstmtIf of Il.il_if_type * Il.temp_id * int
    | ILstmtSwitch of Il.temp_id * (Il.il_switch_label * int) list
    | ILstmtGoto of int
    | ILstmtReturn of Il.temp_id option
    | ILstmtAssign of Il.temp_id * Ctt_abstree.c_type * Il.il_expr
    | ILstmtRead of Il.temp_id * Ctt_abstree.c_type * Il.il_lvalue *
        Il.field list
    | ILstmtWrite of Il.il_lvalue * Il.field list * Il.temp_id
    | ILstmtInitialize of Il.temp_id * Ctt_abstree.c_type *
        Cttm_abstree.cttm_initializer option
    | ILstmtSequence of Il.il list
    | ILstmtParallel of Il.il list
  and il_basic_block = {
    predecessor : int list;
    successor : int list;
    immediate_dominator : int;
    nest_level : int;
    mutable phi_function :
      (Il.temp_id * Ctt_abstree.c_type * Il.temp_id array) list;
    mutable code : Il.il list;
  } 
  and il_variable_attribute = {
    original_name : string option;
    variable_type : Ctt_abstree.c_type;
    storage_class : Ctt_abstree.local_storage_class;
  } 
  and il_function = {
    body : Il.il_basic_block array;
    max_variable_number : int;
    variable_environment : Il.il_variable_attribute array;
    arguments : (Il.identifier * Ctt_abstree.c_type) array;
  } 
end