컴파일러

[컴파일러] 5. LLVM을 이용해 Instruction 위치 이동(feat 메모리 명령어 종속성)

용성군 2021. 8. 2. 11:43
728x90
반응형

이번 글에선 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 명령어를 이동시키지 않은 프로그램과 이동시킨 프로그램 코드를 비교하면 다음과 같다. 

실행결과는 다음과 같다. (레지스터에 있는 쓰레기값을 이용해 계산하기 때문에 결과값은 예상할 수 없다 )

728x90
반응형