This shows you the differences between two versions of the page.
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.a -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]] |