mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[SelectionDAG][FIX] Allow "returned" arguments to be bit-casted
Summary: An argument that is return by a function but bit-casted before can still be annotated as "returned". Make sure we do not crash for this case. Reviewers: sunfish, stephenwlin, niravd, arsenm Subscribers: wdng, hiraditya, bollu, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D59917 llvm-svn: 362546
This commit is contained in:
parent
20f76a0e0d
commit
200fc9cb57
@ -9111,8 +9111,11 @@ TargetLowering::LowerCallTo(TargetLowering::CallLoweringInfo &CLI) const {
|
||||
// for now.
|
||||
if (Args[i].IsReturned && !Op.getValueType().isVector() &&
|
||||
CanLowerReturn) {
|
||||
assert(CLI.RetTy == Args[i].Ty && RetTys.size() == NumValues &&
|
||||
"unexpected use of 'returned'");
|
||||
assert((CLI.RetTy == Args[i].Ty ||
|
||||
(CLI.RetTy->isPointerTy() && Args[i].Ty->isPointerTy() &&
|
||||
CLI.RetTy->getPointerAddressSpace() ==
|
||||
Args[i].Ty->getPointerAddressSpace())) &&
|
||||
RetTys.size() == NumValues && "unexpected use of 'returned'");
|
||||
// Before passing 'returned' to the target lowering code, ensure that
|
||||
// either the register MVT and the actual EVT are the same size or that
|
||||
// the return value and argument are extended in the same way; in these
|
||||
|
12
test/CodeGen/X86/arg_returned_bitcast.ll
Normal file
12
test/CodeGen/X86/arg_returned_bitcast.ll
Normal file
@ -0,0 +1,12 @@
|
||||
; RUN: llc < %s -mtriple=i686-unknown-linux-gnu | FileCheck %s
|
||||
|
||||
; Test that the "returned" attribute "works" even if there is a bitcast between
|
||||
; the argument and return value.
|
||||
|
||||
declare double* @bar(i8* returned)
|
||||
|
||||
define double* @foo(i8*) {
|
||||
%r = tail call double* @bar(i8* %0)
|
||||
; CHECK: jmp bar
|
||||
ret double* %r
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user