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 #ifndef shackle_INCLUDED
00039 #define shackle_INCLUDED "shackle.h"
00040
00041 #include "wn.h"
00042
00043 extern void
00044 SHACKLE_Phase (WN *func_nd);
00045
00046
00047 #define SHACKLED_DIM_MIN_SIZE 5
00048 #define MAX_SHACKLE_DIM_OF_MIN_SIZE 1
00049
00050
00051 #define FOR_CHILDREN(wn,chld,childcnt) \
00052 { \
00053 INT32 childcnt; \
00054 WN *chld; \
00055 WN *__temp_wn; \
00056 \
00057 if (WN_opcode (wn) == OPC_BLOCK) \
00058 __temp_wn = WN_first (wn); \
00059 else if (WN_kid_count (wn) > 0) \
00060 __temp_wn = WN_kid (wn, 0); \
00061 else \
00062 __temp_wn = NULL; \
00063 for (childcnt = 0; __temp_wn != (WN *) NULL; childcnt++) { \
00064 chld = __temp_wn; \
00065 if (WN_opcode ((wn)) == OPC_BLOCK) \
00066 __temp_wn = WN_next (chld); \
00067 else \
00068 __temp_wn = (((childcnt)+1) == WN_kid_count(wn)) ? (WN *) NULL : \
00069 WN_kid (wn, (childcnt) + 1);
00070
00071 #define END_CHILDREN \
00072 } \
00073 }
00074
00075 class SHACKLE_INFO {
00076 private:
00077 const ST *_st;
00078 BOOL _st_is_reshaped;
00079 INT32 _ndim;
00080 BOOL *_is_shackled;
00081 INT32 *_shackle_sizes;
00082
00083
00084
00085 ARB_HANDLE _array_bounds;
00086 MEM_POOL *_pool;
00087 TYPE_ID _type_to_give;
00088 WN **_loop_stmts;
00089 UINT32 _next_loop_count;
00090 WN **_cached_lb_expr_st;
00091 WN **_cached_ub_expr_st;
00092 public:
00093 SHACKLE_INFO(const ST *, WN *, MEM_POOL *, TYPE_ID,
00094 BOOL inquire_info=FALSE);
00095 void Set_Loop_Stmt (INT32 i, WN *stmt) {
00096 _loop_stmts[i] = stmt;
00097 }
00098 BOOL Is_Reshaped() {
00099 return _st_is_reshaped;
00100 }
00101 void Set_Reshaped(BOOL value) {
00102 _st_is_reshaped = value;
00103 }
00104 WN *Get_Loop_Stmt (INT32 i) {
00105 return _loop_stmts[i];
00106 }
00107 TYPE_ID Loop_Type() {
00108 return _type_to_give;
00109 }
00110 WN *Loop();
00111 INT32 Ndim() {
00112 return _ndim;
00113 }
00114 const ST * Symbol() {
00115 return _st;
00116 }
00117 INT32 Shackle_Dim_Size(const INT32 i) {
00118 return _shackle_sizes[i];
00119 }
00120 void Set_Shackle_Dim_Size (const INT32 i, const INT32 val) {
00121 _shackle_sizes[i] = val;
00122 }
00123 INT32 Ndim_Shackled();
00124 BOOL Is_Dim_Shackled(const INT32 i) {
00125 return _is_shackled[i];
00126 }
00127 void Set_Dim_Shackled(const INT32 i, BOOL value) {
00128 _is_shackled[i] = value;
00129 }
00130 BOOL Is_Const_Lower(INT32 i) {
00131 return ARB_const_lbnd(_array_bounds[i]);
00132 }
00133 mINT64 Const_Lower(INT32 i) {
00134 return ARB_lbnd_val(_array_bounds[i]);
00135 }
00136 WN * Expr_Lower (INT32 i) {
00137 WN *tmp = LWN_Copy_Tree (WN_kid0 (_cached_lb_expr_st[i]));
00138 WN *fake_unroll[2];
00139 fake_unroll[0] = WN_kid0 (_cached_lb_expr_st[i]);
00140 fake_unroll[1] = tmp;
00141 Unrolled_DU_Update (fake_unroll, 2, 0);
00142 return tmp;
00143 }
00144
00145 BOOL Is_Const_Upper(INT32 i) {
00146 return ARB_const_ubnd(_array_bounds[i]);
00147 }
00148 mINT64 Const_Upper(INT32 i) {
00149 return ARB_ubnd_val(_array_bounds[i]);
00150 }
00151 WN * Expr_Upper(INT32 i) {
00152 WN *tmp = LWN_Copy_Tree (WN_kid0 (_cached_ub_expr_st[i]));
00153 WN *fake_unroll[2];
00154 fake_unroll[0] = WN_kid0 (_cached_ub_expr_st[i]);
00155 fake_unroll[1] = tmp;
00156 Unrolled_DU_Update (fake_unroll, 2, 0);
00157 return tmp;
00158 }
00159 };
00160
00161 #endif