일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Linux packer
- LLVM 난독화
- Obfuscator
- custom packer
- LLVM Obfuscator
- apm
- linux thread
- pinpoint
- v8 tracing
- pthread
- on-stack replacement
- LLVM
- Android
- 난독화
- tracerpid
- v8 optimizing
- on stack replacement
- TLS
- tracing
- Linux custom packer
- Injection
- so inject
- anti debugging
- initial-exec
- linux debugging
- thread local storage
- OSR
- 안티디버깅
- android inject
- uftrace
- Today
- Total
Why should I know this?
LLVM Optimization study - LoopFlatten 본문
LoopFlatten은 Loop 문을 평탄화 하는 최적화인데, 말로는 느낌이 잘 안오니 다음 주석을 참고하자.
LoopFlatten.cpp
// for (int i = 0; i < N; ++i)
// for (int j = 0; j < M; ++j)
// f(A[i*M+j]);
//
// into one loop:
//
// for (int i = 0; i < (N*M); ++i)
// f(A[i]);
평탄화라는 것이 주석처럼 2층 구조를 가진 Loop를 단층화 하는 것으로 평탄화가 어떤 의미인지 뉘앙스를 알 수 있다.
이를 도식화하면 다음과 같다. (샘플위치 : llvm/test/Transforms/LoopFlatten/loop-flatten.ll)
LoopFlatten 을 거치면 위와 같이 CFG 가 변경된 것을 확인할 수 있다.
IR 을 확인하면, Loop.entry에 Tripcount 가 추가되고 2차원 배열이 1차원 배열로 변경됐음을 확인할 수 있다.
LoopFlatten은 몇 가지 조건을 검사한 뒤에 OuterLoop와 InnerLoop의 Loop Counter 를 찾아서 TripCount로 병합하는 것이 주요로직이다.나열하자면 다음과 같다.
1. LoopFlatten 과정을 수행해도 되는 LOOP 문인지 확인
2. Outer-Inner Loop 간의 Loop Counter 확인
3. TripCounter로 병합 후 InnerLoop 제거 및 InnerLoop의 LoopCounter use 변경
두 번째, Loop Counter를 확인하는 로직을 추려서 다음 테스트 코드를 작성했다.
Loop 관련 구조에 대해서는 다음 글을 참고하면 좋다.
https://die4taoam.tistory.com/100
'LLVM-STUDY' 카테고리의 다른 글
LLVM Optimization study - LoopInstSimplify (0) | 2023.03.13 |
---|---|
LoopLatch (0) | 2023.02.26 |
LLVM 기반 TOOL을 제작할 때 라이브러리 링킹하는 법 (0) | 2022.09.27 |
LLVM] phi 간략 살펴보기 (0) | 2022.09.17 |
LLVM compile option (0) | 2022.03.21 |