Source code:

#include <iostream>

static void Foo()
{
    std::cout << "one" << std::endl;
    std::cout << "two" << std::endl;
    std::cout << "three" << std::endl;
    std::cout << "four" << std::endl;
    std::cout << "five" << std::endl;
    std::cout << "six" << std::endl;
    std::cout << "seven" << std::endl;
    std::cout << "eight" << std::endl;
    std::cout << "nine" << std::endl;
    std::cout << "ten" << std::endl;
}

static void FooCopy()
{
    std::cout << "one" << std::endl;
    std::cout << "two" << std::endl;
    std::cout << "three" << std::endl;
    std::cout << "four" << std::endl;
    std::cout << "five" << std::endl;
    std::cout << "six" << std::endl;
    std::cout << "seven" << std::endl;
    std::cout << "eight" << std::endl;
    std::cout << "nine" << std::endl;
    std::cout << "ten" << std::endl;
}

int GetOne()
{
    Foo();
    return 1;
}

int GetTwo()
{
    FooCopy();
    return 2;
}

What clang produces:

_Z6GetOnev:
        push    r14
        push    rbx
        push    rax
        mov     rbx, qword ptr [rip + _ZSt4cout@GOTPCREL]
        lea     rsi, [rip + .L.str]
        mov     edx, 3
        mov     rdi, rbx
        call    _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l@PLT
        mov     rax, qword ptr [rbx]
        mov     rax, qword ptr [rax - 24]
        mov     r14, qword ptr [rbx + rax + 240]
        test    r14, r14
        je      .LBB0_41
        cmp     byte ptr [r14 + 56], 0
        je      .LBB0_3
        movzx   eax, byte ptr [r14 + 67]
        jmp     .LBB0_4
.LBB0_3:
        mov     rdi, r14
        call    _ZNKSt5ctypeIcE13_M_widen_initEv@PLT
        mov     rax, qword ptr [r14]
        mov     rdi, r14
        mov     esi, 10
        call    qword ptr [rax + 48]
.LBB0_4:
        movsx   esi, al
        mov     rdi, rbx
        call    _ZNSo3putEc@PLT
        mov     rdi, rax
        call    _ZNSo5flushEv@PLT
        lea     rsi, [rip + .L.str.1]
        mov     edx, 3
        mov     rdi, rbx
        call    _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l@PLT
        mov     rax, qword ptr [rbx]
        mov     rax, qword ptr [rax - 24]
        mov     r14, qword ptr [rbx + rax + 240]
        test    r14, r14
        je      .LBB0_41
        cmp     byte ptr [r14 + 56], 0
        je      .LBB0_7
        movzx   eax, byte ptr [r14 + 67]
        jmp     .LBB0_8
.LBB0_7:
        mov     rdi, r14
        call    _ZNKSt5ctypeIcE13_M_widen_initEv@PLT
        mov     rax, qword ptr [r14]
        mov     rdi, r14
        mov     esi, 10
        call    qword ptr [rax + 48]
.LBB0_8:
        movsx   esi, al
        mov     rdi, rbx
        call    _ZNSo3putEc@PLT
        mov     rdi, rax
        call    _ZNSo5flushEv@PLT
        lea     rsi, [rip + .L.str.2]
        mov     edx, 5
        mov     rdi, rbx
        call    _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l@PLT
        mov     rax, qword ptr [rbx]
        mov     rax, qword ptr [rax - 24]
        mov     r14, qword ptr [rbx + rax + 240]
        test    r14, r14
        je      .LBB0_41
        cmp     byte ptr [r14 + 56], 0
        je      .LBB0_11
        movzx   eax, byte ptr [r14 + 67]
        jmp     .LBB0_12
.LBB0_11:
        mov     rdi, r14
        call    _ZNKSt5ctypeIcE13_M_widen_initEv@PLT
        mov     rax, qword ptr [r14]
        mov     rdi, r14
        mov     esi, 10
        call    qword ptr [rax + 48]
