Index: lib/CodeGen/CGCall.cpp =================================================================== --- lib/CodeGen/CGCall.cpp +++ lib/CodeGen/CGCall.cpp @@ -2329,6 +2329,7 @@ llvm::StoreInst *store = dyn_cast(CGF.ReturnValue->user_back()); if (!store) return nullptr; + if (store->getPointerOperand() != CGF.ReturnValue) return nullptr; // These aren't actually possible for non-coerced returns, and we // only care about non-coerced returns on this code path. Index: test/CodeGen/arm_function_epilog.cpp =================================================================== --- /dev/null +++ test/CodeGen/arm_function_epilog.cpp @@ -0,0 +1,17 @@ +// REQUIRES: arm-registered-target +// RUN: %clang_cc1 -triple armv7-none-linux-androideabi -target-abi aapcs-linux -mfloat-abi hard -x c++ -emit-llvm %s -o - | FileCheck %s + +struct Vec2 { + union { struct { float x, y; }; + float data[2]; + }; +}; + +// CHECK: define arm_aapcs_vfpcc %struct.Vec2 @_Z7getVec2v() +// CHECK: ret %struct.Vec2 +Vec2 getVec2() { + Vec2 out; + union { Vec2* v; unsigned char* u; } x; + x.v = &out; + return out; +}