[llvm] 88bc59c - Revert "[IRSim] Adding IRSimilarityCandidate that contains a region of IRInstructionData."

Andrew Litteken via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 22 19:04:08 PDT 2020


Author: Andrew Litteken
Date: 2020-09-22T21:02:34-05:00
New Revision: 88bc59c3001b3b20f55994f9fa9dbaf45991df1d

URL: https://github.com/llvm/llvm-project/commit/88bc59c3001b3b20f55994f9fa9dbaf45991df1d
DIFF: https://github.com/llvm/llvm-project/commit/88bc59c3001b3b20f55994f9fa9dbaf45991df1d.diff

LOG: Revert "[IRSim] Adding IRSimilarityCandidate that contains a region of IRInstructionData."

This reverts commit 4944bb190fed8861d4d043eaf45e3c1e12aa2dc5.

Added: 
    

Modified: 
    llvm/include/llvm/Analysis/IRSimilarityIdentifier.h
    llvm/lib/Analysis/IRSimilarityIdentifier.cpp
    llvm/unittests/Analysis/IRSimilarityIdentifierTest.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/Analysis/IRSimilarityIdentifier.h b/llvm/include/llvm/Analysis/IRSimilarityIdentifier.h
index 8a74a5553083..457b867f345e 100644
--- a/llvm/include/llvm/Analysis/IRSimilarityIdentifier.h
+++ b/llvm/include/llvm/Analysis/IRSimilarityIdentifier.h
@@ -37,10 +37,6 @@
 // or comparison predicate.  These are used to create a hash to map instructions
 // to integers to be used in similarity matching in sequences of instructions
 //
-// Terminology:
-// An IRSimilarityCandidate is a region of IRInstructionData (wrapped
-// Instructions), usually used to denote a region of similarity has been found.
-//
 //===----------------------------------------------------------------------===//
 
 #ifndef LLVM_ANALYSIS_IRSIMILARITYIDENTIFIER_H
@@ -390,137 +386,6 @@ struct IRInstructionMapper {
   InstructionClassification InstClassifier;
 };
 