.LBB0_12:
        movsx   esi, al
        mov     rdi, rbx
        call    _ZNSo3putEc@PLT
        mov     rdi, rax
        call    _ZNSo5flushEv@PLT
        lea     rsi, [rip + .L.str.3]
        mov     edx, 4
        mov     rdi, rbx
        call    _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l@PLT
        mov     rax, qword ptr [rbx]
        mov     rax, qword ptr [rax - 24]
        mov     r14, qword ptr [rbx + rax + 240]
        test    r14, r14
        je      .LBB0_41
        cmp     byte ptr [r14 + 56], 0
        je      .LBB0_15
        movzx   eax, byte ptr [r14 + 67]
        jmp     .LBB0_16
.LBB0_15:
        mov     rdi, r14
        call    _ZNKSt5ctypeIcE13_M_widen_initEv@PLT
        mov     rax, qword ptr [r14]
        mov     rdi, r14
        mov     esi, 10
        call    qword ptr [rax + 48]
.LBB0_16:
        movsx   esi, al
        mov     rdi, rbx
        call    _ZNSo3putEc@PLT
        mov     rdi, rax
        call    _ZNSo5flushEv@PLT
        lea     rsi, [rip + .L.str.4]
        mov     edx, 4
        mov     rdi, rbx
        call    _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l@PLT
        mov     rax, qword ptr [rbx]
        mov     rax, qword ptr [rax - 24]
        mov     r14, qword ptr [rbx + rax + 240]
        test    r14, r14
        je      .LBB0_41
        cmp     byte ptr [r14 + 56], 0
        je      .LBB0_19
        movzx   eax, byte ptr [r14 + 67]
        jmp     .LBB0_20
.LBB0_19:
        mov     rdi, r14
        call    _ZNKSt5ctypeIcE13_M_widen_initEv@PLT
        mov     rax, qword ptr [r14]
        mov     rdi, r14
        mov     esi, 10
        call    qword ptr [rax + 48]
.LBB0_20:
        movsx   esi, al
        mov     rdi, rbx
        call    _ZNSo3putEc@PLT
        mov     rdi, rax
        call    _ZNSo5flushEv@PLT
        lea     rsi, [rip + .L.str.5]
        mov     edx, 3
        mov     rdi, rbx
        call    _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l@PLT
        mov     rax, qword ptr [rbx]
        mov     rax, qword ptr [rax - 24]
        mov     r14, qword ptr [rbx + rax + 240]
        test    r14, r14
        je      .LBB0_41
        cmp     byte ptr [r14 + 56], 0
        je      .LBB0_23
        movzx   eax, byte ptr [r14 + 67]
        jmp     .LBB0_24
.LBB0_23:
        mov     rdi, r14
        call    _ZNKSt5ctypeIcE13_M_widen_initEv@PLT
        mov     rax, qword ptr [r14]
        mov     rdi, r14
        mov     esi, 10
        call    qword ptr [rax + 48]
.LBB0_24:
        movsx   esi, al
        mov     rdi, rbx
        call    _ZNSo3putEc@PLT
        mov     rdi, rax
        call    _ZNSo5flushEv@PLT
        lea     rsi, [rip + .L.str.6]
        mov     edx, 5
        mov     rdi, rbx
        call    _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l@PLT
        mov     rax, qword ptr [rbx]
        mov     rax, qword ptr [rax - 24]
        mov     r14, qword ptr [rbx + rax + 240]
        test    r14, r14
        je      .LBB0_41
        cmp     byte ptr [r14 + 56], 0
        je      .LBB0_27
        movzx   eax, byte ptr [r14 + 67]
        jmp     .LBB0_28
.LBB0_27:
        mov     rdi, r14
        call    _ZNKSt5ctypeIcE13_M_widen_initEv@PLT
        mov     rax, qword ptr [r14]
        mov     rdi, r14
        mov     esi, 10
        call    qword ptr [rax + 48]
