rta.c 16.9 KB
Newer Older
Florian Liekweg's avatar
Florian Liekweg committed
1
2
3
4
5
/* -*- c -*- */

/*
 * Project:     libFIRM
 * File name:   ir/ana/rta.c
6
 * Purpose:     Interprocedural analysis to improve the call graph estimate.
Florian Liekweg's avatar
Florian Liekweg committed
7
8
9
 * Author:      Florian
 * Modified by:
 * Created:     09.06.2002
Florian Liekweg's avatar
Florian Liekweg committed
10
 * CVS-ID:      $Id$
Florian Liekweg's avatar
Florian Liekweg committed
11
 * Copyright:   (c) 1999-2004 Universitt Karlsruhe
Florian Liekweg's avatar
Florian Liekweg committed
12
 * Licence:     This file is protected by GPL -  GNU GENERAL PUBLIC LICENSE.
Florian Liekweg's avatar
Florian Liekweg committed
13
14
15
 */


16
#ifdef HAVE_CONFIG_H
Michael Beck's avatar
Michael Beck committed
17
# include "config.h"
18
19
#endif

Florian Liekweg's avatar
Florian Liekweg committed
20
21
#include "rta.h"

22
#include <stdlib.h>
Florian Liekweg's avatar
Florian Liekweg committed
23

24
#include "irnode_t.h"
Götz Lindenmaier's avatar
Götz Lindenmaier committed
25
#include "irprog_t.h"
26
#include "irgraph_t.h"
Florian Liekweg's avatar
Florian Liekweg committed
27

28
29
#include "eset.h"
#include "irgwalk.h"
30
#include "irgmod.h"
Michael Beck's avatar
Michael Beck committed
31
#include "typewalk.h"
32
33
#include "irvrfy.h"
#include "trvrfy.h"
Florian Liekweg's avatar
Florian Liekweg committed
34

Florian Liekweg's avatar
Florian Liekweg committed
35
36
37
38
# ifndef TRUE
#  define TRUE 1
#  define FALSE 0
# endif /* not defined TRUE */
Florian Liekweg's avatar
Florian Liekweg committed
39

40
41
42
43
/* flags */
static int verbose     = 0;


44
45
/* base data */
static eset *_live_classes   = NULL;
Florian Liekweg's avatar
Florian Liekweg committed
46
47

/* cache computed results */
48
static eset *_live_graphs    = NULL;
Florian Liekweg's avatar
Florian Liekweg committed
49

50
/**
51
   Given a method, find the firm graph that implements that method.
52
*/
53
static ir_graph *get_implementing_graph (entity *method)
54
{
55
#if 0
56
  ir_graph *graph = get_entity_irg ((entity*) method);
57

58
59
  /* Search upwards in the overwrites graph. */
  /* GL: this will not work for multiple inheritance */
60
61
62
  if (NULL == graph) {
    int i;
    int n_over = get_entity_n_overwrites ((entity*) method);
63

64
65
66
67
    for (i = 0; (NULL == graph) && (i < n_over); i ++) {
      entity *over = get_entity_overwrites ((entity*) method, i);
      graph = get_implementing_graph (over);
    }
68
69
  }

70
71
  /* GL   this is not valid in our remove irg algorithm ... which we removed by now ...  */
  assert(get_entity_peculiarity(method) == peculiarity_description
Florian Liekweg's avatar
Florian Liekweg committed
72
     || graph == get_entity_irg(get_SymConst_entity(get_atomic_ent_value(method))));
73

74
75
76
77
78
  /* we *must* always return a graph != NULL, *except* when we're used
     inside remove_irg or force_description */
  /* assert (graph && "no graph"); */

  return (graph);
79
80
81
82
83
84
85
86
#else
  ir_graph *graph = NULL;

  if (get_entity_peculiarity(method) != peculiarity_description)
    graph = get_entity_irg(get_SymConst_entity(get_atomic_ent_value(method)));

  return graph;
#endif
87
88
}

89
90
91
92
93
94
95
/**
 * Add a graph to the set of live graphs.
 *
 * @param graph  the graph to add
 * @return non-zero if the graph was added, zero
 *         if it was already in the live set
 */
