diff options
Diffstat (limited to 'llvm/test/Feature/OperandBundles/pr26510.ll')
-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 +} |