snu-sf-class / swpp202401

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

[Project] Backend error regarding vector constants #146

Open arnold518 opened 5 months ago

arnold518 commented 5 months ago
define dso_local i32 @main() #0 {
vector.ph:
  %a = alloca [1024 x i64], align 16
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %4, %vector.body ]
  %0 = getelementptr i64, ptr %a, i64 %index
  store <4 x i64> <i64 0, i64 1, i64 2, i64 3>, ptr %0, align 8
  %4 = add i64 %index, 4
  %.not = icmp eq i64 %4, 1020
  br i1 %.not, label %for.end, label %vector.body, !llvm.loop !5

for.inc:                                          ; preds = %for.inc
  br label %for.inc

for.end:                                          ; preds = %vector.body
  %5 = getelementptr i64, ptr %a, i64 1000
  %6 = load i64, ptr %5, align 16
  call void @write(i64 noundef %6) #3
  ret i32 0
}

위 llvm ir을 assembly로 변환하였을 때, backend 에서 Tried to resolve non-splat vector! 에러가 발생합니다. 이에, vector constant는 scalar constant와 다르게 처리해야 하는지 궁금합니다. 만약 다르다면, phi 등의 다른 연산들에 대해서 scalar과 vector의 처리가 달라야 하는 경우가 있는지 또한 알고 싶습니다.

마지막으로, vector의 경우 <4 i64>, <8 i32> 두 가지 타입만 존재한다고 생각하여도 되나요?

strikef commented 5 months ago

위 llvm ir을 assembly로 변환하였을 때, backend 에서 Tried to resolve non-splat vector! 에러가 발생합니다.

Vector constant는 기본적으로 지원되지 않습니다. 정확히는, splat vector (모든 element가 같은 vector) 는 백엔드 구현상의 이유로 제한적으로 지원하지만, 이외의 vector를 만들어내려면 insertelement 등을 이용하여 만드셔야 합니다.

vector의 경우 <4 i64>, <8 i32> 두 가지 타입만 존재한다고 생각하여도 되나요?

네, 맞습니다. 이외의 타입은 백엔드에서 크래시가 발생합니다.