[clang] [clang][CodeGen] `sret` args should always point to the `alloca` AS, so use that (PR #114062)
John McCall via cfe-commits
cfe-commits at lists.llvm.org
Thu Nov 14 14:46:19 PST 2024
================
@@ -5390,11 +5390,19 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo,
V->getType()->isIntegerTy())
V = Builder.CreateZExt(V, ArgInfo.getCoerceToType());
- // If the argument doesn't match, perform a bitcast to coerce it. This
- // can happen due to trivial type mismatches.
+ // If the argument doesn't match, we are either trying to pass an
+ // alloca-ed sret argument directly, and the alloca AS does not match
+ // the default AS, case in which we AS cast it, or we have a trivial
+ // type mismatch, and thus perform a bitcast to coerce it.
if (FirstIRArg < IRFuncTy->getNumParams() &&
- V->getType() != IRFuncTy->getParamType(FirstIRArg))
- V = Builder.CreateBitCast(V, IRFuncTy->getParamType(FirstIRArg));
+ V->getType() != IRFuncTy->getParamType(FirstIRArg)) {
+ auto IRTy = IRFuncTy->getParamType(FirstIRArg);
+ auto MaybeSRetArg = dyn_cast_or_null<llvm::Argument>(V);
+ if (MaybeSRetArg && MaybeSRetArg->hasStructRetAttr())
+ V = Builder.CreateAddrSpaceCast(V, IRTy);
----------------
rjmccall wrote:
This is the prevailing existing practice in Clang CodeGen; you'll notice we do the same thing in `CreateTempAlloca`. We are trying to allow targets to completely own the lowering of address spaces to IR. The idea is that targets may want to distinguish address spaces in the frontend without distinguishing them in the backend, or they may decide that they need the address space conversion operation to be more complex than a simple IR `addrspacecast`.
https://github.com/llvm/llvm-project/pull/114062
More information about the cfe-commits
mailing list