-/// This is a class that wraps a range of IRInstructionData from one point to
-/// another in the vector of IRInstructionData, which is a region of the
-/// program.  It is also responsible for defining the structure within this
-/// region of instructions.
-///
-/// The structure of a region is defined through a value numbering system
-/// assigned to each unique value in a region at the creation of the
-/// IRSimilarityCandidate.
-///
-/// For example, for each Instruction we add a mapping for each new
-/// value seen in that Instruction.
-/// IR:                    Mapping Added:
-/// %add1 = add i32 %a, c1    %add1 -> 3, %a -> 1, c1 -> 2
-/// %add2 = add i32 %a, %1    %add2 -> 4
-/// %add3 = add i32 c2, c1    %add3 -> 6, c2 -> 5
-///
-/// We can compare IRSimilarityCandidates against one another.
-/// The \ref isSimilar function compares each IRInstructionData against one
-/// another and if we have the same sequences of IRInstructionData that would
-/// create the same hash, we have similar IRSimilarityCandidates.
-class IRSimilarityCandidate {
-private:
-  /// The start index of this IRSimilarityCandidate in the instruction list.
-  unsigned StartIdx = 0;
-
-  /// The number of instructions in this IRSimilarityCandidate.
-  unsigned Len = 0;
-
-  /// The first instruction in this IRSimilarityCandidate.
-  IRInstructionData *FirstInst = nullptr;
-
-  /// The last instruction in this IRSimilarityCandidate.
-  IRInstructionData *LastInst = nullptr;
-
-  /// Global Value Numbering structures
-  /// @{
-  /// Stores the mapping of the value to the number assigned to it in the
-  /// IRSimilarityCandidate.
-  DenseMap<Value *, unsigned> ValueToNumber;
-  /// Stores the mapping of the number to the value assigned this number.
-  DenseMap<unsigned, Value *> NumberToValue;
-  /// @}
-
-public:
-  /// \param StartIdx - The starting location of the region.
-  /// \param StartIdx - The length of the region.
-  /// \param FirstInstIt - The starting IRInstructionData of the region.
-  /// \param LastInstIt - The ending IRInstructionData of the region.
-  IRSimilarityCandidate(unsigned StartIdx, unsigned Len,
-                        IRInstructionData *FirstInstIt,
-                        IRInstructionData *LastInstIt);
-
-  /// \param A - The first IRInstructionCandidate to compare.
-  /// \param B - The second IRInstructionCandidate to compare.
-  /// \returns True when every IRInstructionData in \p A is similar to every
-  /// IRInstructionData in \p B.
-  static bool isSimilar(const IRSimilarityCandidate &A,
-                        const IRSimilarityCandidate &B);
-  /// Compare the start and end indices of the two IRSimilarityCandidates for
-  /// whether they overlap. If the start instruction of one
-  /// IRSimilarityCandidate is less than the end instruction of the other, and
-  /// the start instruction of one is greater than the start instruction of the
-  /// other, they overlap.
-  ///
-  /// \returns true if the IRSimilarityCandidates do not have overlapping
-  /// instructions.
-  static bool overlap(const IRSimilarityCandidate &A,
-                      const IRSimilarityCandidate &B);
-
-  /// \returns the number of instructions in this Candidate.
-  unsigned getLength() const { return Len; }
-
-  /// \returns the start index of this IRSimilarityCandidate.
-  unsigned getStartIdx() const { return StartIdx; }
-
-  /// \returns the end index of this IRSimilarityCandidate.
-  unsigned getEndIdx() const { return StartIdx + Len - 1; }
-
-  /// \returns The first IRInstructionData.
-  IRInstructionData *front() const { return FirstInst; }
-  /// \returns The last IRInstructionData.
-  IRInstructionData *back() const { return LastInst; }
-
-  /// \returns The first Instruction.
-  Instruction *frontInstruction() { return FirstInst->Inst; }
-  /// \returns The last Instruction
-  Instruction *backInstruction() { return LastInst->Inst; }
-
-  /// \returns The BasicBlock the IRSimilarityCandidate starts in.
-  BasicBlock *getStartBB() { return FirstInst->Inst->getParent(); }
-  /// \returns The BasicBlock the IRSimilarityCandidate ends in.
-  BasicBlock *getEndBB() { return LastInst->Inst->getParent(); }
-
-  /// \returns The Function that the IRSimilarityCandidate is located in.
-  Function *getFunction() { return getStartBB()->getParent(); }
-
-  /// Finds the positive number associated with \p V if it has been mapped.
-  /// \param [in] V - the Value to find.
-  /// \returns The positive number corresponding to the value.
-  /// \returns None if not present.
-  Optional<unsigned> getGVN(Value *V) {
-    assert(V != nullptr && "Value is a nullptr?");
-    DenseMap<Value *, unsigned>::iterator VNIt = ValueToNumber.find(V);
-    if (VNIt == ValueToNumber.end())
-      return None;
-    return VNIt->second;
-  }
-
-  /// Finds the Value associate with \p Num if it exists.
-  /// \param [in] Num - the number to find.
-  /// \returns The Value associated with the number.
-  /// \returns None if not present.
-  Optional<Value *> fromGVN(unsigned Num) {
-    DenseMap<unsigned, Value *>::iterator VNIt = NumberToValue.find(Num);
-    if (VNIt == NumberToValue.end())
-      return None;
-    assert(VNIt->second != nullptr && "Found value is a nullptr!");
-    return VNIt->second;
-  }
-
-  /// \param RHS -The IRSimilarityCandidate to compare against
-  /// \returns true if the IRSimilarityCandidate is occurs after the
-  /// IRSimilarityCandidate in the program.
-  bool operator<(const IRSimilarityCandidate &RHS) const {
-    return getStartIdx() > RHS.getStartIdx();
-  }
-
-  using iterator = IRInstructionDataList::iterator;
-  iterator begin() const { return iterator(front()); }
-  iterator end() const { return std::next(iterator(back())); }
-};
 } // end namespace IRSimilarity
 } // end namespace llvm
 

diff  --git a/llvm/lib/Analysis/IRSimilarityIdentifier.cpp b/llvm/lib/Analysis/IRSimilarityIdentifier.cpp
index de9869211de4..0db7a110f77d 100644
--- a/llvm/lib/Analysis/IRSimilarityIdentifier.cpp
+++ b/llvm/lib/Analysis/IRSimilarityIdentifier.cpp
@@ -163,91 +163,3 @@ unsigned IRInstructionMapper::mapToIllegalUnsigned(
 
   return INumber;
 }