96
97
98
99
100
static int add_graph (ir_graph *graph)
{
  if (!eset_contains (_live_graphs, graph)) {
    if (verbose > 1) {
      fprintf(stdout, "RTA:        new graph of ");
101
      DDMEO(get_irg_entity (graph));
102
103
104
105
106
107
108
109
110
    }

    eset_insert (_live_graphs, graph);
    return (TRUE);
  }

  return (FALSE);
}

111
112
113
114
115
116
117
/**
 * Add a class to the set of live classes.
 *
 * @param clazz   the class to add
 * @return non-zero if the graph was added, zero
 *         if it was already in the live set
 */
118
static int add_class (ir_type *clazz)
119
120
{
  if (!eset_contains (_live_classes, clazz)) {
121
122
123
124
    if (verbose > 1) {
      fprintf(stdout, "RTA:        new class: ");
      DDMT(clazz);
    }
125
126
127
128
129
130
131
132

    eset_insert (_live_classes, clazz);
    return (TRUE);
  }

  return (FALSE);
}

133
134
135
136
/** Given an entity, add all implementing graphs that belong to live classes
 *  to _live_graphs.
 *
 *  Iff additions occurred, return TRUE, else FALSE.
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
*/
static int add_implementing_graphs (entity *method)
{
  int i;
  int n_over = get_entity_n_overwrittenby (method);
  ir_graph *graph = get_entity_irg (method);
  int change = FALSE;

  if (NULL == graph) {
    graph = get_implementing_graph (method);
  }

  if (verbose > 1) {
    fprintf(stdout, "RTA:        new call to ");
    DDMEO(method);
  }

  if (rta_is_alive_class (get_entity_owner (method))) {
    if (NULL != graph) {
      change = add_graph (graph);
    }
  }

  for (i = 0; i < n_over; i ++) {
    entity *over = get_entity_overwrittenby (method, i);
    change |= add_implementing_graphs (over);
163
  }
164
165

  return (change);
166
167
}

168
169
170
171
172
/** Enter all method accesses and all class allocations into
 *  our tables.
 *
 *  Set *(int*)env to true iff (possibly) new graphs have been found.
 */
Florian Liekweg's avatar
Florian Liekweg committed
173
174
static void rta_act (ir_node *node, void *env)
{
175
  int *change = (int*) env;
Florian Liekweg's avatar
Florian Liekweg committed
176
177
  opcode op = get_irn_opcode (node);

178
  if (iro_Call == op) {         /* CALL */
Florian Liekweg's avatar
Florian Liekweg committed
179
180
181
182
    entity *ent = NULL;

    ir_node *ptr = get_Call_ptr (node);

183
184
    /* CALL SEL */
    if (iro_Sel == get_irn_opcode (ptr)) {
Florian Liekweg's avatar
Florian Liekweg committed
185
      ent = get_Sel_entity (ptr);
186
187
      *change |= add_implementing_graphs (ent);

Florian Liekweg's avatar
Florian Liekweg committed
188
      /* CALL SYMCONST */
189
    } else if (iro_SymConst == get_irn_opcode (ptr)) {
Beyhan's avatar
Beyhan committed
190
      if (get_SymConst_kind(ptr) == symconst_addr_ent) {
Michael Beck's avatar
Michael Beck committed
191
192
        ir_graph *graph;

Florian Liekweg's avatar
Florian Liekweg committed
193
        ent = get_SymConst_entity (ptr);
Michael Beck's avatar
Michael Beck committed
194
        graph = get_entity_irg (ent);
Florian Liekweg's avatar
Florian Liekweg committed
195
196
197
198
199
        if (graph) {
          *change |= add_graph (graph);
        } else {
          /* it's an external allocated thing. */
        }
Beyhan's avatar
Beyhan committed
200
      } else if (get_SymConst_kind(ptr) == symconst_addr_name) {
Michael Beck's avatar
Michael Beck committed
201
202
203
204
	    /* Entities of kind addr_name may not be allocated in this compilation unit.
	       If so, the frontend built faulty Firm.  So just ignore. */
	    /* if (get_SymConst_name(ptr) != new_id_from_str("iro_Catch"))
        assert (ent && "couldn't determine entity of call to SymConst of kind addr_name."); */
Beyhan's avatar
Beyhan committed
205
      } else {
Florian Liekweg's avatar
Florian Liekweg committed
206
207
        /* other symconst. */
        assert(0 && "This SymConst can not be an address for a method call.");
Beyhan's avatar
Beyhan committed
208
209
      }

Florian Liekweg's avatar
Florian Liekweg committed
210
      /* STRANGE */
211
212
213
    } else {
      DDMN(ptr);
      assert(0 && "Unexpected address expression: can not analyse, therefore can not do correct rta!");
214
    }
215

216
  } else if (iro_Alloc == op) { /* ALLOC */
217
    ir_type *type = get_Alloc_type (node);
Florian Liekweg's avatar
Florian Liekweg committed
218

219
    *change |= add_class (type);
Florian Liekweg's avatar
Florian Liekweg committed
220
221
222
  }
}