.LBB0_28:
        movsx   esi, al
        mov     rdi, rbx
        call    _ZNSo3putEc@PLT
        mov     rdi, rax
        call    _ZNSo5flushEv@PLT
        lea     rsi, [rip + .L.str.7]
        mov     edx, 5
        mov     rdi, rbx
        call    _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l@PLT
        mov     rax, qword ptr [rbx]
        mov     rax, qword ptr [rax - 24]
        mov     r14, qword ptr [rbx + rax + 240]
        test    r14, r14
        je      .LBB0_41
        cmp     byte ptr [r14 + 56], 0
        je      .LBB0_31
        movzx   eax, byte ptr [r14 + 67]
        jmp     .LBB0_32
.LBB0_31:
        mov     rdi, r14
        call    _ZNKSt5ctypeIcE13_M_widen_initEv@PLT
        mov     rax, qword ptr [r14]
        mov     rdi, r14
        mov     esi, 10
        call    qword ptr [rax + 48]
.LBB0_32:
        movsx   esi, al
        mov     rdi, rbx
        call    _ZNSo3putEc@PLT
        mov     rdi, rax
        call    _ZNSo5flushEv@PLT
        lea     rsi, [rip + .L.str.8]
        mov     edx, 4
        mov     rdi, rbx
        call    _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l@PLT
        mov     rax, qword ptr [rbx]
        mov     rax, qword ptr [rax - 24]
        mov     r14, qword ptr [rbx + rax + 240]
        test    r14, r14
        je      .LBB0_41
        cmp     byte ptr [r14 + 56], 0
        je      .LBB0_35
        movzx   eax, byte ptr [r14 + 67]
        jmp     .LBB0_36
.LBB0_35:
        mov     rdi, r14
        call    _ZNKSt5ctypeIcE13_M_widen_initEv@PLT
        mov     rax, qword ptr [r14]
        mov     rdi, r14
        mov     esi, 10
        call    qword ptr [rax + 48]
.LBB0_36:
        movsx   esi, al
        mov     rdi, rbx
        call    _ZNSo3putEc@PLT
        mov     rdi, rax
        call    _ZNSo5flushEv@PLT
        lea     rsi, [rip + .L.str.9]
        mov     edx, 3
        mov     rdi, rbx
        call    _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l@PLT
        mov     rax, qword ptr [rbx]
        mov     rax, qword ptr [rax - 24]
        mov     rbx, qword ptr [rbx + rax + 240]
        test    rbx, rbx
        je      .LBB0_41
        cmp     byte ptr [rbx + 56], 0
        je      .LBB0_39
        movzx   eax, byte ptr [rbx + 67]
        jmp     .LBB0_40
.LBB0_39:
        mov     rdi, rbx
        call    _ZNKSt5ctypeIcE13_M_widen_initEv@PLT
        mov     rax, qword ptr [rbx]
        mov     rdi, rbx
        mov     esi, 10
        call    qword ptr [rax + 48]
.LBB0_40:
        movsx   esi, al
        mov     rdi, qword ptr [rip + _ZSt4cout@GOTPCREL]
        call    _ZNSo3putEc@PLT
        mov     rdi, rax
        call    _ZNSo5flushEv@PLT
        mov     eax, 1
        add     rsp, 8
        pop     rbx
        pop     r14
        ret
.LBB0_41:
        call    _ZSt16__throw_bad_castv@PLT

_Z6GetTwov:
        push    r14
        push    rbx
        push    rax
        mov     rbx, qword ptr [rip + _ZSt4cout@GOTPCREL]
        lea     rsi, [rip + .L.str]
        mov     edx, 3
        mov     rdi, rbx
        call    _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l@PLT
        mov     rax, qword ptr [rbx]
        mov     rax, qword ptr [rax - 24]
        mov     r14, qword ptr [rbx + rax + 240]
        test    r14, r14
        je      .LBB1_41
        cmp     byte ptr [r14 + 56], 0
        je      .LBB1_3
        movzx   eax, byte ptr [r14 + 67]
        jmp     .LBB1_4
