This shows you the differences between two versions of the page.
cpl:labs-draft:11 [2016/12/19 23:36] bogdan.nitulescu [10. Optimizations with LLVM] |
cpl:labs-draft:11 [2016/12/20 01:58] (current) bogdan.nitulescu [Exerciții de laborator (15p)] |
||
---|---|---|---|
Line 111: | Line 111: | ||
[[http://llvm.org/docs/ProgrammersManual.html#dss-bitvector|Aici]] este o scurtă descriere a structurii de date BitVector folosită la exerciţiul 3. | [[http://llvm.org/docs/ProgrammersManual.html#dss-bitvector|Aici]] este o scurtă descriere a structurii de date BitVector folosită la exerciţiul 3. | ||
- | ====== Exerciții de laborator (10p) ====== | + | ====== Exerciții de laborator (15p) ====== |
<note> | <note> | ||
Laboratorul este compus dintr-o exerciții practice care includ analiza formei SSA și implementarea unor optimizări. | Laboratorul este compus dintr-o exerciții practice care includ analiza formei SSA și implementarea unor optimizări. | ||
- | Înainte de începerea exercițiilor downloadați arhiva de {{:cpl:labs:lab10.zip|aici}}. | + | Înainte de începerea exercițiilor downloadați arhiva de {{:cpl:labs:lab11_2016.zip|aici}}. |
Compilati exercitiile cu -O0 pentru a nu lasa compilatorul sa aplice optimizari. | Compilati exercitiile cu -O0 pentru a nu lasa compilatorul sa aplice optimizari. | ||
Line 152: | Line 152: | ||
===== Exercițiul 2 ===== | ===== Exercițiul 2 ===== | ||
- | Folosind codul din fişierul ''Hello2.cpp'' din archiva laboratorului, urmăriţi modul în care pot fi implementată simple constant propagation în LLVM. | + | Scrieti un pass care optimizeaza cazuri de tipul jump to jump. Un caz de jump to jump avem in momentul in care singura intructiune dintr-un basic block este un salt neconditionat intr-un alt bloc. In acest caz toate instructiunile de salt din blocul initial pot fi optimizate pentru a duce direct la blocul destinatie. |
- | * cum se obţine numele unui basic block? | + | Blocul initial este in acest moment dead code si poate fi eliminat cu pass-ul de la exercitiul anterior. |
+ | |||
+ | <file c jump_to_jump.c> | ||
+ | #include<stdio.h> | ||
+ | #include<time.h> | ||
+ | #include<stdlib.h> | ||
+ | |||
+ | void main(void) { | ||
+ | int x = rand() % 100 - 10; | ||
+ | |||
+ | if ( x < 0 ) { | ||
+ | return; | ||
+ | } else { | ||
+ | printf("Not negative\n"); | ||
+ | } | ||
+ | |||
+ | printf("End\n"); | ||
+ | } | ||
+ | |||
+ | </file> | ||
+ | |||
+ | ===== Exercițiul 3 ===== | ||
+ | |||
+ | Folosind codul din fişierul ''Hello.cpp'' din arhiva laboratorului, urmăriţi modul în care pot fi implementată simple constant propagation în LLVM. | ||
* cum poate fi identificată o instrucţiune inutilă? | * cum poate fi identificată o instrucţiune inutilă? | ||
* identificaţi metoda responsabilă pentru constant folding | * identificaţi metoda responsabilă pentru constant folding | ||
* cum se înlocuiesc apariţiile viitoare ale variabilei în cauză cu o constantă? | * cum se înlocuiesc apariţiile viitoare ale variabilei în cauză cu o constantă? | ||
* de ce se adaugă din nou în worklist unele instrucţiuni? | * de ce se adaugă din nou în worklist unele instrucţiuni? | ||
- | * realizaţi un fişier de test (urmând paşii de la exerciţiul 1) pentru a ilustra beneficiile acestui pas. Rulaţi acest pas pe exemplul ales. | + | * Rulaţi acest pas folosind fisierul ''test.c'' din arhiva laboratorului. |
- | ===== Exercițiul 3 ===== | + | |
- | 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. | ||
- | * ce reprezintă gen(B)/def(B)? Dar kill/use? | ||
- | * 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) | ||
- | * 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) | ||