// Copyright (C) 1985-1998 by Symantec // Copyright (C) 2000-2009 by Digital Mars // All Rights Reserved // http://www.digitalmars.com // Written by Walter Bright /* * This source file is made available for personal use * only. The license is in /dmd/src/dmd/backendlicense.txt * or /dm/src/dmd/backendlicense.txt * For any other uses, please contact Digital Mars. */ #if __SC__ #pragma once #endif #ifndef GO_H #define GO_H 1 /*************************************** * Bit masks for various optimizations. */ typedef unsigned mftype; /* a type big enough for all the flags */ #define MFdc 1 // dead code #define MFda 2 // dead assignments #define MFdv 4 // dead variables #define MFreg 8 // register variables #define MFcse 0x10 // global common subexpressions #define MFvbe 0x20 // very busy expressions #define MFtime 0x40 // favor time (speed) over space #define MFli 0x80 // loop invariants #define MFliv 0x100 // loop induction variables #define MFcp 0x200 // copy propagation #define MFcnp 0x400 // constant propagation #define MFloop 0x800 // loop till no more changes #define MFtree 0x1000 // optelem (tree optimization) #define MFlocal 0x2000 // localize expressions #define MFall (~0) // do everything /********************************** * Definition elem vector, used for reaching definitions. */ typedef struct DN { elem *DNelem; // pointer to definition elem block *DNblock; // pointer to block that the elem is in } dn; /* Global Variables */ extern unsigned optab[]; extern mftype mfoptim; extern unsigned changes; /* # of optimizations performed */ extern struct DN *defnod; /* array of definition elems */ extern unsigned deftop; /* # of entries in defnod[] */ extern elem **expnod; /* array of expression elems */ extern unsigned exptop; /* top of expnod[] */ extern block **expblk; /* parallel array of block pointers */ extern vec_t defkill; /* vector of AEs killed by an ambiguous */ /* definition */ extern vec_t starkill; /* vector of AEs killed by a definition */ /* of something that somebody could be */ /* pointing to */ extern vec_t vptrkill; /* vector of AEs killed by an access */ /* gdag.c */ void builddags(void); void boolopt(void); void opt_arraybounds(); /* gflow.c */ void flowrd(),flowlv(),flowae(),flowvbe(), flowcp(),flowae(),genkillae(),flowarraybounds(); int ae_field_affect(elem *lvalue,elem *e); /* glocal.c */ void localize(void); /* gloop.c */ int blockinit(void); void compdom(void); void loopopt(void); void updaterd(elem *n,vec_t GEN,vec_t KILL); /* gother.c */ void rd_arraybounds(void); void rd_free(); void constprop(void); void copyprop(void); void rmdeadass(void); void elimass(elem *); void deadvar(void); void verybusyexp(void); list_t listrds(vec_t, elem *, vec_t); #endif /* GO_H */