.LBB1_3:
        mov     rdi, r14
        call    _ZNKSt5ctypeIcE13_M_widen_initEv@PLT
        mov     rax, qword ptr [r14]
        mov     rdi, r14
        mov     esi, 10
        call    qword ptr [rax + 48]
.LBB1_4:
        movsx   esi, al
        mov     rdi, rbx
        call    _ZNSo3putEc@PLT
        mov     rdi, rax
        call    _ZNSo5flushEv@PLT
        lea     rsi, [rip + .L.str.1]
        mov     edx, 3
        mov     rdi, rbx
        call    _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l@PLT
        mov     rax, qword ptr [rbx]
        mov     rax, qword ptr [rax - 24]
        mov     r14, qword ptr [rbx + rax + 240]
        test    r14, r14
        je      .LBB1_41
        cmp     byte ptr [r14 + 56], 0
        je      .LBB1_7
        movzx   eax, byte ptr [r14 + 67]
        jmp     .LBB1_8
.LBB1_7:
        mov     rdi, r14
        call    _ZNKSt5ctypeIcE13_M_widen_initEv@PLT
        mov     rax, qword ptr [r14]
        mov     rdi, r14
        mov     esi, 10
        call    qword ptr [rax + 48]
.LBB1_8:
        movsx   esi, al
        mov     rdi, rbx
        call    _ZNSo3putEc@PLT
        mov     rdi, rax
        call    _ZNSo5flushEv@PLT
        lea     rsi, [rip + .L.str.2]
        mov     edx, 5
        mov     rdi, rbx
        call    _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l@PLT
        mov     rax, qword ptr [rbx]
        mov     rax, qword ptr [rax - 24]
        mov     r14, qword ptr [rbx + rax + 240]
        test    r14, r14
        je      .LBB1_41
        cmp     byte ptr [r14 + 56], 0
        je      .LBB1_11
        movzx   eax, byte ptr [r14 + 67]
        jmp     .LBB1_12
.LBB1_11:
        mov     rdi, r14
        call    _ZNKSt5ctypeIcE13_M_widen_initEv@PLT
        mov     rax, qword ptr [r14]
        mov     rdi, r14
        mov     esi, 10
        call    qword ptr [rax + 48]
.LBB1_12:
        movsx   esi, al
        mov     rdi, rbx
        call    _ZNSo3putEc@PLT
        mov     rdi, rax
        call    _ZNSo5flushEv@PLT
        lea     rsi, [rip + .L.str.3]
        mov     edx, 4
        mov     rdi, rbx
        call    _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l@PLT
        mov     rax, qword ptr [rbx]
        mov     rax, qword ptr [rax - 24]
        mov     r14, qword ptr [rbx + rax + 240]
        test    r14, r14
        je      .LBB1_41
        cmp     byte ptr [r14 + 56], 0
        je      .LBB1_15
        movzx   eax, byte ptr [r14 + 67]
        jmp     .LBB1_16
.LBB1_15:
        mov     rdi, r14
        call    _ZNKSt5ctypeIcE13_M_widen_initEv@PLT
        mov     rax, qword ptr [r14]
        mov     rdi, r14
        mov     esi, 10
        call    qword ptr [rax + 48]
.LBB1_16:
        movsx   esi, al
        mov     rdi, rbx
        call    _ZNSo3putEc@PLT
        mov     rdi, rax
        call    _ZNSo5flushEv@PLT
        lea     rsi, [rip + .L.str.4]
        mov     edx, 4
        mov     rdi, rbx
        call    _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l@PLT
        mov     rax, qword ptr [rbx]
        mov     rax, qword ptr [rax - 24]
        mov     r14, qword ptr [rbx + rax + 240]
        test    r14, r14
        je      .LBB1_41
        cmp     byte ptr [r14 + 56], 0
        je      .LBB1_19
        movzx   eax, byte ptr [r14 + 67]
        jmp     .LBB1_20
