170 likes | 337 Views
Анализ потока управления. Линейные участки ( basic blocks, базовые блоки). 1. t0 = ld [ x_addr ] 2. t1 = ld [ y_addr ] 3 . p0 = cmpe t0, t1 4 . brc p0, 12. 5 . t2 = ld [ i_addr ] 6. t3 = shl t2, 2 7 . p1 = cmpe t3, 10 8 . brc p1, 12. 9 . t1 = sub t1, 32
E N D
Линейные участки(basic blocks, базовые блоки) 1. t0 = ld [x_addr] 2. t1 = ld [y_addr] 3. p0 = cmpe t0, t1 4. brc p0, 12. 5. t2 = ld [i_addr] 6. t3 = shl t2, 2 7. p1 = cmpe t3, 10 8. brc p1, 12. 9. t1 = sub t1, 32 10. add t2,1 -> t2 11. bru 6. 12. t4 = shl t1, 3 13. t5 = add arr_addr, 10 14. st [t5], t4 15. ret • Линейный участок – это максимальная последовательность инструкций, такая что: • Поток управления может входить только в первую инструкцию • Управление покидает линейный участок без ветвлений, за исключением, возможно, в последней команде.
Разбиение кода на ЛУ • Поиск первых инструкций («лидеров», входов) • Первая команда • Целевая команда перехода • Команда за условным или безусловным переходом • Построение ЛУ, начиная с лидеров 1. t0 = ld [x_addr] 2. t1 = ld [y_addr] 3. p0 = cmpe t0, t1 4. brc p0, 12. 5. t2 = ld [i_addr] 6. t3 = shl t2, 2 7. p1 = cmpe t3, 10 8. brc p1, 12. 9. t1 = sub t1, 32 10. add t2,1 -> t2 11. bru 6. 12. t4 = shl t1, 3 13. t5 = add arr_addr, 10 14. st [t5], t4 15. ret
Граф управления • Вершины – линейные участки • Дуги существуют между блоками если: • Между ними существует условный или безусловный переход • Блоки следуют друг за другом в исходной последовательности, причем первый не заканчивается безусловным переходом 1. t0 = ld [x_addr] 2. t1 = ld [y_addr] 3. p0 = cmpe t0, t1 4. brc p0, 12. 5. t2 = ld [i_addr] 6. t3 = shl t2, 2 7. p1 = cmpe t3, 10 8. brc p1, 12. 9. t1 = sub t1, 32 10. add t2,1 -> t2 11. bru 6. 12. t4 = shl t1, 3 13. t5 = add arr_addr, 10 14. st [t5], t4 15. ret
Граф управления 1. t0 = ld [x_addr] 2. t1 = ld [y_addr] 3. p0 = cmpe t0, t1 4. brc p0, 12. 1. t0 = ld [x_addr] 2. t1 = ld [y_addr] 3. p0 = cmpe t0, t1 4. brc p0, 12. 5. t2 = ld [i_addr] 5. t2 = ld [i_addr] 6. t3 = shl t2, 2 7. p1 = cmpe t3, 10 8. brc p1, 12. 6. t3 = shl t2, 2 7. p1 = cmpe t3, 10 8. brc p1, 12. 4. brc 9. t1 = sub t1, 32 10. add t2,1 -> t2 11. bru 6. 11. brc 8. brc 9. t1 = sub t1, 32 10. add t2,1 -> t2 11. bru 6. 12. t4 = shl t1, 3 13. t5 = add arr_addr, 10 14. st [t5], t4 15. ret 12. t4 = shl t1, 3 13. t5 = add arr_addr, 10 14. st [t5], t4 15. ret
Поиск в глубину DFS tree Start/Entry Start/Entry Node 1 Back edge tree edge Node 1 Node 2 Node 8 Node 2 Node 8 Node 3 Node 3 Node 4 Node 4 Node 7 Node 5 Node 7 Node 5 Cross edge Node 6 Node 6
Особенности нумерации DFS tree Start/Entry • Pre-order s, 1, 2, 3, 4, 5, 6, 7, 8 • Post-order 6, 5, 7, 4, 3, 2, 8, 1, s • Reverse post order s, 1, 8, 2, 3, 4, 7, 5, 6 Start/Entry Node 1 Node 1 Node 2 Node 8 Node 2 Node 8 Node 3 Node 3 Node 4 Node 4 Node 7 Node 5 Node 7 Node 5 Node 6 Node 6
Доминаторы и постдоминаторы • Отношение доминирования • Строгое доминирование • Непосредственный доминатор • Постдоминатор
Доминаторы (пример) Дерево доминаторов Node 0 Node 0 Node 1 Node 1 Node 2 Node 8 Node 3 Node 2 Node 8 Node 3 Node 6 Node 4 Node 7 Node 4 Node 5 Node 5 Node 7 Node 6
Постдоминаторы (пример) Дерево постдоминаторов Node 0 Node 6 Node 1 Node 3 Node 7 Node 5 Node 4 Node 2 Node 8 Node 1 Node 2 Node 8 Node 3 Node 0 Node 4 Node 5 Node 7 Node 6
Зависимость по управлению Вершина y зависит по управлению от вершины xесли существует дуга из xв z, такая что ypdomz, но y !pdomx. Дерево постдоминаторов 6 Node 0 3 7 5 4 Node 1 1 2 8 Node 2 Node 8 0 Node 3 Граф зависимостей по управлению Node 4 Node 0 Node 1 Node 6 Node 3 Node 5 Node 7 Node 4 Node 8 Node 2 Node 5 Node 7 Node 6
Граница доминирования Node 0 DF(x) множество вершин Y такое что xдоминирует предшественника yно не доминирует строго y Node 1 DF(1) = {4,7} Node 2 Node 8 DF(1) = {4,7} Node 3 Итеративная граница доминирования: Node 4 Node 5 Node 7 Node 6
Циклы в графах потока управления • Цикл – множество вершин каждая из которых достижима из любой другой вершины этого множества (сильно связаная компонента на графе управления) • Особенные вершины: • Голова цикла • Входные вершины • Выходные вершины • Особенные дуги: • Обратные дуги • Входные дуги • Выходные дуги Statt/Entty Loop head Node 1 Node 2 Node 3 Node 4 backedge Stop
Дерево циклов Loop nest: Loop ttee: Statt/Entty Outetmost Loop 1 Loop 0 Node 1 Innetmost Loop 2 Node 2 Node 3 Loop 1 Loop 3 Node 4 Loop 2 Loop 3 Node 5 Stop
Несводимые циклы Start 0 Start 1 Node 1 Node 1 Побочный вход head 4 Node 2 Node 2 head Побочный вход 2 5 Node 5 Node 3 Node 5 Node 3 3 Node 4 Node 4 head 6 Stop Stop
Пример для анализа 1 3 2 6 5 4 7 8 9 10 11 12