snu-sf-class / swpp202401

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

[Project] Backend error: unable to parse v7 as VectorRegister #148

Open sbkim28 opened 5 months ago

sbkim28 commented 5 months ago

안녕하세요, 백엔드에서 오류가 발생하는 것을 확인하여 이를 제보하고자 합니다.

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

define dso_local i32 @main() #0 {
entry:
  %call = call i64 (...) @read()
  %v1 = call <4 x i64> @vicmp_eq_i64x4(<4 x i64> undef, <4 x i64> undef)
  %v2 = call <4 x i64> @vicmp_eq_i64x4(<4 x i64> undef, <4 x i64> undef)
  %v3 = call <4 x i64> @vicmp_eq_i64x4(<4 x i64> undef, <4 x i64> undef)
  %v4 = call <4 x i64> @vicmp_eq_i64x4(<4 x i64> undef, <4 x i64> undef)
  %v5 = call <4 x i64> @vicmp_eq_i64x4(<4 x i64> undef, <4 x i64> undef)
  %v6 = call <4 x i64> @vicmp_eq_i64x4(<4 x i64> undef, <4 x i64> undef)
  %v7 = call <4 x i64> @vicmp_eq_i64x4(<4 x i64> undef, <4 x i64> undef)

  %e1 = extractelement <4 x i64> %v1, i32 0
  %e2 = extractelement <4 x i64> %v2, i32 0
  %e3 = extractelement <4 x i64> %v3, i32 0
  %e4 = extractelement <4 x i64> %v4, i32 0
  %e5 = extractelement <4 x i64> %v5, i32 0
  %e6 = extractelement <4 x i64> %v6, i32 0
  %e7 = extractelement <4 x i64> %v7, i32 0

  call void @write(i64 noundef %e1)
  call void @write(i64 noundef %e2)
  call void @write(i64 noundef %e3)
  call void @write(i64 noundef %e4)
  call void @write(i64 noundef %e5)
  call void @write(i64 noundef %e6)
  call void @write(i64 noundef %e7)
  ret i32 0
}

해당 코드를 컴파일하면 백엔드에서 exception이 발생하는데, 그 내용은 다음과 같습니다.

unable to parse v7 as VectorRegister
[  %v7 = call <4 x i64> @vicmp_eq_i64x4(<4 x i64> undef, <4 x i64> undef)]

문제가 되는 부분은 emitter.cpp에서 line 398입니다.

const std::map<std::string, VectorRegister, std::less<>> vector_reg_table = {
    {"v1"s, VectorRegister::V1},   {"v2"s, VectorRegister::V2},
    {"v3"s, VectorRegister::V3},   {"v4"s, VectorRegister::V4},
    {"v5"s, VectorRegister::V5},   {"v6"s, VectorRegister::V6},
    {"ve"s, VectorRegister::V7},   {"v8"s, VectorRegister::V8},
    {"v9"s, VectorRegister::V9},   {"v10"s, VectorRegister::V10},
    {"v11"s, VectorRegister::V11}, {"v12"s, VectorRegister::V12},
    {"v13"s, VectorRegister::V13}, {"v14"s, VectorRegister::V14},
    {"v15"s, VectorRegister::V15}, {"v16"s, VectorRegister::V16},
};

v7 대신 ve가 사용되어서 레지스터 할당 과정에서 문제가 생기는 것 같습니다. 해당 문제를 확인해주셨으면 합니다.

감사합니다.

strikef commented 5 months ago

제보 감사합니다. 백엔드 패치로 수정 예정입니다.