snu-sf-class / swpp202401

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

[Project] Problem with sext instruction of i1 #101

Open sbkim28 opened 6 months ago

sbkim28 commented 6 months ago

안녕하세요, sext instruction의 operand가 i1일 때 잘못된 결과가 나오는 것 같아서 이를 제보하고자 합니다.

다음은 제가 임의로 작성한 llvm ir 코드입니다.

define dso_local i32 @main() #0 {
entry:
  %call = call i64 (...) @read()
  %cmp = icmp ne i64 %call, 0
  %conv = sext i1 %cmp to i64
  call void @write(i64 noundef %conv)
  ret i32 0
}

llvm ir의 reference에 따르면, i1으로부터의 sign extension의 결과는 항상 -1 또는 0이어야 한다고 되어 있습니다. 그래서 입력으로 1을 입력하면 '%cmp'의 값이 1(true)이 되어 출력으로 -1이 나와야 한다고 생각했습니다. 그러나 실제로 해당 코드를 실행하고 입력으로 1을 주면, -1 대신 1이라는 값이 나오게 됩니다.

해당 문제를 확인해주셨으면 합니다. 감사합니다.

strikef commented 6 months ago

현재 백엔드에서 signed extend를 어셈블리로 변환하는 루틴의 문제인데, 대부분의 경우는 문제가 없으나 iN_MIN (이진수 기준 1000...000) 에서는 본래 나와야 하는 연산 결과와 다르게 나오는 문제가 있는 것으로 보입니다. 컴파일러 버그가 맞으며, 수정 예정입니다.

strikef commented 6 months ago

5/19일자 백엔드 패치에서 수정되었습니다.