is_self_recursive_Call() added
authorMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Fri, 6 Jun 2008 05:53:02 +0000 (05:53 +0000)
committerMichael Beck <beck@ipd.info.uni-karlsruhe.de>
Fri, 6 Jun 2008 05:53:02 +0000 (05:53 +0000)
[r19989]

include/libfirm/irnode.h
ir/ir/irnode.c

index 3e7f8a4..b98880b 100644 (file)
@@ -645,6 +645,12 @@ void     set_Call_type(ir_node *node, ir_type *tp);
 /** Gets the arity of a call. Identical to get_Call_n_params(). */
 int      get_Call_arity(const ir_node *node);
 
+/**
+ * Returns non-zero if a Call is surely a self-recursive Call.
+ * Beware: if this functions returns 0, the call might be self-recursive!
+ */
+int is_self_recursive_Call(const ir_node *call);
+
 /** Set, get and remove the callee information for a Call node.
  *
  *  The callee information lists all method entities that can be called
index 0bd37f1..cbe41f8 100644 (file)
@@ -1412,6 +1412,21 @@ void set_CallBegin_call(ir_node *node, ir_node *call) {
        node->attr.callbegin.call = call;
 }
 
+/*
+ * Returns non-zero if a Call is surely a self-recursive Call.
+ * Beware: if this functions returns 0, the call might be self-recursive!
+ */
+int is_self_recursive_Call(const ir_node *call) {
+       const ir_node *callee = get_Call_ptr(call);
+
+       if (is_SymConst_addr_ent(callee)) {
+               const ir_entity *ent = get_SymConst_entity(callee);
+               const ir_graph  *irg = get_entity_irg(ent);
+               if (irg == get_irn_irg(call))
+                       return 1;
+       }
+       return 0;
+}
 
 #define BINOP(OP)                                      \
 ir_node * get_##OP##_left(const ir_node *node) {       \