Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

clang 14.0.5 i686-pc-windows-msvc <coroutine> ICE: failed to perform tail call elimination on a call site marked musttail #56507

Open
StephanTLavavej opened this issue Jul 13, 2022 · 7 comments

Comments

@StephanTLavavej
Copy link
Member

Repros with VS 2022 17.3 Preview 3 containing Clang 14.0.5.

⚠️ This is specific to 32-bit x86. ⚠️

C:\Temp>"C:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Auxiliary\Build\vcvars32.bat"
**********************************************************************
** Visual Studio 2022 Developer Command Prompt v17.3.0-pre.3.0
** Copyright (c) 2022 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x86'

C:\Temp>type test.cpp
// Copyright (c) Microsoft Corporation.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

#include <cassert>
#include <coroutine>
#include <cstdio>
#include <exception>
using namespace std;

int g_tasks_destroyed{0};

struct Task {
    struct Promise {
        int result{-1000};
        coroutine_handle<> previous;

        Task get_return_object() {
            return Task{*this};
        }

        suspend_always initial_suspend() {
            return {};
        }

        auto final_suspend() noexcept {
            struct Awaiter {
                bool await_ready() noexcept {
                    return false;
                }

                void await_resume() noexcept {}

                coroutine_handle<> await_suspend(coroutine_handle<Promise> h) noexcept {
                    auto& pre = h.promise().previous;
                    if (pre) {
                        return pre; // resume awaiting coroutine
                    }

                    // If there is no previous coroutine to resume, we've reached the outermost coroutine.
                    // Return a noop coroutine to allow control to return back to the caller.
                    return noop_coroutine();
                }
            };

            return Awaiter{};
        }

        void return_value(const int v) {
            result = v;
        }

        void unhandled_exception() noexcept {
            terminate();
        }
    };

    using promise_type = Promise;

    bool await_ready() const noexcept {
        return false;
    }

    int await_resume() {
        return coro.promise().result;
    }

    auto await_suspend(coroutine_handle<> enclosing) {
        coro.promise().previous = enclosing;
        return coro; // resume ourselves
    }

    Task(Task&& rhs) noexcept : coro(rhs.coro) {
        rhs.coro = nullptr;
    }

    explicit Task(Promise& p) : coro(coroutine_handle<Promise>::from_promise(p)) {}

    ~Task() {
        ++g_tasks_destroyed;

        if (coro) {
            coro.destroy();
        }
    }

    coroutine_handle<Promise> coro;
};

Task triangular_number(const int n) {
    if (n == 0) {
        co_return 0;
    }

    co_return n + co_await triangular_number(n - 1);
}

int main() {
    assert(g_tasks_destroyed == 0);

    {
        Task t               = triangular_number(10);
        coroutine_handle<> h = t.coro;

        assert(h == t.coro);
        assert(h);
        assert(!h.done());

        h();

        assert(h == t.coro);
        assert(h);
        assert(h.done());

        assert(g_tasks_destroyed == 10); // triangular_number() called for [0, 9]

        const int val = t.coro.promise().result;

        assert(val == 55);
    }

    assert(g_tasks_destroyed == 11); // triangular_number() called for [0, 10]

    puts("Done!");
}
C:\Temp>cl /EHsc /nologo /W4 /MTd /std:c++20 test.cpp && test.exe
test.cpp
Done!

