snu-sf-class / swpp202401

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

[Project] Interpreter bug: vpselect #142

Open sbkim28 opened 3 weeks ago

sbkim28 commented 3 weeks ago

안녕하세요, interpreter가 spec과 다르게 동작하는 것 같아서 이를 제보하고자 합니다.

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

define dso_local i32 @main() #0 {
entry:
  %vzero = call <4 x i64> @vbcast_i64x4(i64 0)
  %vone = call <4 x i64> @vbcast_i64x4(i64 1)
  %vtwo = call <4 x i64> @vbcast_i64x4(i64 2)

  %vpselect = call <4 x i64> @vpselect_i64x4(<4 x i64> %vzero, <4 x i64> %vone, <4 x i64> %vtwo)
  %el0 = extractelement <4 x i64> %vpselect, i32 0
  call void @write(i64 noundef %el0)
  %el1 = extractelement <4 x i64> %vpselect, i32 1
  call void @write(i64 noundef %el1)
  %el2 = extractelement <4 x i64> %vpselect, i32 2
  call void @write(i64 noundef %el2)
  %el3 = extractelement <4 x i64> %vpselect, i32 3
  call void @write(i64 noundef %el3)
  ret i32 0
}

이를 컴파일하면 다음을 얻습니다.

start main 0:
.entry:
r1 = const 0
v1 = vbcast r1 64
r2 = const 1
v2 = vbcast r2 64
r3 = const 2
v3 = vbcast r3 64
v1 = vpselect v1 v2 v3 64
r4 = vextct v1 r1 64
call write r4
r2 = vextct v1 r2 64
call write r2
r2 = vextct v1 r3 64
call write r2
r2 = const 3
r2 = vextct v1 r2 64
call write r2
ret r1
end main

여기서, v2=[1 1 1 1]이고 v3=[2 2 2 2]이고, v2가 두 번째 operand로 사용되었으므로, 이를 실행하면 1 1 2 2가 output으로 나와야 한다고 생각했습니다. 그러나 실제로 실행해보면 2 2 1 1이 나옵니다.

spec에 제시된 바와 다르게, 뒤에 위치한 register의 결과가 앞에 저장되는 것 같은데, 관련해서 해당 문제를 확인해주셨으면 합니다. 감사합니다.

Hyun2023 commented 3 weeks ago

6월 3일자 패치로 수정되었습니다.