[PATCH] D123300: [Clang] Enable opaque pointers by default
Nikita Popov via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Apr 22 08:00:55 PDT 2022
nikic added a comment.
In D123300#3467615 <https://reviews.llvm.org/D123300#3467615>, @yurai007 wrote:
> Just one more thing regarding this:
> In D123300#3467165 <https://reviews.llvm.org/D123300#3467165>, @yurai007 wrote:
>> Hi, unfortunately for some reason it doesn't play well with coroutines HALO. There is regression seen on Gor's Nishanov classical code snippet: https://godbolt.org/z/PKMxqq4Gr I'm checking IR to find out more.
> It's (kind of) related to GEPs as well. From CoroElide perspective the thing is that we cannot collect coro.subfn.addrs associated with coro.begin intrinsics in processCoroId.
> Normally, for each coro.begin we traverse its users list and save found coro.subfn.addr. That explains why elision works fine when coro.begin is directly used by coro.subfn.addr:
> %35 = call noalias nonnull i8* @llvm.coro.begin(token %31, i8* %34)
> %40 = call i8* @llvm.coro.subfn.addr(i8* nonnull %35, i8 0)
> With opaque pointers IR reaching CoroElide has intermediate GEPs so coro.subfn.addr is not present on coro.begin's list and DestroyAddrs are not collected:
> %22 = call noalias nonnull ptr @llvm.coro.begin(token %18, ptr %21)
> %__promise.reload.addr.i36 = getelementptr inbounds %_Z3addIiE9generatorIT_ERS2_S1_.Frame, ptr %22, i64 0, i32 2
> %23 = getelementptr inbounds i8, ptr %__promise.reload.addr.i36, i64 -16
> %24 = call ptr @llvm.coro.subfn.addr(ptr nonnull %23, i8 0)
Thanks! I'm not familiar with the coroutine aspect here, but clearly there is a big optimization fail here: https://llvm.godbolt.org/z/GPG5df9xT We should be folding these two GEPs together, at least for the case of constant offsets. Probably we should canonicalize to `i8` GEPs in InstCombine.
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
More information about the cfe-commits