C:\Temp>clang-cl /EHsc /nologo /W4 /MTd /std:c++20 test.cpp && test.exe
fatal error: error in backend: failed to perform tail call elimination on a call site marked musttail
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0.      Program arguments: "C:\\Program Files\\Microsoft Visual Studio\\2022\\Preview\\VC\\Tools\\Llvm\\bin\\clang-cl.exe" -cc1 -triple i686-pc-windows-msvc19.33.31627 -emit-obj -mrelax-all -mincremental-linker-compatible --mrelax-relocations -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name test.cpp -mrelocation-model static -mframe-pointer=all -relaxed-aliasing -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -target-cpu pentium4 -mllvm -x86-asm-syntax=intel -tune-cpu generic -mllvm -treat-scalable-fixed-error-as-warning -D_DEBUG -D_MT -flto-visibility-public-std --dependent-lib=libcmtd --dependent-lib=oldnames -stack-protector 2 -fcxx-exceptions -fexceptions -fexternc-nounwind -fms-volatile -fdiagnostics-format msvc -fcoverage-compilation-dir=C:\\Temp -resource-dir "C:\\Program Files\\Microsoft Visual Studio\\2022\\Preview\\VC\\Tools\\Llvm\\lib\\clang\\14.0.5" -c-isystem C:\\MinGW\\include -c-isystem C:\\MinGW\\include\\freetype2 -cxx-isystem C:\\MinGW\\include -cxx-isystem C:\\MinGW\\include\\freetype2 -internal-isystem "C:\\Program Files\\Microsoft Visual Studio\\2022\\Preview\\VC\\Tools\\Llvm\\lib\\clang\\14.0.5\\include" -internal-isystem "C:\\Program Files\\Microsoft Visual Studio\\2022\\Preview\\VC\\Tools\\MSVC\\14.33.31627\\include" -internal-isystem "C:\\Program Files\\Microsoft Visual Studio\\2022\\Preview\\VC\\Auxiliary\\VS\\include" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.22000.0\\ucrt" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\\\include\\10.0.22000.0\\\\um" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\\\include\\10.0.22000.0\\\\shared" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\\\include\\10.0.22000.0\\\\winrt" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\\\include\\10.0.22000.0\\\\cppwinrt" -internal-isystem "C:\\Program Files\\Microsoft Visual Studio\\2022\\Preview\\VC\\Tools\\MSVC\\14.33.31627\\include" -internal-isystem "C:\\Program Files\\Microsoft Visual Studio\\2022\\Preview\\VC\\Auxiliary\\VS\\include" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\include\\10.0.22000.0\\ucrt" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\\\include\\10.0.22000.0\\\\um" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\\\include\\10.0.22000.0\\\\shared" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\\\include\\10.0.22000.0\\\\winrt" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\10\\\\include\\10.0.22000.0\\\\cppwinrt" -WCL4 -fdeprecated-macro -fdebug-compilation-dir=C:\\Temp -ferror-limit 19 -fmessage-length=120 -fno-use-cxa-atexit -fms-extensions -fms-compatibility -fms-compatibility-version=19.33.31627 -std=c++20 -fdelayed-template-parsing -fno-implicit-modules -fcolor-diagnostics -faddrsig -o C:\\Users\\stl\\AppData\\Local\\Temp\\test-792971.obj -x c++ test.cpp
1.      <eof> parser at end of file
2.      Code generation
3.      Running pass 'Function Pass Manager' on module 'test.cpp'.
4.      Running pass 'X86 DAG->DAG Instruction Selection' on function '@"?triangular_number@@YA?AUTask@@H@Z.resume"'
clang-cl: error: clang frontend command failed with exit code 70 (use -v to see invocation)
clang version 14.0.5
Target: i686-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Program Files\Microsoft Visual Studio\2022\Preview\VC\Tools\Llvm\bin
clang-cl: note: diagnostic msg:
********************

PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang-cl: note: diagnostic msg: C:\Users\stl\AppData\Local\Temp\test-67198e.cpp
clang-cl: note: diagnostic msg: C:\Users\stl\AppData\Local\Temp\test-67198e.sh
clang-cl: note: diagnostic msg:

********************

This test case was slightly reduced from https://github.com/microsoft/STL/blob/969b2e250df56690768fdf8344293624d6ab0d6c/tests/std/tests/P0912R5_coroutine/test.cpp .

Here's a zip of the original source, preprocessed source, and run script: repro.zip

@zufuliu
Copy link

zufuliu commented Jul 13, 2022

The code works with llvm-mingw 14.0.0: i686-w64-mingw32-clang++.exe -std=c++20 -static test.cpp.

@llvmbot
Copy link
Member

llvmbot commented Jul 13, 2022

@llvm/issue-subscribers-backend-x86

@CaseyCarter
Copy link
Member

The code works with llvm-mingw 14.0.0: i686-w64-mingw32-clang++.exe -std=c++20 -static test.cpp.

... which suggests there's some MSABI interaction here.

@zufuliu
Copy link

zufuliu commented Jan 26, 2024

The crash is NOT reproducible with LLVM 17.0.6:

**********************************************************************
** Visual Studio 2022 Developer Command Prompt v17.8.5
** Copyright (c) 2022 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x86'

D:\Program Files\Microsoft Visual Studio\2022\Enterprise>F:

F:\>cd Dev\LLVM-17.0.6-win32\bin

F:\Dev\LLVM-17.0.6-win32\bin>cl /EHsc /nologo /W4 /MTd /std:c++20 test.cpp
test.cpp

F:\Dev\LLVM-17.0.6-win32\bin>test.exe
Done!

F:\Dev\LLVM-17.0.6-win32\bin>llvm-readobj.exe test.exe

File: test.exe
Format: COFF-i386
Arch: i386
AddressSize: 32bit

F:\Dev\LLVM-17.0.6-win32\bin>

@cpplearner
Copy link
Contributor

cpplearner commented Jan 27, 2024

The crash is NOT reproducible with LLVM 17.0.6:

It seems that you used MSVC's cl and not clang-cl

@zufuliu
Copy link

zufuliu commented Jan 27, 2024

It seems that you used MSVC's cl and not clang-cl

Sorry, it's my fail, the crash is still here.