Florian Liekweg's avatar
Florian Liekweg committed
223
/**
224
   Traverse the given graph to collect method accesses and
225
   object allocations.
Florian Liekweg's avatar
Florian Liekweg committed
226
*/
227
static int rta_fill_graph (ir_graph* graph)
Florian Liekweg's avatar
Florian Liekweg committed
228
{
229
  int change = FALSE;
230
  irg_walk_graph (graph, rta_act, NULL, &change);
231
  return change;
232
233
}

234
235
/** Traverse all graphs to collect method accesses and object allocations.
 */
236
static int rta_fill_incremental (void)
Florian Liekweg's avatar
Florian Liekweg committed
237
238
{
  int i;
239
240
  int n_runs = 0;
  int rerun  = TRUE;
241
  int old_ip_view = get_interprocedural_view();
Florian Liekweg's avatar
Florian Liekweg committed
242

243
  set_interprocedural_view(0);     /* save this for later */
244

245
  /* init_tables has added main_irg to _live_graphs */
246

247
  /* Need to take care of graphs that are externally
248
     visible or sticky. Pretend that they are called: */
249

250
251
252
  for (i = 0; i < get_irp_n_irgs(); i++) {
    ir_graph *graph = get_irp_irg (i);
    entity *ent = get_irg_entity (graph);
253

254
    if ((visibility_external_visible == get_entity_visibility (ent)) ||
255
256
        (stickyness_sticky == get_entity_stickyness (ent))) {
      eset_insert (_live_graphs, graph);
257
      // printf("external visible: "); DDMG(graph);
258
    }
259
260
  }

261
262
  while (rerun) {
    ir_graph *graph;
Florian Liekweg's avatar
Florian Liekweg committed
263

264
265
266
    /* start off new */
    eset *live_graphs = _live_graphs;
    _live_graphs = eset_create ();
Florian Liekweg's avatar
Florian Liekweg committed
267

268
269
    if (verbose > 1) {
      fprintf(stdout, "RTA: RUN %i\n", n_runs);
Florian Liekweg's avatar
Florian Liekweg committed
270
    }
Florian Liekweg's avatar
Florian Liekweg committed
271

272
273
    /* collect what we have found previously */
    eset_insert_all (_live_graphs, live_graphs);
Florian Liekweg's avatar
Florian Liekweg committed
274

275
276
277
278
    rerun = FALSE;
    for (graph = eset_first (live_graphs);
         graph;
         graph = eset_next (live_graphs)) {
Florian Liekweg's avatar
Florian Liekweg committed
279

280
281
      if (verbose > 1) {
        fprintf(stdout, "RTA: RUN %i: considering graph of ", n_runs);
282
        DDMEO(get_irg_entity (graph));
283
      }
Florian Liekweg's avatar
Florian Liekweg committed
284

285
286
      rerun |= rta_fill_graph (graph);
    }
Florian Liekweg's avatar
Florian Liekweg committed
287

288
    eset_destroy (live_graphs);
Florian Liekweg's avatar
Florian Liekweg committed
289

290
    n_runs ++;
Florian Liekweg's avatar
Florian Liekweg committed
291
292
  }

293
  set_interprocedural_view(old_ip_view); /* cover up our traces */
Florian Liekweg's avatar
Florian Liekweg committed
294

295
  return (n_runs);
Florian Liekweg's avatar
Florian Liekweg committed
296
297
}

Michael Beck's avatar
Michael Beck committed
298
299
300
/**
 * Count the number of graphs that we have found to be live.
 */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
301
static int stats (void)
Florian Liekweg's avatar
Florian Liekweg committed
302
{
303
304
305
306
307
308
309
  int i;
  int n_live_graphs = 0;
  int n_graphs = get_irp_n_irgs();

  for (i = 0; i < n_graphs; i++) {
    ir_graph *graph = get_irp_irg(i);

310
    if (rta_is_alive_graph (graph)) {
311
      n_live_graphs ++;
312
313
314
315
316
    }
  }

  return (n_live_graphs);
}
317

