Skip to content

Commit

Permalink
Teach TBAA analysis to report errors on cyclic TBAA metadata rather t…
Browse files Browse the repository at this point in the history
…han hanging.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232144 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
resistor committed Mar 13, 2015
1 parent 39fcd23 commit c20535d
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 4 deletions.
13 changes: 9 additions & 4 deletions lib/Analysis/TypeBasedAliasAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -578,18 +579,22 @@ MDNode *MDNode::getMostGenericTBAA(MDNode *A, MDNode *B) {
if (!B) return nullptr;
}

SmallVector<MDNode *, 4> PathA;
SmallSetVector<MDNode *, 4> 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<MDNode>(T->getOperand(1))
: nullptr;
}

SmallVector<MDNode *, 4> PathB;
SmallSetVector<MDNode *, 4> 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<MDNode>(T->getOperand(1))
: nullptr;
}
Expand Down
26 changes: 26 additions & 0 deletions test/Analysis/TypeBasedAliasAnalysis/cyclic.ll
Original file line number Diff line number Diff line change
@@ -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}

0 comments on commit c20535d

Please sign in to comment.