CS/Compiler

Short-Circuit Evaluation

djs100201 2024. 12. 13. 12:46

Short - Circuit Evaluation은 뭘까?

즉 if(a && b)가 있다고 할 때, a가 0이라면 b를 검사하지 않아야 한다 라는 일종의 약속이다.

즉 위의 예시 코드는 반드시 오류가 나지 않아야 한다. 

 

그래서 IR generation을 짤 때 이러한 shortcut을 잘 고려해서 구현해야 올바른 코드이다.

그런데 이번 프로젝트3 에서 IR optimization을 진행하면서 다음과 같은 상황을 고려하는 걸 생각하게 됐다.

x-x

x-x는 x에 어떤 값이 들어있는지 살펴볼 필요 없이 항상 0이다.  즉 이런 상수뿐만이 아니라 register나 experssion에 대한 것들에 대해서도 short - curcuit이 진행되어야 하는가? 혹은 이런것들이 real world compiler는 어떻게 구현되어 있는가? 

이게 왜 중요하냐면 다음과 같은 함수 생각해보자.

x는 0으로 정의되어 있다. 0/x는 division by zero 에러를 내는가? 혹은 YES가 출력되는가?

정답은.....!! 내 예상과 같이 short - curcuit이 적용 된다.

사실 short-curcuit으로 불러야 되는지도..? 모르겠다

왜나면 이건 short- curcuit이라기보다는 반드시 0인 expression은 0으로 처리할 수 있냐? 
라는 의미이기 때문에 short-curcuit이랑 다른 것 같기도 하고... 어쨌든 더 실험해본 내용은 아래와 같다.

 

 

이런 것도 된다.
혹은 이런것도 된다.

 

그러면 이런건 될까?

int x=0,y=x; 를 하고 if(x/0 -y/0)을 하는 것이다.
우리가 IR optimization에서 배운 것처럼, Common Sub Expression이 진행되게 되면, if(x/0 -x/0)으로 치환되어 버릴 것이다... 그럼 똑같이 NO가 진행되어야 하나..?


정답은.... division by error 가 났다..!

그럼 이런식으로 레퍼런스를 박는거나 포인터로 같은 주소를 가르키는 것은?!
-> 똑같이 division by zero 에러가 난다.

 

이렇게 복잡한 문구도 된다.

즉 양쪽 expression이 같을때만 몇 가지 Binary Operation에서 register, exprssin에 대한 최적화도 적용된다는 점이다.

근데 이거 고려안하고 IR generation 짜서 이런 테케 있으면 틀릴 것 같다... ㅠㅠ