<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/xhtml; charset=utf-8">
</head>
<body>
<div style="font-family:sans-serif"><div style="white-space:normal">
<p dir="auto">On 8 Jul 2021, at 22:01, Mehdi AMINI wrote:</p>

</div>
<div style="white-space:normal"><blockquote style="border-left:2px solid #3983C4; color:#3983C4; margin:0 0 5px; padding-left:5px"><p dir="auto">On Thu, Jul 8, 2021 at 6:56 PM John McCall <rjmccall@apple.com> wrote:</p>
<blockquote style="border-left:2px solid #3983C4; color:#7CBF0C; margin:0 0 5px; padding-left:5px; border-left-color:#7CBF0C"><p dir="auto">On 8 Jul 2021, at 20:13, Mehdi AMINI wrote:</p>
<blockquote style="border-left:2px solid #3983C4; color:#7CBF0C; margin:0 0 5px; padding-left:5px; border-left-color:#7CBF0C"><p dir="auto">On Thu, Jul 8, 2021 at 4:40 PM Xun Li <lxfind@gmail.com> wrote:<br>
</p>
<blockquote style="border-left:2px solid #3983C4; color:#7CBF0C; margin:0 0 5px; padding-left:5px; border-left-color:#7CBF0C"><p dir="auto">Not sure if I fully understand the question. Do you have a full<br>
example of what you expect but doesn't work?<br>
Are you trying to compile C++ code that uses coroutines, or are you<br>
trying to use opt to compile an .ll file?<br>
</p>
</blockquote><p dir="auto">I'm trying to compile IR (.ll or .bc) file: clang support IR as *input*</p>
</blockquote><p dir="auto">as</p>
<blockquote style="border-left:2px solid #3983C4; color:#7CBF0C; margin:0 0 5px; padding-left:5px; border-left-color:#7CBF0C"><p dir="auto">well.<br>
<br>
So for example with the case you mention:<br>
<br>
clang -emit-llvm  -c    -O3  -Xclang -disable-llvm-passes<br>
clang/test/CodeGenCoroutines/coro-symmetric-transfer-01.cpp -std=c++20 -o<br>
coro.bc<br>
<br>
This gets me a nice coro.bc file, but I have no way to compile this with<br>
clang right now, it will always crash:<br>
<br>
$ clang -c coro.bc<br>
PLEASE submit a bug report to <a href="https://bugs.llvm.org/">https://bugs.llvm.org/</a> and include the</p>
</blockquote><p dir="auto">crash</p>
<blockquote style="border-left:2px solid #3983C4; color:#7CBF0C; margin:0 0 5px; padding-left:5px; border-left-color:#7CBF0C"><p dir="auto">backtrace, preprocessed source, and associated run script.<br>
Stack dump:<br>
0. Program arguments: clang -c coro.bc<br>
1. Code generation<br>
2. Running pass 'Function Pass Manager' on module 'coro.bc'.<br>
3. Running pass 'X86 DAG->DAG Instruction Selection' on function</p>
</blockquote><p dir="auto">'@_Z3foov'</p>
<blockquote style="border-left:2px solid #3983C4; color:#7CBF0C; margin:0 0 5px; padding-left:5px; border-left-color:#7CBF0C"><p dir="auto">Segmentation fault</p>
</blockquote><p dir="auto">Coroutines do push the boundaries of LLVM IR in the sense that<br>
(1) there’s a mandatory lowering sequence and (2) because of the<br>
complexity of that lowering, the IR prior to that sequence is<br>
much more of an internal representation than a stable format.<br>
With that said, I don’t know of any inherent reason why running<br>
the coroutine passes multiple times would be a problem.  It’s<br>
probably just some bit of coroutine bookkeeping (the attribute?)<br>
that we fail to remove after lowering.<br>
<br>
Also, the exact form of the crash is surprising; I don’t know<br>
why running lowering multiple times would add new things that<br>
ISel wouldn’t recognize.<br>
</p>
</blockquote><p dir="auto">Right now this isn't running it multiple times, it is instead never running<br>
it, the backend crashes because ISel does not know about these intrinsics</p>
</blockquote></div>
<div style="white-space:normal">

<p dir="auto">Ah, I had the opposite problem on my mind, sorry.</p>

</div>
<div style="white-space:normal"><blockquote style="border-left:2px solid #3983C4; color:#3983C4; margin:0 0 5px; padding-left:5px"><p dir="auto">(I think we should be friendlier in the failure mode, but that's another<br>
story).</p>
</blockquote></div>
<div style="white-space:normal">

<p dir="auto">Yes, that’s tricky because, again, LLVM doesn’t like to admit that<br>
mandatory lowering is a thing outside of the codegen prepare passes.<br>
Ideally we’d be able to say that IR in a certain stage never has<br>
certain properties, but we lack the concept of stages.</p>

</div>
<div style="white-space:normal"><blockquote style="border-left:2px solid #3983C4; color:#3983C4; margin:0 0 5px; padding-left:5px"><p dir="auto">I use clang to emit IR without running any pass (this is the ` -Xclang<br>
-disable-llvm-passes` part of the invocation).<br>
<br>
 Then I'd like to use clang to "resume" compilation of this file, but clang<br>
does not allow me to have an IR input file and run these passes: this is<br>
what I'd like to fix. One option I had in the original email in this thread<br>
was to change clang to honor `-fcoroutines-ts` when the input is an IR file.</p>
</blockquote></div>
<div style="white-space:normal">

<p dir="auto">Given what I said above about stages, I think clang’s current behavior<br>
of producing fully-lowered IR from <code>-emit-llvm</code> and then expecting<br>
<code>.ll</code>/<code>.bc</code> inputs to be fully-lowered IR is the right default.<br>
Probably what we need is a way to override this, which build systems<br>
would expect to be properly paired with <code>-disable-llvm-passes</code>.<br>
So with that option we’d build exactly the same pipeline as we<br>
would for a source invocation.</p>

<p dir="auto">Alternatively, we could write something about the expected pipeline<br>
into the IR file.  I don’t know if we build the pipeline before<br>
the initial load of the module.</p>

<p dir="auto">John.</p>
</div>
</div>
</body>
</html>