diff options
-rw-r--r-- | lib/CodeGen/TargetInfo.cpp | 2 | ||||
-rw-r--r-- | test/CodeGen/mips64-nontrivial-return.cpp | 17 |
2 files changed, 18 insertions, 1 deletions
diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp index 7c3a23d046..97b49a0c6b 100644 --- a/lib/CodeGen/TargetInfo.cpp +++ b/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/test/CodeGen/mips64-nontrivial-return.cpp b/test/CodeGen/mips64-nontrivial-return.cpp new file mode 100644 index 0000000000..8aff9ab32f --- /dev/null +++ b/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; +} |