diff options
author | Kenneth Uildriks <kennethuil@gmail.com> | 2010-06-05 14:50:21 +0000 |
---|---|---|
committer | Kenneth Uildriks <kennethuil@gmail.com> | 2010-06-05 14:50:21 +0000 |
commit | 3a4340d4cb7c8a4914075a93e762f5023f81d084 (patch) | |
tree | 79f4049298e28c6c79bc6a22d47cb37c0adfcbfc /test | |
parent | 431c3e74045d9b5c18f66d941c908f1fc74e37c7 (diff) | |
download | external_llvm-3a4340d4cb7c8a4914075a93e762f5023f81d084.zip external_llvm-3a4340d4cb7c8a4914075a93e762f5023f81d084.tar.gz external_llvm-3a4340d4cb7c8a4914075a93e762f5023f81d084.tar.bz2 |
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.exp | 3 | ||||
-rw-r--r-- | test/Transforms/PartialSpecialize/two-specializations.ll | 32 |
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 0000000..f200589 --- /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 0000000..9a371a5 --- /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 +} |