summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorKenneth Uildriks <kennethuil@gmail.com>2010-06-05 14:50:21 +0000
committerKenneth Uildriks <kennethuil@gmail.com>2010-06-05 14:50:21 +0000
commit3a4340d4cb7c8a4914075a93e762f5023f81d084 (patch)
tree79f4049298e28c6c79bc6a22d47cb37c0adfcbfc /test
parent431c3e74045d9b5c18f66d941c908f1fc74e37c7 (diff)
downloadllvm-3a4340d4cb7c8a4914075a93e762f5023f81d084.tar.gz
llvm-3a4340d4cb7c8a4914075a93e762f5023f81d084.tar.bz2
llvm-3a4340d4cb7c8a4914075a93e762f5023f81d084.tar.xz
Partial specialization was not checking the callsite to make sure it was using the same constants as the specialization, leading to calls to the wrong specialization. Patch by Takumi Nakamura\!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@105528 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r--test/Transforms/PartialSpecialize/dg.exp3
-rw-r--r--test/Transforms/PartialSpecialize/two-specializations.ll32
2 files changed, 35 insertions, 0 deletions
diff --git a/test/Transforms/PartialSpecialize/dg.exp b/test/Transforms/PartialSpecialize/dg.exp
new file mode 100644
index 0000000000..f2005891a5
--- /dev/null
+++ b/test/Transforms/PartialSpecialize/dg.exp
@@ -0,0 +1,3 @@
+load_lib llvm.exp
+
+RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,c,cpp}]]
diff --git a/test/Transforms/PartialSpecialize/two-specializations.ll b/test/Transforms/PartialSpecialize/two-specializations.ll
new file mode 100644
index 0000000000..9a371a5558
--- /dev/null
+++ b/test/Transforms/PartialSpecialize/two-specializations.ll
@@ -0,0 +1,32 @@
+; If there are two specializations of a function, make sure each callsite
+; calls the right one.
+;
+; RUN: opt -S -partialspecialization %s | FileCheck %s
+declare void @callback1()
+declare void @callback2()
+
+define internal void @UseCallback(void()* %pCallback) {
+ call void %pCallback()
+ ret void
+}
+
+define void @foo(void()* %pNonConstCallback)
+{
+Entry:
+; CHECK: Entry
+; CHECK-NEXT: call void @UseCallback1()
+; CHECK-NEXT: call void @UseCallback1()
+; CHECK-NEXT: call void @UseCallback2()
+; CHECK-NEXT: call void @UseCallback(void ()* %pNonConstCallback)
+; CHECK-NEXT: call void @UseCallback1()
+; CHECK-NEXT: call void @UseCallback2()
+; CHECK-NEXT: call void @UseCallback2()
+ call void @UseCallback(void()* @callback1)
+ call void @UseCallback(void()* @callback1)
+ call void @UseCallback(void()* @callback2)
+ call void @UseCallback(void()* %pNonConstCallback)
+ call void @UseCallback(void()* @callback1)
+ call void @UseCallback(void()* @callback2)
+ call void @UseCallback(void()* @callback2)
+ ret void
+}