.LBB1_19:
        mov     rdi, r14
        call    _ZNKSt5ctypeIcE13_M_widen_initEv@PLT
        mov     rax, qword ptr [r14]
        mov     rdi, r14
        mov     esi, 10
        call    qword ptr [rax + 48]
.LBB1_20:
        movsx   esi, al
        mov     rdi, rbx
        call    _ZNSo3putEc@PLT
        mov     rdi, rax
        call    _ZNSo5flushEv@PLT
        lea     rsi, [rip + .L.str.5]
        mov     edx, 3
        mov     rdi, rbx
        call    _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l@PLT
        mov     rax, qword ptr [rbx]
        mov     rax, qword ptr [rax - 24]
        mov     r14, qword ptr [rbx + rax + 240]
        test    r14, r14
        je      .LBB1_41
        cmp     byte ptr [r14 + 56], 0
        je      .LBB1_23
        movzx   eax, byte ptr [r14 + 67]
        jmp     .LBB1_24
.LBB1_23:
        mov     rdi, r14
        call    _ZNKSt5ctypeIcE13_M_widen_initEv@PLT
        mov     rax, qword ptr [r14]
        mov     rdi, r14
        mov     esi, 10
        call    qword ptr [rax + 48]
.LBB1_24:
        movsx   esi, al
        mov     rdi, rbx
        call    _ZNSo3putEc@PLT
        mov     rdi, rax
        call    _ZNSo5flushEv@PLT
        lea     rsi, [rip + .L.str.6]
        mov     edx, 5
        mov     rdi, rbx
        call    _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l@PLT
        mov     rax, qword ptr [rbx]
        mov     rax, qword ptr [rax - 24]
        mov     r14, qword ptr [rbx + rax + 240]
        test    r14, r14
        je      .LBB1_41
        cmp     byte ptr [r14 + 56], 0
        je      .LBB1_27
        movzx   eax, byte ptr [r14 + 67]
        jmp     .LBB1_28
.LBB1_27:
        mov     rdi, r14
        call    _ZNKSt5ctypeIcE13_M_widen_initEv@PLT
        mov     rax, qword ptr [r14]
        mov     rdi, r14
        mov     esi, 10
        call    qword ptr [rax + 48]
.LBB1_28:
        movsx   esi, al
        mov     rdi, rbx
        call    _ZNSo3putEc@PLT
        mov     rdi, rax
        call    _ZNSo5flushEv@PLT
        lea     rsi, [rip + .L.str.7]
        mov     edx, 5
        mov     rdi, rbx
        call    _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l@PLT
        mov     rax, qword ptr [rbx]
        mov     rax, qword ptr [rax - 24]
        mov     r14, qword ptr [rbx + rax + 240]
        test    r14, r14
        je      .LBB1_41
        cmp     byte ptr [r14 + 56], 0
        je      .LBB1_31
        movzx   eax, byte ptr [r14 + 67]
        jmp     .LBB1_32
.LBB1_31:
        mov     rdi, r14
        call    _ZNKSt5ctypeIcE13_M_widen_initEv@PLT
        mov     rax, qword ptr [r14]
        mov     rdi, r14
        mov     esi, 10
        call    qword ptr [rax + 48]
.LBB1_32:
        movsx   esi, al
        mov     rdi, rbx
        call    _ZNSo3putEc@PLT
        mov     rdi, rax
        call    _ZNSo5flushEv@PLT
        lea     rsi, [rip + .L.str.8]
        mov     edx, 4
        mov     rdi, rbx
        call    _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l@PLT
        mov     rax, qword ptr [rbx]
        mov     rax, qword ptr [rax - 24]
        mov     r14, qword ptr [rbx + rax + 240]
        test    r14, r14
        je      .LBB1_41
        cmp     byte ptr [r14 + 56], 0
        je      .LBB1_35
        movzx   eax, byte ptr [r14 + 67]
        jmp     .LBB1_36
