[clang] [clang][CodeGen] `sret` args should always point to the `alloca` AS, so use that (PR #114062)

Alex Voicu via cfe-commits cfe-commits at lists.llvm.org
Tue Oct 29 17:10:21 PDT 2024


https://github.com/AlexVlx commented:

> Is this a target-independent decision?  I could certainly imagine a target with a generic AS wanting to specify that indirect return addresses (and maybe even parameters?) should be in that rather than the alloca AS; among other things, it would allow return values to be used to initialize objects in arbitrary memory.  In C and C-derived languages, maybe that just avoids a memcpy, but in C++ it avoids a potentially non-trivial move. 

This is a good point that I had not fully considered; I'll (weakly) push back by pointing out that if a target wanted to do that, it'd have to change quite a few things because now we seem to pretty much `alloca` storage for `sret` args by default, and thus we just end up with some extra spurious AS casts / reliance on AS inference doing the right thing. However, your question made me go and look at C++ use cases, which unearthed a pretty big (general) challenge with this change: for cases where the alloca AS and the default AS differ, we can end up trying to pass an `sret` arg directly to a callee that takes a pointer to the default AS. I've added a test that exposes this and a potential fix, but I'm not hyper keen on the latter - unfortunately, I see no better way to deal with this.

https://github.com/llvm/llvm-project/pull/114062


More information about the cfe-commits mailing list