[llvm] r329957 - Let llvm-diff correctly deal with Undef/ConstantAggregateZero/ConstantVector/IndirectBr

Brian Gesiak via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 12 14:28:05 PDT 2018


Author: modocache
Date: Thu Apr 12 14:28:04 2018
New Revision: 329957

URL: http://llvm.org/viewvc/llvm-project?rev=329957&view=rev
Log:
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

Added:
    llvm/trunk/test/tools/llvm-diff/
    llvm/trunk/test/tools/llvm-diff/constantvector.ll
    llvm/trunk/test/tools/llvm-diff/indirectbr.ll
    llvm/trunk/test/tools/llvm-diff/undef.ll
    llvm/trunk/test/tools/llvm-diff/zeroinitializer.bc.ll
Modified:
    llvm/trunk/tools/llvm-diff/DifferenceEngine.cpp

Added: llvm/trunk/test/tools/llvm-diff/constantvector.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-diff/constantvector.ll?rev=329957&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-diff/constantvector.ll (added)
+++ llvm/trunk/test/tools/llvm-diff/constantvector.ll Thu Apr 12 14:28:04 2018
@@ -0,0 +1,16 @@
+; Bugzilla: https://bugs.llvm.org/show_bug.cgi?id=33623
+; RUN: llvm-diff %s %s
+
+%struct.it = type { i64, i64* }
+
+ at 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
+}

Added: llvm/trunk/test/tools/llvm-diff/indirectbr.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-diff/indirectbr.ll?rev=329957&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-diff/indirectbr.ll (added)
+++ llvm/trunk/test/tools/llvm-diff/indirectbr.ll Thu Apr 12 14:28:04 2018
@@ -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
+}

Added: llvm/trunk/test/tools/llvm-diff/undef.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-diff/undef.ll?rev=329957&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-diff/undef.ll (added)
+++ llvm/trunk/test/tools/llvm-diff/undef.ll Thu Apr 12 14:28:04 2018
@@ -0,0 +1,11 @@
+; Bugzilla: https://bugs.llvm.org/show_bug.cgi?id=33623
+; RUN: llvm-diff %s %s
+
+%A = type { i64, i64 }
+ at _gm_ = global <2 x %A*> zeroinitializer
+
+define void @f() {
+entry:
+  store <2 x %A*> undef, <2 x %A*>* @_gm_
+  ret void
+}

Added: llvm/trunk/test/tools/llvm-diff/zeroinitializer.bc.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-diff/zeroinitializer.bc.ll?rev=329957&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-diff/zeroinitializer.bc.ll (added)
+++ llvm/trunk/test/tools/llvm-diff/zeroinitializer.bc.ll Thu Apr 12 14:28:04 2018
@@ -0,0 +1,11 @@
+; Bugzilla: https://bugs.llvm.org/show_bug.cgi?id=33623
+; RUN: llvm-diff %s %s
+
+%A = type { i64, i64 }
+ at _gm_ = global <2 x %A*> zeroinitializer
+
+define void @f() {
+entry:
+  store <2 x %A*> zeroinitializer, <2 x %A*>* @_gm_
+  ret void
+}

Modified: llvm/trunk/tools/llvm-diff/DifferenceEngine.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-diff/DifferenceEngine.cpp?rev=329957&r1=329956&r2=329957&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-diff/DifferenceEngine.cpp (original)
+++ llvm/trunk/tools/llvm-diff/DifferenceEngine.cpp Thu Apr 12 14:28:04 2018
@@ -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);
@@ -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
@@ -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;
   }
 




More information about the llvm-commits mailing list