-
-IRSimilarityCandidate::IRSimilarityCandidate(unsigned StartIdx, unsigned Len,
-                                             IRInstructionData *FirstInstIt,
-                                             IRInstructionData *LastInstIt)
-    : StartIdx(StartIdx), Len(Len) {
-
-  assert(FirstInstIt != nullptr && "Instruction is nullptr!");
-  assert(LastInstIt != nullptr && "Instruction is nullptr!");
-  assert(StartIdx + Len > StartIdx &&
-         "Overflow for IRSimilarityCandidate range?");
-  assert(Len - 1 ==
-             std::distance(iterator(FirstInstIt), iterator(LastInstIt)) &&
-         "Length of the first and last IRInstructionData do not match the "
-         "given length");
-
-  // We iterate over the given instructions, and map each unique value
-  // to a unique number in the IRSimilarityCandidate ValueToNumber and
-  // NumberToValue maps.  A constant get its own value globally, the individual
-  // uses of the constants are not considered to be unique.
-  //
-  // IR:                    Mapping Added:
-  // %add1 = add i32 %a, c1    %add1 -> 3, %a -> 1, c1 -> 2
-  // %add2 = add i32 %a, %1    %add2 -> 4
-  // %add3 = add i32 c2, c1    %add3 -> 6, c2 -> 5
-  //
-  // when replace with global values, starting from 1, would be
-  //
-  // 3 = add i32 1, 2
-  // 4 = add i32 1, 3
-  // 6 = add i32 5, 2
-  unsigned LocalValNumber = 1;
-  IRInstructionDataList::iterator ID = iterator(*FirstInstIt);
-  for (unsigned Loc = StartIdx; Loc < StartIdx + Len; Loc++, ID++) {
-    // Map the operand values to an unsigned integer if it does not already
-    // have an unsigned integer assigned to it.
-    for (Value *Arg : ID->OperVals)
-      if (ValueToNumber.find(Arg) == ValueToNumber.end()) {
-        ValueToNumber.try_emplace(Arg, LocalValNumber);
-        NumberToValue.try_emplace(LocalValNumber, Arg);
-        LocalValNumber++;
-      }
-
-    // Mapping the instructions to an unsigned integer if it is not already
-    // exist in the mapping.
-    if (ValueToNumber.find(ID->Inst) == ValueToNumber.end()) {
-      ValueToNumber.try_emplace(ID->Inst, LocalValNumber);
-      NumberToValue.try_emplace(LocalValNumber, ID->Inst);
-      LocalValNumber++;
-    }
-  }
-
-  // Setting the first and last instruction data pointers for the candidate.  If
-  // we got through the entire for loop without hitting an assert, we know
-  // that both of these instructions are not nullptrs.
-  FirstInst = FirstInstIt;
-  LastInst = LastInstIt;
-}
-
-bool IRSimilarityCandidate::isSimilar(const IRSimilarityCandidate &A,
-                                      const IRSimilarityCandidate &B) {
-  if (A.getLength() != B.getLength())
-    return false;
-
-  auto InstrDataForBoth =
-      zip(make_range(A.begin(), A.end()), make_range(B.begin(), B.end()));
-
-  return all_of(InstrDataForBoth,
-                [](std::tuple<IRInstructionData &, IRInstructionData &> R) {
-                  IRInstructionData &A = std::get<0>(R);
-                  IRInstructionData &B = std::get<1>(R);
-                  if (!A.Legal || !B.Legal)
-                    return false;
-                  return isClose(A, B);
-                });
-}
-
-bool IRSimilarityCandidate::overlap(const IRSimilarityCandidate &A,
-                                    const IRSimilarityCandidate &B) {
-  auto DoesOverlap = [](const IRSimilarityCandidate &X,
-                        const IRSimilarityCandidate &Y) {
-    // Check:
-    // XXXXXX        X starts before Y ends
-    //      YYYYYYY  Y starts after X starts
-    return X.StartIdx <= Y.getEndIdx() && Y.StartIdx >= X.StartIdx;
-  };
-
-  return DoesOverlap(A, B) || DoesOverlap(B, A);
-}

