From b023b2c14596710bd0b7a3472791eda6c1b37357 Mon Sep 17 00:00:00 2001 From: Michael Beck Date: Wed, 4 Feb 2004 15:02:09 +0000 Subject: [PATCH] Added FuncCall Node, a call to a procedure that did NOT change the memory (nor can have exceptions) [r2373] --- ir/ir/ircons.c | 47 +++++++++++++++++++- ir/ir/ircons.h | 115 +++++++++++++++++++++++++++++++------------------ 2 files changed, 119 insertions(+), 43 deletions(-) diff --git a/ir/ir/ircons.c b/ir/ir/ircons.c index 7975e9552..ed97c8c12 100644 --- a/ir/ir/ircons.c +++ b/ir/ir/ircons.c @@ -808,6 +808,30 @@ new_rd_Filter (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *arg, ir_mod } +ir_node * +new_rd_FuncCall (dbg_info* db, ir_graph *irg, ir_node *block, + ir_node *callee, int arity, ir_node **in, type *tp) +{ + ir_node **r_in; + ir_node *res; + int r_arity; + + r_arity = arity+1; + NEW_ARR_A (ir_node *, r_in, r_arity); + r_in[0] = callee; + memcpy (&r_in[1], in, sizeof (ir_node *) * arity); + + res = new_ir_node (db, irg, block, op_FuncCall, mode_T, r_arity, r_in); + + assert(is_method_type(tp)); + set_Call_type(res, tp); + res->attr.call.callee_arr = NULL; + res = optimize_node (res); + irn_vrfy_irg (res, irg); + return res; +} + + INLINE ir_node *new_r_Block (ir_graph *irg, int arity, ir_node **in) { return new_rd_Block(NULL, irg, arity, in); } @@ -996,6 +1020,11 @@ INLINE ir_node *new_r_Filter (ir_graph *irg, ir_node *block, ir_node *arg, ir_mode *mode, long proj) { return new_rd_Filter(NULL, irg, block, arg, mode, proj); } +INLINE ir_node *new_r_FuncCall (ir_graph *irg, ir_node *block, + ir_node *callee, int arity, ir_node **in, + type *tp) { + return new_rd_FuncCall(NULL, irg, block, callee, arity, in, tp); +} /** ********************/ @@ -1483,8 +1512,8 @@ get_r_value_internal (ir_node *block, int pos, ir_mode *mode); static ir_node * phi_merge (ir_node *block, int pos, ir_mode *mode, ir_node **nin, int ins); -static INLINE ir_node ** -new_frag_arr (ir_node *n) { +static INLINE ir_node ** new_frag_arr (ir_node *n) +{ ir_node **arr; int opt; arr = NEW_ARR_D (ir_node *, current_ir_graph->obst, current_ir_graph->n_loc); @@ -2208,6 +2237,17 @@ new_d_Filter (dbg_info *db, ir_node *arg, ir_mode *mode, long proj) arg, mode, proj); } +ir_node * +new_d_FuncCall (dbg_info* db, ir_node *callee, int arity, ir_node **in, + type *tp) +{ + ir_node *res; + res = new_rd_FuncCall (db, current_ir_graph, current_ir_graph->current_block, + callee, arity, in, tp); + + return res; +} + /* ********************************************************************* */ /* Comfortable interface with automatic Phi node construction. */ /* (Uses also constructors of ?? interface, except new_Block. */ @@ -2508,3 +2548,6 @@ ir_node *new_Break (void) { ir_node *new_Filter (ir_node *arg, ir_mode *mode, long proj) { return new_d_Filter(NULL, arg, mode, proj); } +ir_node *new_FuncCall (ir_node *callee, int arity, ir_node **in, type *tp) { + return new_d_FuncCall(NULL, callee, arity, in, tp); +} diff --git a/ir/ir/ircons.h b/ir/ir/ircons.h index cfbb8c565..62596ef20 100644 --- a/ir/ir/ircons.h +++ b/ir/ir/ircons.h @@ -317,50 +317,52 @@ * The comfortable interface contains the following routines further explained * below: * - * ir_node *new_immBlock (void); - * ir_node *new_Start (void); - * ir_node *new_End (void); - * ir_node *new_Jmp (void); - * ir_node *new_Cond (ir_node *c); - * ir_node *new_Return (ir_node *store, int arity, ir_node **in); - * ir_node *new_Raise (ir_node *store, ir_node *obj); - * ir_node *new_Const (ir_mode *mode, tarval *con); + * ir_node *new_immBlock (void); + * ir_node *new_Start (void); + * ir_node *new_End (void); + * ir_node *new_Jmp (void); + * ir_node *new_Cond (ir_node *c); + * ir_node *new_Return (ir_node *store, int arity, ir_node **in); + * ir_node *new_Raise (ir_node *store, ir_node *obj); + * ir_node *new_Const (ir_mode *mode, tarval *con); * ir_node *new_SymConst (type_or_id *value, symconst_kind kind); - * ir_node *new_simpleSel (ir_node *store, ir_node *objptr, entity *ent); - * ir_node *new_Sel (ir_node *store, ir_node *objptr, int arity, - * ir_node **in, entity *ent); - * ir_node *new_Call (ir_node *store, ir_node *callee, int arity, - * ir_node **in, type_method *type); - * ir_node *new_Add (ir_node *op1, ir_node *op2, ir_mode *mode); - * ir_node *new_Sub (ir_node *op1, ir_node *op2, ir_mode *mode); - * ir_node *new_Minus (ir_node *op, ir_mode *mode); - * ir_node *new_Mul (ir_node *op1, ir_node *op2, ir_mode *mode); - * ir_node *new_Quot (ir_node *memop, ir_node *op1, ir_node *op2); - * ir_node *new_DivMod (ir_node *memop, ir_node *op1, ir_node *op2); - * ir_node *new_Div (ir_node *memop, ir_node *op1, ir_node *op2); - * ir_node *new_Mod (ir_node *memop, ir_node *op1, ir_node *op2); - * ir_node *new_Abs (ir_node *op, ir_mode *mode); - * ir_node *new_And (ir_node *op1, ir_node *op2, ir_mode *mode); - * ir_node *new_Or (ir_node *op1, ir_node *op2, ir_mode *mode); - * ir_node *new_Eor (ir_node *op1, ir_node *op2, ir_mode *mode); - * ir_node *new_Not (ir_node *op, ir_mode *mode); - * ir_node *new_Shl (ir_node *op, ir_node *k, ir_mode *mode); - * ir_node *new_Shr (ir_node *op, ir_node *k, ir_mode *mode); - * ir_node *new_Shrs (ir_node *op, ir_node *k, ir_mode *mode); - * ir_node *new_Rot (ir_node *op, ir_node *k, ir_mode *mode); - * ir_node *new_Cmp (ir_node *op1, ir_node *op2); - * ir_node *new_Conv (ir_node *op, ir_mode *mode); - * ir_node *new_Cast (ir_node *op, type *to_tp); - * ir_node *new_Load (ir_node *store, ir_node *addr); - * ir_node *new_Store (ir_node *store, ir_node *addr, ir_node *val); - * ir_node *new_Alloc (ir_node *store, ir_node *size, type *alloc_type, - * where_alloc where); - * ir_node *new_Free (ir_node *store, ir_node *ptr, ir_node *size, - * type *free_type); - * ir_node *new_Proj (ir_node *arg, ir_mode *mode, long proj); + * ir_node *new_simpleSel(ir_node *store, ir_node *objptr, entity *ent); + * ir_node *new_Sel (ir_node *store, ir_node *objptr, int arity, + * ir_node **in, entity *ent); + * ir_node *new_Call (ir_node *store, ir_node *callee, int arity, + * ir_node **in, type_method *type); + * ir_node *new_Add (ir_node *op1, ir_node *op2, ir_mode *mode); + * ir_node *new_Sub (ir_node *op1, ir_node *op2, ir_mode *mode); + * ir_node *new_Minus (ir_node *op, ir_mode *mode); + * ir_node *new_Mul (ir_node *op1, ir_node *op2, ir_mode *mode); + * ir_node *new_Quot (ir_node *memop, ir_node *op1, ir_node *op2); + * ir_node *new_DivMod (ir_node *memop, ir_node *op1, ir_node *op2); + * ir_node *new_Div (ir_node *memop, ir_node *op1, ir_node *op2); + * ir_node *new_Mod (ir_node *memop, ir_node *op1, ir_node *op2); + * ir_node *new_Abs (ir_node *op, ir_mode *mode); + * ir_node *new_And (ir_node *op1, ir_node *op2, ir_mode *mode); + * ir_node *new_Or (ir_node *op1, ir_node *op2, ir_mode *mode); + * ir_node *new_Eor (ir_node *op1, ir_node *op2, ir_mode *mode); + * ir_node *new_Not (ir_node *op, ir_mode *mode); + * ir_node *new_Shl (ir_node *op, ir_node *k, ir_mode *mode); + * ir_node *new_Shr (ir_node *op, ir_node *k, ir_mode *mode); + * ir_node *new_Shrs (ir_node *op, ir_node *k, ir_mode *mode); + * ir_node *new_Rot (ir_node *op, ir_node *k, ir_mode *mode); + * ir_node *new_Cmp (ir_node *op1, ir_node *op2); + * ir_node *new_Conv (ir_node *op, ir_mode *mode); + * ir_node *new_Cast (ir_node *op, type *to_tp); + * ir_node *new_Load (ir_node *store, ir_node *addr); + * ir_node *new_Store (ir_node *store, ir_node *addr, ir_node *val); + * ir_node *new_Alloc (ir_node *store, ir_node *size, type *alloc_type, + * where_alloc where); + * ir_node *new_Free (ir_node *store, ir_node *ptr, ir_node *size, + * type *free_type); + * ir_node *new_Proj (ir_node *arg, ir_mode *mode, long proj); + * ir_node *new_FuncCall (ir_node *store, ir_node *callee, int arity, + * ir_node **in, type_method *type); * * void add_in_edge (ir_node *block, ir_node *jmp); - * void mature_block (ir_node *block); + * void mature_block (ir_node *block); * void switch_block (ir_node *target); * ir_node *get_value (int pos, ir_mode *mode); * void set_value (int pos, ir_node *value); @@ -708,6 +710,27 @@ * Attributes: * attr.call Contains the type information for the procedure. * + * ir_node *new_FuncCall (ir_node *callee, int arity, ir_node **in, type_method *type) + * ----------------------------------------------------------------------------------- + * + * Creates a procedure call to a function WITHOUT memory side effects. + * Nodes of this kind are floating in contrast to Call nodes. + * Further, a procedure call with FuncCall cannot raise an exception! + * + * Parameters + * *callee A pointer to the called procedure. + * arity The number of procedure parameters. + * **in An array with the pointers to the parameters. + * The constructor copies this array. + * *type Type information of the procedure called. + * + * Inputs: + * The callee and the parameters. + * Output: + * A tuple containing the procedure results. + * Attributes: + * attr.call Contains the type information for the procedure. + * * ir_node *new_Add (ir_node *op1, ir_node *op2, ir_mode *mode) * ------------------------------------------------------------ * @@ -1188,6 +1211,9 @@ ir_node *new_rd_EndExcept(dbg_info *db, ir_graph *irg, ir_node *block); ir_node *new_rd_Break (dbg_info *db, ir_graph *irg, ir_node *block); ir_node *new_rd_Filter (dbg_info *db, ir_graph *irg, ir_node *block, ir_node *arg, ir_mode *mode, long proj); +ir_node *new_rd_FuncCall (dbg_info *db, ir_graph *irg, ir_node *block, + ir_node *callee, int arity, ir_node *in[], + type *tp); /*-------------------------------------------------------------------------*/ /* The raw interface without debug support */ @@ -1284,6 +1310,9 @@ ir_node *new_r_EndExcept(ir_graph *irg, ir_node *block); ir_node *new_r_Break (ir_graph *irg, ir_node *block); ir_node *new_r_Filter (ir_graph *irg, ir_node *block, ir_node *arg, ir_mode *mode, long proj); +ir_node *new_r_FuncCall (ir_graph *irg, ir_node *block, + ir_node *callee, int arity, ir_node *in[], + type *tp); /*-----------------------------------------------------------------------*/ /* The block oriented interface */ @@ -1353,6 +1382,8 @@ ir_node *new_d_EndReg (dbg_info *db); ir_node *new_d_EndExcept(dbg_info *db); ir_node *new_d_Break (dbg_info *db); ir_node *new_d_Filter (dbg_info *db, ir_node *arg, ir_mode *mode, long proj); +ir_node *new_d_FuncCall (dbg_info* db, ir_node *callee, int arity, ir_node *in[], + type *tp); /*-----------------------------------------------------------------------*/ /* The block oriented interface without debug support */ @@ -1418,6 +1449,8 @@ ir_node *new_Id (ir_node *val, ir_mode *mode); ir_node *new_Bad (void); ir_node *new_Confirm (ir_node *val, ir_node *bound, pn_Cmp cmp); ir_node *new_Unknown(ir_mode *m); +ir_node *new_FuncCall (ir_node *callee, int arity, ir_node *in[], + type *tp); /*---------------------------------------------------------------------*/ /* The comfortable interface. */ -- 2.20.1