-static int check_cfg_node(ir_node *node, check_cfg_env_t *env)
-{
- pmap *branch_nodes = env->branch_nodes;
- ir_mode *mode = get_irn_mode(node);
-
- if (ir_nodeset_contains(&env->ignore_nodes, node))
- return 1;
-
- if (mode == mode_X) {
- ir_node *block = get_nodes_block(node);
- ir_node *former_branch = pmap_get(branch_nodes, block);
- ir_node *skipped = skip_Tuple(node);
- ir_node *branch = skipped;
-
+static int check_block_cfg(ir_node *block, check_cfg_env_t *env)
+{
+ pmap *branch_nodes;
+ int n_cfgpreds;
+ int i;
+
+ n_cfgpreds = get_Block_n_cfgpreds(block);
+ branch_nodes = env->branch_nodes;
+ for (i = 0; i < n_cfgpreds; ++i) {
+ /* check that each mode_X node is only connected
+ * to 1 user */
+ ir_node *branch = get_Block_cfgpred(block, i);
+ ir_node *former_dest;
+ ir_node *former_branch;
+ ir_node *branch_proj;
+ ir_node *branch_block;
+ branch = skip_Tuple(branch);
+ if (is_Bad(branch))
+ continue;
+ former_dest = pmap_get(branch_nodes, branch);
+ ASSERT_AND_RET_DBG(former_dest==NULL || is_unknown_jump(skip_Proj(branch)),
+ "Multiple users on mode_X node", 0,
+ ir_printf("node %+F\n", branch));
+ pmap_insert(branch_nodes, branch, block);
+
+ /* check that there's only 1 branching instruction in each block */
+ branch_block = get_nodes_block(branch);
+ branch_proj = branch;