Index: llvm/lib/IR/AutoUpgrade.cpp =================================================================== --- llvm/lib/IR/AutoUpgrade.cpp +++ llvm/lib/IR/AutoUpgrade.cpp @@ -4453,12 +4453,16 @@ } MDNode *llvm::UpgradeTBAANode(MDNode &MD) { + const unsigned NumOperands = MD.getNumOperands(); + if (NumOperands == 0) + return &MD; // Invalid, punt to a verifier error. + // Check if the tag uses struct-path aware TBAA format. - if (isa(MD.getOperand(0)) && MD.getNumOperands() >= 3) + if (isa(MD.getOperand(0)) && NumOperands >= 3) return &MD; auto &Context = MD.getContext(); - if (MD.getNumOperands() == 3) { + if (NumOperands == 3) { Metadata *Elts[] = {MD.getOperand(0), MD.getOperand(1)}; MDNode *ScalarType = MDNode::get(Context, Elts); // Create a MDNode Index: llvm/lib/IR/Verifier.cpp =================================================================== --- llvm/lib/IR/Verifier.cpp +++ llvm/lib/IR/Verifier.cpp @@ -6824,6 +6824,9 @@ } bool TBAAVerifier::visitTBAAMetadata(Instruction &I, const MDNode *MD) { + CheckTBAA(MD->getNumOperands() > 0, "TBAA metadata cannot have 0 operands", + &I, MD); + CheckTBAA(isa(I) || isa(I) || isa(I) || isa(I) || isa(I) || isa(I), Index: llvm/test/Verifier/tbaa.ll =================================================================== --- llvm/test/Verifier/tbaa.ll +++ llvm/test/Verifier/tbaa.ll @@ -37,6 +37,9 @@ ; CHECK: Access type node must be a valid scalar type ; CHECK-NEXT: store i32 9, ptr %ptr, align 4, !tbaa !{{[0-9]+}} +; CHECK: TBAA metadata cannot have 0 operands +; CHECK-NEXT: store i32 10, ptr %ptr, align 4, !tbaa !{{[0-9]+}} + store i32 0, ptr %ptr, !tbaa !{!3, !2, i64 40, i64 0, i64 1, i64 2} store i32 1, ptr %ptr, !tbaa !{!3, !2, i64 40, !"immutable"} store i32 2, ptr %ptr, !tbaa !{!3, !2, i64 40, i64 4} @@ -47,6 +50,7 @@ store i32 7, ptr %ptr, !tbaa !{!3, !12, i32 40, i64 0}, !metadata !42 store i32 8, ptr %ptr, !tbaa !{!13, !1, i64 0} store i32 9, ptr %ptr, !tbaa !{!14, !14, i64 0} + store i32 10, ptr %ptr, !tbaa !15 ret void } !42 = !{!"Do no strip this!"} @@ -121,3 +125,4 @@ !12 = !{!"bad-scalar-2", !3, i64 0} !13 = !{!1, !1, i64 0} !14 = !{!"bad-scalar-2", !13} +!15 = !{}