
#define REUSE_UNIQUE_NODES
#define UPDATE_POP 1
#define BUILD_FREE_NODE_ID_LIST_DURING_PATTER_MATCH 1 /* added 13-4-1999 */
#define TAIL_CALL_MODULO_CONS_OPTIMIZATION 1
#define OPTIMIZE_LAZY_TUPLE_RECURSION 1
#define UNBOX_UPDATE_FUNCTION_ARGUMENTS 1

#define TAIL_CALL_MODULO_TUPLE_CONS_OPTIMIZATION 0
#undef THUNK_LIFT_SELECTORS

#define GENERATE_CODE_AGAIN TAIL_CALL_MODULO_CONS_OPTIMIZATION || OPTIMIZE_LAZY_TUPLE_RECURSION

/* node_id_list: used in PushNode and during code generation */

STRUCT (node_id_list_element,NodeIdListElement){
	struct node_id *				nidl_node_id;
	struct node_id_list_element *	nidl_next;
};

STRUCT (node_id_ref_count_list,NodeIdRefCountList){
	struct node_id_ref_count_list *	nrcl_next;
	struct node_id *				nrcl_node_id;
	int								nrcl_ref_count;
#if BOXED_RECORDS
	int								nrcl_mark2;
#endif
};

STRUCT (free_unique_node_ids,FreeUniqueNodeIds){
	struct node *					fnid_push_node;
	int								fnid_node_size;
	struct free_unique_node_ids	*	fnid_next;
};

STRUCT (ab_node_ids,AbNodeIds){
	struct node_id_list_element *	a_node_ids;
	struct node_id_list_element *	b_node_ids;
#if BUILD_FREE_NODE_ID_LIST_DURING_PATTER_MATCH
	struct node_id_list_element *	free_node_ids;
#endif
};

STRUCT (saved_nid_state,SavedNidState){
	StateS						save_state;
	NodeId						save_node_id;
	struct saved_nid_state *	save_next;
};

typedef struct label {
	char 		*lab_mod;
	char 		*lab_pref;
	Bool		lab_issymbol;
	union{
			char 	*u_name;
			SymbDef	 u_symbol;
	} lab_u;
	unsigned	lab_post;
} *Label, LabDef;

#define lab_name	lab_u.u_name
#define lab_symbol	lab_u.u_symbol

struct def_list {
	DefMod				mod_body;
	struct def_list *	mod_next;
};

typedef struct def_list *DefModList,DefModElem;
