diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 34f7bf168494..3609628561b5 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -4062,7 +4062,8 @@ void Verifier::visitInstruction(Instruction &I) { if (MDNode *TBAA = I.getMetadata(LLVMContext::MD_tbaa)) { Assert(isa(I) || isa(I) || isa(I) || - isa(I), + isa(I) || isa(I) || + isa(I), "TBAA is only for loads, stores and calls!", &I); visitTBAAMetadata(I, TBAA); } diff --git a/llvm/test/Verifier/tbaa-allowed.ll b/llvm/test/Verifier/tbaa-allowed.ll new file mode 100644 index 000000000000..911d3caa29af --- /dev/null +++ b/llvm/test/Verifier/tbaa-allowed.ll @@ -0,0 +1,22 @@ +; RUN: opt -S < %s + +; This file contains TBAA metadata that is okay and should pass the verifier. + +declare void @callee() +declare void @llvm.va_start(i8*) nounwind + +define void @f_0(i8* %ptr, ...) { + %args = alloca i8, align 8 + call void @llvm.va_start(i8* %args) + + %old = atomicrmw add i8* %ptr, i8 0 seq_cst, !tbaa !{!1, !1, i64 0} + %pair = cmpxchg i8* %ptr, i8 0, i8 1 acquire acquire, !tbaa !{!1, !1, i64 0} + %ld = load i8, i8* %ptr, !tbaa !{!1, !1, i64 0} + store i8 1, i8* %ptr, !tbaa !{!1, !1, i64 0} + call void @callee(), !tbaa !{!1, !1, i64 0} + %argval = va_arg i8* %args, i8, !tbaa !{!1, !1, i64 0} + ret void +} + +!0 = !{!"root"} +!1 = !{!"scalar-a", !0}