diff options
author | Jakub Kuderski <jakub.kuderski@arm.com> | 2015-09-08 10:36:42 +0000 |
---|---|---|
committer | Jakub Kuderski <jakub.kuderski@arm.com> | 2015-09-08 10:36:42 +0000 |
commit | f50ab0ffce8fdb58a0859e070ecd660c0ed8f6cd (patch) | |
tree | fb67f13728783e97a7604f8e79f022bbf0efa161 /clang/test/CodeGen/arm_function_epilog.cpp | |
parent | 3f1153869faa1df53ad0a84f6cfebfeab78cfaff (diff) | |
download | llvm-f50ab0ffce8fdb58a0859e070ecd660c0ed8f6cd.zip llvm-f50ab0ffce8fdb58a0859e070ecd660c0ed8f6cd.tar.gz llvm-f50ab0ffce8fdb58a0859e070ecd660c0ed8f6cd.tar.bz2 |
findDominatingStoreToReturn in CGCall.cpp didn't check if a candidate store
instruction used the ReturnValue as pointer operand or value operand. This
led to wrong code gen - in later stages (load-store elision code) the found
store and its operand would be erased, causing ReturnValue to become a <badref>.
The patch adds a check that makes sure that ReturnValue is a pointer operand of
store instruction. Regression test is also added.
This fixes PR24386.
Differential Revision: http://reviews.llvm.org/D12400
llvm-svn: 247003
Diffstat (limited to 'clang/test/CodeGen/arm_function_epilog.cpp')
-rw-r--r-- | clang/test/CodeGen/arm_function_epilog.cpp | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/clang/test/CodeGen/arm_function_epilog.cpp b/clang/test/CodeGen/arm_function_epilog.cpp new file mode 100644 index 0000000..0089507 --- /dev/null +++ b/clang/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; +} |