aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2010-03-05 08:38:04 +0000
committerEvan Cheng <evan.cheng@apple.com>2010-03-05 08:38:04 +0000
commit4cae133780aa35b0f40f382286b2c0eb57369fee (patch)
tree580aa1cea2f15a1943d3175cd80d122048cfe8d5 /test
parent2d4e4af45e074b6d712ac6fc6ab3e63456e1e24e (diff)
downloadexternal_llvm-4cae133780aa35b0f40f382286b2c0eb57369fee.zip
external_llvm-4cae133780aa35b0f40f382286b2c0eb57369fee.tar.gz
external_llvm-4cae133780aa35b0f40f382286b2c0eb57369fee.tar.bz2
Fix an oops in x86 sibcall optimization. If the ByVal callee argument is itself passed as a pointer, then it's obviously not safe to do a tail call.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@97797 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r--test/CodeGen/X86/tailcall2.ll21
1 files changed, 21 insertions, 0 deletions
diff --git a/test/CodeGen/X86/tailcall2.ll b/test/CodeGen/X86/tailcall2.ll
index 80bab61..90315fd 100644
--- a/test/CodeGen/X86/tailcall2.ll
+++ b/test/CodeGen/X86/tailcall2.ll
@@ -195,3 +195,24 @@ bb2:
}
declare i32 @foo6(i32, i32, %struct.t* byval align 4)
+
+; rdar://r7717598
+%struct.ns = type { i32, i32 }
+%struct.cp = type { float, float }
+
+define %struct.ns* @t13(%struct.cp* %yy) nounwind ssp {
+; 32: t13:
+; 32-NOT: jmp
+; 32: call
+; 32: ret
+
+; 64: t13:
+; 64-NOT: jmp
+; 64: call
+; 64: ret
+entry:
+ %0 = tail call fastcc %struct.ns* @foo7(%struct.cp* byval align 4 %yy, i8 signext 0) nounwind
+ ret %struct.ns* %0
+}
+
+declare fastcc %struct.ns* @foo7(%struct.cp* byval align 4, i8 signext) nounwind ssp