Otawa  0.10
BranchProblem.h
Go to the documentation of this file.
1 /*
2  * $Id$
3  * BranchProblem class interface
4  *
5  * This file is part of OTAWA
6  * Copyright (c) 2011, IRIT UPS.
7  *
8  * OTAWA is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * OTAWA is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with OTAWA; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 
24 #ifndef CACHE_BRANCHPROBLEM_H_
25 #define CACHE_BRANCHPROBLEM_H_
26 
27 #include <otawa/prog/WorkSpace.h>
28 #include <otawa/cache/LBlockSet.h>
29 #include <otawa/hard/Cache.h>
30 #include <otawa/cfg/BasicBlock.h>
31 #include <otawa/util/HalfAbsInt.h>
32 
33 
34 namespace otawa {
35 
36 
37 class MUSTBranch {
38  int row;
39  // Types
40  public:
41 
42  class Domain {
43  int A, size;
44 
45  public:
53  inline Domain(const int _size, const int _A)
54  : A (_A), size(_size)
55  {
56  age = new int [size];
57  for (int i = 0; i < size; i++)
58  age[i] = 0;
59  }
60 
61  inline ~Domain() {
62  delete [] age;
63  }
64 
65  inline Domain(const Domain &source) : A(source.A), size(source.size) {
66  age = new int [size];
67  for (int i = 0; i < size; i++)
68  age[i] = source.age[i];
69 
70  }
71 
72  inline Domain& operator=(const Domain &src) {
73  ASSERT((A == src.A) && (size == src.size));
74  for (int i = 0; i < size ; i++)
75  age[i] = src.age[i];
76  return(*this);
77 
78  }
79 
80 
81  inline void lub(const Domain &dom) {
82  ASSERT((A == dom.A) && (size == dom.size));
83 
84  for (int i = 0; i < size; i++) {
85  if (age[i] < dom.age[i])
86  age[i] = dom.age[i];
87  }
88  }
89 
90  inline int getSize(void) {
91  return size;
92  }
93 
94  inline bool equals(const Domain &dom) const {
95  ASSERT((A == dom.A) && (size == dom.size));
96  for (int i = 0; i < size; i++)
97  if (age[i] != dom.age[i])
98  return false;
99  return true;
100  }
101 
102  inline void empty() {
103  for (int i = 0; i < size; i++)
104  age[i] = A;
105 
106  }
107 
108  inline bool contains(const int id) {
109  ASSERT((id < size) && (id >= 0));
110  return(age[id] != A);
111  }
112 
113 
114  inline void inject(const int id) {
115  if (contains(id)) {
116  for (int i = 0; i < size; i++) {
117  if (age[i] < age[id])
118  age[i]++;
119  }
120  } else {
121  for (int i = 0; i < size; i++) {
122  if (age[i] != A)
123  age[i]++;
124  }
125  }
126  age[id] = 0;
127  }
128 
129  inline void print(elm::io::Output &output) const {
130  bool first = true;
131  output << "[";
132  for (int i = 0; i < size; i++) {
133  if (age[i] != A) {
134  if (!first) {
135  output << ", ";
136  }
137  // output << i << ":" << age[i];
138  output << i;
139  output << ":";
140  output << age[i];
141 
142  first = false;
143  }
144  }
145  output << "]";
146 
147  }
148 
149  inline int getAge(int id) const {
150  ASSERT(id < size);
151  return(age[id]);
152  }
153 
154  inline void setAge(const int id, const int _age) {
155  ASSERT(id < size);
156  ASSERT((_age <= A) || (_age >= 0));
157  age[id] = _age;
158  }
159 
160 
161  /*
162  * For each cache block belonging to the set:
163  * age[block] represents its age, from 0 (newest) to A-1 (oldest).
164  * The value -1 means that the block is not in the set.
165  */
166  int *age;
167  };
168 
169  private:
170 
171  // Fields
175 
176  public:
177 
178  // Public fields
179 
180  // Constructors
181  MUSTBranch(const int _size, WorkSpace *_fw, const int _A, const int _row);
182 
183  // Destructors
184  ~MUSTBranch();
185 
186  // Problem methods
187  const Domain& bottom(void) const;
188  const Domain& entry(void) const;
189 
190 
191 
192  inline void lub(Domain &a, const Domain &b) const {
193  a.lub(b);
194  }
195  inline void assign(Domain &a, const Domain &b) const {
196  a = b;
197  }
198  inline bool equals(const Domain &a, const Domain &b) const {
199  return (a.equals(b));
200  }
201 
202 
203  void update(Domain& out, const Domain& in, BasicBlock* bb);
204 
205  inline void enterContext(Domain &dom, BasicBlock *header, util::hai_context_t ctx) {
206 
207  }
208 
209  inline void leaveContext(Domain &dom, BasicBlock *header, util::hai_context_t ctx) {
210 
211  }
212 
213 };
214 
215 
216 
217 class MAYBranch {
218  int row;
219  // Types
220  public:
221 
222  class Domain {
223  int A, size;
224 
225  public:
233  inline Domain(const int _size, const int _A)
234  : A (_A), size(_size)
235  {
236  age = new int [size];
237  for (int i = 0; i < size; i++)
238  age[i] = A;
239  }
240 
241  inline ~Domain() {
242  delete [] age;
243  }
244 
245  inline Domain(const Domain &source) : A(source.A), size(source.size) {
246  age = new int [size];
247  for (int i = 0; i < size; i++)
248  age[i] = source.age[i];
249 
250  }
251 
252  inline Domain& operator=(const Domain &src) {
253  ASSERT((A == src.A) && (size == src.size));
254  for (int i = 0; i < size ; i++)
255  age[i] = src.age[i];
256  return(*this);
257 
258  }
259 
260 
261  inline void lub(const Domain &dom) {
262  ASSERT((A == dom.A) && (size == dom.size));
263 
264  for (int i = 0; i < size; i++) {
265  if (age[i] >= dom.age[i])
266  age[i] = dom.age[i];
267  }
268  }
269 
270  inline int getSize(void) {
271  return size;
272  }
273 
274  inline bool equals(const Domain &dom) const {
275  ASSERT((A == dom.A) && (size == dom.size));
276  for (int i = 0; i < size; i++)
277  if (age[i] != dom.age[i])
278  return false;
279  return true;
280  }
281 
282  inline void empty() {
283  for (int i = 0; i < size; i++)
284  age[i] = A;
285 
286  }
287 
288  inline bool contains(const int id) {
289  ASSERT((id < size) && (id >= 0));
290  return(age[id] != A);
291  }
292 
293 
294  inline void inject(const int id) {
295  if (contains(id)) {
296  for (int i = 0; i < size; i++) {
297  if (age[i] <= age[id])
298  age[i]++;
299  }
300  } else {
301  for (int i = 0; i < size; i++) {
302  if (age[i] != A)
303  age[i]++;
304  }
305  }
306  age[id] = 0;
307  }
308 
309  inline void print(elm::io::Output &output) const {
310  bool first = true;
311  output << "[";
312  for (int i = 0; i < size; i++) {
313  if (age[i] != A) {
314  if (!first) {
315  output << ", ";
316  }
317  // output << i << ":" << age[i];
318  output << i;
319  output << ":";
320  output << age[i];
321 
322  first = false;
323  }
324  }
325  output << "]";
326 
327  }
328 
329  inline int getAge(int id) const {
330  ASSERT(id < size);
331  return(age[id]);
332  }
333 
334  inline void setAge(const int id, const int _age) {
335  ASSERT(id < size);
336  ASSERT((_age <= A) || (_age >= 0));
337  age[id] = _age;
338  }
339 
340 
341  /*
342  * For each cache block belonging to the set:
343  * age[block] represents its age, from 0 (newest) to A-1 (oldest).
344  * The value -1 means that the block is not in the set.
345  */
346  int *age;
347  };
348 
349  private:
350 
351  // Fields
355 
356  public:
357 
358  // Public fields
359 
360  // Constructors
361  MAYBranch(const int _size, WorkSpace *_fw, const int _A, const int _row);
362 
363  // Destructors
364  ~MAYBranch();
365 
366  // Problem methods
367  const Domain& bottom(void) const;
368  const Domain& entry(void) const;
369 
370 
371 
372  inline void lub(Domain &a, const Domain &b) const {
373  a.lub(b);
374  }
375  inline void assign(Domain &a, const Domain &b) const {
376  a = b;
377  }
378  inline bool equals(const Domain &a, const Domain &b) const {
379  return (a.equals(b));
380  }
381 
382 
383  void update(Domain& out, const Domain& in, BasicBlock* bb);
384 
385  inline void enterContext(Domain &dom, BasicBlock *header, util::hai_context_t ctx) {
386 
387  }
388 
389  inline void leaveContext(Domain &dom, BasicBlock *header, util::hai_context_t ctx) {
390 
391  }
392 
393 };
394 
395 
396 
397 
398 
399 class PERSBranch {
400  int row;
401  // Types
402  public:
403  class Item {
404  int A, size;
405 
406  public:
407  inline Item(const int _size, const int _A)
408  : A (_A), size(_size)
409  {
410  age = new int [size];
411  for (int i = 0; i < size; i++)
412  age[i] = -1;
413  }
414 
415  inline ~Item() {
416  delete [] age;
417  }
418 
419  inline Item(const Item &source) : A(source.A), size(source.size) {
420  age = new int [size];
421  for (int i = 0; i < size; i++)
422  age[i] = source.age[i];
423 
424  }
425 
426  inline Item& operator=(const Item &src) {
427  ASSERT((A == src.A) && (size == src.size));
428  for (int i = 0; i < size ; i++)
429  age[i] = src.age[i];
430  return *this;
431  }
432 
433  inline void lub(const Item &dom) {
434  /* ASSERT((A == dom.A) && (size == dom.size)); */
435 
436  for (int i = 0; i < size; i++) {
437  if ((age[i] == -1) || ((age[i] < dom.age[i]) && (dom.age[i] != -1)) )
438  age[i] = dom.age[i];
439  }
440  }
441 
442  inline bool equals(const Item &dom) const {
443  ASSERT((A == dom.A) && (size == dom.size));
444  for (int i = 0; i < size; i++)
445  if (age[i] != dom.age[i])
446  return false;
447  return true;
448  }
449 
450  inline void empty() {
451  for (int i = 0; i < size; i++)
452  age[i] = -1;
453 
454  }
455 
456  inline bool contains(const int id) {
457  ASSERT((id < size) && (id >= 0));
458  return(age[id] != -1);
459  }
460 
461  inline void inject(MUSTBranch::Domain *must, const int id) {
462  if (must->contains(id)) {
463  for (int i = 0; i < size; i++) {
464  if ((age[i] < age[id]) && (age[i] != -1) && (age[i] != A))
465  age[i]++;
466  }
467  } else {
468  for (int i = 0; i < size; i++) {
469  if ((age[i] != -1) && (age[i] != A))
470  age[i]++;
471  }
472  }
473  age[id] = 0;
474  }
475 
476  inline bool isWiped(const int id) {
477  return(age[id] == A);
478  }
479 
480  inline bool isPersistent(const int id) {
481  return(contains(id) && !isWiped(id));
482  }
483  inline int getAge(const int id) const {
484  ASSERT((id >= 0) && (id < size));
485  return age[id];
486  }
487 
488  inline void print(elm::io::Output &output) const {
489  bool first = true;
490  output << "[";
491  for (int i = 0; i < size; i++) {
492  if (age[i] != -1) {
493  if (!first) {
494  output << ", ";
495  }
496  output << i << ":" << age[i];
497  first = false;
498  }
499  }
500  output << "]";
501 
502  }
503 
504  /*
505  * For each cache block belonging to the set:
506  * age[block] represents its age, from 0 (newest) to A-1 (oldest).
507  * The value -1 means that the block is not in the set.
508  */
509  int *age;
510  };
511 
512  class Domain {
513  int A, size;
514  bool isBottom;
515  public:
516 
517  inline Domain(const int _size, const int _A)
518  : A (_A), size(_size), whole(_size, _A)
519  {
520  isBottom = true;
521  whole.empty();
522  }
523 
524  inline ~Domain() {
525  for (int i = 0; i < data.length(); i++)
526  delete data[i];
527  }
528 
529  inline Domain(const Domain &source) : A(source.A), size(source.size), isBottom(source.isBottom), whole(source.whole) {
530 
531  for (int i = 0; i < source.data.length(); i++)
532  data.add(new Item(*source.data[i]));
533  }
534 
535  inline Domain& operator=(const Domain &src) {
536  if (src.isBottom) {
537  setToBottom();
538  } else {
539  whole = src.whole;
540  isBottom = false;
541 
542  /*
543  for (int i = 0; i < src.data.length(); i++)
544  data.add(new Item(*src.data[i]));
545  */
546  int sdl = src.data.length();
547  int dl = data.length();
548  int minl = (sdl > dl) ? dl : sdl;
549  data.setLength((sdl > dl) ? dl : sdl);
550 
551  for (int i = 0; i < minl; i++)
552  *data[i] = *src.data[i];
553 
554  for (int i = dl; i < sdl; i++)
555  data.add(new Item(*src.data[i]));
556 
557 
558  }
559  return *this;
560 
561  }
562 
563  inline void lub(const Domain &dom) {
564  /*
565  * Rules for the LUB:
566  * 1. lub(anything,bottom) == anything
567  * 2. lub(dom1,dom2) where dom1 and dom2 has the same size, do the LUB of each corresponding item.
568  * 3. lub(dom1,dom2) where dom1 has less items than dom2: we discard items of dom2 (starting from outer-most loop)
569  * until it has the same size as dom1, then apply rule 2.
570  */
571  if (dom.isBottom)
572  return;
573 
574  if (isBottom) {
575  for (int i = 0; i < dom.data.length(); i++)
576  data.add(new Item(*dom.data[i]));
577  whole = dom.whole;
578  isBottom = false;
579  return;
580  }
581 
582  int dl = data.length();
583  int ddl = dom.data.length();
584  int length = (dl < ddl) ? dl : ddl;
585 
586  for (int i = dl - 1, j = ddl - 1, k = 0; k < length; i--, j--, k++) {
587  data[i]->lub(*dom.data[j]);
588  }
589 
590  for (int i = 0; i < dl - length; i++) {
591  data.remove(0);
592  }
593  whole.lub(dom.whole);
594  }
595 
596 
597  inline void lub(const Item &item) {
598  /* Special LUB: do the lub of each Item in current domain with
599  * item passed as parameter. Used for the partial analysis
600  */
601  for (int i = 0; i < data.length(); i++)
602  data[i]->lub(item);
603 
604  whole.lub(item);
605 
606  }
607 
608 
609  inline bool equals(const Domain &dom) const {
610  ASSERT(!isBottom && !dom.isBottom);
611  for (int i = 0; i < dom.data.length(); i++) {
612  if (!data[i]->equals(*dom.data[i]))
613  return false;
614  }
615  return (whole.equals(dom.whole) && (isBottom == dom.isBottom));
616  }
617 
618  inline void empty() {
619  for (int i = 0; i < data.length(); i++)
620  delete data[i];
621  data.clear();
622  whole.empty();
623  isBottom = false;
624  }
625 
626  inline void setToBottom() {
627  for (int i = 0; i < data.length(); i++)
628  delete data[i];
629  data.clear();
630  whole.empty();
631  isBottom = true;
632  }
633 
634  inline Item &getWhole() {
635  return whole;
636  }
637 
638  inline bool contains(const int id, const int index) {
639  ASSERT(!isBottom);
640  return(data[index]->contains(id));
641  }
642 
643 
644  inline void inject(MUSTBranch::Domain *must, const int id) {
645  ASSERT(!isBottom);
646  for (int i = 0; i < data.length(); i++)
647  data[i]->inject(must, id);
648  whole.inject(must, id);
649  }
650 
651  inline bool isWiped(const int id, const int index) {
652  ASSERT(!isBottom);
653  return(data[index]->isWiped(id));
654 
655  }
656 
657  inline int getAge(const int id, const int index) const {
658  ASSERT(!isBottom);
659  return(data[index]->getAge(id));
660  }
661 
662  inline bool isPersistent(const int id, const int index) {
663  ASSERT(!isBottom);
664  return(data[index]->isPersistent(id));
665 
666  }
667 
668  inline void print(elm::io::Output &output) const {
669  bool first = true;
670  if (isBottom) {
671  output << "BOTTOM";
672  return;
673  }
674  output << "(W=";
675  whole.print(output);
676  output << ", ";
677  for (int i = 0; i < data.length(); i++) {
678  if (!first)
679  output << "|";
680  data[i]->print(output);
681  first = false;
682  }
683  output << ")";
684  }
685 
686  inline void enterContext() {
687  ASSERT(!isBottom);
688  Item item(size, A);
689  item.empty();
690  data.push(new Item(item));
691 
692  }
693 
694  inline void leaveContext() {
695  ASSERT(!isBottom);
696  Item *ptr = data.pop();
697  delete ptr;
698  }
699 
700  inline int length() {
701  ASSERT(!isBottom);
702  return data.length();
703  }
704 
705  inline Item& getItem(const int idx) const {
706  ASSERT(!isBottom);
707  return(*data.get(idx));
708  }
709 
710 
711  private:
712 
715 
716  };
717 
718 
719 
720  private:
721 
722  // Fields
723 
724 
726 
729 
730 
731  public:
732  // Public fields
733 
734  // Constructors
735  PERSBranch(const int _size, WorkSpace *_fw, const int _A, const int _row);
736 
737  // Destructors
738  ~PERSBranch();
739 
740  // Problem methods
741  const Domain& bottom(void) const;
742  const Domain& entry(void) const;
743 
744  inline void lub(Domain &a, const Domain &b) const {
745  a.lub(b);
746  }
747  inline void assign(Domain &a, const Domain &b) const {
748  a = b;
749  }
750  inline bool equals(const Domain &a, const Domain &b) const {
751  return (a.equals(b));
752  }
753  void update(Domain& out, const Domain& in, BasicBlock* bb);
754 
755  inline void enterContext(Domain& dom, BasicBlock *header, util::hai_context_t ctx) {
756  if (ctx == util::CTX_LOOP)
757  dom.enterContext();
758  }
759 
760  inline void leaveContext(Domain& dom, BasicBlock *header, util::hai_context_t ctx) {
761  if (ctx == util::CTX_LOOP)
762  dom.leaveContext();
763  }
764 };
765 
766 
768 
773  int row;
774 
775  // Types
776  public:
777  class Domain {
778  friend class BranchProblem;
779 
783 
784  public:
785  inline Domain(const int _size, const int _A)
786  : pers(PERSBranch::Domain(_size, _A)), must(MUSTBranch::Domain(_size, _A)), may(MAYBranch::Domain(_size, _A)) {
787 
788  }
789 
790 
791  inline Domain(const Domain &source) : pers(source.pers), must(source.must), may(source.may) {
792  }
793 
794  inline Domain& operator=(const Domain &src) {
795  pers = src.pers;
796  must = src.must;
797  may = src.may;
798  return *this;
799  }
800 
802  return may;
803  }
804 
806  return must;
807  }
808 
809 
811  return pers;
812  }
813 
814  inline void lub(const Domain &dom) {
815  pers.lub(dom.pers);
816  must.lub(dom.must);
817  may.lub(dom.may);
818  }
819 
820  inline int getSize(void) {
821  return must.getSize();
822  }
823 
824  inline bool equals(const Domain &dom) const {
825  return (pers.equals(dom.pers) && must.equals(dom.must) && may.equals(dom.may));
826  }
827 
828  inline void empty() {
829  must.empty();
830  pers.empty();
831  may.empty();
832  }
833 
834  inline void inject(const int id) {
835  pers.inject(&must, id);
836  must.inject(id);
837  may.inject(id);
838  }
839 
840  inline void print(elm::io::Output &output) const {
841  output << "PERS=[ ";
842  pers.print(output);
843  output << "] MUST=[ ";
844  must.print(output);
845  output << "] MAY=[ ";
846  may.print(output);
847  output << "]";
848  }
849 
850  };
851 
852 
853  private:
856 
857 
858  public:
859 
860  // Constructors
861  BranchProblem(const int _size, WorkSpace *_fw, const int _A, const int _row);
862 
863  // Problem methods
864  const Domain& bottom(void) const;
865  const Domain& entry(void) const;
866 
867  inline void lub(Domain &a, const Domain &b) const {
868  a.lub(b);
869  }
870  inline void assign(Domain &a, const Domain &b) const {
871  a = b;
872  }
873  inline bool equals(const Domain &a, const Domain &b) const {
874  return (a.equals(b));
875  }
876 
877  void update(Domain& out, const Domain& in, BasicBlock* bb);
878  void updateLBlock(Domain& acs, LBlock *lblock);
879 
880  inline void enterContext(Domain &dom, BasicBlock *header, util::hai_context_t ctx) {
881  persProb.enterContext(dom.pers, header, ctx);
882  mustProb.enterContext(dom.must, header, ctx);
883  mayProb.enterContext(dom.may, header, ctx);
884  }
885 
886  inline void leaveContext(Domain &dom, BasicBlock *header, util::hai_context_t ctx) {
887  persProb.leaveContext(dom.pers, header, ctx);
888  mustProb.leaveContext(dom.must, header, ctx);
889  mayProb.leaveContext(dom.may, header, ctx);
890  }
891 
892 };
893 
894 }
895 
896 #endif /*CACHE_MUSTPROBLEM_H_*/
void update(Domain &out, const Domain &in, BasicBlock *bb)
Definition: branch_BranchProblem.cpp:156
int * age
Definition: BranchProblem.h:346
void enterContext(Domain &dom, BasicBlock *header, util::hai_context_t ctx)
Definition: BranchProblem.h:880
dtd::RefAttr< BasicBlock * > source("source", dtd::STRICT|dtd::REQUIRED)
void enterContext(Domain &dom, BasicBlock *header, util::hai_context_t ctx)
Definition: BranchProblem.h:205
int getAge(int id) const
Definition: BranchProblem.h:149
Domain ent
Definition: BranchProblem.h:855
Domain & operator=(const Domain &src)
Definition: BranchProblem.h:72
Domain & operator=(const Domain &src)
Definition: BranchProblem.h:252
const Domain & bottom(void) const
Definition: branch_BranchProblem.cpp:50
void update(Domain &out, const Domain &in, BasicBlock *bb)
Definition: branch_BranchProblem.cpp:57
~MUSTBranch()
Definition: branch_BranchProblem.cpp:47
Definition: BranchProblem.h:767
MAYBranch mayProb
Definition: BranchProblem.h:771
bool equals(const Domain &dom) const
Definition: BranchProblem.h:824
Domain(const Domain &source)
Definition: BranchProblem.h:791
void inject(const int id)
Definition: BranchProblem.h:294
void leaveContext(Domain &dom, BasicBlock *header, util::hai_context_t ctx)
Definition: BranchProblem.h:209
bool equals(const Domain &dom) const
Definition: BranchProblem.h:94
const Domain & entry(void) const
Definition: branch_BranchProblem.cpp:53
PERSBranch::Domain pers
Definition: BranchProblem.h:780
Domain(const int _size, const int _A)
Definition: BranchProblem.h:53
MAYBranch::Domain may
Definition: BranchProblem.h:782
void update(Domain &out, const Domain &in, BasicBlock *bb)
Definition: branch_BranchProblem.cpp:84
Item whole
Definition: BranchProblem.h:713
void lub(const Domain &dom)
Definition: BranchProblem.h:563
const Domain & entry(void) const
Definition: branch_BranchProblem.cpp:113
void lub(const Domain &dom)
Definition: BranchProblem.h:814
void lub(Domain &a, const Domain &b) const
Definition: BranchProblem.h:867
bool equals(const Domain &a, const Domain &b) const
Definition: BranchProblem.h:873
int A
Definition: BranchProblem.h:43
Domain bot
Definition: BranchProblem.h:727
void empty()
Definition: BranchProblem.h:828
void lub(const Domain &dom)
Definition: BranchProblem.h:81
void empty()
Definition: BranchProblem.h:102
int * age
Definition: BranchProblem.h:509
bool equals(const Domain &a, const Domain &b) const
Definition: BranchProblem.h:750
bool equals(const Domain &dom) const
Definition: BranchProblem.h:609
MUSTBranch(const int _size, WorkSpace *_fw, const int _A, const int _row)
Definition: branch_BranchProblem.cpp:37
int getAge(const int id) const
Definition: BranchProblem.h:483
~Domain()
Definition: BranchProblem.h:61
int A
Definition: BranchProblem.h:513
genstruct::Vector< Item * > data
Definition: BranchProblem.h:714
sys::SystemInStream & in
int getAge(int id) const
Definition: BranchProblem.h:329
int row
Definition: BranchProblem.h:773
bool equals(const Domain &a, const Domain &b) const
Definition: BranchProblem.h:198
~Item()
Definition: BranchProblem.h:415
BranchProblem(const int _size, WorkSpace *_fw, const int _A, const int _row)
Definition: branch_BranchProblem.cpp:129
dtd::Element bb(dtd::make("bb", _BB).attr(id).attr(address).attr(size))
WorkSpace * fw
Definition: BranchProblem.h:352
int size
Definition: BranchProblem.h:43
int A
Definition: BranchProblem.h:404
Item(const int _size, const int _A)
Definition: BranchProblem.h:407
bool isPersistent(const int id)
Definition: BranchProblem.h:480
int size
Definition: BranchProblem.h:513
void assign(Domain &a, const Domain &b) const
Definition: BranchProblem.h:870
void enterContext(Domain &dom, BasicBlock *header, util::hai_context_t ctx)
Definition: BranchProblem.h:755
uint32 size
void inject(MUSTBranch::Domain *must, const int id)
Definition: BranchProblem.h:644
Definition: BranchProblem.h:222
void updateLBlock(Domain &acs, LBlock *lblock)
void enterContext(Domain &dom, BasicBlock *header, util::hai_context_t ctx)
Definition: BranchProblem.h:385
bool isWiped(const int id, const int index)
Definition: BranchProblem.h:651
Definition: BranchProblem.h:512
void print(elm::io::Output &output) const
Definition: BranchProblem.h:840
void print(elm::io::Output &output) const
Definition: BranchProblem.h:129
MAYBranch::Domain & getMay()
Definition: BranchProblem.h:801
bool equals(const Domain &a, const Domain &b) const
Definition: BranchProblem.h:378
bool equals(const Domain &dom) const
Definition: BranchProblem.h:274
int size
Definition: BranchProblem.h:404
~PERSBranch()
Definition: branch_BranchProblem.cpp:106
int getAge(const int id, const int index) const
Definition: BranchProblem.h:657
int row
Definition: BranchProblem.h:400
PERSBranch(const int _size, WorkSpace *_fw, const int _A, const int _row)
Definition: branch_BranchProblem.cpp:94
void leaveContext(Domain &dom, BasicBlock *header, util::hai_context_t ctx)
Definition: BranchProblem.h:389
MAYBranch(const int _size, WorkSpace *_fw, const int _A, const int _row)
Definition: branch_BranchProblem.cpp:64
bool contains(const int id, const int index)
Definition: BranchProblem.h:638
const Domain & bottom(void) const
Definition: branch_BranchProblem.cpp:109
void lub(const Domain &dom)
Definition: BranchProblem.h:261
int A
Definition: BranchProblem.h:223
const Domain & entry(void) const
Definition: branch_BranchProblem.cpp:80
bool contains(const int id)
Definition: BranchProblem.h:456
A workspace represents a program, its run-time and all information about WCET computation or any othe...
Definition: WorkSpace.h:67
void print(elm::io::Output &output) const
Definition: BranchProblem.h:668
Item & getItem(const int idx) const
Definition: BranchProblem.h:705
The l-block is an abstraction allowing to split the basic block according to the bound of the cache b...
Definition: LBlock.h:43
int size
Definition: BranchProblem.h:223
void lub(Domain &a, const Domain &b) const
Definition: BranchProblem.h:744
PERSBranch::Domain & getPers()
Definition: BranchProblem.h:810
void assign(Domain &a, const Domain &b) const
Definition: BranchProblem.h:195
Item & operator=(const Item &src)
Definition: BranchProblem.h:426
void update(Domain &out, const Domain &in, BasicBlock *bb)
Definition: branch_BranchProblem.cpp:117
Domain & operator=(const Domain &src)
Definition: BranchProblem.h:535
Domain bot
Definition: BranchProblem.h:173
void inject(MUSTBranch::Domain *must, const int id)
Definition: BranchProblem.h:461
sys::SystemOutStream & out
bool isBottom
Definition: BranchProblem.h:514
Domain ent
Definition: BranchProblem.h:728
void empty()
Definition: BranchProblem.h:618
Item & getWhole()
Definition: BranchProblem.h:634
void enterContext()
Definition: BranchProblem.h:686
int length()
Definition: BranchProblem.h:700
void setToBottom()
Definition: BranchProblem.h:626
Domain(const Domain &source)
Definition: BranchProblem.h:245
void print(elm::io::Output &output) const
Definition: BranchProblem.h:309
hai_context_t
Definition: HalfAbsInt.h:50
int row
Definition: BranchProblem.h:218
int row
Definition: BranchProblem.h:38
Domain(const Domain &source)
Definition: BranchProblem.h:65
void lub(const Item &item)
Definition: BranchProblem.h:597
void leaveContext()
Definition: BranchProblem.h:694
void print(elm::io::Output &output) const
Definition: BranchProblem.h:488
void setAge(const int id, const int _age)
Definition: BranchProblem.h:334
Definition: BranchProblem.h:37
MUSTBranch::Domain & getMust()
Definition: BranchProblem.h:805
WorkSpace * fw
Definition: BranchProblem.h:772
Definition: HalfAbsInt.h:51
Domain ent
Definition: BranchProblem.h:354
void leaveContext(Domain &dom, BasicBlock *header, util::hai_context_t ctx)
Definition: BranchProblem.h:886
const Domain & bottom(void) const
Definition: branch_BranchProblem.cpp:147
Definition: BranchProblem.h:42
MUSTBranch::Domain must
Definition: BranchProblem.h:781
Domain ent
Definition: BranchProblem.h:174
Domain bot
Definition: BranchProblem.h:854
This is the minimal definition of a basic block.
Definition: BasicBlock.h:43
Domain(const Domain &source)
Definition: BranchProblem.h:529
void empty()
Definition: BranchProblem.h:282
Definition: BranchProblem.h:777
Domain bot
Definition: BranchProblem.h:353
void lub(Domain &a, const Domain &b) const
Definition: BranchProblem.h:372
Domain(const int _size, const int _A)
Definition: BranchProblem.h:785
void lub(const Item &dom)
Definition: BranchProblem.h:433
PERSBranch persProb
Definition: BranchProblem.h:770
WorkSpace * fw
Definition: BranchProblem.h:172
int getSize(void)
Definition: BranchProblem.h:90
void assign(Domain &a, const Domain &b) const
Definition: BranchProblem.h:747
Domain(const int _size, const int _A)
Definition: BranchProblem.h:233
~Domain()
Definition: BranchProblem.h:241
void lub(Domain &a, const Domain &b) const
Definition: BranchProblem.h:192
Item(const Item &source)
Definition: BranchProblem.h:419
Definition: BranchProblem.h:399
bool isPersistent(const int id, const int index)
Definition: BranchProblem.h:662
void leaveContext(Domain &dom, BasicBlock *header, util::hai_context_t ctx)
Definition: BranchProblem.h:760
Definition: BranchProblem.h:403
int getSize(void)
Definition: BranchProblem.h:270
Domain(const int _size, const int _A)
Definition: BranchProblem.h:517
Domain & operator=(const Domain &src)
Definition: BranchProblem.h:794
int getSize(void)
Definition: BranchProblem.h:820
~MAYBranch()
Definition: branch_BranchProblem.cpp:74
bool equals(const Item &dom) const
Definition: BranchProblem.h:442
void inject(const int id)
Definition: BranchProblem.h:114
void assign(Domain &a, const Domain &b) const
Definition: BranchProblem.h:375
void inject(const int id)
Definition: BranchProblem.h:834
bool contains(const int id)
Definition: BranchProblem.h:108
MUSTBranch mustProb
Definition: BranchProblem.h:769
~Domain()
Definition: BranchProblem.h:524
bool isWiped(const int id)
Definition: BranchProblem.h:476
Definition: BranchProblem.h:217
const Domain & bottom(void) const
Definition: branch_BranchProblem.cpp:77
void empty()
Definition: BranchProblem.h:450
int * age
Definition: BranchProblem.h:166
const Domain & entry(void) const
Definition: branch_BranchProblem.cpp:150
bool contains(const int id)
Definition: BranchProblem.h:288
WorkSpace * fw
Definition: BranchProblem.h:725
void setAge(const int id, const int _age)
Definition: BranchProblem.h:154