318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
/* remove a graph, part I */
/*
   We removed the first graph to implement the entity, so we're
   abstract now.  Pretend that it wasn't there at all, and every
   entity that used to inherit this entity's graph is now abstract.
*/
/* Since we *know* that this entity will not be called, this is OK. */
static void force_description (entity *ent, entity *addr)
{
  int i, n_over = get_entity_n_overwrittenby (ent);

  set_entity_peculiarity (ent, peculiarity_description);

  for (i = 0; i < n_over; i ++) {
    entity *over = get_entity_overwrittenby (ent, i);

    if (peculiarity_inherited == get_entity_peculiarity (over)) {
      /* We rely on the fact that cse is performed on the const_code_irg. */
Beyhan's avatar
Beyhan committed
336
      entity *my_addr = get_SymConst_entity(get_atomic_ent_value(over));
337
338
339
340
341

      if (addr == my_addr) {
        force_description (over, addr);
      }
    } else if (peculiarity_existent == get_entity_peculiarity (over)) {
Florian Liekweg's avatar
Florian Liekweg committed
342
      /* check whether 'over' forces 'inheritance' of *our* graph: */
343
      ir_node *f_addr = get_atomic_ent_value (over);
Beyhan's avatar
Beyhan committed
344
      entity *impl_ent = get_SymConst_entity (f_addr);
345

Beyhan's avatar
Beyhan committed
346
      assert ((get_irn_op(f_addr) == op_SymConst) && "can't do complex addrs");
347
348
349
350
351
352
353
354
      if (impl_ent == addr) {
        assert (0 && "gibt's denn sowas");
        force_description (over, addr);
      }
    }
  }
}

355
/**
Michael Beck's avatar
Michael Beck committed
356
   Initialize the static data structures.
357
358
359
*/
static void init_tables (void)
{
360
361
  ir_type *tp;
  int i, n;
362
363

  _live_classes = eset_create ();
364
  _live_graphs  = eset_create ();
365
366
367
368
369

  if (get_irp_main_irg ()) {
    eset_insert (_live_graphs, get_irp_main_irg ());
  }

370
  /* Find static allocated classes */
371
372
373
374
375
376
377
378
379
380
381
382
  tp = get_glob_type();
  n = get_class_n_members(tp);
  for (i = 0; i < n; ++i) {
    ir_type *member_type = get_entity_type(get_class_member(tp, i));
    if (is_Class_type(member_type))
      eset_insert(_live_classes, member_type);
  }

  tp = get_tls_type();
  n = get_struct_n_members(tp);
  for (i = 0; i < n; ++i) {
    ir_type *member_type = get_entity_type(get_struct_member(tp, i));
383
    if (is_Class_type(member_type))
384
      eset_insert(_live_classes, member_type);
385
386
387
  }
}

388
/*
Michael Beck's avatar
Michael Beck committed
389
 * Initialize the RTA data structures, and perform RTA.
390
391
 * do_verbose If == 1, print statistics, if > 1, chatter about every detail
 */
392
void rta_init (int do_verbose)
393
{
Matthias Braun's avatar
Matthias Braun committed
394
  int n_runs = 0;
395

Götz Lindenmaier's avatar
Götz Lindenmaier committed
396
397
398
  int rem_vpi = get_visit_pseudo_irgs();
  set_visit_pseudo_irgs(1);

399
# ifdef DEBUG_libfirm
Matthias Braun's avatar
Matthias Braun committed
400
401
  {
  int i, n;
402
403
  n = get_irp_n_irgs();
  for (i = 0; i < n; i++) {
404
405
406
    irg_vrfy (get_irp_irg(i));
  }
  tr_vrfy ();
Matthias Braun's avatar
Matthias Braun committed
407
  }
408
409
# endif /* defined DEBUG_libfirm */

410
  verbose = do_verbose;
411

412
  init_tables ();
413

414
  n_runs = rta_fill_incremental ();
415

416
  if (verbose) {
417
418
    int n_live_graphs = stats ();

419
420
421
422
    printf ("RTA: n_graphs      = %i\n", get_irp_n_irgs ());
    printf ("RTA: n_live_graphs = %i\n", n_live_graphs);
    printf ("RTA: n_runs        = %i\n", n_runs);
  }
423
424

# ifdef DEBUG_libfirm
Matthias Braun's avatar
Matthias Braun committed
425
426
  {
  int n, i;
427
  for (i = 0; i < n; i++) {
428
429
430
    irg_vrfy (get_irp_irg(i));
  }
  tr_vrfy ();
Matthias Braun's avatar
Matthias Braun committed
431
  }
432
# endif /* defined DEBUG_libfirm */
Götz Lindenmaier's avatar
Götz Lindenmaier committed
433
434

  set_visit_pseudo_irgs(rem_vpi);
435
436
}

