160 lines · 5.4 KB · C
RawDownload
/*  $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 4void calc_finfo(struct Var *,int);