.LBB1_35:
        mov     rdi, r14
        call    _ZNKSt5ctypeIcE13_M_widen_initEv@PLT
        mov     rax, qword ptr [r14]
        mov     rdi, r14
        mov     esi, 10
        call    qword ptr [rax + 48]
.LBB1_36:
        movsx   esi, al
        mov     rdi, rbx
        call    _ZNSo3putEc@PLT
        mov     rdi, rax
        call    _ZNSo5flushEv@PLT
        lea     rsi, [rip + .L.str.9]
        mov     edx, 3
        mov     rdi, rbx
        call    _ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_l@PLT
        mov     rax, qword ptr [rbx]
        mov     rax, qword ptr [rax - 24]
        mov     rbx, qword ptr [rbx + rax + 240]
        test    rbx, rbx
        je      .LBB1_41
        cmp     byte ptr [rbx + 56], 0
        je      .LBB1_39
        movzx   eax, byte ptr [rbx + 67]
        jmp     .LBB1_40
.LBB1_39:
        mov     rdi, rbx
        call    _ZNKSt5ctypeIcE13_M_widen_initEv@PLT
        mov     rax, qword ptr [rbx]
        mov     rdi, rbx
        mov     esi, 10
        call    qword ptr [rax + 48]
.LBB1_40:
        movsx   esi, al
        mov     rdi, qword ptr [rip + _ZSt4cout@GOTPCREL]
        call    _ZNSo3putEc@PLT
        mov     rdi, rax
        call    _ZNSo5flushEv@PLT
        mov     eax, 2
        add     rsp, 8
        pop     rbx
        pop     r14
        ret
.LBB1_41:
        call    _ZSt16__throw_bad_castv@PLT

.L.str:
        .asciz  "one"

.L.str.1:
        .asciz  "two"

.L.str.2:
        .asciz  "three"

.L.str.3:
        .asciz  "four"

.L.str.4:
        .asciz  "five"

.L.str.5:
        .asciz  "six"

.L.str.6:
        .asciz  "seven"

.L.str.7:
        .asciz  "eight"

.L.str.8:
        .asciz  "nine"

.L.str.9:
        .asciz  "ten"

Godblot example: https://godbolt.org/z/TWqKTcGce

LLVM optimization pipiline struggles to merge two identical functions into one and inlines each of them individually instead. This effect is observable with -O1, -O2, -Os, -Oz.
Expected behavior: MergeFunctions pass runs before inlining (or before AND after), so in cases like above no duplicated binary code is emitted.

Also it seems like constants deduplication pass isn't placed optimal too. It should be run before MergeFunctions pass, otherwise functions accessing identical but different constants can't be merged.
Activity
github-actions
added
new issue
on Jan 2, 2025
Panzerschrek
Panzerschrek commented on Jan 2, 2025
Panzerschrek
on Jan 2, 2025
Author

This bug is critical for my language project Ü. My compilation model can produce a lot of duplicated intermediate code, which eventually should be merged together to avoid bloating result executables. But because of behavior described above no actual deduplication happens in many cases and thus result executables are bloated.

This affects every function with private linkage. Such functions are always forcefully-inlined before they can be merged.
Panzerschrek
changed the title LLVM simplification/optimization pipeline misuptimization - missing oportunity to merge private functions LLVM simplification/optimization pipeline misoptimization - missing oportunity to merge private functions on Jan 2, 2025
cricsion
Add a comment
new Comment
Markdown input: edit mode selected.
Remember, contributions to this repository should follow its contributing guidelines, security policy and code of conduct.
Assignees
No one assigned

Labels
new issue
Type
No type
Projects
No projects
Milestone
No milestone

Relationships
None yet
Development
No branches or pull requests

Notifications
You're not receiving notifications from this thread.
Participants
@Panzerschrek solve this issue