diff options
| author | Sanjoy Das <sanjoy@playingwithpointers.com> | 2016-02-09 02:31:47 +0000 |
|---|---|---|
| committer | Sanjoy Das <sanjoy@playingwithpointers.com> | 2016-02-09 02:31:47 +0000 |
| commit | ca2edc7ad5ebeceb8eae8c20a8455d6db248ad74 (patch) | |
| tree | a10ac9c1463191352ac5df03a3929c7f3221e20a /llvm/test/Feature | |
| parent | 4a33ab7b2cc3a396b41ce2c0710ad08213f4792e (diff) | |
| download | bcm5719-llvm-ca2edc7ad5ebeceb8eae8c20a8455d6db248ad74.tar.gz bcm5719-llvm-ca2edc7ad5ebeceb8eae8c20a8455d6db248ad74.zip | |
[GMR/OperandBundles] Teach getModRefBehavior about operand bundles
In general, memory restrictions on a called function (e.g. readnone)
cannot be transferred to a CallSite that has operand bundles. It is
possible to make this inference smarter, but lets fix the behavior to be
correct first.
llvm-svn: 260193
Diffstat (limited to 'llvm/test/Feature')
| -rw-r--r-- | llvm/test/Feature/OperandBundles/pr26510.ll | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/llvm/test/Feature/OperandBundles/pr26510.ll b/llvm/test/Feature/OperandBundles/pr26510.ll new file mode 100644 index 00000000000..d1d60b47313 --- /dev/null +++ b/llvm/test/Feature/OperandBundles/pr26510.ll @@ -0,0 +1,27 @@ +; RUN: opt -S -globals-aa -functionattrs < %s | FileCheck %s +; RUN: opt -S -O3 < %s | FileCheck %s + +; Apart from checking for the direct cause of the bug, we also check +; if any problematic aliasing rules have accidentally snuck into -O3. +; +; Since the "abc" operand bundle is not a special operand bundle that +; LLVM knows about, all of the stores and loads in @test below have to +; stay. + +declare void @foo() readnone + +; CHECK-LABEL: define i8* @test(i8* %p) { +; CHECK: %a = alloca i8*, align 8 +; CHECK: store i8* %p, i8** %a, align 8 +; CHECK: call void @foo() [ "abc"(i8** %a) ] +; CHECK: %reload = load i8*, i8** %a, align 8 +; CHECK: ret i8* %reload +; CHECK: } + +define i8* @test(i8* %p) { + %a = alloca i8*, align 8 + store i8* %p, i8** %a, align 8 + call void @foo() ["abc" (i8** %a)] + %reload = load i8*, i8** %a, align 8 + ret i8* %reload +} |

