forked from Leffmann/vbcc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
opt.h
160 lines (141 loc) · 5.45 KB
/
opt.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
/* $VER: vbcc (opt.h) V0.8 */
#include "supp.h"
extern int gchanged; /* Merker, ob Optimierungslauf etwas geaendert hat */
extern int norek; /* diese Funktion wird nicht rekursiv auf */
extern int nocall; /* diese Funktion kehrt nicht zum Caller zurueck */
extern int inr; /* number of num_Vars iteration */
/* temporary fuer verschiedene Bitvektoren */
extern bvtype *tmp;
/* fuer aktive Variablen */
extern struct Var **vilist;
extern unsigned int vcount; /* 0..vcount-rcount-1: vars, vcount-rcount..vcount: DREFOBJs */
extern unsigned int rcount;
extern size_t vsize;
extern bvtype *av_globals,*av_address,*av_statics,*av_drefs;
extern int report_dead_statements;
/* fuer verfuegbare Definitionen */
extern unsigned int dcount;
extern size_t dsize;
extern struct IC **dlist;
extern bvtype **var_defs,**var_undefs;
extern bvtype **defs_kill,**defs_gen;
extern bvtype *rd_defs,*rd_tmp;
extern bvtype *rd_matrix;
#define UNDEF(x) (x+dcount)
/* fuer verfuegbare Ausdruecke */
extern struct IC **elist;
extern unsigned int ecount;
extern size_t esize;
extern bvtype *ae_globals,*ae_address,*ae_statics,*ae_drefs;
/* fuer verfuegbare Kopien */
extern unsigned int ccount;
extern size_t csize;
extern struct IC **clist;
/* fuer frequency-reduction */
extern bvtype *inloop,*invariant;
/* alle Assignments, globaler oder Adr. fuer propagation etc. */
extern bvtype *cp_globals,*cp_address,*cp_statics,*cp_drefs,*cp_act,*cp_dest;
/* alle Kopieranweisungen, die eine best. Variable als Quelle haben */
extern bvtype **copies;
extern int have_alias;
extern int static_cse,dref_cse;
struct flowgraph{
struct IC *start,*end;
struct flowgraph *normalout,*branchout;
struct flowlist *in;
int index;
/* Letzter Block der Schleife, falls Block Start einer Schleife ist */
struct flowgraph *loopend;
/* Anzahl Funktionsaufrufe im Block/der Schleife */
int calls,loop_calls;
/* Bitvektoren fuer aktive Variablen, reaching-definitions,
available-expressions und available-copies */
bvtype *av_in,*av_out,*av_gen,*av_kill;
bvtype *rd_in,*rd_out,*rd_gen,*rd_kill;
bvtype *ae_in,*ae_out,*ae_gen,*ae_kill;
bvtype *cp_in,*cp_out,*cp_gen,*cp_kill;
/* points-to-info */
bvtype **pt;
/* Registervariablen */
struct Var *regv[MAXR+1];
/* Merker, ob Register gebraucht wurde; MACR+1 Bits */
bvtype regused[RSIZE/sizeof(bvtype)];
#ifdef ALEX_REG
int loop_depth; /* schleifentiefe des blocks. Wird nur fuer echte Schleifen gezaehlt. */
#endif
};
extern unsigned int basic_blocks;
struct flowlist{
struct flowgraph *graph;
struct flowlist *next;
};
int compare_const(union atyps *q1,union atyps *q2,int t);
int compare_objs(struct obj *o1,struct obj *o2,int t);
void simple_regs(void);
void load_simple_reg_parms(void);
void remove_IC_fg(struct flowgraph *g,struct IC *p);
extern int lastlabel;
struct flowgraph *new_flowgraph(void);
struct flowgraph *construct_flowgraph(void);
void print_av(bvtype *bitvector);
void print_rd(bvtype *bitvector);
void print_ae(bvtype *bitvector);
void print_cp(bvtype *bitvector);
void print_flowgraph(struct flowgraph *g);
void free_flowgraph(struct flowgraph *g);
void num_vars(void);
void print_vi(void);
void av_change(struct IC *p,bvtype *use,bvtype *def);
void av_update(struct IC *,bvtype *);
void active_vars(struct flowgraph *fg);
int dead_assignments(struct flowgraph *fg);
void insert_IC(struct IC *p,struct IC *new);
void insert_IC_fg(struct flowgraph *fg,struct IC *p,struct IC *new);
void insert_allocreg(struct flowgraph *fg,struct IC *p,int code,int reg);
void used_objects(struct Var *);
void used_clist(struct Typ *,struct const_list *);
extern struct Var *lregv[MAXR+1],*first_const,*last_const;
extern struct flowgraph *lfg;
extern int report_weird_code,report_suspicious_loops,pointer_call;
int replace_local_reg(struct obj *);
void local_regs(struct flowgraph *);
void local_combine(struct flowgraph *);
void create_const_vars(struct flowgraph *);
void free_const_vars(void);
void loop_regs(struct flowgraph *,int);
void block_regs(struct flowgraph *);
void insert_saves(struct flowgraph *);
struct flowgraph *jump_optimization(void);
void num_defs(void);
void reaching_definitions(struct flowgraph *);
void rd_change(struct IC *);
void calc(int c,int t,union atyps *q1,union atyps *q2,union atyps *z,struct IC *p);
int fold(struct IC *p);
int peephole(void);
int propagate(struct IC *p,struct obj *o,int replace,int global);
int constant_propagation(struct flowgraph *fg,int global);
int compare_exp(const void *a1,const void *a2);
void num_exp(void);
void available_expressions(struct flowgraph *fg);
void available_copies(struct flowgraph *fg);
int cse(struct flowgraph *fg,int global);
void num_copies(void);
int copy_propagation(struct flowgraph *fg,int global);
int loops(struct flowgraph *fg,int mode);
struct flowgraph *create_loop_headers(struct flowgraph *fg,int av);
struct flowgraph *create_loop_footers(struct flowgraph *fg,int av);
void insert_regs(struct flowgraph *fg);
void recalc_offsets(struct flowgraph *fg);
void optimize(long flags,struct Var *function);
int loop_optimizations(struct flowgraph *fg);
void ic_uses(struct IC *p,bvtype *result);
void ic_changes(struct IC *p,bvtype *result);
void create_alias(struct flowgraph *fg);
void free_alias(struct flowgraph *fg);
void update_alias(struct Var *old,struct Var *new);
void print_pt(bvtype **);
void free_pt(bvtype **);
#define CALC_CALLS 1
#define CALC_USES 2
#define CALC_CHANGES 4
void calc_finfo(struct Var *,int);