이번 글에선 IR 파일에서 Store 명령어를 BasicBlock 가장 마지막 부분으로 위치를 옮기도록 해보겠다.
일반적인 산술 연산(ex add, sub) 명령어와 다르게, 메모리 명령어 (load/store)의 종속 관계는 컴파일러 입장에서 대부분 알기 어렵다. 예를 들면 주소 X에서 값을 읽은 명령어와(load) 주소 Y에 값을 저장하는 명령어(store)가 있다고 할 때, 주소 X와 주소 Y가 같거나, 다르다는 보장이 없는 이상 종속 관계가 없다고 하더라도 순서가 쉽게 바뀔 수 없다.
따라서 Store 명령어의 위치 이동으로 이루어지는 종속성 문제는 컴파일러 레벨에서 특별한 오류를 발생시키지 않는다.
프로그램 작성
Basic Block 마지막 store 명령에 모든 store명령을 이동시키는 프로그램을 만들어보려고 한다.
프로그램에서 if문을 통해 store 명령어를 찾도록 코드를 작성하고 vector변수 StoreInsts에 추가한다.
LastInst 변수를 이용해 Basick Block 내의 마지막 명령어를 탐색하는 코드를 추가한다.
Store 명령어들을 Basic Block 내의 마지막 명령어 이전 위치로 이동시킨다.
위의 프로그램을 실행시켜 새로운 Human Readable Assembly 파일과 이전 파일을 비교한다.
store 명령어를 이동시키지 않은 프로그램과 이동시킨 프로그램 코드를 비교하면 다음과 같다.
실행결과는 다음과 같다. (레지스터에 있는 쓰레기값을 이용해 계산하기 때문에 결과값은 예상할 수 없다 )
'컴파일러' 카테고리의 다른 글
[디지털논리] FPGA란? (0) | 2021.08.27 |
---|---|
[컴파일러/LLVM] 2. Module, Function, Basic Block 순회하며 Instruction 출력하기 (0) | 2021.08.01 |
[컴파일러] 1. LLVM을 이용한 컴파일 방법 및 IR파일 읽기(feat. 소스코드와 IR 코드 ) (0) | 2021.07.31 |
[컴파일러] 4. LLVM을 이용한 IR 레벨에서 명령어 삭제 및 생성 (0) | 2021.07.28 |
[컴파일러] 3. LLVM을 이용하여 프로그램 안의 특정 명령어 세기 (0) | 2021.07.22 |