From d0d2ce942507daf7d3315ef5e070e89f2823f1ef Mon Sep 17 00:00:00 2001 From: Brian Gesiak Date: Thu, 12 Apr 2018 21:28:04 +0000 Subject: Let llvm-diff correctly deal with Undef/ConstantAggregateZero/ConstantVector/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 --- llvm/tools/llvm-diff/DifferenceEngine.cpp | 37 +++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) (limited to 'llvm/tools/llvm-diff/DifferenceEngine.cpp') diff --git a/llvm/tools/llvm-diff/DifferenceEngine.cpp b/llvm/tools/llvm-diff/DifferenceEngine.cpp index 95a63d7..af0a055 100644 --- a/llvm/tools/llvm-diff/DifferenceEngine.cpp +++ b/llvm/tools/llvm-diff/DifferenceEngine.cpp @@ -303,6 +303,26 @@ class FunctionDifferenceEngine { if (TryUnify) tryUnify(LI->getSuccessor(0), RI->getSuccessor(0)); return false; + } else if (isa(L)) { + IndirectBrInst *LI = cast(L); + IndirectBrInst *RI = cast(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(L)) { SwitchInst *LI = cast(L); SwitchInst *RI = cast(R); @@ -377,9 +397,9 @@ class FunctionDifferenceEngine { return equivalentAsOperands(cast(L), cast(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(L)) + if (isa(L) || isa(L) || isa(L)) return true; // Block addresses only match if we've already encountered the @@ -388,6 +408,19 @@ class FunctionDifferenceEngine { return Blocks[cast(L)->getBasicBlock()] == cast(R)->getBasicBlock(); + // If L and R are ConstantVectors, compare each element + if (isa(L)) { + ConstantVector *CVL = cast(L); + ConstantVector *CVR = cast(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; } -- cgit v1.1