The docs for the LLVM coroutines intrinsic @llvm.coro.id state that
"The second argument, if not null, designates a particular alloca instruction
to be a coroutine promise."
However, if the address sanitizer pass is run before the @llvm.coro.id
intrinsic is lowered, the alloca instruction passed to the intrinsic as its
second argument is converted, as per the
https://github.com/google/sanitizers/wiki/AddressSanitizerAlgorithm docs, to
an inttoptr instruction that accesses the address of the promise.
On optimization levels -O1 and above, the -asan pass is run after
-coro-early, -coro-split, and -coro-elide, and before
-coro-cleanup, and so there is no issue. At -O0, however, -asan
is run in between -coro-early and -coro-split, which causes an
assertion to be hit when the inttoptr instruction is forcibly cast to
an alloca.
Rearrange the passes such that the coroutine passes are registered
before the sanitizer passes.
Test Plan:
Compile a simple C++ program that uses coroutines in -O0 with
-fsanitize-address, and confirm no assertion is hit:
clang++ coro-example.cpp -fcoroutines-ts -g -fsanitize=address -fno-omit-frame-pointer.