fatal error: error in backend: failed to perform tail call elimination on a call site marked musttail
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0.      Program arguments: F:\\Dev\\LLVM-17.0.6-win32\\bin\\clang-cl.exe -cc1 -triple i686-pc-windows-msvc19.38.33134 -emit-obj -mrelax-all -mincremental-linker-compatible -dumpdir a- -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name test.cpp -mrelocation-model static -mframe-pointer=all -relaxed-aliasing -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -target-cpu pentium4 -mllvm -x86-asm-syntax=intel -tune-cpu generic -D_DEBUG -D_MT -flto-visibility-public-std --dependent-lib=libcmtd --dependent-lib=oldnames -stack-protector 2 -fcxx-exceptions -fexceptions -fexternc-nounwind -fms-volatile -fdiagnostics-format msvc -fcoverage-compilation-dir=F:\\Dev\\LLVM-17.0.6-win32\\bin -resource-dir F:\\Dev\\LLVM-17.0.6-win32\\lib\\clang\\17 -internal-isystem F:\\Dev\\LLVM-17.0.6-win32\\lib\\clang\\17\\include -internal-isystem "D:\\Program Files\\Microsoft Visual Studio\\2022\\VC\\Tools\\MSVC\\14.38.33130\\include" -internal-isystem "D:\\Program Files\\Microsoft Visual Studio\\2022\\VC\\Tools\\MSVC\\14.38.33130\\ATLMFC\\include" -internal-isystem "D:\\Program Files\\Microsoft Visual Studio\\2022\\VC\\Auxiliary\\VS\\include" -internal-isystem "D:\\Windows Kits\\10\\include\\10.0.22000.0\\ucrt" -internal-isystem "D:\\Windows Kits\\10\\\\include\\10.0.22000.0\\\\um" -internal-isystem "D:\\Windows Kits\\10\\\\include\\10.0.22000.0\\\\shared" -internal-isystem "D:\\Windows Kits\\10\\\\include\\10.0.22000.0\\\\winrt" -internal-isystem "D:\\Windows Kits\\10\\\\include\\10.0.22000.0\\\\cppwinrt" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\NETFXSDK\\4.8\\include\\um" -internal-isystem "D:\\Program Files\\Microsoft Visual Studio\\2022\\VC\\Tools\\MSVC\\14.38.33130\\include" -internal-isystem "D:\\Windows Kits\\10\\Include\\10.0.22000.0\\ucrt" -internal-isystem "D:\\Windows Kits\\10\\Include\\10.0.22000.0\\um" -internal-isystem "D:\\Windows Kits\\10\\Include\\10.0.22000.0\\shared" -internal-isystem "D:\\Program Files\\Microsoft Visual Studio\\2022\\VC\\Tools\\MSVC\\14.38.33130\\include" -internal-isystem "D:\\Program Files\\Microsoft Visual Studio\\2022\\VC\\Tools\\MSVC\\14.38.33130\\ATLMFC\\include" -internal-isystem "D:\\Program Files\\Microsoft Visual Studio\\2022\\VC\\Auxiliary\\VS\\include" -internal-isystem "D:\\Windows Kits\\10\\include\\10.0.22000.0\\ucrt" -internal-isystem "D:\\Windows Kits\\10\\\\include\\10.0.22000.0\\\\um" -internal-isystem "D:\\Windows Kits\\10\\\\include\\10.0.22000.0\\\\shared" -internal-isystem "D:\\Windows Kits\\10\\\\include\\10.0.22000.0\\\\winrt" -internal-isystem "D:\\Windows Kits\\10\\\\include\\10.0.22000.0\\\\cppwinrt" -internal-isystem "C:\\Program Files (x86)\\Windows Kits\\NETFXSDK\\4.8\\include\\um" -WCL4 -fdeprecated-macro -fdebug-compilation-dir=F:\\Dev\\LLVM-17.0.6-win32\\bin -ferror-limit 19 -fmessage-length=120 -fno-use-cxa-atexit -fms-extensions -fms-compatibility -fms-compatibility-version=19.38.33134 -std=c++20 -fdelayed-template-parsing -fno-implicit-modules -fcolor-diagnostics -faddrsig -o C:\\Users\\Admin\\AppData\\Local\\Temp\\test-1c4c8e.obj -x c++ test.cpp
1.      <eof> parser at end of file
2.      Code generation
3.      Running pass 'Function Pass Manager' on module 'test.cpp'.
4.      Running pass 'X86 DAG->DAG Instruction Selection' on function '@"?triangular_number@@YA?AUTask@@H@Z.resume"'
clang-cl: error: clang frontend command failed with exit code 70 (use -v to see invocation)
clang version 17.0.6
Target: i686-pc-windows-msvc
Thread model: posix
InstalledDir: F:\Dev\LLVM-17.0.6-win32\bin
clang-cl: note: diagnostic msg:
********************

PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT:
Preprocessed source(s) and associated run script(s) are located at:
clang-cl: note: diagnostic msg: C:\Users\Admin\AppData\Local\Temp\test-dac199.cpp
clang-cl: note: diagnostic msg: C:\Users\Admin\AppData\Local\Temp\test-dac199.sh
clang-cl: note: diagnostic msg:

********************

@StephanTLavavej
Copy link
Member Author

After upgrading from Clang 18 to Clang 19, this appears to be affecting even more code.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

6 participants