00001
00015 #include <iostream>
00016 #include "MemRefExpr.hpp"
00017 #include <OpenAnalysis/IRInterface/IRHandles.hpp>
00018
00019 class TestIRInterface : public virtual OA::IRHandlesIRInterface {
00020
00021 public:
00022 TestIRInterface() {}
00023 virtual ~TestIRInterface() {}
00024
00025
00026
00027
00028
00029 std::string toString(const OA::ProcHandle h) { return ""; }
00030 std::string toString(const OA::StmtHandle h)
00031 { std::ostringstream os; os << "StmtHandle(" << h.hval() << ")"; return os.str(); }
00032 std::string toString(const OA::ExprHandle h) { return ""; }
00033 std::string toString(const OA::CallHandle h) { return ""; }
00034 std::string toString(const OA::OpHandle h) { return ""; }
00035 std::string toString(const OA::MemRefHandle h) { return ""; }
00036 std::string toString(const OA::SymHandle h)
00037 { std::ostringstream os; os << "SymHandle(" << h.hval() << ")"; return os.str(); }
00038 std::string toString(const OA::ConstSymHandle h) { return ""; }
00039 std::string toString(const OA::ConstValHandle h) { return ""; }
00040
00041
00042
00043
00044
00046 void dump(OA::MemRefHandle h, std::ostream& os) {}
00047
00049 void dump(OA::StmtHandle stmt, std::ostream& os) {}
00050
00051
00052
00053
00054
00055
00056 void currentProc(OA::ProcHandle p) {}
00057 };
00058
00059
00060 int main() {
00061 OA::OA_ptr<TestIRInterface> ir;
00062 ir = new TestIRInterface;
00063
00064
00065 std::list<OA::OA_ptr<OA::MemRefExpr> > mList;
00066
00067 OA::StmtHandle stmt1(1);
00068 OA::StmtHandle stmt2(2);
00069 OA::SymHandle sym1(1);
00070 OA::SymHandle sym2(2);
00071 OA::MemRefHandle mhandle1(1);
00072 OA::MemRefHandle mhandle2(2);
00073 std::string string1("string1");
00074 std::string string2("string2");
00075
00076
00077 std::cout << "===== NamedRef =====" << std::endl;
00078 OA::OA_ptr<OA::NamedRef> namedRef1;
00079 namedRef1 = new OA::NamedRef(OA::MemRefExpr::USE, sym1);
00080 std::cout << "== dump ==" << std::endl;
00081 namedRef1->dump(std::cout,ir);
00082 std::cout << std::endl;
00083
00084
00085
00086
00087
00088
00089 mList.push_back(namedRef1);
00090
00091
00092 std::cout << "===== NamedRef =====" << std::endl;
00093 OA::OA_ptr<OA::NamedRef> namedRef2;
00094 namedRef2 = new OA::NamedRef(OA::MemRefExpr::USE, sym2);
00095 std::cout << "== dump ==" << std::endl;
00096 namedRef2->dump(std::cout,ir);
00097 std::cout << std::endl;
00098
00099
00100
00101
00102
00103
00104 mList.push_back(namedRef2);
00105
00106
00107 std::cout << "===== NamedRef =====" << std::endl;
00108 OA::OA_ptr<OA::NamedRef> namedRef3;
00109 namedRef3 = new OA::NamedRef(OA::MemRefExpr::USE, sym1);
00110 std::cout << "== dump ==" << std::endl;
00111 namedRef3->dump(std::cout,ir);
00112 std::cout << std::endl;
00113
00114
00115
00116
00117
00118
00119 mList.push_back(namedRef3);
00120
00121
00122 std::cout << "===== UnnamedRef =====" << std::endl;
00123 OA::ExprHandle hm=OA::ExprHandle((OA::irhandle_t)stmt1);
00124 OA::OA_ptr<OA::UnnamedRef> unnamedRef;
00125 unnamedRef = new OA::UnnamedRef(OA::MemRefExpr::DEF, hm);
00126 std::cout << "== dump ==" << std::endl;
00127 unnamedRef->dump(std::cout,ir);
00128 std::cout << std::endl;
00129
00130
00131
00132
00133
00134
00135
00136 mList.push_back(unnamedRef);
00137
00138
00139 std::cout << "===== UnKnownRef =====" << std::endl;
00140 OA::OA_ptr<OA::MemRefExpr::MemRefExpr> unknownRef;
00141 unknownRef = new OA::UnknownRef(OA::MemRefExpr::USE);
00142 std::cout << "== dump ==" << std::endl << std::endl;
00143 unknownRef->dump(std::cout,ir);
00144 std::cout << std::endl;
00145
00146
00147
00148
00149
00150
00151
00152
00153 mList.push_back(unknownRef);
00154
00155
00156
00157
00158 OA::OA_ptr<OA::Deref> derefMRE3;
00159 derefMRE3 = new OA::Deref(OA::MemRefExpr::USE, namedRef3, 2);
00160 mList.push_back(derefMRE3);
00161 OA::OA_ptr<OA::Deref> derefMRE1;
00162 derefMRE1 = new OA::Deref(OA::MemRefExpr::USE, namedRef1, 2);
00163 mList.push_back(derefMRE1);
00164
00165
00166 std::cout << "===== Deref =====" << std::endl << std::endl;
00167 std::cout << "== derefMRE3 dump ==" << std::endl << std::endl;
00168 derefMRE3->dump(std::cout,ir);
00169 std::cout << std::endl;
00170
00171
00172
00173 std::cout << "== derefMRE1 dump ==" << std::endl << std::endl;
00174 derefMRE1->dump(std::cout,ir);
00175 std::cout << std::endl;
00176
00177
00178
00179 OA::OA_ptr<OA::SubSetRef> subset_mre;
00180 OA::OA_ptr<OA::MemRefExpr> nullMRE;
00181 OA::OA_ptr<OA::MemRefExpr> subset_derefMRE3, subset_derefMRE1;
00182
00183 subset_mre = new OA::SubSetRef(
00184 OA::MemRefExpr::USE,
00185 nullMRE
00186 );
00187 subset_derefMRE3 = subset_mre->composeWith(derefMRE3->clone());
00188 mList.push_back(subset_derefMRE3);
00189
00190
00191 std::cout << "Now should be false:" << std::endl << std::endl;
00192 derefMRE3->dump(std::cout,ir);
00193 std::cout << "(derefMRE3 == derefMRE1) = " << (*derefMRE3==*derefMRE1)
00194 << std::endl << std::endl;
00195
00196
00197 subset_mre = new OA::SubSetRef(
00198 OA::MemRefExpr::USE,
00199 nullMRE
00200 );
00201 subset_derefMRE1 = subset_mre->composeWith(derefMRE1->clone());
00202 mList.push_back(subset_derefMRE1);
00203
00204
00205 OA::OA_ptr<OA::IdxAccess> idxAccess3;
00206 idxAccess3 = new OA::IdxAccess(OA::MemRefExpr::USE,subset_derefMRE3,5);
00207 OA::OA_ptr<OA::IdxAccess> idxAccess1;
00208 idxAccess1 = new OA::IdxAccess(OA::MemRefExpr::USE,subset_derefMRE1,5);
00209 OA::OA_ptr<OA::IdxAccess> idxAccessX;
00210 idxAccessX = new OA::IdxAccess(OA::MemRefExpr::USE,subset_derefMRE1,6);
00211 std::cout << "== idxAccess3 dump ==" << std::endl << std::endl;
00212 idxAccess3->dump(std::cout,ir);
00213 std::cout << std::endl;
00214 std::cout << "== idxAccess1 dump ==" << std::endl << std::endl;
00215 idxAccess1->dump(std::cout,ir);
00216 std::cout << std::endl;
00217 std::cout << "== idxAccessX dump ==" << std::endl << std::endl;
00218 idxAccessX->dump(std::cout,ir);
00219 std::cout << std::endl;
00220
00221
00222
00223
00224 mList.push_back(idxAccess3);
00225 mList.push_back(idxAccess1);
00226 mList.push_back(idxAccessX);
00227
00228
00229
00230 OA::OA_ptr<OA::IdxExprAccess> idxExprAccess3;
00231
00232 idxExprAccess3
00233 = new OA::IdxExprAccess(OA::MemRefExpr::USE,subset_derefMRE3,mhandle1);
00234 OA::OA_ptr<OA::IdxExprAccess> idxExprAccess1;
00235 idxExprAccess1
00236 = new OA::IdxExprAccess(OA::MemRefExpr::USE,subset_derefMRE1,mhandle1);
00237 OA::OA_ptr<OA::IdxExprAccess> idxExprAccessX;
00238 idxExprAccessX
00239 = new OA::IdxExprAccess(OA::MemRefExpr::USE,subset_derefMRE1,mhandle2);
00240 std::cout << "== idxExprAccess3 dump ==" << std::endl << std::endl;
00241 idxExprAccess3->dump(std::cout,ir);
00242 std::cout << std::endl;
00243 std::cout << "== idxExprAccess1 dump ==" << std::endl << std::endl;
00244 idxExprAccess1->dump(std::cout,ir);
00245 std::cout << std::endl;
00246 std::cout << "== idxExprAccessX dump ==" << std::endl << std::endl;
00247 idxExprAccessX->dump(std::cout,ir);
00248 std::cout << std::endl;
00249
00250
00251
00252 mList.push_back(idxExprAccess3);
00253 mList.push_back(idxExprAccess1);
00254 mList.push_back(idxExprAccessX);
00255
00256
00257
00258 OA::OA_ptr<OA::FieldAccess> fieldAccess3;
00259 fieldAccess3 = new OA::FieldAccess(OA::MemRefExpr::USE,subset_derefMRE3,string1);
00260 OA::OA_ptr<OA::FieldAccess> fieldAccess1;
00261 fieldAccess1 = new OA::FieldAccess(OA::MemRefExpr::USE,subset_derefMRE1,string1);
00262 OA::OA_ptr<OA::FieldAccess> fieldAccessX;
00263 fieldAccessX = new OA::FieldAccess(OA::MemRefExpr::USE,subset_derefMRE1,string2);
00264 std::cout << "== fieldAccess3 dump ==" << std::endl << std::endl;
00265 fieldAccess3->dump(std::cout,ir);
00266 std::cout << std::endl;
00267 std::cout << "== fieldAccess1 dump ==" << std::endl << std::endl;
00268 fieldAccess1->dump(std::cout,ir);
00269 std::cout << std::endl;
00270 std::cout << "== fieldAccessX dump ==" << std::endl << std::endl;
00271 fieldAccessX->dump(std::cout,ir);
00272 std::cout << std::endl;
00273
00274
00275
00276 mList.push_back(fieldAccess3);
00277 mList.push_back(fieldAccess1);
00278 mList.push_back(fieldAccessX);
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290 OA::OA_ptr<OA::MemRefExpr> subSetRefMRE4;
00291 subSetRefMRE4 = subset_mre->composeWith(namedRef1->clone());
00292 OA::OA_ptr<OA::FieldAccess> fieldAccess4;
00293 fieldAccess4 = new OA::FieldAccess(OA::MemRefExpr::USE,subSetRefMRE4,string1);
00294 OA::OA_ptr<OA::Deref> derefMRE4;
00295 derefMRE4 = new OA::Deref(OA::MemRefExpr::USE, fieldAccess4, 1);
00296 std::cout << "== derefMRE4 dump ==" << std::endl << std::endl;
00297 derefMRE4->dump(std::cout,ir);
00298 std::cout << std::endl;
00299 mList.push_back(derefMRE4);
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310 OA::OA_ptr<OA::MemRefExpr> subSetRefMRE5;
00311 subSetRefMRE5 = subset_mre->composeWith(derefMRE4->clone());
00312 std::cout << "== subSetRefMRE5 dump ==" << std::endl << std::endl;
00313 subSetRefMRE5->dump(std::cout,ir);
00314 std::cout << std::endl;
00315 mList.push_back(subSetRefMRE5);
00316
00317
00318
00319
00320
00321
00322
00323
00324 OA::OA_ptr<OA::MemRefExpr> subSetRefMRE6;
00325 subSetRefMRE6 = subset_mre->composeWith(namedRef1->clone());
00326 OA::OA_ptr<OA::FieldAccess> fieldAccess6;
00327 fieldAccess6 = new OA::FieldAccess(OA::MemRefExpr::USE,subSetRefMRE6,string1);
00328 OA::OA_ptr<OA::Deref> derefMRE6;
00329 derefMRE6 = new OA::Deref(OA::MemRefExpr::USE, fieldAccess6, 1);
00330 std::cout << "== derefMRE6 dump ==" << std::endl << std::endl;
00331 derefMRE6->dump(std::cout,ir);
00332 std::cout << std::endl;
00333 mList.push_back(derefMRE6);
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343 std::cout << "== subset_derefMRE1 dump ==" << std::endl << std::endl;
00344 subset_derefMRE1->dump(std::cout,ir);
00345 std::cout << std::endl;
00346 mList.push_back(subset_derefMRE1);
00347
00348
00349
00350
00351
00352
00353
00354
00355 OA::OA_ptr<OA::FieldAccess> fieldAccess7;
00356 fieldAccess7 = new OA::FieldAccess(OA::MemRefExpr::USE,derefMRE1,string1);
00357 OA::OA_ptr<OA::Deref> derefMRE7;
00358 derefMRE7 = new OA::Deref(OA::MemRefExpr::USE, fieldAccess7, 1);
00359 OA::OA_ptr<OA::MemRefExpr> subSetRefMRE7;
00360 subSetRefMRE7 = subset_mre->composeWith(derefMRE7->clone());
00361 std::cout << "== subSetRefMRE7 dump ==" << std::endl << std::endl;
00362 subSetRefMRE7->dump(std::cout,ir);
00363 std::cout << std::endl;
00364 mList.push_back(subSetRefMRE7);
00365
00366
00367
00368
00369
00370
00371 OA::OA_ptr<OA::FieldAccess> fieldAccess8;
00372 fieldAccess8 = new OA::FieldAccess(OA::MemRefExpr::USE,subset_derefMRE1,string1);
00373 std::cout << "== fieldAccess8 dump ==" << std::endl << std::endl;
00374 fieldAccess8->dump(std::cout,ir);
00375 std::cout << std::endl;
00376 mList.push_back(fieldAccess8);
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387 OA::OA_ptr<OA::FieldAccess> fieldAccess9;
00388 fieldAccess9 = new OA::FieldAccess(OA::MemRefExpr::USE,subSetRefMRE7,string1);
00389 std::cout << "== fieldAccess9 dump ==" << std::endl << std::endl;
00390 fieldAccess9->dump(std::cout,ir);
00391 std::cout << std::endl;
00392 mList.push_back(fieldAccess9);
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408 OA::OA_ptr<OA::Deref> derefMRE10;
00409 derefMRE10 = new OA::Deref(OA::MemRefExpr::USE, fieldAccess9->clone(), 1);
00410 OA::OA_ptr<OA::MemRefExpr> subSetRefMRE10;
00411 subSetRefMRE10 = subset_mre->composeWith(derefMRE10->clone());
00412 OA::OA_ptr<OA::FieldAccess> fieldAccess10;
00413 fieldAccess10 = new OA::FieldAccess(OA::MemRefExpr::USE,subSetRefMRE10,string1);
00414 derefMRE10 = new OA::Deref(OA::MemRefExpr::USE, fieldAccess10->clone(), 1);
00415 subSetRefMRE10 = subset_mre->composeWith(derefMRE10->clone());
00416 fieldAccess10 = new OA::FieldAccess(OA::MemRefExpr::USE,subSetRefMRE10,string1);
00417 std::cout << "== fieldAccess10 dump ==" << std::endl << std::endl;
00418 fieldAccess10->dump(std::cout,ir);
00419 std::cout << std::endl;
00420 mList.push_back(fieldAccess10);
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430 OA::OA_ptr<OA::IdxExprAccess> idxExprAccess11;
00431 idxExprAccess11 = new OA::IdxExprAccess(OA::MemRefExpr::USE,subSetRefMRE6,mhandle1);
00432 std::cout << "== idxExprAccess11 dump ==" << std::endl << std::endl;
00433 idxExprAccess11->dump(std::cout,ir);
00434 std::cout << std::endl;
00435 mList.push_back(idxExprAccess11);
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445 OA::OA_ptr<OA::Deref> derefMRE11;
00446 derefMRE11 = new OA::Deref(OA::MemRefExpr::USE, idxExprAccess11->clone(), 1);
00447 OA::OA_ptr<OA::MemRefExpr> subSetRefMRE11;
00448 subSetRefMRE11 = subset_mre->composeWith(derefMRE11->clone());
00449 OA::OA_ptr<OA::FieldAccess> fieldAccess11;
00450 fieldAccess11 = new OA::FieldAccess(OA::MemRefExpr::USE,subSetRefMRE11->clone(),string1);
00451 std::cout << "== fieldAccess11 dump ==" << std::endl << std::endl;
00452 fieldAccess11->dump(std::cout,ir);
00453 std::cout << std::endl;
00454 mList.push_back(fieldAccess11);
00455
00456 std::cout << std::endl << std::endl << std::endl << std::endl;
00457
00458 std::cout << "================================================"
00459 << std::endl;
00460
00461 std::cout << "Start comparision operators <,==" << std::endl;
00462
00463 std::list<OA::OA_ptr<OA::MemRefExpr> >::iterator mIter1;
00464 std::list<OA::OA_ptr<OA::MemRefExpr> >::iterator mIter2;
00465
00466 for(mIter1 = mList.begin(); mIter1 != mList.end(); ++mIter1) {
00467 OA::OA_ptr<OA::MemRefExpr> mreA = *mIter1;
00468 for(mIter2 = mList.begin(); mIter2 != mList.end(); ++mIter2) {
00469 std::cout << "=============================================="
00470 << std::endl;
00471 OA::OA_ptr<OA::MemRefExpr> mreB = *mIter2;
00472 std::cout << std::endl << "\tmre A = ";
00473 mreA->output(*ir);
00474 std::cout << std::endl;
00475 std::cout << std::endl << "\tmre B = ";
00476 mreB->output(*ir);
00477 std::cout << std::endl;
00478 std::cout << "A < B :" << (mreA<mreB) << std::endl;
00479 std::cout << "B < A :" << (mreB<mreA) << std::endl;
00480 std::cout << "A == B :" << (mreA==mreB) << std::endl;
00481 std::cout << "B == A :" << (mreB==mreA) << std::endl;
00482 std::cout << "(A==B) == (B==A) :"
00483 << ((mreA == mreB) == (mreB == mreA))
00484 << std::endl;
00485
00486 int AlessthanB = (mreA<mreB);
00487 int BlessthanA = (mreB<mreA);
00488 int AequaltoB = (mreA==mreB);
00489
00490 if((AlessthanB + BlessthanA + AequaltoB) != 1) {
00491 std::cout << "more than one of (A<B B<A and A==B) are true"
00492 << std::endl;
00493 assert(0);
00494 }
00495
00496
00497 if((mreA == mreB) != (mreB == mreA)) {
00498 std::cout << "(mreA == mreB) != (mreB == mreA)"
00499 << std::endl;
00500 assert(0);
00501 }
00502
00503 std::cout << "==============================================="
00504 << std::endl;
00505 }
00506 }
00507
00508 std::cout << "End comparision operators <,==" << std::endl;
00509 std::cout << "================================================"
00510 << std::endl;
00511
00512 return 0;
00513 }
00514
00515
00516