Added FuncCall Node, a call to a procedure that did NOT change the memory
authorMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Wed, 4 Feb 2004 15:02:09 +0000 (15:02 +0000)
committerMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Wed, 4 Feb 2004 15:02:09 +0000 (15:02 +0000)
(nor can have exceptions)

[r2373]

ir/ir/ircons.c
ir/ir/ircons.h

index 7975e95..ed97c8c 100644 (file)
@@ -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);
+}
index cfbb8c5..62596ef 100644 (file)
  *    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);
  *    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.                                          */