Reuse already fetched values.
[libfirm] / ir / lower / lower_hl.c
index 4986c7c..7614216 100644 (file)
@@ -35,6 +35,8 @@
 #include "irhooks.h"
 #include "irgmod.h"
 #include "irgwalk.h"
+#include "irtools.h"
+#include "irpass_t.h"
 
 /**
  * Lower a Sel node. Do not touch Sels accessing entities on the frame type.
@@ -576,6 +578,29 @@ void lower_highlevel_graph(ir_graph *irg, int lower_bitfields) {
        irg_walk_graph(irg, NULL, lower_irnode, NULL);
 }  /* lower_highlevel_graph */
 
+struct pass_t {
+       ir_graph_pass_t pass;
+       int            lower_bitfields;
+};
+
+/**
+ * Wrapper for running lower_highlevel_graph() as an ir_graph pass.
+ */
+static int lower_highlevel_graph_wrapper(ir_graph *irg, void *context) {
+       struct pass_t *pass = context;
+
+       lower_highlevel_graph(irg, pass->lower_bitfields);
+       return 0;
+}  /* lower_highlevel_graph_wrapper */
+
+ir_graph_pass_t *lower_highlevel_graph_pass(const char *name, int lower_bitfields) {
+       struct pass_t *pass = XMALLOCZ(struct pass_t);
+
+       pass->lower_bitfields = lower_bitfields;
+       return def_graph_pass_constructor(
+               &pass->pass, name ? name : "lower_hl", lower_highlevel_graph_wrapper);
+}  /* lower_highlevel_graph_pass */
+
 /*
  * does the same as lower_highlevel() for all nodes on the const code irg
  */
@@ -583,6 +608,10 @@ void lower_const_code(void) {
        walk_const_code(NULL, lower_irnode, NULL);
 }  /* lower_const_code */
 
+ir_prog_pass_t *lower_const_code_pass(const char *name) {
+       return def_prog_pass(name ? name : "lower_const_code", lower_const_code);
+}
+
 /*
  * Replaces SymConsts by a real constant if possible.
  * Replace Sel nodes by address computation.  Also resolves array access.