snu-sf-class / swpp202401

Principles and Practices of Software Development Main Repository
14 stars 4 forks source link

[Assignment 5] Question about check9.ll #99

Open summerBreeze2007 opened 6 months ago

summerBreeze2007 commented 6 months ago
define i32 @triangle(i32 %a, i32 %b) {
  %cond = icmp eq i32 %a, %b
  br i1 %cond, label %bb_true, label %bb_else

bb_else:
  br label %bb_true

bb_true:
  call void @g(i32 %a, i32 %b)
  ret i32 %b
}

declare void @g(i32, i32)

안녕하세요, 과제 설명에 아래와 같이 나와 있는데 위 경우에는 왜 bb_true에서 replace가 안 일어나는 것이 정답인지 궁금합니다. 혹시 알려주실 수 있으신가요? 감사합니다

please replace x with y (or y with x) for all uses of x that are (1) executed after the branch is taken

strikef commented 6 months ago

%a, %b 가 서로 같지 않은 경우에도 bb_true block에 도달이 가능하기 때문에 bb_true에서 %a = %b 라는 보장이 되지 않습니다. 따라서 해당 replace는 올바르지 않은 최적화입니다.