================ @@ -286,8 +286,15 @@ void AggExprEmitter::withReturnValueSlot( // We need to always provide our own temporary if destruction is required. // Otherwise, EmitCall will emit its own, notice that it's "unused", and end // its lifetime before we have the chance to emit a proper destructor call. - bool UseTemp = Dest.isPotentiallyAliased() || Dest.requiresGCollection() || - (RequiresDestruction && Dest.isIgnored()); + // + // We also need a temporary if the destination is in a different address space + // from the alloca AS, to avoid an invalid addrspacecast on the sret pointer. + bool UseTemp = + Dest.isPotentiallyAliased() || Dest.requiresGCollection() || + (RequiresDestruction && Dest.isIgnored()) || + (!Dest.isIgnored() && Dest.getAddress().getAddressSpace() != ---------------- VigneshwarJ wrote:
When Dest is ignored, there's no destination pointer to be incorrectly addrspacecast'd, and the existing path handles it correctly: RetAddr is passed as invalid, EmitCall detects ReturnValue.isNull() and creates its own temporary in the alloca AS. Also, we need the check because getAddress() on an ignored slot returns an invalid Address https://github.com/llvm/llvm-project/pull/183639 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
