snu-sf-class / swpp202401

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

[Project] Skeleton Compiler Compilation failure. #58

Open sbkim28 opened 6 months ago

sbkim28 commented 6 months ago

안녕하십니까, 테스트 케이스를 제작하던 중, 컴파일에 실패하는 것으로 보이는 현상을 발견하여 제보합니다.

다음은 제가 c로 작성한 테스트케이스입니다.

#include <stdint.h>
#include <stdlib.h>

int64_t read();
void write(int64_t);

int main() {
    int64_t n = read();
    int64_t sum = 0;
    int64_t sqr_sum = 0;
    int64_t cube_sum = 0;
    int64_t neg_sum = 0;
    int64_t neg_sqr_sum = 0;
    int64_t neg_cube_sum = 0;
    int64_t xsum = 0;
    int64_t xsqr_sum = 0;
    int64_t xcube_sum = 0;
    int64_t even_sum = 0;
    int64_t even_sqr_sum = 0;
    int64_t odd_sum = 0;
    int64_t odd_sqr_sum = 0;
    int64_t even_xsum = 0;
    int64_t even_xsqr_sum = 0;
    int64_t odd_xsum = 0;
    int64_t odd_xsqr_sum = 0;

    int32_t sum32 = 0;
    int32_t sqr_sum32 = 0;
    int32_t cube_sum32 = 0;
    int32_t neg_sum32 = 0;
    int32_t neg_sqr_sum32 = 0;
    int32_t neg_cube_sum32 = 0;
    int32_t xsum32 = 0;
    int32_t xsqr_sum32 = 0;
    int32_t xcube_sum32 = 0;
    int32_t even_sum32 = 0;
    int32_t even_sqr_sum32 = 0;
    int32_t odd_sum32 = 0;
    int32_t odd_sqr_sum32 = 0;
    int32_t even_xsum32 = 0;
    int32_t even_xsqr_sum32 = 0;
    int32_t odd_xsum32 = 0;
    int32_t odd_xsqr_sum32 = 0;

    for (int64_t i = 1; i <= n; ++i) {
        sum += i;
        sqr_sum += i * i;
        cube_sum += i * i * i;
        neg_cube_sum += -i * i * i;
        neg_sum += -i;
        neg_sqr_sum += -i * i;
        xsum ^= i;
        xsqr_sum ^= i * i;
        xcube_sum ^= i * i * i;
        even_sum += i & 1 ? 0 : i;
        even_sqr_sum += i & 1 ? 0 : i * i;
        odd_sum += i & 1 ? i : 0;
        odd_sqr_sum += i & 1 ? i * i : 0;
        even_xsum ^= i & 1 ? 0 : i;
        even_xsqr_sum ^= i & 1 ? 0 : i * i;
        odd_xsum ^= i & 1 ? i : 0;
        odd_xsqr_sum ^= i & 1 ? i * i : 0;
        sum32 += i;
        sqr_sum32 += i * i;
        cube_sum32 += i * i * i;
        neg_cube_sum32 += -i * i * i;
        neg_sum32 += -i;
        neg_sqr_sum32 += -i * i;
        xsum32 ^= i;
        xsqr_sum32 ^= i * i;
        xcube_sum32 ^= i * i * i;
        even_sum32 += i & 1 ? 0 : i;
        even_sqr_sum32 += i & 1 ? 0 : i * i;
        odd_sum32 += i & 1 ? i : 0;
        odd_sqr_sum32 += i & 1 ? i * i : 0;
        even_xsum32 ^= i & 1 ? 0 : i;
        even_xsqr_sum32 ^= i & 1 ? 0 : i * i;
        odd_xsum32 ^= i & 1 ? i : 0;
        odd_xsqr_sum32 ^= i & 1 ? i * i : 0;
    }

    write(sum);
    write(sqr_sum);
    write(cube_sum);
    write(neg_sum);
    write(neg_sqr_sum);
    write(neg_cube_sum);
    write(xsum);
    write(xsqr_sum);
    write(xcube_sum);
    write(even_sum);
    write(even_sqr_sum);
    write(odd_sum);
    write(odd_sqr_sum);
    write(even_xsum);
    write(even_xsqr_sum);
    write(odd_xsum);
    write(odd_xsqr_sum);

    write(sum32);
    write(sqr_sum32);
    write(cube_sum32);
    write(neg_sum32);
    write(neg_sqr_sum32);
    write(neg_cube_sum32);
    write(xsum32);
    write(xsqr_sum32);
    write(xcube_sum32);
    write(even_sum32);
    write(even_sqr_sum32);
    write(odd_sum32);
    write(odd_sqr_sum32);
    write(even_xsum32);
    write(even_xsqr_sum32);
    write(odd_xsum32);
    write(odd_xsqr_sum32);

}

해당 c 파일을 ll 파일로 변환하고, build한 컴파일러로 s 파일로 컴파일하려 하였으나, build된 컴파일러에서 오랜 시간이 걸려도 결과가 나오지 않았습니다. 작성한 pass에 문제가 있는 것은 아닐까 해서 제공해주신 skeleton compiler로 컴파일을 해도 같은 현상이 발생하였습니다. 디버거로 확인해보니, backend/register_allocate.cpp에서 무한 루프에 빠지는 것으로 추정됩니다.

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

strikef commented 6 months ago

말씀해주신 대로 register allocation 과정에서 발생한 문제이며, 루프마다 update되는 변수가 많다 보니 PHI node 처리에 필요한 register 수가 물리 register 수를 넘어버렸을 때 생기는 문제로 보입니다. 현재 디버깅 중이며, 수정되는 대로 재공지하겠습니다.

strikef commented 6 months ago

Register allocation은 구현이 복잡하다 보니 디버깅에 시간이 많이 걸리고 있습니다. 현재 계속 디버깅 중이며, 고쳐지는 대로 다시 공지드리겠습니다.