diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp index 7c3a23d046fa..97b49a0c6b4e 100644 --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -3215,7 +3215,7 @@ ABIArgInfo MipsABIInfo::classifyReturnType(QualType RetTy) const { if (RetTy->isAnyComplexType()) return ABIArgInfo::getDirect(); - if (!IsO32) + if (!IsO32 && !isRecordWithNonTrivialDestructorOrCopyConstructor(RetTy)) return ABIArgInfo::getDirect(returnAggregateInRegs(RetTy, Size)); } diff --git a/clang/test/CodeGen/mips64-nontrivial-return.cpp b/clang/test/CodeGen/mips64-nontrivial-return.cpp new file mode 100644 index 000000000000..8aff9ab32f0f --- /dev/null +++ b/clang/test/CodeGen/mips64-nontrivial-return.cpp @@ -0,0 +1,17 @@ +// RUN: %clang -target mips64el-unknown-linux -ccc-clang-archs mips64el -O3 -S -mabi=n64 -o - -emit-llvm %s | FileCheck %s + +class B { +public: + virtual ~B() {} +}; + +class D : public B { +}; + +extern D gd0; + +// CHECK: _Z4foo1v(%class.D* noalias nocapture sret + +D foo1(void) { + return gd0; +}