Go to the documentation of this file.00001
00017 #include "ManagerSideEffectStandard.hpp"
00018 #include <Utils/Util.hpp>
00019
00020
00021 namespace OA {
00022 namespace SideEffect {
00023
00024 static bool debug = false;
00025
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 ManagerSideEffectStandard::ManagerSideEffectStandard(OA_ptr<SideEffectIRInterface> _ir) : mIR(_ir)
00062 {
00063 OA_DEBUG_CTRL_MACRO("DEBUG_ManagerSideEffectStandard:ALL", debug);
00064 }
00065
00066
00075 OA_ptr<SideEffectStandard>
00076 ManagerSideEffectStandard::performAnalysis(ProcHandle proc,
00077 OA_ptr<Alias::Interface> alias,
00078 OA_ptr<InterSideEffectInterface> inter)
00079 {
00080 mProc = proc;
00081 if (debug) {
00082 std::cout << "ManagerSideEffectStandard: proc = " << mIR->toString(proc)
00083 << std::endl;
00084 }
00085
00086
00087 OA_ptr<SideEffectStandard> retSideEffect;
00088 retSideEffect= new SideEffectStandard();
00089
00090
00091
00092
00093 retSideEffect->emptyLMOD();
00094 retSideEffect->emptyMOD();
00095 retSideEffect->emptyLDEF();
00096 retSideEffect->emptyDEF();
00097 retSideEffect->emptyLUSE();
00098 retSideEffect->emptyUSE();
00099 retSideEffect->emptyLREF();
00100 retSideEffect->emptyREF();
00101
00102
00103 OA_ptr<OA::IRStmtIterator> sIt = mIR->getStmtIterator(proc);
00104 for ( ; sIt->isValid(); (*sIt)++) {
00105 OA::StmtHandle stmt = sIt->current();
00106 if (debug) {
00107 std::cout << "\tstmt = ";
00108 mIR->dump(stmt,std::cout);
00109 }
00110
00111
00112 OA_ptr<MemRefHandleIterator> mrIterPtr = mIR->getUseMemRefs(stmt);
00113 for (; mrIterPtr->isValid(); (*mrIterPtr)++ )
00114 {
00115 MemRefHandle memref = mrIterPtr->current();
00116 if (debug) {
00117 std::cout << "\tmemref = ";
00118 mIR->dump(memref,std::cout);
00119 }
00120
00121
00122 OA_ptr<LocIterator> locIterPtr = alias->getMayLocs(memref);
00123 for (; locIterPtr->isValid(); ++(*locIterPtr)) {
00124
00125 OA_ptr<Location> useLoc = locIterPtr->current();
00126 if (debug) {
00127 std::cout << "useLoc = ";
00128 useLoc->dump(std::cout, mIR);
00129 }
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139 retSideEffect->insertLREF( useLoc);
00140 retSideEffect->insertREF( useLoc);
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152 retSideEffect->insertLUSE(useLoc);
00153 retSideEffect->insertUSE(useLoc);
00154
00155
00156 }
00157 }
00158
00159
00160 mrIterPtr = mIR->getDefMemRefs(stmt);
00161 for (; mrIterPtr->isValid(); (*mrIterPtr)++ )
00162 {
00163 MemRefHandle memref = mrIterPtr->current();
00164 if (debug) {
00165 std::cout << "\tmemref = ";
00166 mIR->dump(memref,std::cout);
00167 }
00168
00169
00170 OA_ptr<LocIterator> locIterPtr = alias->getMayLocs(memref);
00171 for (; locIterPtr->isValid(); ++(*locIterPtr)) {
00172 OA_ptr<Location> mayDef = locIterPtr->current();
00173 if (debug) {
00174 std::cout << "mayDef = ";
00175 mayDef->dump(std::cout, mIR);
00176 }
00177
00178
00179
00180
00181
00182
00183 retSideEffect->insertLMOD(mayDef);
00184 retSideEffect->insertMOD(mayDef);
00185
00186 }
00187
00188
00189 locIterPtr = alias->getMustLocs(memref);
00190 for (; locIterPtr->isValid(); ++(*locIterPtr)) {
00191 OA_ptr<Location> mustDef = locIterPtr->current();
00192
00193
00194
00195
00196
00197 retSideEffect->insertLDEF(mustDef);
00198 retSideEffect->insertDEF(mustDef);
00199
00200 }
00201 }
00202
00203
00204
00205 OA_ptr<IRCallsiteIterator> callsiteItPtr = mIR->getCallsites(stmt);
00206 for ( ; callsiteItPtr->isValid(); ++(*callsiteItPtr)) {
00207 CallHandle call = callsiteItPtr->current();
00208 if (debug) {
00209 std::cout << "\tcall = " << mIR->toString(call) << std::endl;
00210 }
00211
00212 OA_ptr<LocIterator> locIterPtr;
00213
00214
00215 locIterPtr = inter->getMODIterator(call);
00216 for ( ; locIterPtr->isValid(); (*locIterPtr)++) {
00217 retSideEffect->insertMOD(locIterPtr->current());
00218 if (debug) {
00219 std::cout << "\tinserting loc = ";
00220 locIterPtr->current()->dump(std::cout,mIR);
00221 std::cout << "\tinto MOD" << std::endl;
00222 }
00223 }
00224
00225 locIterPtr = inter->getDEFIterator(call);
00226 for ( ; locIterPtr->isValid(); (*locIterPtr)++) {
00227 retSideEffect->insertDEF(locIterPtr->current());
00228 }
00229
00230 locIterPtr = inter->getUSEIterator(call);
00231 for ( ; locIterPtr->isValid(); (*locIterPtr)++) {
00232
00233
00234 OA_ptr<Location> Loc = locIterPtr->current();
00235 if (debug) {
00236 std::cout << "SideEffectStandard USE retSideEffect = ";
00237 Loc->dump(std::cout);
00238 std::cout << std::endl;
00239 }
00240 retSideEffect->insertUSE(Loc);
00241
00242
00243 }
00244
00245 locIterPtr = inter->getREFIterator(call);
00246 for ( ; locIterPtr->isValid(); (*locIterPtr)++) {
00247 retSideEffect->insertREF(locIterPtr->current());
00248 }
00249 }
00250
00251 }
00252
00253 return retSideEffect;
00254 }
00255 }
00256 }