*/
static void exchange_tuple_projs(ir_node *node, void *env)
{
- bool *changed = (bool*)env;
ir_node *pred;
int proj;
+ (void)env;
if (!is_Proj(node)) return;
pred = get_Tuple_pred(pred, proj);
exchange(node, pred);
- *changed = true;
}
-int remove_tuples(ir_graph *irg)
+void remove_tuples(ir_graph *irg)
{
- bool changed = 0;
- irg_walk_graph(irg, exchange_tuple_projs, NULL, &changed);
- return changed;
+ irg_walk_graph(irg, exchange_tuple_projs, NULL, NULL);
+
+ ir_node *end = get_irg_end(irg);
+ int n_keepalives = get_End_n_keepalives(end);
+ int i;
+
+ for (i = n_keepalives - 1; i >= 0; --i) {
+ ir_node *irn = get_End_keepalive(end, i);
+
+ if (is_Tuple(irn)) {
+ remove_End_keepalive(end, irn);
+ }
+ }
+
+ add_irg_properties(irg, IR_GRAPH_PROPERTY_NO_TUPLES);
}