#include <stdlib.h>
#include <stdbool.h>
+#include "adt/pmap.h"
#include "irnode_t.h"
#include "irgraph_t.h"
#include "irprog_t.h"
#include "irprintf.h"
#include "debug.h"
#include "error.h"
+#include "typerep.h"
/** The debug handle. */
DEBUG_ONLY(static firm_dbg_module_t *dbg = NULL;)
+DEBUG_ONLY(static firm_dbg_module_t *dbgcall = NULL;)
/** The source language specific language disambiguator function. */
static DISAMBIGUATOR_FUNC language_disambuigator = NULL;
}
break;
-#if 0
- case iro_Phi:
- /* TODO implement marker algo */
-#endif
+ /* skip identities */
+ case iro_Id:
+ res |= determine_entity_usage(succ, entity);
+ break;
+
+ /* skip tuples */
+ case iro_Tuple: {
+ int input_nr;
+ for (input_nr = get_Tuple_n_preds(succ) - 1; input_nr >= 0;
+ --input_nr) {
+ ir_node *pred = get_Tuple_pred(succ, input_nr);
+ if (pred == irn) {
+ int k;
+ /* we found one input */
+ for (k = get_irn_n_outs(succ) - 1; k >= 0; --k) {
+ ir_node *proj = get_irn_out(succ, k);
+
+ if (is_Proj(proj) && get_Proj_proj(proj) == input_nr) {
+ res |= determine_entity_usage(proj, entity);
+ break;
+ }
+ }
+ }
+ }
+ break;
+ }
default:
- /* another op, we don't know anything */
+ /* another op, we don't know anything (we could do more advanced
+ * things like a dataflow analysis here) */
res |= ir_usage_unknown;
break;
}
void firm_init_memory_disambiguator(void) {
FIRM_DBG_REGISTER(dbg, "firm.ana.irmemory");
+ FIRM_DBG_REGISTER(dbgcall, "firm.opt.cc");
}
-#include <adt/pmap.h>
-#include "typerep.h"
-
-DEBUG_ONLY(static firm_dbg_module_t *dbgcall = NULL;)
-
/** Maps method types to cloned method types. */
static pmap *mtp_map;
int i;
int changed = 0;
- FIRM_DBG_REGISTER(dbgcall, "firm.opt.cc");
-
assure_irp_globals_entity_usage_computed();
mtp_map = pmap_create();