437
438
439
440
441
442
443
/**
 * walker for all types and entities
 *
 * Changes the peculiarity of entities that represents
 * dead graphs to peculiarity_description.
 */
static void make_entity_to_description(type_or_ent *tore, void *env) {
444
445
446
  if (get_kind(tore) == k_entity) {
    entity *ent = (entity *)tore;

447
    if ((is_Method_type(get_entity_type(ent)))                        &&
Michael Beck's avatar
Michael Beck committed
448
449
        (get_entity_peculiarity(ent) != peculiarity_description)      &&
        (get_entity_visibility(ent)  != visibility_external_allocated)   ) {
450
451
      ir_graph *irg = get_entity_irg(get_SymConst_entity(get_atomic_ent_value(ent)));
      if (!eset_contains (_live_graphs, irg)) {
Michael Beck's avatar
Michael Beck committed
452
453
        set_entity_peculiarity(ent, peculiarity_description);
        set_entity_irg(ent, NULL);
454
455
456
457
458
      }
    }
  }
}

459
460
461
/* Delete all graphs that we have found to be dead from the program
   If verbose == 1, print statistics, if > 1, chatter about every detail
*/
462
void rta_delete_dead_graphs (void)
463
464
465
466
{
  int i;
  int n_graphs = get_irp_n_irgs ();
  ir_graph *graph = NULL;
467
  int n_dead_graphs = 0;
Michael Beck's avatar
Michael Beck committed
468
  ir_graph **dead_graphs;
469

Götz Lindenmaier's avatar
Götz Lindenmaier committed
470
471
472
  int rem_vpi = get_visit_pseudo_irgs();
  set_visit_pseudo_irgs(1);

Götz Lindenmaier's avatar
Götz Lindenmaier committed
473
474
  if (!get_optimize() || !get_opt_dead_method_elimination()) return;

Michael Beck's avatar
Michael Beck committed
475
  dead_graphs = xmalloc(sizeof(*dead_graphs) * get_irp_n_irgs());
476
477
478
479

  for (i = 0; i < n_graphs; i++) {
    graph = get_irp_irg(i);

480
    if (rta_is_alive_graph (graph)) {
481
482
      /* do nothing (except some debugging fprintf`s :-) */
    } else {
Florian Liekweg's avatar
Florian Liekweg committed
483
# ifdef DEBUG_libfirm
484
      entity *ent = get_irg_entity (graph);
485
      assert (visibility_external_visible != get_entity_visibility (ent));
Florian Liekweg's avatar
Florian Liekweg committed
486
# endif /* defined DEBUG_libfirm */
487

488
      dead_graphs[n_dead_graphs] = graph;
489
      n_dead_graphs ++;
490
491
    }
  }
Florian Liekweg's avatar
Florian Liekweg committed
492

493
494
495
  type_walk(make_entity_to_description, NULL, NULL);
  for (i = 0; i < n_dead_graphs; ++i) {
    remove_irp_irg (dead_graphs[i]);
496
  }
497
498
499
500

  if (verbose) {
    printf ("RTA: n_dead_graphs = %i\n", n_dead_graphs);
  }
Götz Lindenmaier's avatar
Götz Lindenmaier committed
501
502

  set_visit_pseudo_irgs(rem_vpi);
Michael Beck's avatar
Michael Beck committed
503
504

  free(dead_graphs);
505
}
506

