Differences

This shows you the differences between two versions of the page.

Link to this comparison view

cpl:labs:10 [2016/12/11 21:06]
bogdan.nitulescu
cpl:labs:10 [2017/12/05 08:34] (current)
bogdan.nitulescu [Exercițiul 1]
Line 303: Line 303:
  
 ====== Exerciții de laborator (10p) ====== ====== Exerciții de laborator (10p) ======
 +
 +{{:​cpl:​labs:​lab10_2016.zip|Arhiva}} laboratorului.
 +
 +**Indicatii:​**
 +  * clasa [[http://​llvm.org/​docs/​ProgrammersManual.html#​Instruction|Instruction]] este subclasă a
 +    * clasei [[http://​llvm.org/​docs/​ProgrammersManual.html#​User|User]] care este subclasă a
 +    * clasei [[http://​llvm.org/​docs/​ProgrammersManual.html#​Value|Value]]
 +Mai jos este un exemplu de instrucțiune (Instruction). Ea este şi utilizator (User) ale variabilelor (Value) a şi b. În acelaşi timp reprezintă şi definirea variabilei (Value) c.
 +<code asm>
 +%c = add i32 %a, %b
 +</​code>​
 +
 +[[http://​llvm.org/​docs/​ProgrammersManual.html#​iterate-chains|Aici]] este un exemplu de cum pot fi parcurşi toţi utilizatorii unei variabile.
 +
 +[[http://​llvm.org/​docs/​ProgrammersManual.html#​iterate-function|Aici]] este un exemplu de cum pot fi parcurse toate basic block-urile dintr-o funcţie.
 +
 +[[http://​llvm.org/​docs/​ProgrammersManual.html#​iterate-basicblock|Aici]] este un exemplu de cum pot fi parcurse toate instrucţiunile dintr-un basic block.
 +
 +[[http://​llvm.org/​docs/​ProgrammersManual.html#​iterate-institer|Aici]] este un exemplu de cum pot fi parcurse toate instrucţiunile dintr-o funcţie.
 +
 +[[http://​llvm.org/​docs/​ProgrammersManual.html#​iterate-preds|Aici]] este un exemplu de cum pot fi parcurşi toţi predecesorii şi succesorii unui basic block.
 +
 +[[http://​llvm.org/​docs/​ProgrammersManual.html#​isa|Aici]] este un exemplu de cast folosit la exerciţiul 2.
 +
 +[[http://​llvm.org/​docs/​ProgrammersManual.html#​dss-valuemap|Aici]] este o scurtă descriere a structurii de date ValueMap folosită la exerciţiul 2.
 +
 +[[http://​llvm.org/​docs/​ProgrammersManual.html#​dss-bitvector|Aici]] este o scurtă descriere a structurii de date BitVector folosită la exerciţiul 2.
  
 ===== Exercițiul 1 ===== ===== Exercițiul 1 =====
Line 315: Line 342:
  
 <code bash> <code bash>
-clang -O0 -emit-llvm test.c -c -o test.bc+clang -c -O0 -emit-llvm test.c -c -o test.bc
 opt -p -mem2reg -dce < test.bc > /dev/null opt -p -mem2reg -dce < test.bc > /dev/null
 opt -p -mem2reg -adce < test.bc > /dev/null opt -p -mem2reg -adce < test.bc > /dev/null
Line 326: Line 353:
      * La execuție folosiți parametrul ''​load''​ cu calea către noul pass, ex:      * La execuție folosiți parametrul ''​load''​ cu calea către noul pass, ex:
 <code bash> <code bash>
-opt -p -mem2reg -load ../llvm-3.6.2/src/Release+Asserts/lib/DCE.so -mydce < test.bc > /dev/null+opt -p -mem2reg -load ~packages/llvm-3.8.0/build/lib/libLLVMScalarOpts.-mydce < test.bc > /dev/null
 </​code>​ </​code>​
   * Ce observați?   * Ce observați?
Line 368: Line 395:
 ===== Exercițiul 2 ===== ===== Exercițiul 2 =====
  
-Implementaţi [[http://​en.wikipedia.org/​wiki/​Live_variable_analysis |analiza live variables]]. Algoritmul este explicat clar şi concis în Dragon book dar şi în slide-urile de [[http://​infolab.stanford.edu/​~ullman/​dragon/​slides4.pdf|aici]]. Puteţi pleca de la fişierul ''​Hello3.cpp''​ din arhiva laboratorului. Pentru implementare,​ urmăriţi şi instrucţiunile din cod.+Implementaţi [[http://​en.wikipedia.org/​wiki/​Live_variable_analysis |analiza live variables]]. Algoritmul este explicat clar şi concis în Dragon book dar şi în slide-urile de [[http://​infolab.stanford.edu/​~ullman/​dragon/​slides4.pdf|aici]]. Puteţi pleca de la fişierul ''​LiveVars.cpp''​ din arhiva laboratorului. Pentru implementare,​ urmăriţi şi instrucţiunile din cod.
   * ce reprezintă gen(B)/​def(B)?​ Dar kill/use?   * ce reprezintă gen(B)/​def(B)?​ Dar kill/use?
   * explicaţi ecuaţia de flux pentru in(B)   * explicaţi ecuaţia de flux pentru in(B)
   * cum arată laticea? Indexaţi instrucţiunile pentru a putea reprezenta un element din latice ca vector de biţi (1)   * cum arată laticea? Indexaţi instrucţiunile pentru a putea reprezenta un element din latice ca vector de biţi (1)
   * implementaţi calculul def (2) şi use (3)   * implementaţi calculul def (2) şi use (3)
-  * rulaţi pe fişierul de intrare generat la exerciţiul 1 
   * implementaţi algoritmul Killdal (4)   * implementaţi algoritmul Killdal (4)
 +  * rulati pass-ul peste urmatorul fisier dupa ce faceti transformara in forma SSA (dupa ce rulati pass-ul mem2reg).
  
 +<file c test.c>
 +#include <​stdlib.h>​
 +
 +int test(int X, int Y) {
 +  int Z = 1;
 +  if (X == Y) Z = Z + 1;
 +  else Z = Z + 2;
 +  Z = Z + 3;
 +  return Z;
 +}
 +
 +int main(int argc, char **argv) {
 +  test(atoi(argv[1]),​ atoi(argv[2]));​
 +}
 +</​file>​
 ======Resurse====== ======Resurse======
   * [[http://​drona.csa.iisc.ernet.in/​~deepakd/​pav-07/​Lecture11.pdf|Explicatii Kildal si MOP]]   * [[http://​drona.csa.iisc.ernet.in/​~deepakd/​pav-07/​Lecture11.pdf|Explicatii Kildal si MOP]]
   * [[http://​en.wikipedia.org/​wiki/​Kildall|Kildall]]   * [[http://​en.wikipedia.org/​wiki/​Kildall|Kildall]]
cpl/labs/10.1481483209.txt.gz · Last modified: 2016/12/11 21:06 by bogdan.nitulescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0