================ @@ -5389,11 +5389,22 @@ 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. + // The only plausible mismatch here would be for pointer address spaces, + // which can happen e.g. when passing a sret arg that is in the AllocaAS + // to a function that takes a pointer to and argument in the DefaultAS. + // We assume that the target has a reasonable mapping for the DefaultAS + // (it can be casted to from incoming specific ASes), and insert an AS + // cast to address the mismatch. if (FirstIRArg < IRFuncTy->getNumParams() && - V->getType() != IRFuncTy->getParamType(FirstIRArg)) - V = Builder.CreateBitCast(V, IRFuncTy->getParamType(FirstIRArg)); + V->getType() != IRFuncTy->getParamType(FirstIRArg)) { + assert(V->getType()->isPointerTy() && "Only pointers can mismatch!"); + auto FormalAS = CallInfo.arguments()[ArgNo] + .type.getQualifiers() + .getAddressSpace(); + auto ActualAS = I->Ty.getAddressSpace(); + V = getTargetHooks().performAddrSpaceCast( + *this, V, ActualAS, FormalAS, IRFuncTy->getParamType(FirstIRArg)); ---------------- arsenm wrote:
Not sure why a target hook is needed to just insert an addrspacecast, but this seems to be prior art 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