507
/* Clean up the RTA data structures.  Call this after calling rta_init */
508
void rta_cleanup (void)
509
{
510
511
512
513
514
515
516
517
# ifdef DEBUG_libfirm
  int i;
    for (i = 0; i < get_irp_n_irgs(); i++) {
      irg_vrfy (get_irp_irg(i));
    }
    tr_vrfy ();
# endif /* defined DEBUG_libfirm */

Florian Liekweg's avatar
Florian Liekweg committed
518
  if (_live_classes) {
519
    eset_destroy (_live_classes);
Florian Liekweg's avatar
Florian Liekweg committed
520
521
522
523
    _live_classes = NULL;
  }

  if (_live_graphs) {
524
    eset_destroy (_live_graphs);
Florian Liekweg's avatar
Florian Liekweg committed
525
526
527
528
    _live_graphs = NULL;
  }
}

Florian Liekweg's avatar
Florian Liekweg committed
529
/* Say whether this class might be instantiated at any point in the program: */
530
int  rta_is_alive_class  (ir_type   *clazz)
Florian Liekweg's avatar
Florian Liekweg committed
531
{
532
  return (eset_contains (_live_classes, clazz));
Florian Liekweg's avatar
Florian Liekweg committed
533
534
}

Florian Liekweg's avatar
Florian Liekweg committed
535
/* Say whether this graph might be run at any time in the program: */
Florian Liekweg's avatar
Florian Liekweg committed
536
537
int  rta_is_alive_graph (ir_graph *graph)
{
538
  return eset_contains (_live_graphs, graph);
Florian Liekweg's avatar
Florian Liekweg committed
539
540
}

Florian Liekweg's avatar
Florian Liekweg committed
541
/* dump our opinion */
542
void rta_report (void)
Florian Liekweg's avatar
Florian Liekweg committed
543
544
545
546
{
  int i;

  for (i = 0; i < get_irp_n_types(); ++i) {
547
    ir_type *tp = get_irp_type(i);
548
    if (is_Class_type(tp) && rta_is_alive_class(tp)) {
549
      fprintf(stdout, "RTA: considered allocated: "); DDMT(tp);
Florian Liekweg's avatar
Florian Liekweg committed
550
551
552
553
554
    }
  }

  for (i = 0; i < get_irp_n_irgs(); i++) {
    if (rta_is_alive_graph (get_irp_irg(i))) {
555
      fprintf(stdout, "RTA: considered called: graph of ");
556
      DDMEO(get_irg_entity (get_irp_irg(i)));
Florian Liekweg's avatar
Florian Liekweg committed
557
558
559
    }
  }
}
Florian Liekweg's avatar
Florian Liekweg committed
560
561
562
563


