extended boolopts test
[libfirm] / ir / ana / irbackedge.c
index 3fada07..7bfd1c0 100644 (file)
@@ -1,14 +1,32 @@
 /*
- * Project:     libFIRM
- * File name:   ir/ana/irbackedge.c
- * Purpose:     Access function for backedges.
- * Author:      Goetz Lindenmaier
- * Modified by:
- * Created:     7.2002
- * CVS-ID:      $Id$
- * Copyright:   (c) 2002-2003 Universität Karlsruhe
- * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
+ * Copyright (C) 1995-2007 University of Karlsruhe.  All right reserved.
+ *
+ * This file is part of libFirm.
+ *
+ * This file may be distributed and/or modified under the terms of the
+ * GNU General Public License version 2 as published by the Free Software
+ * Foundation and appearing in the file LICENSE.GPL included in the
+ * packaging of this file.
+ *
+ * Licensees holding valid libFirm Professional Edition licenses may use
+ * this file in accordance with the libFirm Commercial License.
+ * Agreement provided with the Software.
+ *
+ * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
+ * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE.
+ */
+
+/**
+ * @file
+ * @brief     Access function for backedges.
+ * @author    Goetz Lindenmaier
+ * @date      7.2002
+ * @version   $Id$
  */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
 
 #include "irnode_t.h"
 #include "irgraph_t.h"
@@ -61,11 +79,13 @@ static INLINE int *mere_get_backarray(ir_node *n) {
 static INLINE int *get_backarray(ir_node *n) {
   int *ba = mere_get_backarray(n);
 
+#ifndef NDEBUG
   if (ba) {
     int bal = ARR_LEN(ba);  /* avoid makro expansion in assertion. */
     int inl = ARR_LEN(get_irn_in(n)) -1;  /* Use get_irn_in -- sensitive to view! */
     assert(bal == inl && "backedge array with faulty length");
   }
+#endif
 
   return ba;
 }
@@ -84,7 +104,7 @@ static INLINE int legal_backarray (ir_node *n) {
 
 void fix_backedges(struct obstack *obst, ir_node *n) {
   int *arr = mere_get_backarray(n);
-  opcode opc;
+  ir_opcode opc;
 
   if (! arr)
     return;
@@ -187,3 +207,26 @@ void clear_backedges (ir_node *n) {
   }
   set_interprocedural_view(rem);
 }
+
+int *new_backedge_arr(struct obstack *obst, int size) {
+  int *res = NEW_ARR_D (int, obst, size);
+  memset(res, 0, sizeof(int) * size);
+  return res;
+}
+
+/* TODO: add an ir_op operation */
+void new_backedge_info(ir_node *n) {
+  switch(get_irn_opcode(n)) {
+  case iro_Block:
+    n->attr.block.cg_backedge = NULL;
+    n->attr.block.backedge = new_backedge_arr(current_ir_graph->obst, get_irn_arity(n));
+    break;
+  case iro_Phi:
+    n->attr.phi_backedge = new_backedge_arr(current_ir_graph->obst, get_irn_arity(n));
+    break;
+  case iro_Filter:
+    n->attr.filter.backedge = new_backedge_arr(current_ir_graph->obst, get_irn_arity(n));
+    break;
+  default: ;
+  }
+}