Skip to content

Commit

Permalink
Let llvm-diff correctly deal with Undef/ConstantAggregateZero/Constan…
Browse files Browse the repository at this point in the history
…tVector/IndirectBr

Summary:
llvm-diff incorrectly reports that there's a diff when input IR contains undef/zeroinitializer/constantvector/indirectbr.
(This happens even if two identical files are given, e.g. `llvm-diff x.ll x.ll`)

This is fix to the bug report https://bugs.llvm.org/show_bug.cgi?id=33623 .



Reviewers: dexonsmith, rjmccall

Reviewed By: rjmccall

Subscribers: chenwj, mgrang, llvm-commits

Differential Revision: https://reviews.llvm.org/D34856

llvm-svn: 329957
  • Loading branch information
modocache committed Apr 12, 2018
1 parent 00db326 commit d0d2ce9
Show file tree
Hide file tree
Showing 5 changed files with 84 additions and 2 deletions.
16 changes: 16 additions & 0 deletions llvm/test/tools/llvm-diff/constantvector.ll
@@ -0,0 +1,16 @@
; Bugzilla: https://bugs.llvm.org/show_bug.cgi?id=33623
; RUN: llvm-diff %s %s

%struct.it = type { i64, i64* }

@a_vector = internal global [2 x i64] zeroinitializer, align 16

define i32 @foo(%struct.it* %it) {

entry:
%a = getelementptr inbounds %struct.it, %struct.it* %it, i64 0, i32 1
%tmp0 = bitcast i64** %a to <2 x i64*>*
store <2 x i64*> <i64* getelementptr inbounds ([2 x i64], [2 x i64]* @a_vector, i64 0, i64 0), i64* getelementptr inbounds ([2 x i64], [2 x i64]* @a_vector, i64 0, i64 0)>, <2 x i64*>* %tmp0, align 8

ret i32 0
}
11 changes: 11 additions & 0 deletions llvm/test/tools/llvm-diff/indirectbr.ll
@@ -0,0 +1,11 @@
; Bugzilla: https://bugs.llvm.org/show_bug.cgi?id=33623
; RUN: llvm-diff %s %s

define i32 @foo(i8*) {
entry:
indirectbr i8* %0, [label %A, label %B, label %entry]
A:
ret i32 1
B:
ret i32 2
}
11 changes: 11 additions & 0 deletions llvm/test/tools/llvm-diff/undef.ll
@@ -0,0 +1,11 @@
; Bugzilla: https://bugs.llvm.org/show_bug.cgi?id=33623
; RUN: llvm-diff %s %s

%A = type { i64, i64 }
@_gm_ = global <2 x %A*> zeroinitializer

define void @f() {
entry:
store <2 x %A*> undef, <2 x %A*>* @_gm_
ret void
}
11 changes: 11 additions & 0 deletions llvm/test/tools/llvm-diff/zeroinitializer.bc.ll
@@ -0,0 +1,11 @@
; Bugzilla: https://bugs.llvm.org/show_bug.cgi?id=33623
; RUN: llvm-diff %s %s

%A = type { i64, i64 }
@_gm_ = global <2 x %A*> zeroinitializer

define void @f() {
entry:
store <2 x %A*> zeroinitializer, <2 x %A*>* @_gm_
ret void
}
37 changes: 35 additions & 2 deletions llvm/tools/llvm-diff/DifferenceEngine.cpp
Expand Up @@ -303,6 +303,26 @@ class FunctionDifferenceEngine {
if (TryUnify) tryUnify(LI->getSuccessor(0), RI->getSuccessor(0));
return false;

} else if (isa<IndirectBrInst>(L)) {
IndirectBrInst *LI = cast<IndirectBrInst>(L);
IndirectBrInst *RI = cast<IndirectBrInst>(R);
if (LI->getNumDestinations() != RI->getNumDestinations()) {
if (Complain) Engine.log("indirectbr # of destinations differ");
return true;
}

if (!equivalentAsOperands(LI->getAddress(), RI->getAddress())) {
if (Complain) Engine.log("indirectbr addresses differ");
return true;
}

if (TryUnify) {
for (unsigned i = 0; i < LI->getNumDestinations(); i++) {
tryUnify(LI->getDestination(i), RI->getDestination(i));
}
}
return false;

} else if (isa<SwitchInst>(L)) {
SwitchInst *LI = cast<SwitchInst>(L);
SwitchInst *RI = cast<SwitchInst>(R);
Expand Down Expand Up @@ -377,9 +397,9 @@ class FunctionDifferenceEngine {
return equivalentAsOperands(cast<ConstantExpr>(L),
cast<ConstantExpr>(R));

// Nulls of the "same type" don't always actually have the same
// Constants of the "same type" don't always actually have the same
// type; I don't know why. Just white-list them.
if (isa<ConstantPointerNull>(L))
if (isa<ConstantPointerNull>(L) || isa<UndefValue>(L) || isa<ConstantAggregateZero>(L))
return true;

// Block addresses only match if we've already encountered the
Expand All @@ -388,6 +408,19 @@ class FunctionDifferenceEngine {
return Blocks[cast<BlockAddress>(L)->getBasicBlock()]
== cast<BlockAddress>(R)->getBasicBlock();

// If L and R are ConstantVectors, compare each element
if (isa<ConstantVector>(L)) {
ConstantVector *CVL = cast<ConstantVector>(L);
ConstantVector *CVR = cast<ConstantVector>(R);
if (CVL->getType()->getNumElements() != CVR->getType()->getNumElements())
return false;
for (unsigned i = 0; i < CVL->getType()->getNumElements(); i++) {
if (!equivalentAsOperands(CVL->getOperand(i), CVR->getOperand(i)))
return false;
}
return true;
}

return false;
}

Expand Down

0 comments on commit d0d2ce9

Please sign in to comment.