snu-sf-class / swpp202401

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

[Project] Interpreter error: parsing vpicmp #160

Open sbkim28 opened 3 weeks ago

sbkim28 commented 3 weeks ago

안녕하세요, Interpreter에서 오류가 발생하는 것 같아서 이를 제보하고자 합니다.

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

define dso_local i32 @main() #0 {
entry:
  %v0 = insertelement <4 x i64> undef, i64 3, i32 0
  %v1 = insertelement <4 x i64> %v0, i64 2, i32 1
  %v2 = insertelement <4 x i64> %v1, i64 1, i32 2
  %v3 = insertelement <4 x i64> %v2, i64 0, i32 3
  br label %middle.block
middle.block:
  %vpicmp0 = call <4 x i64> @vpicmp_sle_i64x4(<4 x i64> %v3, <4 x i64> %v3)
  br label %end.block
end.block:
  %ans = extractelement <4 x i64> %vpicmp0, i32 0
  call void @write(i64 noundef %ans)
  ret i32 0
}

해당 코드를 컴파일하면 다음을 얻습니다.

start main 0:
.entry:
r1 = const 3
r2 = const 0
v1 = vupdate v1 r1 r2 64
r3 = const 2
r4 = const 1
v1 = vupdate v1 r3 r4 64
v1 = vupdate v1 r4 r3 64
v2 = vupdate v1 r2 r1 64
br .middle.block
.middle.block:
v1 = vpicmp sle v2 v2 64
br .end.block
.end.block:
r1 = vextct v1 r2 64
call write r1
ret r2
end main

이를 실행시키면 다음과 같은 오류가 발생합니다.

Block middle.block is not well formed : line 12

IR과 어셈블리 모두 syntax가 올바른 것으로 보이는데, vpicmp instruction이 포함된 block을 parsing하는 과정에서 문제가 있는 것 같습니다. 확인해보니 inst.rsicmp_parser에 typo가 있는 것 같습니다.

    let (rem, op) = alt((tag("icmp"), tag("vicmp"), tag("vpcimp")))(rem)?;

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

Hyun2023 commented 3 weeks ago

너무 어처구니없는 실수를 했네요;; 최신버전에서 수정되었습니다. 감사합니다.