* Copyright: (c) 2002-2003 Universität Karlsruhe
* Licence: This file protected by GPL - GNU GENERAL PUBLIC LICENSE.
*/
-
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
#include <string.h>
#include <stdbool.h>
#include "ircons.h"
#include "irgmod.h"
#include "irgwalk.h"
-#include "irflag.h"
+#include "irflag_t.h"
+
+// # define CATE_jni
/* Datenstruktur für jede Methode */
typedef struct {
entity * ent = get_Call_callee(call, j);
if (ent) {
irg_data_t * data = get_entity_link(ent);
+# ifndef CATE_jni
assert(get_entity_irg(ent) && data);
++data->count;
+# endif /* ndef CATE_jni */
}
}
}
/* Echt neue Block-Operation erzeugen. CSE abschalten! */
static ir_node * create_Block(int n, ir_node ** in) {
/* Turn off optimizations so that blocks are not merged again. */
- int rem_opt = get_optimize();
+ int rem_opt = get_opt_optimize();
ir_node * block;
set_optimize(0);
block = new_Block(n, in);
static void prepare_irg_end_except(ir_graph * irg, irg_data_t * data);
+/* If we use new_Unknown we get the Unknown of a graph. This can
+ * cause cycles we don't want to see, as Unknwon is in the Start Block
+ * or the procedure. Use unknown of outermost irg where the start
+ * block has no predecessors. */
+static INLINE ir_node *get_cg_Unknown(ir_mode *m) {
+ assert((get_Block_n_cfgpreds(get_irg_start_block(get_irp_main_irg())) == 1) &&
+ (get_nodes_block(get_Block_cfgpred(get_irg_start_block(get_irp_main_irg()), 0)) ==
+ get_irg_start_block(get_irp_main_irg())));
+ return new_r_Unknown(get_irp_main_irg(), m);
+}
+
+
/* IRG vorbereiten. Proj-Operationen der Start-Operation in Filter-Operationen
* umwandeln. Die künstlichen Steuerzusammenflüsse EndReg und EndExcept
* einfügen. An der Start-Operation hängt nach dem Aufruf eine Liste der
/* Unbekannten Aufrufer sofort eintragen. */
if (data->open) {
- set_Block_cg_cfgpred(start_block, 0, new_Unknown());
+ set_Block_cg_cfgpred(start_block, 0, get_cg_Unknown(mode_X));
for (proj = get_irn_link(get_irg_start(irg)); proj; proj = get_irn_link(proj)) {
if (get_irn_op(proj) == op_Filter) {
- set_Filter_cg_pred(proj, 0, new_Unknown());
+ set_Filter_cg_pred(proj, 0, get_cg_Unknown(get_irn_mode(proj)));
}
}
data->count = 1;
/* "frame_base" wird nur durch Unknown dargestellt. Man kann ihn aber
* auch explizit darstellen, wenn sich daraus Vorteile für die
* Datenflussanalyse ergeben. */
- set_Filter_cg_pred(filter, data->count, new_Unknown());
+ set_Filter_cg_pred(filter, data->count, get_cg_Unknown(get_irn_mode(filter)));
break;
case pns_globals:
/* "globals" wird nur durch Unknown dargestellt. Man kann ihn aber auch
* explizit darstellen, wenn sich daraus Vorteile für die
* Datenflussanalyse ergeben. */
- set_Filter_cg_pred(filter, data->count, new_Unknown());
+ set_Filter_cg_pred(filter, data->count, get_cg_Unknown(get_irn_mode(filter)));
break;
default:
/* not reached */
in[i] = new_Bad();
}
} else { /* unknown */
- in[i] = new_Unknown();
+ in[i] = get_cg_Unknown(mode_M);
}
}
}
in[i] = new_Bad();
}
} else { /* unknown */
- in[i] = new_Unknown();
+ in[i] = get_cg_Unknown(mode_M);
}
}
}
/* Abhängigkeiten für ein Ergebnis über alle aufgerufenen Methoden
* bestimmen. */
-static void fill_result(int pos, int length, irg_data_t * data[], ir_node * in[]) {
+static void fill_result(int pos, int length, irg_data_t * data[], ir_node * in[], ir_mode *m) {
int i;
for (i = 0; i < length; ++i) {
if (data[i]) { /* explicit */
in[i] = new_Bad();
}
} else { /* unknown */
- in[i] = new_Unknown();
+ in[i] = get_cg_Unknown(m);
}
}
}
in[i] = new_Bad();
}
} else { /* unknown */
- in[i] = new_Unknown();
+ in[i] = get_cg_Unknown(mode_X);
}
}
set_interprocedural_view(0);
in[i] = new_Bad();
}
} else { /* unknown */
- in[i] = new_Unknown();
+ in[i] = get_cg_Unknown(mode_X);
}
}
set_irn_link(filter, get_irn_link(post_block));
set_irn_link(post_block, filter);
}
- fill_result(get_Proj_proj(filter), n_callees, data, in);
+ fill_result(get_Proj_proj(filter), n_callees, data, in, get_irn_mode(filter));
set_Filter_cg_pred_arr(filter, n_callees, in);
}
}
irg_walk_graph(irg, destruct_walker, clear_link, NULL);
set_irg_frame(irg, skip_nop(get_irg_frame(irg)));
set_irg_globals(irg, skip_nop(get_irg_globals(irg)));
+ set_irg_callee_info_state(irg, irg_callee_info_none);
}
}