/*
 * $Log$
Matthias Braun's avatar
Matthias Braun committed
564
565
566
567
568
 * Revision 1.37  2006/12/11 15:28:48  matze
 * - Several warning fixes
 * - Fixes for compilation without DEBUG_libfirm
 * - Fixed for compilation without WITH_LIBCORE (but it's still broken)
 *
569
570
571
572
 * Revision 1.36  2006/06/05 15:58:12  beck
 * added support for Thread local storage
 * added more doxygen docu
 *
573
574
575
 * Revision 1.35  2006/01/13 21:51:59  beck
 * renamed all types 'type' to 'ir_type'
 *
Michael Beck's avatar
Michael Beck committed
576
577
578
 * Revision 1.34  2006/01/02 15:01:16  beck
 * missing include added
 *
579
580
581
 * Revision 1.33  2005/11/17 17:26:57  beck
 * removed bool type and depency from stdbool.h (not C89)
 *
582
583
584
 * Revision 1.32  2005/01/05 14:24:52  beck
 * renames all is_x*_type() functions to is_X*_type() to prevent name clash with EDG frontend
 *
Michael Beck's avatar
Michael Beck committed
585
586
587
 * Revision 1.31  2004/12/21 13:45:14  beck
 * removed C99 constructs
 *
Michael Beck's avatar
Michael Beck committed
588
589
590
591
 * Revision 1.30  2004/12/02 16:16:11  beck
 * fixed config.h include
 * used xmalloc instead of malloc
 *
Götz Lindenmaier's avatar
Götz Lindenmaier committed
592
593
594
 * Revision 1.29  2004/11/11 13:28:08  goetz
 * made pseudo irg aware
 *
595
596
597
 * Revision 1.28  2004/11/03 14:47:18  beck
 * removed gloval intraprocedural_view variable and replaced by get_*() set_*() functions
 *
Götz Lindenmaier's avatar
Götz Lindenmaier committed
598
599
600
 * Revision 1.27  2004/10/21 07:23:34  goetz
 * comments
 *
Florian Liekweg's avatar
Florian Liekweg committed
601
602
603
 * Revision 1.26  2004/10/20 14:59:27  liekweg
 * Removed ecg
 *
Florian Liekweg's avatar
Florian Liekweg committed
604
605
606
 * Revision 1.25  2004/10/18 12:47:08  liekweg
 * avoid warning
 *
607
608
609
 * Revision 1.24  2004/09/24 13:59:04  beck
 * fixed doxygen comments, removed initialization for description entities
 *
610
611
612
 * Revision 1.23  2004/08/19 16:51:02  goetz
 * fixed some errors, pushed closer to inteded firm semantics
 *
613
614
615
616
617
 * Revision 1.22  2004/08/13 08:57:15  beyhan
 * normalized names of functions, enums ...
 * added suffix as argument to dumpers, removed global variable
 * removed support for tarval/Const
 *
Götz Lindenmaier's avatar
Götz Lindenmaier committed
618
619
620
 * Revision 1.21  2004/07/08 15:50:56  goetz
 * firmstat added
 *
Götz Lindenmaier's avatar
Götz Lindenmaier committed
621
622
623
 * Revision 1.20  2004/07/08 11:17:40  goetz
 * *** empty log message ***
 *
Beyhan's avatar
Beyhan committed
624
625
626
 * Revision 1.19  2004/07/06 12:30:37  beyhan
 * new SymConst semantics
 *
Florian Liekweg's avatar
Florian Liekweg committed
627
628
629
 * Revision 1.18  2004/06/27 21:17:41  liekweg
 * Added comment
 *
630
631
632
 * Revision 1.17  2004/06/25 13:45:13  liekweg
 * observe stickyness; minor refactoring
 *
Götz Lindenmaier's avatar
Götz Lindenmaier committed
633
634
635
 * Revision 1.16  2004/06/24 06:42:14  goetz
 * test of firm flags
 *
636
637
638
 * Revision 1.15  2004/06/18 15:47:19  liekweg
 * minor bug fix (go forward, not backward) --flo
 *
639
640
641
 * Revision 1.14  2004/06/18 13:12:43  liekweg
 * final bug fix (calls via consts)
 *
Florian Liekweg's avatar
Florian Liekweg committed
642
643
644
 * Revision 1.13  2004/06/17 16:34:33  liekweg
 * removed DD*s
 *
Florian Liekweg's avatar
Florian Liekweg committed
645
646
647
 * Revision 1.12  2004/06/17 16:33:33  liekweg
 * minor bug fix
 *
Florian Liekweg's avatar
Florian Liekweg committed
648
649
650
 * Revision 1.11  2004/06/17 14:21:13  liekweg
 * major bugfix
 *
651
652
653
654
655
 * Revision 1.10  2004/06/17 10:31:41  goetz
 * irscc: bugfix, can now deal with loops not reachable from start
 * cgana: bugfix, skip_Tuple
 * rta: improved
 *
Florian Liekweg's avatar
Florian Liekweg committed
656
657
658
 * Revision 1.9  2004/06/17 08:56:03  liekweg
 * Fixed typos in comments
 *
659
660
 * Revision 1.8  2004/06/17 08:33:01  liekweg
 * Added comments; added remove_irg
661
 *
Götz Lindenmaier's avatar
Götz Lindenmaier committed
662
663
664
 * Revision 1.6  2004/06/14 13:02:03  goetz
 * bugfixesbug
 *
665
666
667
 * Revision 1.5  2004/06/13 15:03:45  liekweg
 * RTA auf Iterative RTA aufgebohrt --flo
 *
Florian Liekweg's avatar
Florian Liekweg committed
668
669
670
 * Revision 1.4  2004/06/12 19:35:04  liekweg
 * Kommentare eingef"ugt --flo
 *
671
672
673
 * Revision 1.3  2004/06/12 17:09:46  liekweg
 * RTA works, outedges breaks.  "Yay." --flo
 *
Florian Liekweg's avatar
Florian Liekweg committed
674
675
676
 * Revision 1.2  2004/06/11 18:25:39  liekweg
 * Added todo
 *
Florian Liekweg's avatar
Florian Liekweg committed
677
678
679
680
 * Revision 1.1  2004/06/11 18:24:18  liekweg
 * Added RTA --flo
 *
 */