From c20535dff6680917835a365624da67027a8fae53 Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Fri, 13 Mar 2015 07:09:33 +0000 Subject: [PATCH] Teach TBAA analysis to report errors on cyclic TBAA metadata rather than hanging. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232144 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/TypeBasedAliasAnalysis.cpp | 13 +++++++--- .../Analysis/TypeBasedAliasAnalysis/cyclic.ll | 26 +++++++++++++++++++ 2 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 test/Analysis/TypeBasedAliasAnalysis/cyclic.ll diff --git a/lib/Analysis/TypeBasedAliasAnalysis.cpp b/lib/Analysis/TypeBasedAliasAnalysis.cpp index 1ed2653bee9..115872584cb 100644 --- a/lib/Analysis/TypeBasedAliasAnalysis.cpp +++ b/lib/Analysis/TypeBasedAliasAnalysis.cpp @@ -129,6 +129,7 @@ #include "llvm/IR/Module.h" #include "llvm/Pass.h" #include "llvm/Support/CommandLine.h" +#include "llvm/ADT/SetVector.h" using namespace llvm; // A handy option for disabling TBAA functionality. The same effect can also be @@ -578,18 +579,22 @@ MDNode *MDNode::getMostGenericTBAA(MDNode *A, MDNode *B) { if (!B) return nullptr; } - SmallVector PathA; + SmallSetVector PathA; MDNode *T = A; while (T) { - PathA.push_back(T); + if (PathA.count(T)) + report_fatal_error("Cycle found in TBAA metadata."); + PathA.insert(T); T = T->getNumOperands() >= 2 ? cast_or_null(T->getOperand(1)) : nullptr; } - SmallVector PathB; + SmallSetVector PathB; T = B; while (T) { - PathB.push_back(T); + if (PathB.count(T)) + report_fatal_error("Cycle found in TBAA metadata."); + PathB.insert(T); T = T->getNumOperands() >= 2 ? cast_or_null(T->getOperand(1)) : nullptr; } diff --git a/test/Analysis/TypeBasedAliasAnalysis/cyclic.ll b/test/Analysis/TypeBasedAliasAnalysis/cyclic.ll new file mode 100644 index 00000000000..a88e26c5cd5 --- /dev/null +++ b/test/Analysis/TypeBasedAliasAnalysis/cyclic.ll @@ -0,0 +1,26 @@ +; RUN: not opt -instcombine < %s 2>&1 | FileCheck %s +; CHECK: Cycle found in TBAA metadata. + +define void @test6(i32* %gi) #0 { +entry: + store i32 42, i32* %gi, align 4, !tbaa !0 + br label %for.cond + +for.cond: ; preds = %for.body, %entry + br i1 undef, label %for.body, label %for.end + +for.body: ; preds = %for.cond + store i32 undef, i32* %gi, align 4, !tbaa !2 + br label %for.cond + +for.end: ; preds = %for.cond + ret void +} + +attributes #0 = { nounwind ssp uwtable } + +!0 = !{!1, !1, i64 0} +!1 = !{!"Simple C/C++ TBAA"} +!2 = distinct !{!3, !2, i64 0} +!3 = !{!"int", !4} +!4 = !{!"omnipotent ", !1}