diff  --git a/llvm/unittests/Analysis/IRSimilarityIdentifierTest.cpp b/llvm/unittests/Analysis/IRSimilarityIdentifierTest.cpp
index e2cfc8f7b72f..f79149b5eda2 100644
--- a/llvm/unittests/Analysis/IRSimilarityIdentifierTest.cpp
+++ b/llvm/unittests/Analysis/IRSimilarityIdentifierTest.cpp
@@ -1175,205 +1175,3 @@ TEST(IRInstructionMapper, RepeatedIllegalLength) {
   // Make sure that the unsigned vector is the expected size.
   ASSERT_TRUE(UnsignedVec.size() == 6);
 }
-
-// A helper function that accepts an instruction list from a module made up of
-// two blocks of two legal instructions and terminator, and checks them for
-// instruction similarity.
-static bool longSimCandCompare(std::vector<IRInstructionData *> &InstrList) {
-
-  std::vector<IRInstructionData *>::iterator Start, End;
-
-  Start = InstrList.begin();
-  End = InstrList.begin();
-
-  std::advance(End, 1);
-  IRSimilarityCandidate Cand1(0, 2, *Start, *End);
-
-  Start = InstrList.begin();
-  End = InstrList.begin();
-
-  std::advance(Start, 3);
-  std::advance(End, 4);
-  IRSimilarityCandidate Cand2(3, 2, *Start, *End);
-  return IRSimilarityCandidate::isSimilar(Cand1, Cand2);
-}
-
-// Checks that two adds with commuted operands are considered to be the same
-// instructions.
-TEST(IRSimilarityCandidate, CheckIdenticalInstructions) {
-  StringRef ModuleString = R"(
-                          define i32 @f(i32 %a, i32 %b) {
-                          bb0:
-                             %0 = add i32 %a, %b
-                             %1 = add i32 %b, %a
-                             ret i32 0
-                          })";
-  LLVMContext Context;
-  std::unique_ptr<Module> M = makeLLVMModule(Context, ModuleString);
-
-  std::vector<IRInstructionData *> InstrList;
-  std::vector<unsigned> UnsignedVec;
-
-  getVectors(*M, InstrList, UnsignedVec);
-
-  // Check to make sure that we have a long enough region.
-  ASSERT_EQ(InstrList.size(), static_cast<unsigned>(3));
-  // Check that the instructions were added correctly to both vectors.
-  ASSERT_TRUE(InstrList.size() == UnsignedVec.size());
-
-  std::vector<IRInstructionData *>::iterator Start, End;
-  Start = InstrList.begin();
-  End = InstrList.begin();
-  std::advance(End, 1);
-  IRSimilarityCandidate Cand1(0, 2, *Start, *End);
-  IRSimilarityCandidate Cand2(0, 2, *Start, *End);
-
-  ASSERT_TRUE(IRSimilarityCandidate::isSimilar(Cand1, Cand2));
-}
-
-// Checks that IRSimilarityCandidates wrapping these two regions of instructions
-// are able to 
diff erentiate between instructions that have 
diff erent opcodes.
-TEST(IRSimilarityCandidate, CheckRegionsDifferentInstruction) {
-  StringRef ModuleString = R"(
-                          define i32 @f(i32 %a, i32 %b) {
-                          bb0:
-                             %0 = add i32 %a, %b
-                             %1 = add i32 %b, %a
-                             ret i32 0
-                          bb1:
-                             %2 = sub i32 %a, %b
-                             %3 = add i32 %b, %a
-                             ret i32 0
-                          })";
-  LLVMContext Context;
-  std::unique_ptr<Module> M = makeLLVMModule(Context, ModuleString);
-
-  std::vector<IRInstructionData *> InstrList;
-  std::vector<unsigned> UnsignedVec;
-
-  getVectors(*M, InstrList, UnsignedVec);
-
-  // Check to make sure that we have a long enough region.
-  ASSERT_EQ(InstrList.size(), static_cast<unsigned>(6));
-  // Check that the instructions were added correctly to both vectors.
-  ASSERT_TRUE(InstrList.size() == UnsignedVec.size());
-
-  ASSERT_FALSE(longSimCandCompare(InstrList));
-}
-
-// Checks that IRSimilarityCandidates wrapping these two regions of instructions
-// are able to 
diff erentiate between instructions that have 
diff erent types.
-TEST(IRSimilarityCandidate, CheckRegionsDifferentTypes) {
-  StringRef ModuleString = R"(
-                          define i32 @f(i32 %a, i32 %b, i64 %c, i64 %d) {
-                          bb0:
-                             %0 = add i32 %a, %b
-                             %1 = add i32 %b, %a
-                             ret i32 0
-                          bb1:
-                             %2 = add i64 %c, %d
-                             %3 = add i64 %d, %c
-                             ret i32 0
-                          })";
-  LLVMContext Context;
-  std::unique_ptr<Module> M = makeLLVMModule(Context, ModuleString);
-
-  std::vector<IRInstructionData *> InstrList;
-  std::vector<unsigned> UnsignedVec;
-
-  getVectors(*M, InstrList, UnsignedVec);
-
-  // Check to make sure that we have a long enough region.
-  ASSERT_EQ(InstrList.size(), static_cast<unsigned>(6));
-  // Check that the instructions were added correctly to both vectors.
-  ASSERT_TRUE(InstrList.size() == UnsignedVec.size());
-
-  ASSERT_FALSE(longSimCandCompare(InstrList));
-}
-
-// Check that debug instructions do not impact similarity. They are marked as
-// invisible.
-TEST(IRSimilarityCandidate, IdenticalWithDebug) {
-  StringRef ModuleString = R"(
-                          define i32 @f(i32 %a, i32 %b) {
-                          bb0:
-                             %0 = add i32 %a, %b
-                             call void @llvm.dbg.value(metadata !0)
-                             %1 = add i32 %b, %a
-                             ret i32 0
-                          bb1:
-                             %2 = add i32 %a, %b
-                             call void @llvm.dbg.value(metadata !1)
-                             %3 = add i32 %b, %a
-                             ret i32 0
-                          bb2:
-                             %4 = add i32 %a, %b
-                             %5 = add i32 %b, %a
-                             ret i32 0       
-                          }
-
-                          declare void @llvm.dbg.value(metadata)
-                          !0 = distinct !{!"test\00", i32 10}
-                          !1 = distinct !{!"test\00", i32 11})";
-  LLVMContext Context;
-  std::unique_ptr<Module> M = makeLLVMModule(Context, ModuleString);
-
-  std::vector<IRInstructionData *> InstrList;
-  std::vector<unsigned> UnsignedVec;
-
-  getVectors(*M, InstrList, UnsignedVec);
-
-  // Check to make sure that we have a long enough region.
-  ASSERT_EQ(InstrList.size(), static_cast<unsigned>(9));
-  // Check that the instructions were added correctly to both vectors.
-  ASSERT_TRUE(InstrList.size() == UnsignedVec.size());
-
-  ASSERT_TRUE(longSimCandCompare(InstrList));
-}
-
-// Checks that IRSimilarityCandidates that include illegal instructions, are not
-// considered to be the same set of instructions.  In these sets of instructions
-// the allocas are illegal.
-TEST(IRSimilarityCandidate, IllegalInCandidate) {
-  StringRef ModuleString = R"(
-                          define i32 @f(i32 %a, i32 %b) {
-                          bb0:
-                             %0 = add i32 %a, %b
-                             %1 = add i32 %a, %b
-                             %2 = alloca i32
-                             ret i32 0
-                          bb1:
-                             %3 = add i32 %a, %b
-                             %4 = add i32 %a, %b
-                             %5 = alloca i32
-                             ret i32 0
-                          })";
-  LLVMContext Context;
-  std::unique_ptr<Module> M = makeLLVMModule(Context, ModuleString);
-
-  std::vector<IRInstructionData *> InstrList;
-  std::vector<unsigned> UnsignedVec;
-
-  getVectors(*M, InstrList, UnsignedVec);
-
-  // Check to make sure that we have a long enough region.
-  ASSERT_EQ(InstrList.size(), static_cast<unsigned>(6));
-  // Check that the instructions were added correctly to both vectors.
-  ASSERT_TRUE(InstrList.size() == UnsignedVec.size());
-
-  std::vector<IRInstructionData *>::iterator Start, End;
-
-  Start = InstrList.begin();
-  End = InstrList.begin();
-
-  std::advance(End, 2);
-  IRSimilarityCandidate Cand1(0, 3, *Start, *End);
-
-  Start = InstrList.begin();
-  End = InstrList.begin();
-
-  std::advance(Start, 3);
-  std::advance(End, 5);
-  IRSimilarityCandidate Cand2(3, 3, *Start, *End);
-  ASSERT_FALSE(IRSimilarityCandidate::isSimilar(Cand1, Cand2));
-}


        


More information about the llvm-commits mailing list