This shows you the differences between two versions of the page.
|
cpl:labs:10 [2016/12/11 21:24] bogdan.nitulescu [Exercițiul 2] |
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) | ||