e2e4866f08413de93015b24db74f3f954cd229b5
[libfirm] / ir / opt / jumpthreading.c
1 /*
2  * Copyright (C) 1995-2008 University of Karlsruhe.  All right reserved.
3  *
4  * This file is part of libFirm.
5  *
6  * This file may be distributed and/or modified under the terms of the
7  * GNU General Public License version 2 as published by the Free Software
8  * Foundation and appearing in the file LICENSE.GPL included in the
9  * packaging of this file.
10  *
11  * Licensees holding valid libFirm Professional Edition licenses may use
12  * this file in accordance with the libFirm Commercial License.
13  * Agreement provided with the Software.
14  *
15  * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16  * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE.
18  */
19
20 /**
21  * @file
22  * @brief   Path-Sensitive Jump Threading
23  * @date    10. Sep. 2006
24  * @author  Christoph Mallon, Matthias Braun
25  * @version $Id$
26  */
27 #include "config.h"
28
29 #include "iroptimize.h"
30
31 #include <assert.h>
32 #include "array_t.h"
33 #include "debug.h"
34 #include "ircons.h"
35 #include "irgmod.h"
36 #include "irgopt.h"
37 #include "irgwalk.h"
38 #include "irnode.h"
39 #include "irnode_t.h"
40 #include "iredges.h"
41 #include "iredges_t.h"
42 #include "irtools.h"
43 #include "irgraph.h"
44 #include "tv.h"
45 #include "opt_confirms.h"
46 #include "iropt_dbg.h"
47
48 #undef AVOID_PHIB
49
50 DEBUG_ONLY(static firm_dbg_module_t *dbg);
51
52 /**
53  * Add the new predecessor x to node node, which is either a Block or a Phi
54  */
55 static void add_pred(ir_node* node, ir_node* x)
56 {
57         ir_node** ins;
58         int n;
59         int i;
60
61         assert(is_Block(node) || is_Phi(node));
62
63         n = get_irn_arity(node);
64         NEW_ARR_A(ir_node*, ins, n + 1);
65         for (i = 0; i < n; i++)
66                 ins[i] = get_irn_n(node, i);
67         ins[n] = x;
68         set_irn_in(node, n + 1, ins);
69 }
70
71 static ir_node *ssa_second_def;
72 static ir_node *ssa_second_def_block;
73
74 static ir_node *search_def_and_create_phis(ir_node *block, ir_mode *mode,
75                                            int first)
76 {
77         int i;
78         int n_cfgpreds;
79         ir_graph *irg;
80         ir_node *phi;
81         ir_node **in;
82
83         /* This is needed because we create bads sometimes */
84         if (is_Bad(block))
85                 return new_Bad();
86
87         /* the other defs can't be marked for cases where a user of the original
88          * value is in the same block as the alternative definition.
89          * In this case we mustn't use the alternative definition.
90          * So we keep a flag that indicated wether we walked at least 1 block
91          * away and may use the alternative definition */
92         if (block == ssa_second_def_block && !first) {
93                 return ssa_second_def;
94         }
95
96         /* already processed this block? */
97         if (irn_visited(block)) {
98                 ir_node *value = (ir_node*) get_irn_link(block);
99                 return value;
100         }
101
102         irg = get_irn_irg(block);
103         assert(block != get_irg_start_block(irg));
104
105         /* a Block with only 1 predecessor needs no Phi */
106         n_cfgpreds = get_Block_n_cfgpreds(block);
107         if (n_cfgpreds == 1) {
108                 ir_node *pred_block = get_Block_cfgpred_block(block, 0);
109                 ir_node *value      = search_def_and_create_phis(pred_block, mode, 0);
110
111                 set_irn_link(block, value);
112                 mark_irn_visited(block);
113                 return value;
114         }
115
116         /* create a new Phi */
117         NEW_ARR_A(ir_node*, in, n_cfgpreds);
118         for(i = 0; i < n_cfgpreds; ++i)
119                 in[i] = new_Unknown(mode);
120
121         phi = new_r_Phi(block, n_cfgpreds, in, mode);
122         set_irn_link(block, phi);
123         mark_irn_visited(block);
124
125         /* set Phi predecessors */
126         for(i = 0; i < n_cfgpreds; ++i) {
127                 ir_node *pred_block = get_Block_cfgpred_block(block, i);
128                 ir_node *pred_val   = search_def_and_create_phis(pred_block, mode, 0);
129
130                 set_irn_n(phi, i, pred_val);
131         }
132
133         return phi;
134 }
135
136 /**
137  * Given a set of values this function constructs SSA-form for the users of the
138  * first value (the users are determined through the out-edges of the value).
139  * Uses the irn_visited flags. Works without using the dominance tree.
140  */
141 static void construct_ssa(ir_node *orig_block, ir_node *orig_val,
142                           ir_node *second_block, ir_node *second_val)
143 {
144         ir_graph *irg;
145         ir_mode *mode;
146         const ir_edge_t *edge;
147         const ir_edge_t *next;
148
149         /* no need to do anything */
150         if (orig_val == second_val)
151                 return;
152
153         irg = get_irn_irg(orig_val);
154         inc_irg_visited(irg);
155
156         mode = get_irn_mode(orig_val);
157         set_irn_link(orig_block, orig_val);
158         mark_irn_visited(orig_block);
159
160         ssa_second_def_block = second_block;
161         ssa_second_def       = second_val;
162
163         /* Only fix the users of the first, i.e. the original node */
164         foreach_out_edge_safe(orig_val, edge, next) {
165                 ir_node *user = get_edge_src_irn(edge);
166                 int j = get_edge_src_pos(edge);
167                 ir_node *user_block = get_nodes_block(user);
168                 ir_node *newval;
169
170                 /* ignore keeps */
171                 if (is_End(user))
172                         continue;
173
174                 DB((dbg, LEVEL_3, ">>> Fixing user %+F (pred %d == %+F)\n", user, j, get_irn_n(user, j)));
175
176                 if (is_Phi(user)) {
177                         ir_node *pred_block = get_Block_cfgpred_block(user_block, j);
178                         newval = search_def_and_create_phis(pred_block, mode, 1);
179                 } else {
180                         newval = search_def_and_create_phis(user_block, mode, 1);
181                 }
182
183                 /* don't fix newly created Phis from the SSA construction */
184                 if (newval != user) {
185                         DB((dbg, LEVEL_4, ">>>> Setting input %d of %+F to %+F\n", j, user, newval));
186                         set_irn_n(user, j, newval);
187                 }
188         }
189 }
190
191 static void split_critical_edge(ir_node *block, int pos) {
192         ir_graph *irg = get_irn_irg(block);
193         ir_node *in[1];
194         ir_node *new_block;
195         ir_node *new_jmp;
196
197         in[0] = get_Block_cfgpred(block, pos);
198         new_block = new_r_Block(irg, 1, in);
199         new_jmp = new_r_Jmp(new_block);
200         set_Block_cfgpred(block, pos, new_jmp);
201 }
202
203 typedef struct jumpthreading_env_t {
204         ir_node       *true_block;
205         ir_node       *cmp;        /**< The Compare node that might be partial evaluated */
206         pn_Cmp         pnc;        /**< The Compare mode of the Compare node. */
207         ir_node       *cnst;
208         tarval        *tv;
209         ir_visited_t   visited_nr;
210
211         ir_node       *cnst_pred;   /**< the block before the constant */
212         int            cnst_pos;    /**< the pos to the constant block (needed to
213                                           kill that edge later) */
214 } jumpthreading_env_t;
215
216 static ir_node *copy_and_fix_node(const jumpthreading_env_t *env,
217                                   ir_node *block, ir_node *copy_block, int j,
218                                   ir_node *node)
219 {
220         int      i, arity;
221         ir_node *copy;
222
223         /* we can evaluate Phis right now, all other nodes get copied */
224         if (is_Phi(node)) {
225                 copy = get_Phi_pred(node, j);
226                 /* we might have to evaluate a Phi-cascade */
227                 if (get_irn_visited(copy) >= env->visited_nr) {
228                         copy = get_irn_link(copy);
229                 }
230         } else {
231                 copy = exact_copy(node);
232                 set_nodes_block(copy, copy_block);
233
234                 assert(get_irn_mode(copy) != mode_X);
235
236                 arity = get_irn_arity(copy);
237                 for(i = 0; i < arity; ++i) {
238                         ir_node *pred     = get_irn_n(copy, i);
239                         ir_node *new_pred;
240
241                         if (get_nodes_block(pred) != block)
242                                 continue;
243
244                         if (get_irn_visited(pred) >= env->visited_nr) {
245                                 new_pred = get_irn_link(pred);
246                         } else {
247                                 new_pred = copy_and_fix_node(env, block, copy_block, j, pred);
248                         }
249                         DB((dbg, LEVEL_2, ">> Set Pred of %+F to %+F\n", copy, new_pred));
250                         set_irn_n(copy, i, new_pred);
251                 }
252         }
253
254         set_irn_link(node, copy);
255         set_irn_visited(node, env->visited_nr);
256
257         return copy;
258 }
259
260 static void copy_and_fix(const jumpthreading_env_t *env, ir_node *block,
261                          ir_node *copy_block, int j)
262 {
263         const ir_edge_t *edge;
264
265         /* Look at all nodes in the cond_block and copy them into pred */
266         foreach_out_edge(block, edge) {
267                 ir_node *node = get_edge_src_irn(edge);
268                 ir_node *copy;
269                 ir_mode *mode;
270
271                 if (is_Block(node)) {
272                         /* Block->Block edge, should be the MacroBlock edge */
273                         assert(get_Block_MacroBlock(node) == block && "Block->Block edge found");
274                         continue;
275                 }
276
277                 /* ignore control flow */
278                 mode = get_irn_mode(node);
279                 if (mode == mode_X || is_Cond(node))
280                         continue;
281 #ifdef AVOID_PHIB
282                 /* we may not copy mode_b nodes, because this could produce Phi with
283                  * mode_bs which can't be handled in all backends. Instead we duplicate
284                  * the node and move it to its users */
285                 if (mode == mode_b) {
286                         const ir_edge_t *edge, *next;
287                         ir_node *pred;
288                         int      pn;
289
290                         assert(is_Proj(node));
291
292                         pred = get_Proj_pred(node);
293                         pn   = get_Proj_proj(node);
294
295                         foreach_out_edge_safe(node, edge, next) {
296                                 ir_node *cmp_copy;
297                                 ir_node *user       = get_edge_src_irn(edge);
298                                 int pos             = get_edge_src_pos(edge);
299                                 ir_node *user_block = get_nodes_block(user);
300
301                                 if (user_block == block)
302                                         continue;
303
304                                 cmp_copy = exact_copy(pred);
305                                 set_nodes_block(cmp_copy, user_block);
306                                 copy = new_r_Proj(current_ir_graph, user_block, cmp_copy, mode_b, pn);
307                                 set_irn_n(user, pos, copy);
308                         }
309                         continue;
310                 }
311 #endif
312
313                 copy = copy_and_fix_node(env, block, copy_block, j, node);
314
315                 /* we might hit values in blocks that have already been processed by a
316                  * recursive find_phi_with_const() call */
317                 assert(get_irn_visited(copy) <= env->visited_nr);
318                 if (get_irn_visited(copy) >= env->visited_nr) {
319                         ir_node *prev_copy = get_irn_link(copy);
320                         if (prev_copy != NULL)
321                                 set_irn_link(node, prev_copy);
322                 }
323         }
324
325         /* fix data-flow (and reconstruct SSA if needed) */
326         foreach_out_edge(block, edge) {
327                 ir_node *node = get_edge_src_irn(edge);
328                 ir_node *copy_node;
329                 ir_mode *mode;
330
331                 if (is_Block(node)) {
332                         /* Block->Block edge, should be the MacroBlock edge */
333                         assert(get_Block_MacroBlock(node) == block && "Block->Block edge found");
334                         continue;
335                 }
336
337                 mode = get_irn_mode(node);
338                 if (mode == mode_X || is_Cond(node))
339                         continue;
340 #ifdef AVOID_PHIB
341                 if (mode == mode_b)
342                         continue;
343 #endif
344
345                 DB((dbg, LEVEL_2, ">> Fixing users of %+F\n", node));
346
347                 copy_node = get_irn_link(node);
348                 construct_ssa(block, node, copy_block, copy_node);
349         }
350 }
351
352 /**
353  * returns whether the cmp evaluates to true or false, or can't be evaluated!
354  * 1: true, 0: false, -1: can't evaluate
355  *
356  * @param pnc       the compare mode of the Compare
357  * @param tv_left   the left tarval
358  * @param tv_right  the right tarval
359  */
360 static int eval_cmp_tv(pn_Cmp pnc, tarval *tv_left, tarval *tv_right)
361 {
362         pn_Cmp cmp_result = tarval_cmp(tv_left, tv_right);
363
364         /* does the compare evaluate to true? */
365         if (cmp_result == pn_Cmp_False)
366                 return -1;
367         if ((cmp_result & pnc) != cmp_result)
368                 return 0;
369
370         return 1;
371 }
372
373 /**
374  * returns whether the cmp evaluates to true or false, or can't be evaluated!
375  * 1: true, 0: false, -1: can't evaluate
376  *
377  * @param env      the environment
378  * @param cand     the candidate node, either a Const or a Confirm
379  */
380 static int eval_cmp(jumpthreading_env_t *env, ir_node *cand)
381 {
382         if (is_Const(cand)) {
383                 tarval *tv_cand   = get_Const_tarval(cand);
384                 tarval *tv_cmp    = get_Const_tarval(env->cnst);
385
386                 return eval_cmp_tv(env->pnc, tv_cand, tv_cmp);
387         } else { /* a Confirm */
388                 tarval *res = computed_value_Cmp_Confirm(env->cmp, cand, env->cnst, env->pnc);
389
390                 if (res == tarval_bad)
391                         return -1;
392                 return res == tarval_b_true;
393         }
394 }
395
396 /**
397  * Check for Const or Confirm with Const.
398  */
399 static int is_Const_or_Confirm(const ir_node *node)
400 {
401         if (is_Confirm(node))
402                 node = get_Confirm_bound(node);
403         return is_Const(node);
404 }
405
406 /**
407  * get the tarval of a Const or Confirm with
408  */
409 static tarval *get_Const_or_Confirm_tarval(const ir_node *node)
410 {
411         if (is_Confirm(node)) {
412                 if (get_Confirm_bound(node))
413                         node = get_Confirm_bound(node);
414         }
415         return get_Const_tarval(node);
416 }
417
418 static ir_node *find_const_or_confirm(jumpthreading_env_t *env, ir_node *jump,
419                                       ir_node *value)
420 {
421         ir_node *block = get_nodes_block(jump);
422
423         if (irn_visited_else_mark(value))
424                 return NULL;
425
426         if (is_Const_or_Confirm(value)) {
427                 if (eval_cmp(env, value) <= 0) {
428                         return NULL;
429                 }
430
431                 DB((
432                         dbg, LEVEL_1,
433                         "> Found condition evaluation candidate %+F->%+F\n",
434                         env->true_block, block
435                 ));
436
437                 /* adjust true_block to point directly towards our jump */
438                 add_pred(env->true_block, jump);
439
440                 split_critical_edge(env->true_block, 0);
441
442                 /* we need a bigger visited nr when going back */
443                 env->visited_nr++;
444
445                 return block;
446         }
447
448         if (is_Phi(value)) {
449                 int i, arity;
450
451                 /* the Phi has to be in the same Block as the Jmp */
452                 if (get_nodes_block(value) != block) {
453                         return NULL;
454                 }
455
456                 arity = get_irn_arity(value);
457                 for(i = 0; i < arity; ++i) {
458                         ir_node *copy_block;
459                         ir_node *phi_pred = get_Phi_pred(value, i);
460                         ir_node *cfgpred  = get_Block_cfgpred(block, i);
461
462                         copy_block = find_const_or_confirm(env, cfgpred, phi_pred);
463                         if (copy_block == NULL)
464                                 continue;
465
466                         /* copy duplicated nodes in copy_block and fix SSA */
467                         copy_and_fix(env, block, copy_block, i);
468
469                         if (copy_block == get_nodes_block(cfgpred)) {
470                                 env->cnst_pred = block;
471                                 env->cnst_pos  = i;
472                         }
473
474                         /* return now as we can't process more possibilities in 1 run */
475                         return copy_block;
476                 }
477         }
478
479         return NULL;
480 }
481
482 static ir_node *find_candidate(jumpthreading_env_t *env, ir_node *jump,
483                                ir_node *value)
484 {
485         ir_node *block = get_nodes_block(jump);
486
487         if (irn_visited_else_mark(value)) {
488                 return NULL;
489         }
490
491         if (is_Const_or_Confirm(value)) {
492                 tarval *tv = get_Const_or_Confirm_tarval(value);
493
494                 if (tv != env->tv)
495                         return NULL;
496
497                 DB((
498                         dbg, LEVEL_1,
499                         "> Found condition evaluation candidate %+F->%+F\n",
500                         env->true_block, block
501                 ));
502
503                 /* adjust true_block to point directly towards our jump */
504                 add_pred(env->true_block, jump);
505
506                 split_critical_edge(env->true_block, 0);
507
508                 /* we need a bigger visited nr when going back */
509                 env->visited_nr++;
510
511                 return block;
512         }
513         if (is_Phi(value)) {
514                 int i, arity;
515
516                 /* the Phi has to be in the same Block as the Jmp */
517                 if (get_nodes_block(value) != block)
518                         return NULL;
519
520                 arity = get_irn_arity(value);
521                 for(i = 0; i < arity; ++i) {
522                         ir_node *copy_block;
523                         ir_node *phi_pred = get_Phi_pred(value, i);
524                         ir_node *cfgpred  = get_Block_cfgpred(block, i);
525
526                         copy_block = find_candidate(env, cfgpred, phi_pred);
527                         if (copy_block == NULL)
528                                 continue;
529
530                         /* copy duplicated nodes in copy_block and fix SSA */
531                         copy_and_fix(env, block, copy_block, i);
532
533                         if (copy_block == get_nodes_block(cfgpred)) {
534                                 env->cnst_pred = block;
535                                 env->cnst_pos  = i;
536                         }
537
538                         /* return now as we can't process more possibilities in 1 run */
539                         return copy_block;
540                 }
541         }
542         if (is_Proj(value)) {
543                 ir_node *left;
544                 ir_node *right;
545                 int      pnc;
546                 ir_node *cmp = get_Proj_pred(value);
547                 if (!is_Cmp(cmp))
548                         return NULL;
549
550                 left  = get_Cmp_left(cmp);
551                 right = get_Cmp_right(cmp);
552                 pnc   = get_Proj_proj(value);
553
554                 /* we assume that the constant is on the right side, swap left/right
555                  * if needed */
556                 if (is_Const(left)) {
557                         ir_node *t = left;
558                         left       = right;
559                         right      = t;
560
561                         pnc        = get_inversed_pnc(pnc);
562                 }
563
564                 if (!is_Const(right))
565                         return 0;
566
567                 if (get_nodes_block(left) != block) {
568                         return 0;
569                 }
570
571                 /* negate condition when we're looking for the false block */
572                 if (env->tv == tarval_b_false) {
573                         pnc = get_negated_pnc(pnc, get_irn_mode(right));
574                 }
575
576                 /* (recursively) look if a pred of a Phi is a constant or a Confirm */
577                 env->cmp  = cmp;
578                 env->pnc  = pnc;
579                 env->cnst = right;
580
581                 return find_const_or_confirm(env, jump, left);
582         }
583
584         return NULL;
585 }
586
587 /**
588  * Block-walker: searches for the following construct
589  *
590  *  Const or Phi with constants
591  *           |
592  *          Cmp
593  *           |
594  *         Cond
595  *          /
596  *       ProjX
597  *        /
598  *     Block
599  */
600 static void thread_jumps(ir_node* block, void* data)
601 {
602         jumpthreading_env_t env;
603         int *changed = data;
604         ir_node *selector;
605         ir_node *projx;
606         ir_node *cond;
607         ir_node *copy_block;
608         int      selector_evaluated;
609         const ir_edge_t *edge, *next;
610         ir_node *bad;
611         size_t   cnst_pos;
612
613         if (get_Block_n_cfgpreds(block) != 1)
614                 return;
615
616         projx = get_Block_cfgpred(block, 0);
617         if (!is_Proj(projx))
618                 return;
619         assert(get_irn_mode(projx) == mode_X);
620
621         cond = get_Proj_pred(projx);
622         if (!is_Cond(cond))
623                 return;
624
625         selector = get_Cond_selector(cond);
626         /* TODO handle switch Conds */
627         if (get_irn_mode(selector) != mode_b)
628                 return;
629
630         /* handle cases that can be immediately evaluated */
631         selector_evaluated = -1;
632         if (is_Proj(selector)) {
633                 ir_node *cmp = get_Proj_pred(selector);
634                 if (is_Cmp(cmp)) {
635                         ir_node *left  = get_Cmp_left(cmp);
636                         ir_node *right = get_Cmp_right(cmp);
637                         if (is_Const(left) && is_Const(right)) {
638                                 int     pnc      = get_Proj_proj(selector);
639                                 tarval *tv_left  = get_Const_tarval(left);
640                                 tarval *tv_right = get_Const_tarval(right);
641
642                                 selector_evaluated = eval_cmp_tv(pnc, tv_left, tv_right);
643                                 if (selector_evaluated < 0)
644                                         return;
645                         }
646                 }
647         } else if (is_Const_or_Confirm(selector)) {
648                 tarval *tv = get_Const_or_Confirm_tarval(selector);
649                 if (tv == tarval_b_true) {
650                         selector_evaluated = 1;
651                 } else {
652                         assert(tv == tarval_b_false);
653                         selector_evaluated = 0;
654                 }
655         }
656
657         env.cnst_pred = NULL;
658         if (get_Proj_proj(projx) == pn_Cond_false) {
659                 env.tv = tarval_b_false;
660                 if (selector_evaluated >= 0)
661                         selector_evaluated = !selector_evaluated;
662         } else {
663                 env.tv = tarval_b_true;
664         }
665
666         if (selector_evaluated == 0) {
667                 bad = new_Bad();
668                 exchange(projx, bad);
669                 *changed = 1;
670                 return;
671         } else if (selector_evaluated == 1) {
672                 dbg_info *dbgi = get_irn_dbg_info(selector);
673                 ir_node  *jmp  = new_rd_Jmp(dbgi, get_nodes_block(projx));
674                 DBG_OPT_COND_EVAL(projx, jmp);
675                 exchange(projx, jmp);
676                 *changed = 1;
677                 return;
678         }
679
680         /* (recursively) look if a pred of a Phi is a constant or a Confirm */
681         env.true_block = block;
682         inc_irg_visited(current_ir_graph);
683         env.visited_nr = get_irg_visited(current_ir_graph);
684
685         copy_block = find_candidate(&env, projx, selector);
686         if (copy_block == NULL)
687                 return;
688
689         /* we have to remove the edge towards the pred as the pred now
690          * jumps into the true_block. We also have to shorten Phis
691          * in our block because of this */
692         bad      = new_Bad();
693         cnst_pos = env.cnst_pos;
694
695         /* shorten Phis */
696         foreach_out_edge_safe(env.cnst_pred, edge, next) {
697                 ir_node *node = get_edge_src_irn(edge);
698
699                 if (is_Phi(node))
700                         set_Phi_pred(node, cnst_pos, bad);
701         }
702
703         set_Block_cfgpred(env.cnst_pred, cnst_pos, bad);
704
705         /* the graph is changed now */
706         *changed = 1;
707 }
708
709 void opt_jumpthreading(ir_graph* irg)
710 {
711         int changed, rerun;
712
713         FIRM_DBG_REGISTER(dbg, "firm.opt.jumpthreading");
714
715         DB((dbg, LEVEL_1, "===> Performing jumpthreading on %+F\n", irg));
716
717         remove_critical_cf_edges(irg);
718
719         edges_assure(irg);
720         ir_reserve_resources(irg, IR_RESOURCE_IRN_LINK | IR_RESOURCE_IRN_VISITED);
721
722         changed = 0;
723         do {
724                 rerun = 0;
725                 irg_block_walk_graph(irg, thread_jumps, NULL, &rerun);
726                 changed |= rerun;
727         } while (rerun);
728
729         ir_free_resources(irg, IR_RESOURCE_IRN_LINK | IR_RESOURCE_IRN_VISITED);
730
731         if (changed) {
732                 /* control flow changed, some blocks may become dead */
733                 set_irg_outs_inconsistent(irg);
734                 set_irg_doms_inconsistent(irg);
735                 set_irg_extblk_inconsistent(irg);
736                 set_irg_loopinfo_inconsistent(irg);
737                 set_irg_entity_usage_state(irg, ir_entity_usage_not_computed);
738
739                 /* Dead code might be created. Optimize it away as it is dangerous
740                  * to call optimize_df() an dead code. */
741                 optimize_cf(irg);
742         }
743 }