snu-sf-class / swpp202401

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

alive test 관련 질문 #128

Open bean1009 opened 4 months ago

bean1009 commented 4 months ago

안녕하세요. 조교님.

@arr1 = dso_local global <4 x i64> zeroinitializer, align 16
@arr2 = dso_local global <4 x i64> zeroinitializer, align 16
@arr3 = dso_local global <4 x i64> zeroinitializer, align 16

define dso_local i32 @main() #0 {
entry:
  %0 = load <4 x i64>, ptr @arr1, align 16
  %1 = load <4 x i64>, ptr @arr2, align 16
  %2 = call <4 x i64> @vincr_i64x4(<4 x i64> %0)
  %3 = call <4 x i64> @vpadd_i64x4(<4 x i64> %1, <4 x i64> %2)
  %4 = call <4 x i64> @vpicmp_eq_i64x4(<4 x i64> %2, <4 x i64> %3)
  store <4 x i64> %4, ptr @arr3, align 16
  ret i32 0
}

declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #1
declare i64 @read(...) #2
declare void @write(i64 noundef) #2
declare <4 x i64> @vincr_i64x4(<4 x i64>)
declare <4 x i64> @vpadd_i64x4(<4 x i64>, <4 x i64>)
declare <4 x i64> @vpicmp_eq_i64x4(<4 x i64>, <4 x i64>)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #1

이 테스트 케이스에 대하여 alive test를 실행하였을 때, 아래와 같은 오류가 발생하였습니다.

54: alive-tv: /root/llvm-project/llvm/lib/IR/Instructions.cpp:1876: llvm::InsertElementInst::InsertElementInst(Value *, Value *, Value *, const Twine &, Instruction *): Assertion `isValidOperands(Vec, Elt, Index) && "Invalid insertelement instruction operands!"' failed.
  %0 = load <4 x i64>, ptr @arr1, align 16
  %1 = load <4 x i64>, ptr @arr2, align 16
  %2 = call <4 x i64> @vpadd_i64x4(<4 x i64> %0, <4 x i64> %1)
  store <4 x i64> %2, ptr @arr3, align 16
  ret i32 0

위 테스트 케이스에 대해서는 alive test를 실행해도 같은 에러가 뜨지 않아 확인해본 결과 vpicmp_eq_i64x4 부분을 추가하였을 때 오류가 발생하는 것 같습니다. 다만 정확한 문제 원인을 잘 모르겠어 질문드립니다. 감사합니다.

strikef commented 4 months ago

수정된 Alive2 에서 vpicmp intrinsic을 변환하는 로직이 잘못되어 발생한 문제입니다. 다만 벡터 관련해 조금 엮인 문제가 있어서 버그를 같이 해결해 다시 공지할 예정입니다.

bean1009 commented 4 months ago

네! 감사합니다!

strikef commented 4 months ago

5월 30일자 Alive2 패치에서 해당 문제를 수정하였습니다.