================ @@ -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:
As a general rule, we try to use the target hook to perform address-space conversions. That target hook is expressed in terms of AST address spaces, which is one reason I think we need to thread a LangAS through. If we need to do the same for the other indirect cases, so be it. https://github.com/llvm/llvm-project/pull/114062 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits