Go to the documentation of this file.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 #include "opt_alias_interface.h"
00037 #include "opt_points_to.h"
00038 #include "config_opt.h"
00039 #include "symtab_access.h"
00040 #include "wn.h"
00041 #include "be_symtab.h"
00042
00043
00044
00045 static BOOL suppress_all_warnings;
00046 static void Set_addr_saved_stmt(WN *wn, BOOL use_passed_not_saved);
00047
00048
00049
00050
00051
00052 static void
00053 Set_addr_saved_expr(WN *wn, BOOL warn)
00054 {
00055 OPCODE opc = WN_opcode(wn);
00056 Is_True(OPCODE_is_expression(opc),
00057 ("Update_addr_saved: opcode must be expression"));
00058
00059 if (OPCODE_is_load(opc))
00060 return;
00061
00062 if (OPCODE_operator(opc) == OPR_LDA) {
00063 ST *st = WN_st(wn);
00064 if (ST_class(st) == CLASS_VAR &&
00065 !ST_addr_saved(st)) {
00066 Set_ST_addr_saved(st);
00067 if (warn && !suppress_all_warnings)
00068 DevWarn("Set_addr_saved_expr: addr_saved flag of ST (%s) should be set.",
00069 ST_name(st));
00070 }
00071 }
00072 if (OPCODE_operator(opc) == OPR_COMMA) {
00073 Set_addr_saved_stmt(WN_kid(wn,0), warn);
00074 Set_addr_saved_expr(WN_kid(wn,1), warn);
00075 return;
00076 }
00077 if (OPCODE_operator(opc) == OPR_RCOMMA) {
00078 Set_addr_saved_expr(WN_kid(wn,0), warn);
00079 Set_addr_saved_stmt(WN_kid(wn,1), warn);
00080 return;
00081 }
00082 for (INT i = 0; i < WN_kid_count(wn); i++)
00083 Set_addr_saved_expr(WN_kid(wn,i), warn);
00084 }
00085
00086
00087 static void
00088 Set_addr_saved_stmt(WN *wn, BOOL use_passed_not_saved)
00089 {
00090 if (wn == NULL) return;
00091 OPCODE opc = WN_opcode(wn);
00092
00093 if (OPCODE_is_call(opc)) {
00094 for (INT32 i = 0; i < WN_kid_count(wn); i++) {
00095 WN *actual = WN_actual(wn,i);
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112 if (WN_operator(actual) != OPR_PARM) continue;
00113 if (!use_passed_not_saved ||
00114 !WN_Parm_Passed_Not_Saved(actual))
00115 Set_addr_saved_expr(WN_kid0(actual), FALSE);
00116 }
00117 return;
00118 }
00119
00120 switch (OPCODE_operator(opc)) {
00121 case OPR_FORWARD_BARRIER:
00122 case OPR_BACKWARD_BARRIER:
00123 case OPR_ALLOCA:
00124 case OPR_DEALLOCA:
00125 return;
00126 }
00127
00128 if (OPCODE_is_black_box(opc))
00129 return;
00130
00131 if (opc == OPC_BLOCK) {
00132 for (WN *stmt = WN_first(wn); stmt != NULL; stmt = WN_next(stmt))
00133 Set_addr_saved_stmt(stmt, use_passed_not_saved);
00134 } else {
00135 for (INT i = 0; i < WN_kid_count(wn); i++) {
00136 Set_addr_saved_stmt(WN_kid(wn,i), use_passed_not_saved);
00137 }
00138 }
00139 }
00140
00141
00142
00143 static void
00144 Recompute_addr_saved_stmt(WN *wn)
00145 {
00146 if (wn == NULL) return;
00147 OPCODE opc = WN_opcode(wn);
00148
00149 if (OPCODE_is_store(opc)) {
00150
00151
00152 Set_addr_saved_expr(WN_kid0(wn), TRUE);
00153 }
00154
00155 if (OPCODE_is_black_box(opc))
00156 return;
00157
00158 if (opc == OPC_BLOCK) {
00159 for (WN *stmt = WN_first(wn); stmt != NULL; stmt = WN_next(stmt))
00160 Recompute_addr_saved_stmt(stmt);
00161 } else {
00162 for (INT i = 0; i < WN_kid_count(wn); i++) {
00163 Recompute_addr_saved_stmt(WN_kid(wn,i));
00164 }
00165 }
00166 }
00167
00168
00169 #ifdef Is_True_On
00170
00171 static void Verify_addr_flags_stmt(WN *wn);
00172
00173 static void
00174 Verify_addr_saved_expr(WN *wn)
00175 {
00176 OPCODE opc = WN_opcode(wn);
00177 Is_True(OPCODE_is_expression(opc),
00178 ("Update_addr_saved: opcode must be expression"));
00179
00180 if (OPCODE_is_load(opc))
00181 return;
00182
00183 if (OPCODE_operator(opc) == OPR_LDA) {
00184 ST *st = WN_st(wn);
00185 if (ST_class(st) == CLASS_VAR &&
00186 !ST_addr_saved(st)) {
00187 FmtAssert(TRUE, ("PU_adjust_addr_flags: ST %s should be addr_saved.\n",
00188 ST_name(st)));
00189 }
00190 }
00191 if (OPCODE_operator(opc) == OPR_COMMA) {
00192 Verify_addr_flags_stmt(WN_kid(wn,0));
00193 Verify_addr_saved_expr(WN_kid(wn,1));
00194 return;
00195 }
00196 if (OPCODE_operator(opc) == OPR_RCOMMA) {
00197 Verify_addr_saved_expr(WN_kid(wn,0));
00198 Verify_addr_flags_stmt(WN_kid(wn,1));
00199 return;
00200 }
00201 for (INT i = 0; i < WN_kid_count(wn); i++)
00202 Verify_addr_saved_expr(WN_kid(wn,i));
00203 }
00204
00205 static void
00206 Verify_addr_flags_stmt(WN *wn)
00207 {
00208 if (wn == NULL) return;
00209 OPCODE opc = WN_opcode(wn);
00210
00211 if (OPCODE_is_store(opc)) {
00212
00213
00214 Verify_addr_saved_expr(WN_kid0(wn));
00215 }
00216
00217 switch (OPCODE_operator(opc)) {
00218 case OPR_FORWARD_BARRIER:
00219 case OPR_BACKWARD_BARRIER:
00220 case OPR_ALLOCA:
00221 case OPR_DEALLOCA:
00222 return;
00223 }
00224
00225 if (OPCODE_is_black_box(opc))
00226 return;
00227
00228 if (opc == OPC_BLOCK) {
00229 for (WN *stmt = WN_first(wn); stmt != NULL; stmt = WN_next(stmt))
00230 Verify_addr_flags_stmt(stmt);
00231 } else {
00232 for (INT i = 0; i < WN_kid_count(wn); i++) {
00233 Verify_addr_flags_stmt(WN_kid(wn,i));
00234 }
00235 }
00236 }
00237 #endif
00238
00239
00240 void
00241 PU_adjust_addr_flags(ST* pu_st, WN *wn)
00242 {
00243 suppress_all_warnings = FALSE;
00244
00245
00246
00247
00248 BOOL has_privatization_LDAs = BE_ST_pu_needs_addr_flag_adjust(pu_st);
00249
00250 if (OPT_recompute_addr_flags || has_privatization_LDAs) {
00251 if (!OPT_recompute_addr_flags)
00252 suppress_all_warnings = TRUE;
00253 Recompute_addr_saved_stmt(wn);
00254 }
00255
00256 if (BE_ST_pu_needs_addr_flag_adjust(pu_st))
00257 Clear_BE_ST_pu_needs_addr_flag_adjust(pu_st);
00258
00259 #ifdef Is_True_On
00260 if (!PU_smart_addr_analysis(Pu_Table[ST_pu(pu_st)]))
00261 Verify_addr_flags_stmt(wn);
00262 #endif
00263
00264
00265 if (!Is_FORTRAN()) {
00266 PU& pu = Pu_Table[ST_pu(pu_st)];
00267 Set_addr_saved_stmt(wn,
00268 CXX_Alias_Const ||
00269 (OPT_IPA_addr_analysis && PU_ipa_addr_analysis(pu)));
00270 }
00271 }