00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061 #ifndef opt_fold_INCLUDED
00062 #define opt_fold_INCLUDED "opt_fold.h"
00063 #ifdef _KEEP_RCS_ID
00064 static char *opt_foldrcs_id = opt_fold_INCLUDED"$Revision: 1.4 $";
00065 #endif
00066
00067 #ifndef opt_htable_INCLUDED
00068 #include "opt_htable.h"
00069 #endif
00070
00071 #ifndef config_INCLUDED
00072 #include "config.h"
00073 #endif
00074
00075 class FOLD
00076 {
00077 public:
00078 FOLD(void);
00079
00080
00081 CODEREP *Fold_Expr(CODEREP *);
00082 CODEREP *Fold_Tree(CODEREP *);
00083
00084 private:
00085
00086 #define NOHASH NULL // did nothing
00087 #define CONST NULL // folded to a constant
00088
00089
00090 void Print(const char *, const CODEREP *);
00091
00092
00093 CODEREP *CR_Simplify_Tree(CODEREP *);
00094 CODEREP *CR_Simplify_Expr(CODEREP *);
00095 #ifdef KEY
00096 CODEREP *CR_Simplify_Iload(CODEREP *);
00097 #endif
00098
00099
00100 BOOL check_convert(CODEREP *, CODEREP **, INT);
00101
00102
00103 WN_MAP CR_SimpParentMap(void) { return (WN_MAP)0; }
00104 };
00105
00106
00107 typedef CODEREP * simpnode;
00108
00109
00110 #define SIMPNODE_opcode CR_opcode
00111 #define SIMPNODE_operator CR_operator
00112 #define SIMPNODE_rtype(x) (x)->Dtyp()
00113 #define SIMPNODE_desc(x) (x)->Dsctyp()
00114 #define SIMPNODE_load_offset(x) (x)->Offset()
00115 #define SIMPNODE_cvtl_bits(x) (x)->Offset()
00116 #define SIMPNODE_st CR_st
00117 #define SIMPNODE_st_idx(x) ST_st_idx(CR_st(x))
00118 #define SIMPNODE_ty CR_ty
00119 #define SIMPNODE_kid0 CR_kid0
00120
00121 #define SIMPNODE_kid1(x) (((x)->Kind() == CK_OP) ? \
00122 (x)->Opnd(1) : NULL)
00123 #define SIMPNODE_kid CR_kid
00124 #define SIMPNODE_kid_count CR_kid_count
00125 #define SIMPNODE_element_size(x) (x)->Elm_siz()
00126 #define SIMPNODE_idname_offset(x) (x)->Offset()
00127 #define SIMPNODE_lda_offset(x) (x)->Offset()
00128 #define SIMPNODE_label_number(x) (x)->Offset()
00129 #define SIMPNODE_num_dim(x) (x)->Num_dim()
00130 #define SIMPNODE_array_base(x) (x)->Opnd(0)
00131 #define SIMPNODE_array_index(x,y) (x)->Opnd((x)->Num_dim()+y+1)
00132 #define SIMPNODE_array_dim(x,y) (x)->Opnd(y+1)
00133 #define SIMPNODE_intrinsic(x) (x)->Intrinsic()
00134 #define SIMPNODE_const_val(x) (x)->Const_val()
00135 #define SIMPNODE_fconst_val(x) (x)->Const_ftcon2(fold_htable)
00136 #define SIMPNODE_field_id(x) (x)->Field_id()
00137 #define SIMPNODE_i_field_id(x) (x)->I_field_id()
00138 #define SIMPNODE_bit_offset(x) (x)->Bit_offset()
00139 #define SIMPNODE_i_bit_offset(x) (x)->I_bit_offset()
00140 #define SIMPNODE_op_bit_offset(x) (x)->Op_bit_offset()
00141 #define SIMPNODE_op_bit_size(x) (x)->Op_bit_size()
00142
00143
00144 #define SIMPNODE_enable WOPT_Enable_CRSIMP
00145 #define TRACEFILE TFile
00146
00147
00148 #define SIMPNODE_SimpCreateExp1 CR_SimpCreateExp1
00149 #define SIMPNODE_SimpCreateExp2 CR_SimpCreateExp2
00150 #define SIMPNODE_SimpCreateExp3 CR_SimpCreateExp3
00151 #define SIMPNODE_SimpCreateCvtl CR_SimpCreateCvtl
00152 #define SIMPNODE_SimpCreateExtract CR_SimpCreateExtract
00153 #define SIMPNODE_SimpCreateDeposit CR_SimpCreateDeposit
00154 #define SIMPNODE_TREE_DELETE(x) (x)->DecUsecnt_rec()
00155 #define SIMPNODE_DELETE(x) (x)->DecUsecnt()
00156 #define SIMPNODE_CopyNode(x) (((x)->Coderep_id() == 0) ? \
00157 fold_htable->Rehash(x) : (x))
00158 #define SIMPNODE_CreateIntconst CR_CreateIntconst
00159 #define SIMPNODE_CreateFloatconstFromTcon CR_CreateFPconst
00160 #define SIMPNODE_Simplify_Initialize CR_Simplify_Initialize
00161 #define SIMPNODE_Compare_Symbols CR_Compare_Symbols
00162
00163 extern simpnode SIMPNODE_SimplifyExp1(OPCODE, simpnode);
00164 extern simpnode SIMPNODE_SimplifyExp2(OPCODE, simpnode, simpnode);
00165 extern simpnode SIMPNODE_SimplifyExp3(OPCODE, simpnode, simpnode, simpnode);
00166 extern simpnode SIMPNODE_SimplifyCvtl(OPCODE, INT16, simpnode);
00167 extern simpnode SIMPNODE_SimplifyIntrinsic(OPCODE, UINT32, INT32, simpnode *);
00168
00169
00170 extern void Initialize_CR_simp(CODEMAP*);
00171 extern INT32 CR_Compare_Symbols(CODEREP*, CODEREP*);
00172 extern INT32 CR_Compare_Trees(CODEREP*, CODEREP*);
00173
00174 #endif // opt_fold_INCLUDED