1d88c1a5aSDimitry Andric //===- FunctionComparator.h - Function Comparator -------------------------===//
2d88c1a5aSDimitry Andric //
3d88c1a5aSDimitry Andric //                     The LLVM Compiler Infrastructure
4d88c1a5aSDimitry Andric //
5d88c1a5aSDimitry Andric // This file is distributed under the University of Illinois Open Source
6d88c1a5aSDimitry Andric // License. See LICENSE.TXT for details.
7d88c1a5aSDimitry Andric //
8d88c1a5aSDimitry Andric //===----------------------------------------------------------------------===//
9d88c1a5aSDimitry Andric //
10d88c1a5aSDimitry Andric // This file implements the FunctionComparator and GlobalNumberState classes
11d88c1a5aSDimitry Andric // which are used by the MergeFunctions pass for comparing functions.
12d88c1a5aSDimitry Andric //
13d88c1a5aSDimitry Andric //===----------------------------------------------------------------------===//
14d88c1a5aSDimitry Andric 
15d88c1a5aSDimitry Andric #include "llvm/Transforms/Utils/FunctionComparator.h"
162cab237bSDimitry Andric #include "llvm/ADT/APFloat.h"
172cab237bSDimitry Andric #include "llvm/ADT/APInt.h"
182cab237bSDimitry Andric #include "llvm/ADT/ArrayRef.h"
192cab237bSDimitry Andric #include "llvm/ADT/Hashing.h"
202cab237bSDimitry Andric #include "llvm/ADT/SmallPtrSet.h"
212cab237bSDimitry Andric #include "llvm/ADT/SmallVector.h"
222cab237bSDimitry Andric #include "llvm/IR/Attributes.h"
232cab237bSDimitry Andric #include "llvm/IR/BasicBlock.h"
24d88c1a5aSDimitry Andric #include "llvm/IR/CallSite.h"
252cab237bSDimitry Andric #include "llvm/IR/Constant.h"
262cab237bSDimitry Andric #include "llvm/IR/Constants.h"
272cab237bSDimitry Andric #include "llvm/IR/DataLayout.h"
282cab237bSDimitry Andric #include "llvm/IR/DerivedTypes.h"
292cab237bSDimitry Andric #include "llvm/IR/Function.h"
302cab237bSDimitry Andric #include "llvm/IR/GlobalValue.h"
31d88c1a5aSDimitry Andric #include "llvm/IR/InlineAsm.h"
322cab237bSDimitry Andric #include "llvm/IR/InstrTypes.h"
332cab237bSDimitry Andric #include "llvm/IR/Instruction.h"
34db17bf38SDimitry Andric #include "llvm/IR/Instructions.h"
352cab237bSDimitry Andric #include "llvm/IR/LLVMContext.h"
362cab237bSDimitry Andric #include "llvm/IR/Metadata.h"
37d88c1a5aSDimitry Andric #include "llvm/IR/Module.h"
382cab237bSDimitry Andric #include "llvm/IR/Operator.h"
392cab237bSDimitry Andric #include "llvm/IR/Type.h"
402cab237bSDimitry Andric #include "llvm/IR/Value.h"
412cab237bSDimitry Andric #include "llvm/Support/Casting.h"
422cab237bSDimitry Andric #include "llvm/Support/Compiler.h"
43d88c1a5aSDimitry Andric #include "llvm/Support/Debug.h"
442cab237bSDimitry Andric #include "llvm/Support/ErrorHandling.h"
45d88c1a5aSDimitry Andric #include "llvm/Support/raw_ostream.h"
462cab237bSDimitry Andric #include <cassert>
472cab237bSDimitry Andric #include <cstddef>
482cab237bSDimitry Andric #include <cstdint>
492cab237bSDimitry Andric #include <utility>
50d88c1a5aSDimitry Andric 
51d88c1a5aSDimitry Andric using namespace llvm;
52d88c1a5aSDimitry Andric 
53d88c1a5aSDimitry Andric #define DEBUG_TYPE "functioncomparator"
54d88c1a5aSDimitry Andric 
cmpNumbers(uint64_t L,uint64_t R) const55d88c1a5aSDimitry Andric int FunctionComparator::cmpNumbers(uint64_t L, uint64_t R) const {
56d88c1a5aSDimitry Andric   if (L < R) return -1;
57d88c1a5aSDimitry Andric   if (L > R) return 1;
58d88c1a5aSDimitry Andric   return 0;
59d88c1a5aSDimitry Andric }
60d88c1a5aSDimitry Andric 
cmpOrderings(AtomicOrdering L,AtomicOrdering R) const61d88c1a5aSDimitry Andric int FunctionComparator::cmpOrderings(AtomicOrdering L, AtomicOrdering R) const {
62d88c1a5aSDimitry Andric   if ((int)L < (int)R) return -1;
63d88c1a5aSDimitry Andric   if ((int)L > (int)R) return 1;
64d88c1a5aSDimitry Andric   return 0;
65d88c1a5aSDimitry Andric }
66d88c1a5aSDimitry Andric 
cmpAPInts(const APInt & L,const APInt & R) const67d88c1a5aSDimitry Andric int FunctionComparator::cmpAPInts(const APInt &L, const APInt &R) const {
68d88c1a5aSDimitry Andric   if (int Res = cmpNumbers(L.getBitWidth(), R.getBitWidth()))
69d88c1a5aSDimitry Andric     return Res;
70d88c1a5aSDimitry Andric   if (L.ugt(R)) return 1;
71d88c1a5aSDimitry Andric   if (R.ugt(L)) return -1;
72d88c1a5aSDimitry Andric   return 0;
73d88c1a5aSDimitry Andric }
74d88c1a5aSDimitry Andric 
cmpAPFloats(const APFloat & L,const APFloat & R) const75d88c1a5aSDimitry Andric int FunctionComparator::cmpAPFloats(const APFloat &L, const APFloat &R) const {
76d88c1a5aSDimitry Andric   // Floats are ordered first by semantics (i.e. float, double, half, etc.),
77d88c1a5aSDimitry Andric   // then by value interpreted as a bitstring (aka APInt).
78d88c1a5aSDimitry Andric   const fltSemantics &SL = L.getSemantics(), &SR = R.getSemantics();
79d88c1a5aSDimitry Andric   if (int Res = cmpNumbers(APFloat::semanticsPrecision(SL),
80d88c1a5aSDimitry Andric                            APFloat::semanticsPrecision(SR)))
81d88c1a5aSDimitry Andric     return Res;
82d88c1a5aSDimitry Andric   if (int Res = cmpNumbers(APFloat::semanticsMaxExponent(SL),
83d88c1a5aSDimitry Andric                            APFloat::semanticsMaxExponent(SR)))
84d88c1a5aSDimitry Andric     return Res;
85d88c1a5aSDimitry Andric   if (int Res = cmpNumbers(APFloat::semanticsMinExponent(SL),
86d88c1a5aSDimitry Andric                            APFloat::semanticsMinExponent(SR)))
87d88c1a5aSDimitry Andric     return Res;
88d88c1a5aSDimitry Andric   if (int Res = cmpNumbers(APFloat::semanticsSizeInBits(SL),
89d88c1a5aSDimitry Andric                            APFloat::semanticsSizeInBits(SR)))
90d88c1a5aSDimitry Andric     return Res;
91d88c1a5aSDimitry Andric   return cmpAPInts(L.bitcastToAPInt(), R.bitcastToAPInt());
92d88c1a5aSDimitry Andric }
93d88c1a5aSDimitry Andric 
cmpMem(StringRef L,StringRef R) const94d88c1a5aSDimitry Andric int FunctionComparator::cmpMem(StringRef L, StringRef R) const {
95d88c1a5aSDimitry Andric   // Prevent heavy comparison, compare sizes first.
96d88c1a5aSDimitry Andric   if (int Res = cmpNumbers(L.size(), R.size()))
97d88c1a5aSDimitry Andric     return Res;
98d88c1a5aSDimitry Andric 
99d88c1a5aSDimitry Andric   // Compare strings lexicographically only when it is necessary: only when
100d88c1a5aSDimitry Andric   // strings are equal in size.
101d88c1a5aSDimitry Andric   return L.compare(R);
102d88c1a5aSDimitry Andric }
103d88c1a5aSDimitry Andric 
cmpAttrs(const AttributeList L,const AttributeList R) const1047a7e6055SDimitry Andric int FunctionComparator::cmpAttrs(const AttributeList L,
1057a7e6055SDimitry Andric                                  const AttributeList R) const {
106302affcbSDimitry Andric   if (int Res = cmpNumbers(L.getNumAttrSets(), R.getNumAttrSets()))
107d88c1a5aSDimitry Andric     return Res;
108d88c1a5aSDimitry Andric 
109302affcbSDimitry Andric   for (unsigned i = L.index_begin(), e = L.index_end(); i != e; ++i) {
110302affcbSDimitry Andric     AttributeSet LAS = L.getAttributes(i);
111302affcbSDimitry Andric     AttributeSet RAS = R.getAttributes(i);
112302affcbSDimitry Andric     AttributeSet::iterator LI = LAS.begin(), LE = LAS.end();
113302affcbSDimitry Andric     AttributeSet::iterator RI = RAS.begin(), RE = RAS.end();
114d88c1a5aSDimitry Andric     for (; LI != LE && RI != RE; ++LI, ++RI) {
115d88c1a5aSDimitry Andric       Attribute LA = *LI;
116d88c1a5aSDimitry Andric       Attribute RA = *RI;
117d88c1a5aSDimitry Andric       if (LA < RA)
118d88c1a5aSDimitry Andric         return -1;
119d88c1a5aSDimitry Andric       if (RA < LA)
120d88c1a5aSDimitry Andric         return 1;
121d88c1a5aSDimitry Andric     }
122d88c1a5aSDimitry Andric     if (LI != LE)
123d88c1a5aSDimitry Andric       return 1;
124d88c1a5aSDimitry Andric     if (RI != RE)
125d88c1a5aSDimitry Andric       return -1;
126d88c1a5aSDimitry Andric   }
127d88c1a5aSDimitry Andric   return 0;
128d88c1a5aSDimitry Andric }
129d88c1a5aSDimitry Andric 
cmpRangeMetadata(const MDNode * L,const MDNode * R) const130d88c1a5aSDimitry Andric int FunctionComparator::cmpRangeMetadata(const MDNode *L,
131d88c1a5aSDimitry Andric                                          const MDNode *R) const {
132d88c1a5aSDimitry Andric   if (L == R)
133d88c1a5aSDimitry Andric     return 0;
134d88c1a5aSDimitry Andric   if (!L)
135d88c1a5aSDimitry Andric     return -1;
136d88c1a5aSDimitry Andric   if (!R)
137d88c1a5aSDimitry Andric     return 1;
138d88c1a5aSDimitry Andric   // Range metadata is a sequence of numbers. Make sure they are the same
139d88c1a5aSDimitry Andric   // sequence.
140d88c1a5aSDimitry Andric   // TODO: Note that as this is metadata, it is possible to drop and/or merge
141d88c1a5aSDimitry Andric   // this data when considering functions to merge. Thus this comparison would
142d88c1a5aSDimitry Andric   // return 0 (i.e. equivalent), but merging would become more complicated
143d88c1a5aSDimitry Andric   // because the ranges would need to be unioned. It is not likely that
144d88c1a5aSDimitry Andric   // functions differ ONLY in this metadata if they are actually the same
145d88c1a5aSDimitry Andric   // function semantically.
146d88c1a5aSDimitry Andric   if (int Res = cmpNumbers(L->getNumOperands(), R->getNumOperands()))
147d88c1a5aSDimitry Andric     return Res;
148d88c1a5aSDimitry Andric   for (size_t I = 0; I < L->getNumOperands(); ++I) {
149d88c1a5aSDimitry Andric     ConstantInt *LLow = mdconst::extract<ConstantInt>(L->getOperand(I));
150d88c1a5aSDimitry Andric     ConstantInt *RLow = mdconst::extract<ConstantInt>(R->getOperand(I));
151d88c1a5aSDimitry Andric     if (int Res = cmpAPInts(LLow->getValue(), RLow->getValue()))
152d88c1a5aSDimitry Andric       return Res;
153d88c1a5aSDimitry Andric   }
154d88c1a5aSDimitry Andric   return 0;
155d88c1a5aSDimitry Andric }
156d88c1a5aSDimitry Andric 
cmpOperandBundlesSchema(const Instruction * L,const Instruction * R) const157d88c1a5aSDimitry Andric int FunctionComparator::cmpOperandBundlesSchema(const Instruction *L,
158d88c1a5aSDimitry Andric                                                 const Instruction *R) const {
159d88c1a5aSDimitry Andric   ImmutableCallSite LCS(L);
160d88c1a5aSDimitry Andric   ImmutableCallSite RCS(R);
161d88c1a5aSDimitry Andric 
162d88c1a5aSDimitry Andric   assert(LCS && RCS && "Must be calls or invokes!");
163d88c1a5aSDimitry Andric   assert(LCS.isCall() == RCS.isCall() && "Can't compare otherwise!");
164d88c1a5aSDimitry Andric 
165d88c1a5aSDimitry Andric   if (int Res =
166d88c1a5aSDimitry Andric           cmpNumbers(LCS.getNumOperandBundles(), RCS.getNumOperandBundles()))
167d88c1a5aSDimitry Andric     return Res;
168d88c1a5aSDimitry Andric 
169d88c1a5aSDimitry Andric   for (unsigned i = 0, e = LCS.getNumOperandBundles(); i != e; ++i) {
170d88c1a5aSDimitry Andric     auto OBL = LCS.getOperandBundleAt(i);
171d88c1a5aSDimitry Andric     auto OBR = RCS.getOperandBundleAt(i);
172d88c1a5aSDimitry Andric 
173d88c1a5aSDimitry Andric     if (int Res = OBL.getTagName().compare(OBR.getTagName()))
174d88c1a5aSDimitry Andric       return Res;
175d88c1a5aSDimitry Andric 
176d88c1a5aSDimitry Andric     if (int Res = cmpNumbers(OBL.Inputs.size(), OBR.Inputs.size()))
177d88c1a5aSDimitry Andric       return Res;
178d88c1a5aSDimitry Andric   }
179d88c1a5aSDimitry Andric 
180d88c1a5aSDimitry Andric   return 0;
181d88c1a5aSDimitry Andric }
182d88c1a5aSDimitry Andric 
183d88c1a5aSDimitry Andric /// Constants comparison:
184d88c1a5aSDimitry Andric /// 1. Check whether type of L constant could be losslessly bitcasted to R
185d88c1a5aSDimitry Andric /// type.
186d88c1a5aSDimitry Andric /// 2. Compare constant contents.
187d88c1a5aSDimitry Andric /// For more details see declaration comments.
cmpConstants(const Constant * L,const Constant * R) const188d88c1a5aSDimitry Andric int FunctionComparator::cmpConstants(const Constant *L,
189d88c1a5aSDimitry Andric                                      const Constant *R) const {
190d88c1a5aSDimitry Andric   Type *TyL = L->getType();
191d88c1a5aSDimitry Andric   Type *TyR = R->getType();
192d88c1a5aSDimitry Andric 
193d88c1a5aSDimitry Andric   // Check whether types are bitcastable. This part is just re-factored
194d88c1a5aSDimitry Andric   // Type::canLosslesslyBitCastTo method, but instead of returning true/false,
195d88c1a5aSDimitry Andric   // we also pack into result which type is "less" for us.
196d88c1a5aSDimitry Andric   int TypesRes = cmpTypes(TyL, TyR);
197d88c1a5aSDimitry Andric   if (TypesRes != 0) {
198d88c1a5aSDimitry Andric     // Types are different, but check whether we can bitcast them.
199d88c1a5aSDimitry Andric     if (!TyL->isFirstClassType()) {
200d88c1a5aSDimitry Andric       if (TyR->isFirstClassType())
201d88c1a5aSDimitry Andric         return -1;
202d88c1a5aSDimitry Andric       // Neither TyL nor TyR are values of first class type. Return the result
203d88c1a5aSDimitry Andric       // of comparing the types
204d88c1a5aSDimitry Andric       return TypesRes;
205d88c1a5aSDimitry Andric     }
206d88c1a5aSDimitry Andric     if (!TyR->isFirstClassType()) {
207d88c1a5aSDimitry Andric       if (TyL->isFirstClassType())
208d88c1a5aSDimitry Andric         return 1;
209d88c1a5aSDimitry Andric       return TypesRes;
210d88c1a5aSDimitry Andric     }
211d88c1a5aSDimitry Andric 
212d88c1a5aSDimitry Andric     // Vector -> Vector conversions are always lossless if the two vector types
213d88c1a5aSDimitry Andric     // have the same size, otherwise not.
214d88c1a5aSDimitry Andric     unsigned TyLWidth = 0;
215d88c1a5aSDimitry Andric     unsigned TyRWidth = 0;
216d88c1a5aSDimitry Andric 
217d88c1a5aSDimitry Andric     if (auto *VecTyL = dyn_cast<VectorType>(TyL))
218d88c1a5aSDimitry Andric       TyLWidth = VecTyL->getBitWidth();
219d88c1a5aSDimitry Andric     if (auto *VecTyR = dyn_cast<VectorType>(TyR))
220d88c1a5aSDimitry Andric       TyRWidth = VecTyR->getBitWidth();
221d88c1a5aSDimitry Andric 
222d88c1a5aSDimitry Andric     if (TyLWidth != TyRWidth)
223d88c1a5aSDimitry Andric       return cmpNumbers(TyLWidth, TyRWidth);
224d88c1a5aSDimitry Andric 
225d88c1a5aSDimitry Andric     // Zero bit-width means neither TyL nor TyR are vectors.
226d88c1a5aSDimitry Andric     if (!TyLWidth) {
227d88c1a5aSDimitry Andric       PointerType *PTyL = dyn_cast<PointerType>(TyL);
228d88c1a5aSDimitry Andric       PointerType *PTyR = dyn_cast<PointerType>(TyR);
229d88c1a5aSDimitry Andric       if (PTyL && PTyR) {
230d88c1a5aSDimitry Andric         unsigned AddrSpaceL = PTyL->getAddressSpace();
231d88c1a5aSDimitry Andric         unsigned AddrSpaceR = PTyR->getAddressSpace();
232d88c1a5aSDimitry Andric         if (int Res = cmpNumbers(AddrSpaceL, AddrSpaceR))
233d88c1a5aSDimitry Andric           return Res;
234d88c1a5aSDimitry Andric       }
235d88c1a5aSDimitry Andric       if (PTyL)
236d88c1a5aSDimitry Andric         return 1;
237d88c1a5aSDimitry Andric       if (PTyR)
238d88c1a5aSDimitry Andric         return -1;
239d88c1a5aSDimitry Andric 
240d88c1a5aSDimitry Andric       // TyL and TyR aren't vectors, nor pointers. We don't know how to
241d88c1a5aSDimitry Andric       // bitcast them.
242d88c1a5aSDimitry Andric       return TypesRes;
243d88c1a5aSDimitry Andric     }
244d88c1a5aSDimitry Andric   }
245d88c1a5aSDimitry Andric 
246d88c1a5aSDimitry Andric   // OK, types are bitcastable, now check constant contents.
247d88c1a5aSDimitry Andric 
248d88c1a5aSDimitry Andric   if (L->isNullValue() && R->isNullValue())
249d88c1a5aSDimitry Andric     return TypesRes;
250d88c1a5aSDimitry Andric   if (L->isNullValue() && !R->isNullValue())
251d88c1a5aSDimitry Andric     return 1;
252d88c1a5aSDimitry Andric   if (!L->isNullValue() && R->isNullValue())
253d88c1a5aSDimitry Andric     return -1;
254d88c1a5aSDimitry Andric 
255d88c1a5aSDimitry Andric   auto GlobalValueL = const_cast<GlobalValue *>(dyn_cast<GlobalValue>(L));
256d88c1a5aSDimitry Andric   auto GlobalValueR = const_cast<GlobalValue *>(dyn_cast<GlobalValue>(R));
257d88c1a5aSDimitry Andric   if (GlobalValueL && GlobalValueR) {
258d88c1a5aSDimitry Andric     return cmpGlobalValues(GlobalValueL, GlobalValueR);
259d88c1a5aSDimitry Andric   }
260d88c1a5aSDimitry Andric 
261d88c1a5aSDimitry Andric   if (int Res = cmpNumbers(L->getValueID(), R->getValueID()))
262d88c1a5aSDimitry Andric     return Res;
263d88c1a5aSDimitry Andric 
264d88c1a5aSDimitry Andric   if (const auto *SeqL = dyn_cast<ConstantDataSequential>(L)) {
265d88c1a5aSDimitry Andric     const auto *SeqR = cast<ConstantDataSequential>(R);
266d88c1a5aSDimitry Andric     // This handles ConstantDataArray and ConstantDataVector. Note that we
267d88c1a5aSDimitry Andric     // compare the two raw data arrays, which might differ depending on the host
268d88c1a5aSDimitry Andric     // endianness. This isn't a problem though, because the endiness of a module
269d88c1a5aSDimitry Andric     // will affect the order of the constants, but this order is the same
270d88c1a5aSDimitry Andric     // for a given input module and host platform.
271d88c1a5aSDimitry Andric     return cmpMem(SeqL->getRawDataValues(), SeqR->getRawDataValues());
272d88c1a5aSDimitry Andric   }
273d88c1a5aSDimitry Andric 
274d88c1a5aSDimitry Andric   switch (L->getValueID()) {
275d88c1a5aSDimitry Andric   case Value::UndefValueVal:
276d88c1a5aSDimitry Andric   case Value::ConstantTokenNoneVal:
277d88c1a5aSDimitry Andric     return TypesRes;
278d88c1a5aSDimitry Andric   case Value::ConstantIntVal: {
279d88c1a5aSDimitry Andric     const APInt &LInt = cast<ConstantInt>(L)->getValue();
280d88c1a5aSDimitry Andric     const APInt &RInt = cast<ConstantInt>(R)->getValue();
281d88c1a5aSDimitry Andric     return cmpAPInts(LInt, RInt);
282d88c1a5aSDimitry Andric   }
283d88c1a5aSDimitry Andric   case Value::ConstantFPVal: {
284d88c1a5aSDimitry Andric     const APFloat &LAPF = cast<ConstantFP>(L)->getValueAPF();
285d88c1a5aSDimitry Andric     const APFloat &RAPF = cast<ConstantFP>(R)->getValueAPF();
286d88c1a5aSDimitry Andric     return cmpAPFloats(LAPF, RAPF);
287d88c1a5aSDimitry Andric   }
288d88c1a5aSDimitry Andric   case Value::ConstantArrayVal: {
289d88c1a5aSDimitry Andric     const ConstantArray *LA = cast<ConstantArray>(L);
290d88c1a5aSDimitry Andric     const ConstantArray *RA = cast<ConstantArray>(R);
291d88c1a5aSDimitry Andric     uint64_t NumElementsL = cast<ArrayType>(TyL)->getNumElements();
292d88c1a5aSDimitry Andric     uint64_t NumElementsR = cast<ArrayType>(TyR)->getNumElements();
293d88c1a5aSDimitry Andric     if (int Res = cmpNumbers(NumElementsL, NumElementsR))
294d88c1a5aSDimitry Andric       return Res;
295d88c1a5aSDimitry Andric     for (uint64_t i = 0; i < NumElementsL; ++i) {
296d88c1a5aSDimitry Andric       if (int Res = cmpConstants(cast<Constant>(LA->getOperand(i)),
297d88c1a5aSDimitry Andric                                  cast<Constant>(RA->getOperand(i))))
298d88c1a5aSDimitry Andric         return Res;
299d88c1a5aSDimitry Andric     }
300d88c1a5aSDimitry Andric     return 0;
301d88c1a5aSDimitry Andric   }
302d88c1a5aSDimitry Andric   case Value::ConstantStructVal: {
303d88c1a5aSDimitry Andric     const ConstantStruct *LS = cast<ConstantStruct>(L);
304d88c1a5aSDimitry Andric     const ConstantStruct *RS = cast<ConstantStruct>(R);
305d88c1a5aSDimitry Andric     unsigned NumElementsL = cast<StructType>(TyL)->getNumElements();
306d88c1a5aSDimitry Andric     unsigned NumElementsR = cast<StructType>(TyR)->getNumElements();
307d88c1a5aSDimitry Andric     if (int Res = cmpNumbers(NumElementsL, NumElementsR))
308d88c1a5aSDimitry Andric       return Res;
309d88c1a5aSDimitry Andric     for (unsigned i = 0; i != NumElementsL; ++i) {
310d88c1a5aSDimitry Andric       if (int Res = cmpConstants(cast<Constant>(LS->getOperand(i)),
311d88c1a5aSDimitry Andric                                  cast<Constant>(RS->getOperand(i))))
312d88c1a5aSDimitry Andric         return Res;
313d88c1a5aSDimitry Andric     }
314d88c1a5aSDimitry Andric     return 0;
315d88c1a5aSDimitry Andric   }
316d88c1a5aSDimitry Andric   case Value::ConstantVectorVal: {
317d88c1a5aSDimitry Andric     const ConstantVector *LV = cast<ConstantVector>(L);
318d88c1a5aSDimitry Andric     const ConstantVector *RV = cast<ConstantVector>(R);
319d88c1a5aSDimitry Andric     unsigned NumElementsL = cast<VectorType>(TyL)->getNumElements();
320d88c1a5aSDimitry Andric     unsigned NumElementsR = cast<VectorType>(TyR)->getNumElements();
321d88c1a5aSDimitry Andric     if (int Res = cmpNumbers(NumElementsL, NumElementsR))
322d88c1a5aSDimitry Andric       return Res;
323d88c1a5aSDimitry Andric     for (uint64_t i = 0; i < NumElementsL; ++i) {
324d88c1a5aSDimitry Andric       if (int Res = cmpConstants(cast<Constant>(LV->getOperand(i)),
325d88c1a5aSDimitry Andric                                  cast<Constant>(RV->getOperand(i))))
326d88c1a5aSDimitry Andric         return Res;
327d88c1a5aSDimitry Andric     }
328d88c1a5aSDimitry Andric     return 0;
329d88c1a5aSDimitry Andric   }
330d88c1a5aSDimitry Andric   case Value::ConstantExprVal: {
331d88c1a5aSDimitry Andric     const ConstantExpr *LE = cast<ConstantExpr>(L);
332d88c1a5aSDimitry Andric     const ConstantExpr *RE = cast<ConstantExpr>(R);
333d88c1a5aSDimitry Andric     unsigned NumOperandsL = LE->getNumOperands();
334d88c1a5aSDimitry Andric     unsigned NumOperandsR = RE->getNumOperands();
335d88c1a5aSDimitry Andric     if (int Res = cmpNumbers(NumOperandsL, NumOperandsR))
336d88c1a5aSDimitry Andric       return Res;
337d88c1a5aSDimitry Andric     for (unsigned i = 0; i < NumOperandsL; ++i) {
338d88c1a5aSDimitry Andric       if (int Res = cmpConstants(cast<Constant>(LE->getOperand(i)),
339d88c1a5aSDimitry Andric                                  cast<Constant>(RE->getOperand(i))))
340d88c1a5aSDimitry Andric         return Res;
341d88c1a5aSDimitry Andric     }
342d88c1a5aSDimitry Andric     return 0;
343d88c1a5aSDimitry Andric   }
344d88c1a5aSDimitry Andric   case Value::BlockAddressVal: {
345d88c1a5aSDimitry Andric     const BlockAddress *LBA = cast<BlockAddress>(L);
346d88c1a5aSDimitry Andric     const BlockAddress *RBA = cast<BlockAddress>(R);
347d88c1a5aSDimitry Andric     if (int Res = cmpValues(LBA->getFunction(), RBA->getFunction()))
348d88c1a5aSDimitry Andric       return Res;
349d88c1a5aSDimitry Andric     if (LBA->getFunction() == RBA->getFunction()) {
350d88c1a5aSDimitry Andric       // They are BBs in the same function. Order by which comes first in the
351d88c1a5aSDimitry Andric       // BB order of the function. This order is deterministic.
352d88c1a5aSDimitry Andric       Function* F = LBA->getFunction();
353d88c1a5aSDimitry Andric       BasicBlock *LBB = LBA->getBasicBlock();
354d88c1a5aSDimitry Andric       BasicBlock *RBB = RBA->getBasicBlock();
355d88c1a5aSDimitry Andric       if (LBB == RBB)
356d88c1a5aSDimitry Andric         return 0;
357d88c1a5aSDimitry Andric       for(BasicBlock &BB : F->getBasicBlockList()) {
358d88c1a5aSDimitry Andric         if (&BB == LBB) {
359d88c1a5aSDimitry Andric           assert(&BB != RBB);
360d88c1a5aSDimitry Andric           return -1;
361d88c1a5aSDimitry Andric         }
362d88c1a5aSDimitry Andric         if (&BB == RBB)
363d88c1a5aSDimitry Andric           return 1;
364d88c1a5aSDimitry Andric       }
365d88c1a5aSDimitry Andric       llvm_unreachable("Basic Block Address does not point to a basic block in "
366d88c1a5aSDimitry Andric                        "its function.");
367d88c1a5aSDimitry Andric       return -1;
368d88c1a5aSDimitry Andric     } else {
369d88c1a5aSDimitry Andric       // cmpValues said the functions are the same. So because they aren't
370d88c1a5aSDimitry Andric       // literally the same pointer, they must respectively be the left and
371d88c1a5aSDimitry Andric       // right functions.
372d88c1a5aSDimitry Andric       assert(LBA->getFunction() == FnL && RBA->getFunction() == FnR);
373d88c1a5aSDimitry Andric       // cmpValues will tell us if these are equivalent BasicBlocks, in the
374d88c1a5aSDimitry Andric       // context of their respective functions.
375d88c1a5aSDimitry Andric       return cmpValues(LBA->getBasicBlock(), RBA->getBasicBlock());
376d88c1a5aSDimitry Andric     }
377d88c1a5aSDimitry Andric   }
378d88c1a5aSDimitry Andric   default: // Unknown constant, abort.
3794ba319b5SDimitry Andric     LLVM_DEBUG(dbgs() << "Looking at valueID " << L->getValueID() << "\n");
380d88c1a5aSDimitry Andric     llvm_unreachable("Constant ValueID not recognized.");
381d88c1a5aSDimitry Andric     return -1;
382d88c1a5aSDimitry Andric   }
383d88c1a5aSDimitry Andric }
384d88c1a5aSDimitry Andric 
cmpGlobalValues(GlobalValue * L,GlobalValue * R) const385d88c1a5aSDimitry Andric int FunctionComparator::cmpGlobalValues(GlobalValue *L, GlobalValue *R) const {
386d88c1a5aSDimitry Andric   uint64_t LNumber = GlobalNumbers->getNumber(L);
387d88c1a5aSDimitry Andric   uint64_t RNumber = GlobalNumbers->getNumber(R);
388d88c1a5aSDimitry Andric   return cmpNumbers(LNumber, RNumber);
389d88c1a5aSDimitry Andric }
390d88c1a5aSDimitry Andric 
391d88c1a5aSDimitry Andric /// cmpType - compares two types,
392d88c1a5aSDimitry Andric /// defines total ordering among the types set.
393d88c1a5aSDimitry Andric /// See method declaration comments for more details.
cmpTypes(Type * TyL,Type * TyR) const394d88c1a5aSDimitry Andric int FunctionComparator::cmpTypes(Type *TyL, Type *TyR) const {
395d88c1a5aSDimitry Andric   PointerType *PTyL = dyn_cast<PointerType>(TyL);
396d88c1a5aSDimitry Andric   PointerType *PTyR = dyn_cast<PointerType>(TyR);
397d88c1a5aSDimitry Andric 
398d88c1a5aSDimitry Andric   const DataLayout &DL = FnL->getParent()->getDataLayout();
399d88c1a5aSDimitry Andric   if (PTyL && PTyL->getAddressSpace() == 0)
400d88c1a5aSDimitry Andric     TyL = DL.getIntPtrType(TyL);
401d88c1a5aSDimitry Andric   if (PTyR && PTyR->getAddressSpace() == 0)
402d88c1a5aSDimitry Andric     TyR = DL.getIntPtrType(TyR);
403d88c1a5aSDimitry Andric 
404d88c1a5aSDimitry Andric   if (TyL == TyR)
405d88c1a5aSDimitry Andric     return 0;
406d88c1a5aSDimitry Andric 
407d88c1a5aSDimitry Andric   if (int Res = cmpNumbers(TyL->getTypeID(), TyR->getTypeID()))
408d88c1a5aSDimitry Andric     return Res;
409d88c1a5aSDimitry Andric 
410d88c1a5aSDimitry Andric   switch (TyL->getTypeID()) {
411d88c1a5aSDimitry Andric   default:
412d88c1a5aSDimitry Andric     llvm_unreachable("Unknown type!");
413d88c1a5aSDimitry Andric   case Type::IntegerTyID:
414d88c1a5aSDimitry Andric     return cmpNumbers(cast<IntegerType>(TyL)->getBitWidth(),
415d88c1a5aSDimitry Andric                       cast<IntegerType>(TyR)->getBitWidth());
416d88c1a5aSDimitry Andric   // TyL == TyR would have returned true earlier, because types are uniqued.
417d88c1a5aSDimitry Andric   case Type::VoidTyID:
418d88c1a5aSDimitry Andric   case Type::FloatTyID:
419d88c1a5aSDimitry Andric   case Type::DoubleTyID:
420d88c1a5aSDimitry Andric   case Type::X86_FP80TyID:
421d88c1a5aSDimitry Andric   case Type::FP128TyID:
422d88c1a5aSDimitry Andric   case Type::PPC_FP128TyID:
423d88c1a5aSDimitry Andric   case Type::LabelTyID:
424d88c1a5aSDimitry Andric   case Type::MetadataTyID:
425d88c1a5aSDimitry Andric   case Type::TokenTyID:
426d88c1a5aSDimitry Andric     return 0;
427d88c1a5aSDimitry Andric 
4282cab237bSDimitry Andric   case Type::PointerTyID:
429d88c1a5aSDimitry Andric     assert(PTyL && PTyR && "Both types must be pointers here.");
430d88c1a5aSDimitry Andric     return cmpNumbers(PTyL->getAddressSpace(), PTyR->getAddressSpace());
431d88c1a5aSDimitry Andric 
432d88c1a5aSDimitry Andric   case Type::StructTyID: {
433d88c1a5aSDimitry Andric     StructType *STyL = cast<StructType>(TyL);
434d88c1a5aSDimitry Andric     StructType *STyR = cast<StructType>(TyR);
435d88c1a5aSDimitry Andric     if (STyL->getNumElements() != STyR->getNumElements())
436d88c1a5aSDimitry Andric       return cmpNumbers(STyL->getNumElements(), STyR->getNumElements());
437d88c1a5aSDimitry Andric 
438d88c1a5aSDimitry Andric     if (STyL->isPacked() != STyR->isPacked())
439d88c1a5aSDimitry Andric       return cmpNumbers(STyL->isPacked(), STyR->isPacked());
440d88c1a5aSDimitry Andric 
441d88c1a5aSDimitry Andric     for (unsigned i = 0, e = STyL->getNumElements(); i != e; ++i) {
442d88c1a5aSDimitry Andric       if (int Res = cmpTypes(STyL->getElementType(i), STyR->getElementType(i)))
443d88c1a5aSDimitry Andric         return Res;
444d88c1a5aSDimitry Andric     }
445d88c1a5aSDimitry Andric     return 0;
446d88c1a5aSDimitry Andric   }
447d88c1a5aSDimitry Andric 
448d88c1a5aSDimitry Andric   case Type::FunctionTyID: {
449d88c1a5aSDimitry Andric     FunctionType *FTyL = cast<FunctionType>(TyL);
450d88c1a5aSDimitry Andric     FunctionType *FTyR = cast<FunctionType>(TyR);
451d88c1a5aSDimitry Andric     if (FTyL->getNumParams() != FTyR->getNumParams())
452d88c1a5aSDimitry Andric       return cmpNumbers(FTyL->getNumParams(), FTyR->getNumParams());
453d88c1a5aSDimitry Andric 
454d88c1a5aSDimitry Andric     if (FTyL->isVarArg() != FTyR->isVarArg())
455d88c1a5aSDimitry Andric       return cmpNumbers(FTyL->isVarArg(), FTyR->isVarArg());
456d88c1a5aSDimitry Andric 
457d88c1a5aSDimitry Andric     if (int Res = cmpTypes(FTyL->getReturnType(), FTyR->getReturnType()))
458d88c1a5aSDimitry Andric       return Res;
459d88c1a5aSDimitry Andric 
460d88c1a5aSDimitry Andric     for (unsigned i = 0, e = FTyL->getNumParams(); i != e; ++i) {
461d88c1a5aSDimitry Andric       if (int Res = cmpTypes(FTyL->getParamType(i), FTyR->getParamType(i)))
462d88c1a5aSDimitry Andric         return Res;
463d88c1a5aSDimitry Andric     }
464d88c1a5aSDimitry Andric     return 0;
465d88c1a5aSDimitry Andric   }
466d88c1a5aSDimitry Andric 
467d88c1a5aSDimitry Andric   case Type::ArrayTyID:
468d88c1a5aSDimitry Andric   case Type::VectorTyID: {
469d88c1a5aSDimitry Andric     auto *STyL = cast<SequentialType>(TyL);
470d88c1a5aSDimitry Andric     auto *STyR = cast<SequentialType>(TyR);
471d88c1a5aSDimitry Andric     if (STyL->getNumElements() != STyR->getNumElements())
472d88c1a5aSDimitry Andric       return cmpNumbers(STyL->getNumElements(), STyR->getNumElements());
473d88c1a5aSDimitry Andric     return cmpTypes(STyL->getElementType(), STyR->getElementType());
474d88c1a5aSDimitry Andric   }
475d88c1a5aSDimitry Andric   }
476d88c1a5aSDimitry Andric }
477d88c1a5aSDimitry Andric 
478d88c1a5aSDimitry Andric // Determine whether the two operations are the same except that pointer-to-A
479d88c1a5aSDimitry Andric // and pointer-to-B are equivalent. This should be kept in sync with
480d88c1a5aSDimitry Andric // Instruction::isSameOperationAs.
481d88c1a5aSDimitry Andric // Read method declaration comments for more details.
cmpOperations(const Instruction * L,const Instruction * R,bool & needToCmpOperands) const482d88c1a5aSDimitry Andric int FunctionComparator::cmpOperations(const Instruction *L,
483d88c1a5aSDimitry Andric                                       const Instruction *R,
484d88c1a5aSDimitry Andric                                       bool &needToCmpOperands) const {
485d88c1a5aSDimitry Andric   needToCmpOperands = true;
486d88c1a5aSDimitry Andric   if (int Res = cmpValues(L, R))
487d88c1a5aSDimitry Andric     return Res;
488d88c1a5aSDimitry Andric 
489d88c1a5aSDimitry Andric   // Differences from Instruction::isSameOperationAs:
490d88c1a5aSDimitry Andric   //  * replace type comparison with calls to cmpTypes.
491d88c1a5aSDimitry Andric   //  * we test for I->getRawSubclassOptionalData (nuw/nsw/tail) at the top.
492d88c1a5aSDimitry Andric   //  * because of the above, we don't test for the tail bit on calls later on.
493d88c1a5aSDimitry Andric   if (int Res = cmpNumbers(L->getOpcode(), R->getOpcode()))
494d88c1a5aSDimitry Andric     return Res;
495d88c1a5aSDimitry Andric 
496d88c1a5aSDimitry Andric   if (const GetElementPtrInst *GEPL = dyn_cast<GetElementPtrInst>(L)) {
497d88c1a5aSDimitry Andric     needToCmpOperands = false;
498d88c1a5aSDimitry Andric     const GetElementPtrInst *GEPR = cast<GetElementPtrInst>(R);
499d88c1a5aSDimitry Andric     if (int Res =
500d88c1a5aSDimitry Andric             cmpValues(GEPL->getPointerOperand(), GEPR->getPointerOperand()))
501d88c1a5aSDimitry Andric       return Res;
502d88c1a5aSDimitry Andric     return cmpGEPs(GEPL, GEPR);
503d88c1a5aSDimitry Andric   }
504d88c1a5aSDimitry Andric 
505d88c1a5aSDimitry Andric   if (int Res = cmpNumbers(L->getNumOperands(), R->getNumOperands()))
506d88c1a5aSDimitry Andric     return Res;
507d88c1a5aSDimitry Andric 
508d88c1a5aSDimitry Andric   if (int Res = cmpTypes(L->getType(), R->getType()))
509d88c1a5aSDimitry Andric     return Res;
510d88c1a5aSDimitry Andric 
511d88c1a5aSDimitry Andric   if (int Res = cmpNumbers(L->getRawSubclassOptionalData(),
512d88c1a5aSDimitry Andric                            R->getRawSubclassOptionalData()))
513d88c1a5aSDimitry Andric     return Res;
514d88c1a5aSDimitry Andric 
515d88c1a5aSDimitry Andric   // We have two instructions of identical opcode and #operands.  Check to see
516d88c1a5aSDimitry Andric   // if all operands are the same type
517d88c1a5aSDimitry Andric   for (unsigned i = 0, e = L->getNumOperands(); i != e; ++i) {
518d88c1a5aSDimitry Andric     if (int Res =
519d88c1a5aSDimitry Andric             cmpTypes(L->getOperand(i)->getType(), R->getOperand(i)->getType()))
520d88c1a5aSDimitry Andric       return Res;
521d88c1a5aSDimitry Andric   }
522d88c1a5aSDimitry Andric 
523d88c1a5aSDimitry Andric   // Check special state that is a part of some instructions.
524d88c1a5aSDimitry Andric   if (const AllocaInst *AI = dyn_cast<AllocaInst>(L)) {
525d88c1a5aSDimitry Andric     if (int Res = cmpTypes(AI->getAllocatedType(),
526d88c1a5aSDimitry Andric                            cast<AllocaInst>(R)->getAllocatedType()))
527d88c1a5aSDimitry Andric       return Res;
528d88c1a5aSDimitry Andric     return cmpNumbers(AI->getAlignment(), cast<AllocaInst>(R)->getAlignment());
529d88c1a5aSDimitry Andric   }
530d88c1a5aSDimitry Andric   if (const LoadInst *LI = dyn_cast<LoadInst>(L)) {
531d88c1a5aSDimitry Andric     if (int Res = cmpNumbers(LI->isVolatile(), cast<LoadInst>(R)->isVolatile()))
532d88c1a5aSDimitry Andric       return Res;
533d88c1a5aSDimitry Andric     if (int Res =
534d88c1a5aSDimitry Andric             cmpNumbers(LI->getAlignment(), cast<LoadInst>(R)->getAlignment()))
535d88c1a5aSDimitry Andric       return Res;
536d88c1a5aSDimitry Andric     if (int Res =
537d88c1a5aSDimitry Andric             cmpOrderings(LI->getOrdering(), cast<LoadInst>(R)->getOrdering()))
538d88c1a5aSDimitry Andric       return Res;
539c4394386SDimitry Andric     if (int Res = cmpNumbers(LI->getSyncScopeID(),
540c4394386SDimitry Andric                              cast<LoadInst>(R)->getSyncScopeID()))
541d88c1a5aSDimitry Andric       return Res;
542d88c1a5aSDimitry Andric     return cmpRangeMetadata(LI->getMetadata(LLVMContext::MD_range),
543d88c1a5aSDimitry Andric         cast<LoadInst>(R)->getMetadata(LLVMContext::MD_range));
544d88c1a5aSDimitry Andric   }
545d88c1a5aSDimitry Andric   if (const StoreInst *SI = dyn_cast<StoreInst>(L)) {
546d88c1a5aSDimitry Andric     if (int Res =
547d88c1a5aSDimitry Andric             cmpNumbers(SI->isVolatile(), cast<StoreInst>(R)->isVolatile()))
548d88c1a5aSDimitry Andric       return Res;
549d88c1a5aSDimitry Andric     if (int Res =
550d88c1a5aSDimitry Andric             cmpNumbers(SI->getAlignment(), cast<StoreInst>(R)->getAlignment()))
551d88c1a5aSDimitry Andric       return Res;
552d88c1a5aSDimitry Andric     if (int Res =
553d88c1a5aSDimitry Andric             cmpOrderings(SI->getOrdering(), cast<StoreInst>(R)->getOrdering()))
554d88c1a5aSDimitry Andric       return Res;
555c4394386SDimitry Andric     return cmpNumbers(SI->getSyncScopeID(),
556c4394386SDimitry Andric                       cast<StoreInst>(R)->getSyncScopeID());
557d88c1a5aSDimitry Andric   }
558d88c1a5aSDimitry Andric   if (const CmpInst *CI = dyn_cast<CmpInst>(L))
559d88c1a5aSDimitry Andric     return cmpNumbers(CI->getPredicate(), cast<CmpInst>(R)->getPredicate());
560d88c1a5aSDimitry Andric   if (const CallInst *CI = dyn_cast<CallInst>(L)) {
561d88c1a5aSDimitry Andric     if (int Res = cmpNumbers(CI->getCallingConv(),
562d88c1a5aSDimitry Andric                              cast<CallInst>(R)->getCallingConv()))
563d88c1a5aSDimitry Andric       return Res;
564d88c1a5aSDimitry Andric     if (int Res =
565d88c1a5aSDimitry Andric             cmpAttrs(CI->getAttributes(), cast<CallInst>(R)->getAttributes()))
566d88c1a5aSDimitry Andric       return Res;
567d88c1a5aSDimitry Andric     if (int Res = cmpOperandBundlesSchema(CI, R))
568d88c1a5aSDimitry Andric       return Res;
569d88c1a5aSDimitry Andric     return cmpRangeMetadata(
570d88c1a5aSDimitry Andric         CI->getMetadata(LLVMContext::MD_range),
571d88c1a5aSDimitry Andric         cast<CallInst>(R)->getMetadata(LLVMContext::MD_range));
572d88c1a5aSDimitry Andric   }
573d88c1a5aSDimitry Andric   if (const InvokeInst *II = dyn_cast<InvokeInst>(L)) {
574d88c1a5aSDimitry Andric     if (int Res = cmpNumbers(II->getCallingConv(),
575d88c1a5aSDimitry Andric                              cast<InvokeInst>(R)->getCallingConv()))
576d88c1a5aSDimitry Andric       return Res;
577d88c1a5aSDimitry Andric     if (int Res =
578d88c1a5aSDimitry Andric             cmpAttrs(II->getAttributes(), cast<InvokeInst>(R)->getAttributes()))
579d88c1a5aSDimitry Andric       return Res;
580d88c1a5aSDimitry Andric     if (int Res = cmpOperandBundlesSchema(II, R))
581d88c1a5aSDimitry Andric       return Res;
582d88c1a5aSDimitry Andric     return cmpRangeMetadata(
583d88c1a5aSDimitry Andric         II->getMetadata(LLVMContext::MD_range),
584d88c1a5aSDimitry Andric         cast<InvokeInst>(R)->getMetadata(LLVMContext::MD_range));
585d88c1a5aSDimitry Andric   }
586d88c1a5aSDimitry Andric   if (const InsertValueInst *IVI = dyn_cast<InsertValueInst>(L)) {
587d88c1a5aSDimitry Andric     ArrayRef<unsigned> LIndices = IVI->getIndices();
588d88c1a5aSDimitry Andric     ArrayRef<unsigned> RIndices = cast<InsertValueInst>(R)->getIndices();
589d88c1a5aSDimitry Andric     if (int Res = cmpNumbers(LIndices.size(), RIndices.size()))
590d88c1a5aSDimitry Andric       return Res;
591d88c1a5aSDimitry Andric     for (size_t i = 0, e = LIndices.size(); i != e; ++i) {
592d88c1a5aSDimitry Andric       if (int Res = cmpNumbers(LIndices[i], RIndices[i]))
593d88c1a5aSDimitry Andric         return Res;
594d88c1a5aSDimitry Andric     }
595d88c1a5aSDimitry Andric     return 0;
596d88c1a5aSDimitry Andric   }
597d88c1a5aSDimitry Andric   if (const ExtractValueInst *EVI = dyn_cast<ExtractValueInst>(L)) {
598d88c1a5aSDimitry Andric     ArrayRef<unsigned> LIndices = EVI->getIndices();
599d88c1a5aSDimitry Andric     ArrayRef<unsigned> RIndices = cast<ExtractValueInst>(R)->getIndices();
600d88c1a5aSDimitry Andric     if (int Res = cmpNumbers(LIndices.size(), RIndices.size()))
601d88c1a5aSDimitry Andric       return Res;
602d88c1a5aSDimitry Andric     for (size_t i = 0, e = LIndices.size(); i != e; ++i) {
603d88c1a5aSDimitry Andric       if (int Res = cmpNumbers(LIndices[i], RIndices[i]))
604d88c1a5aSDimitry Andric         return Res;
605d88c1a5aSDimitry Andric     }
606d88c1a5aSDimitry Andric   }
607d88c1a5aSDimitry Andric   if (const FenceInst *FI = dyn_cast<FenceInst>(L)) {
608d88c1a5aSDimitry Andric     if (int Res =
609d88c1a5aSDimitry Andric             cmpOrderings(FI->getOrdering(), cast<FenceInst>(R)->getOrdering()))
610d88c1a5aSDimitry Andric       return Res;
611c4394386SDimitry Andric     return cmpNumbers(FI->getSyncScopeID(),
612c4394386SDimitry Andric                       cast<FenceInst>(R)->getSyncScopeID());
613d88c1a5aSDimitry Andric   }
614d88c1a5aSDimitry Andric   if (const AtomicCmpXchgInst *CXI = dyn_cast<AtomicCmpXchgInst>(L)) {
615d88c1a5aSDimitry Andric     if (int Res = cmpNumbers(CXI->isVolatile(),
616d88c1a5aSDimitry Andric                              cast<AtomicCmpXchgInst>(R)->isVolatile()))
617d88c1a5aSDimitry Andric       return Res;
618d88c1a5aSDimitry Andric     if (int Res = cmpNumbers(CXI->isWeak(),
619d88c1a5aSDimitry Andric                              cast<AtomicCmpXchgInst>(R)->isWeak()))
620d88c1a5aSDimitry Andric       return Res;
621d88c1a5aSDimitry Andric     if (int Res =
622d88c1a5aSDimitry Andric             cmpOrderings(CXI->getSuccessOrdering(),
623d88c1a5aSDimitry Andric                          cast<AtomicCmpXchgInst>(R)->getSuccessOrdering()))
624d88c1a5aSDimitry Andric       return Res;
625d88c1a5aSDimitry Andric     if (int Res =
626d88c1a5aSDimitry Andric             cmpOrderings(CXI->getFailureOrdering(),
627d88c1a5aSDimitry Andric                          cast<AtomicCmpXchgInst>(R)->getFailureOrdering()))
628d88c1a5aSDimitry Andric       return Res;
629c4394386SDimitry Andric     return cmpNumbers(CXI->getSyncScopeID(),
630c4394386SDimitry Andric                       cast<AtomicCmpXchgInst>(R)->getSyncScopeID());
631d88c1a5aSDimitry Andric   }
632d88c1a5aSDimitry Andric   if (const AtomicRMWInst *RMWI = dyn_cast<AtomicRMWInst>(L)) {
633d88c1a5aSDimitry Andric     if (int Res = cmpNumbers(RMWI->getOperation(),
634d88c1a5aSDimitry Andric                              cast<AtomicRMWInst>(R)->getOperation()))
635d88c1a5aSDimitry Andric       return Res;
636d88c1a5aSDimitry Andric     if (int Res = cmpNumbers(RMWI->isVolatile(),
637d88c1a5aSDimitry Andric                              cast<AtomicRMWInst>(R)->isVolatile()))
638d88c1a5aSDimitry Andric       return Res;
639d88c1a5aSDimitry Andric     if (int Res = cmpOrderings(RMWI->getOrdering(),
640d88c1a5aSDimitry Andric                              cast<AtomicRMWInst>(R)->getOrdering()))
641d88c1a5aSDimitry Andric       return Res;
642c4394386SDimitry Andric     return cmpNumbers(RMWI->getSyncScopeID(),
643c4394386SDimitry Andric                       cast<AtomicRMWInst>(R)->getSyncScopeID());
644d88c1a5aSDimitry Andric   }
645d88c1a5aSDimitry Andric   if (const PHINode *PNL = dyn_cast<PHINode>(L)) {
646d88c1a5aSDimitry Andric     const PHINode *PNR = cast<PHINode>(R);
647d88c1a5aSDimitry Andric     // Ensure that in addition to the incoming values being identical
648d88c1a5aSDimitry Andric     // (checked by the caller of this function), the incoming blocks
649d88c1a5aSDimitry Andric     // are also identical.
650d88c1a5aSDimitry Andric     for (unsigned i = 0, e = PNL->getNumIncomingValues(); i != e; ++i) {
651d88c1a5aSDimitry Andric       if (int Res =
652d88c1a5aSDimitry Andric               cmpValues(PNL->getIncomingBlock(i), PNR->getIncomingBlock(i)))
653d88c1a5aSDimitry Andric         return Res;
654d88c1a5aSDimitry Andric     }
655d88c1a5aSDimitry Andric   }
656d88c1a5aSDimitry Andric   return 0;
657d88c1a5aSDimitry Andric }
658d88c1a5aSDimitry Andric 
659d88c1a5aSDimitry Andric // Determine whether two GEP operations perform the same underlying arithmetic.
660d88c1a5aSDimitry Andric // Read method declaration comments for more details.
cmpGEPs(const GEPOperator * GEPL,const GEPOperator * GEPR) const661d88c1a5aSDimitry Andric int FunctionComparator::cmpGEPs(const GEPOperator *GEPL,
662d88c1a5aSDimitry Andric                                 const GEPOperator *GEPR) const {
663d88c1a5aSDimitry Andric   unsigned int ASL = GEPL->getPointerAddressSpace();
664d88c1a5aSDimitry Andric   unsigned int ASR = GEPR->getPointerAddressSpace();
665d88c1a5aSDimitry Andric 
666d88c1a5aSDimitry Andric   if (int Res = cmpNumbers(ASL, ASR))
667d88c1a5aSDimitry Andric     return Res;
668d88c1a5aSDimitry Andric 
669d88c1a5aSDimitry Andric   // When we have target data, we can reduce the GEP down to the value in bytes
670d88c1a5aSDimitry Andric   // added to the address.
671d88c1a5aSDimitry Andric   const DataLayout &DL = FnL->getParent()->getDataLayout();
672d88c1a5aSDimitry Andric   unsigned BitWidth = DL.getPointerSizeInBits(ASL);
673d88c1a5aSDimitry Andric   APInt OffsetL(BitWidth, 0), OffsetR(BitWidth, 0);
674d88c1a5aSDimitry Andric   if (GEPL->accumulateConstantOffset(DL, OffsetL) &&
675d88c1a5aSDimitry Andric       GEPR->accumulateConstantOffset(DL, OffsetR))
676d88c1a5aSDimitry Andric     return cmpAPInts(OffsetL, OffsetR);
677d88c1a5aSDimitry Andric   if (int Res = cmpTypes(GEPL->getSourceElementType(),
678d88c1a5aSDimitry Andric                          GEPR->getSourceElementType()))
679d88c1a5aSDimitry Andric     return Res;
680d88c1a5aSDimitry Andric 
681d88c1a5aSDimitry Andric   if (int Res = cmpNumbers(GEPL->getNumOperands(), GEPR->getNumOperands()))
682d88c1a5aSDimitry Andric     return Res;
683d88c1a5aSDimitry Andric 
684d88c1a5aSDimitry Andric   for (unsigned i = 0, e = GEPL->getNumOperands(); i != e; ++i) {
685d88c1a5aSDimitry Andric     if (int Res = cmpValues(GEPL->getOperand(i), GEPR->getOperand(i)))
686d88c1a5aSDimitry Andric       return Res;
687d88c1a5aSDimitry Andric   }
688d88c1a5aSDimitry Andric 
689d88c1a5aSDimitry Andric   return 0;
690d88c1a5aSDimitry Andric }
691d88c1a5aSDimitry Andric 
cmpInlineAsm(const InlineAsm * L,const InlineAsm * R) const692d88c1a5aSDimitry Andric int FunctionComparator::cmpInlineAsm(const InlineAsm *L,
693d88c1a5aSDimitry Andric                                      const InlineAsm *R) const {
694d88c1a5aSDimitry Andric   // InlineAsm's are uniqued. If they are the same pointer, obviously they are
695d88c1a5aSDimitry Andric   // the same, otherwise compare the fields.
696d88c1a5aSDimitry Andric   if (L == R)
697d88c1a5aSDimitry Andric     return 0;
698d88c1a5aSDimitry Andric   if (int Res = cmpTypes(L->getFunctionType(), R->getFunctionType()))
699d88c1a5aSDimitry Andric     return Res;
700d88c1a5aSDimitry Andric   if (int Res = cmpMem(L->getAsmString(), R->getAsmString()))
701d88c1a5aSDimitry Andric     return Res;
702d88c1a5aSDimitry Andric   if (int Res = cmpMem(L->getConstraintString(), R->getConstraintString()))
703d88c1a5aSDimitry Andric     return Res;
704d88c1a5aSDimitry Andric   if (int Res = cmpNumbers(L->hasSideEffects(), R->hasSideEffects()))
705d88c1a5aSDimitry Andric     return Res;
706d88c1a5aSDimitry Andric   if (int Res = cmpNumbers(L->isAlignStack(), R->isAlignStack()))
707d88c1a5aSDimitry Andric     return Res;
708d88c1a5aSDimitry Andric   if (int Res = cmpNumbers(L->getDialect(), R->getDialect()))
709d88c1a5aSDimitry Andric     return Res;
7106ccc06f6SDimitry Andric   assert(L->getFunctionType() != R->getFunctionType());
711d88c1a5aSDimitry Andric   return 0;
712d88c1a5aSDimitry Andric }
713d88c1a5aSDimitry Andric 
714d88c1a5aSDimitry Andric /// Compare two values used by the two functions under pair-wise comparison. If
715d88c1a5aSDimitry Andric /// this is the first time the values are seen, they're added to the mapping so
716d88c1a5aSDimitry Andric /// that we will detect mismatches on next use.
717d88c1a5aSDimitry Andric /// See comments in declaration for more details.
cmpValues(const Value * L,const Value * R) const718d88c1a5aSDimitry Andric int FunctionComparator::cmpValues(const Value *L, const Value *R) const {
719d88c1a5aSDimitry Andric   // Catch self-reference case.
720d88c1a5aSDimitry Andric   if (L == FnL) {
721d88c1a5aSDimitry Andric     if (R == FnR)
722d88c1a5aSDimitry Andric       return 0;
723d88c1a5aSDimitry Andric     return -1;
724d88c1a5aSDimitry Andric   }
725d88c1a5aSDimitry Andric   if (R == FnR) {
726d88c1a5aSDimitry Andric     if (L == FnL)
727d88c1a5aSDimitry Andric       return 0;
728d88c1a5aSDimitry Andric     return 1;
729d88c1a5aSDimitry Andric   }
730d88c1a5aSDimitry Andric 
731d88c1a5aSDimitry Andric   const Constant *ConstL = dyn_cast<Constant>(L);
732d88c1a5aSDimitry Andric   const Constant *ConstR = dyn_cast<Constant>(R);
733d88c1a5aSDimitry Andric   if (ConstL && ConstR) {
734d88c1a5aSDimitry Andric     if (L == R)
735d88c1a5aSDimitry Andric       return 0;
736d88c1a5aSDimitry Andric     return cmpConstants(ConstL, ConstR);
737d88c1a5aSDimitry Andric   }
738d88c1a5aSDimitry Andric 
739d88c1a5aSDimitry Andric   if (ConstL)
740d88c1a5aSDimitry Andric     return 1;
741d88c1a5aSDimitry Andric   if (ConstR)
742d88c1a5aSDimitry Andric     return -1;
743d88c1a5aSDimitry Andric 
744d88c1a5aSDimitry Andric   const InlineAsm *InlineAsmL = dyn_cast<InlineAsm>(L);
745d88c1a5aSDimitry Andric   const InlineAsm *InlineAsmR = dyn_cast<InlineAsm>(R);
746d88c1a5aSDimitry Andric 
747d88c1a5aSDimitry Andric   if (InlineAsmL && InlineAsmR)
748d88c1a5aSDimitry Andric     return cmpInlineAsm(InlineAsmL, InlineAsmR);
749d88c1a5aSDimitry Andric   if (InlineAsmL)
750d88c1a5aSDimitry Andric     return 1;
751d88c1a5aSDimitry Andric   if (InlineAsmR)
752d88c1a5aSDimitry Andric     return -1;
753d88c1a5aSDimitry Andric 
754d88c1a5aSDimitry Andric   auto LeftSN = sn_mapL.insert(std::make_pair(L, sn_mapL.size())),
755d88c1a5aSDimitry Andric        RightSN = sn_mapR.insert(std::make_pair(R, sn_mapR.size()));
756d88c1a5aSDimitry Andric 
757d88c1a5aSDimitry Andric   return cmpNumbers(LeftSN.first->second, RightSN.first->second);
758d88c1a5aSDimitry Andric }
759d88c1a5aSDimitry Andric 
760d88c1a5aSDimitry Andric // Test whether two basic blocks have equivalent behaviour.
cmpBasicBlocks(const BasicBlock * BBL,const BasicBlock * BBR) const761d88c1a5aSDimitry Andric int FunctionComparator::cmpBasicBlocks(const BasicBlock *BBL,
762d88c1a5aSDimitry Andric                                        const BasicBlock *BBR) const {
763d88c1a5aSDimitry Andric   BasicBlock::const_iterator InstL = BBL->begin(), InstLE = BBL->end();
764d88c1a5aSDimitry Andric   BasicBlock::const_iterator InstR = BBR->begin(), InstRE = BBR->end();
765d88c1a5aSDimitry Andric 
766d88c1a5aSDimitry Andric   do {
767d88c1a5aSDimitry Andric     bool needToCmpOperands = true;
768d88c1a5aSDimitry Andric     if (int Res = cmpOperations(&*InstL, &*InstR, needToCmpOperands))
769d88c1a5aSDimitry Andric       return Res;
770d88c1a5aSDimitry Andric     if (needToCmpOperands) {
771d88c1a5aSDimitry Andric       assert(InstL->getNumOperands() == InstR->getNumOperands());
772d88c1a5aSDimitry Andric 
773d88c1a5aSDimitry Andric       for (unsigned i = 0, e = InstL->getNumOperands(); i != e; ++i) {
774d88c1a5aSDimitry Andric         Value *OpL = InstL->getOperand(i);
775d88c1a5aSDimitry Andric         Value *OpR = InstR->getOperand(i);
776d88c1a5aSDimitry Andric         if (int Res = cmpValues(OpL, OpR))
777d88c1a5aSDimitry Andric           return Res;
778d88c1a5aSDimitry Andric         // cmpValues should ensure this is true.
779d88c1a5aSDimitry Andric         assert(cmpTypes(OpL->getType(), OpR->getType()) == 0);
780d88c1a5aSDimitry Andric       }
781d88c1a5aSDimitry Andric     }
782d88c1a5aSDimitry Andric 
783d88c1a5aSDimitry Andric     ++InstL;
784d88c1a5aSDimitry Andric     ++InstR;
785d88c1a5aSDimitry Andric   } while (InstL != InstLE && InstR != InstRE);
786d88c1a5aSDimitry Andric 
787d88c1a5aSDimitry Andric   if (InstL != InstLE && InstR == InstRE)
788d88c1a5aSDimitry Andric     return 1;
789d88c1a5aSDimitry Andric   if (InstL == InstLE && InstR != InstRE)
790d88c1a5aSDimitry Andric     return -1;
791d88c1a5aSDimitry Andric   return 0;
792d88c1a5aSDimitry Andric }
793d88c1a5aSDimitry Andric 
compareSignature() const794d88c1a5aSDimitry Andric int FunctionComparator::compareSignature() const {
795d88c1a5aSDimitry Andric   if (int Res = cmpAttrs(FnL->getAttributes(), FnR->getAttributes()))
796d88c1a5aSDimitry Andric     return Res;
797d88c1a5aSDimitry Andric 
798d88c1a5aSDimitry Andric   if (int Res = cmpNumbers(FnL->hasGC(), FnR->hasGC()))
799d88c1a5aSDimitry Andric     return Res;
800d88c1a5aSDimitry Andric 
801d88c1a5aSDimitry Andric   if (FnL->hasGC()) {
802d88c1a5aSDimitry Andric     if (int Res = cmpMem(FnL->getGC(), FnR->getGC()))
803d88c1a5aSDimitry Andric       return Res;
804d88c1a5aSDimitry Andric   }
805d88c1a5aSDimitry Andric 
806d88c1a5aSDimitry Andric   if (int Res = cmpNumbers(FnL->hasSection(), FnR->hasSection()))
807d88c1a5aSDimitry Andric     return Res;
808d88c1a5aSDimitry Andric 
809d88c1a5aSDimitry Andric   if (FnL->hasSection()) {
810d88c1a5aSDimitry Andric     if (int Res = cmpMem(FnL->getSection(), FnR->getSection()))
811d88c1a5aSDimitry Andric       return Res;
812d88c1a5aSDimitry Andric   }
813d88c1a5aSDimitry Andric 
814d88c1a5aSDimitry Andric   if (int Res = cmpNumbers(FnL->isVarArg(), FnR->isVarArg()))
815d88c1a5aSDimitry Andric     return Res;
816d88c1a5aSDimitry Andric 
817d88c1a5aSDimitry Andric   // TODO: if it's internal and only used in direct calls, we could handle this
818d88c1a5aSDimitry Andric   // case too.
819d88c1a5aSDimitry Andric   if (int Res = cmpNumbers(FnL->getCallingConv(), FnR->getCallingConv()))
820d88c1a5aSDimitry Andric     return Res;
821d88c1a5aSDimitry Andric 
822d88c1a5aSDimitry Andric   if (int Res = cmpTypes(FnL->getFunctionType(), FnR->getFunctionType()))
823d88c1a5aSDimitry Andric     return Res;
824d88c1a5aSDimitry Andric 
825d88c1a5aSDimitry Andric   assert(FnL->arg_size() == FnR->arg_size() &&
826d88c1a5aSDimitry Andric          "Identically typed functions have different numbers of args!");
827d88c1a5aSDimitry Andric 
828d88c1a5aSDimitry Andric   // Visit the arguments so that they get enumerated in the order they're
829d88c1a5aSDimitry Andric   // passed in.
830d88c1a5aSDimitry Andric   for (Function::const_arg_iterator ArgLI = FnL->arg_begin(),
831d88c1a5aSDimitry Andric        ArgRI = FnR->arg_begin(),
832d88c1a5aSDimitry Andric        ArgLE = FnL->arg_end();
833d88c1a5aSDimitry Andric        ArgLI != ArgLE; ++ArgLI, ++ArgRI) {
834d88c1a5aSDimitry Andric     if (cmpValues(&*ArgLI, &*ArgRI) != 0)
835d88c1a5aSDimitry Andric       llvm_unreachable("Arguments repeat!");
836d88c1a5aSDimitry Andric   }
837d88c1a5aSDimitry Andric   return 0;
838d88c1a5aSDimitry Andric }
839d88c1a5aSDimitry Andric 
840d88c1a5aSDimitry Andric // Test whether the two functions have equivalent behaviour.
compare()841d88c1a5aSDimitry Andric int FunctionComparator::compare() {
842d88c1a5aSDimitry Andric   beginCompare();
843d88c1a5aSDimitry Andric 
844d88c1a5aSDimitry Andric   if (int Res = compareSignature())
845d88c1a5aSDimitry Andric     return Res;
846d88c1a5aSDimitry Andric 
847d88c1a5aSDimitry Andric   // We do a CFG-ordered walk since the actual ordering of the blocks in the
848d88c1a5aSDimitry Andric   // linked list is immaterial. Our walk starts at the entry block for both
849d88c1a5aSDimitry Andric   // functions, then takes each block from each terminator in order. As an
850d88c1a5aSDimitry Andric   // artifact, this also means that unreachable blocks are ignored.
851d88c1a5aSDimitry Andric   SmallVector<const BasicBlock *, 8> FnLBBs, FnRBBs;
852d88c1a5aSDimitry Andric   SmallPtrSet<const BasicBlock *, 32> VisitedBBs; // in terms of F1.
853d88c1a5aSDimitry Andric 
854d88c1a5aSDimitry Andric   FnLBBs.push_back(&FnL->getEntryBlock());
855d88c1a5aSDimitry Andric   FnRBBs.push_back(&FnR->getEntryBlock());
856d88c1a5aSDimitry Andric 
857d88c1a5aSDimitry Andric   VisitedBBs.insert(FnLBBs[0]);
858d88c1a5aSDimitry Andric   while (!FnLBBs.empty()) {
859d88c1a5aSDimitry Andric     const BasicBlock *BBL = FnLBBs.pop_back_val();
860d88c1a5aSDimitry Andric     const BasicBlock *BBR = FnRBBs.pop_back_val();
861d88c1a5aSDimitry Andric 
862d88c1a5aSDimitry Andric     if (int Res = cmpValues(BBL, BBR))
863d88c1a5aSDimitry Andric       return Res;
864d88c1a5aSDimitry Andric 
865d88c1a5aSDimitry Andric     if (int Res = cmpBasicBlocks(BBL, BBR))
866d88c1a5aSDimitry Andric       return Res;
867d88c1a5aSDimitry Andric 
868*b5893f02SDimitry Andric     const Instruction *TermL = BBL->getTerminator();
869*b5893f02SDimitry Andric     const Instruction *TermR = BBR->getTerminator();
870d88c1a5aSDimitry Andric 
871d88c1a5aSDimitry Andric     assert(TermL->getNumSuccessors() == TermR->getNumSuccessors());
872d88c1a5aSDimitry Andric     for (unsigned i = 0, e = TermL->getNumSuccessors(); i != e; ++i) {
873d88c1a5aSDimitry Andric       if (!VisitedBBs.insert(TermL->getSuccessor(i)).second)
874d88c1a5aSDimitry Andric         continue;
875d88c1a5aSDimitry Andric 
876d88c1a5aSDimitry Andric       FnLBBs.push_back(TermL->getSuccessor(i));
877d88c1a5aSDimitry Andric       FnRBBs.push_back(TermR->getSuccessor(i));
878d88c1a5aSDimitry Andric     }
879d88c1a5aSDimitry Andric   }
880d88c1a5aSDimitry Andric   return 0;
881d88c1a5aSDimitry Andric }
882d88c1a5aSDimitry Andric 
883d88c1a5aSDimitry Andric namespace {
884d88c1a5aSDimitry Andric 
885d88c1a5aSDimitry Andric // Accumulate the hash of a sequence of 64-bit integers. This is similar to a
886d88c1a5aSDimitry Andric // hash of a sequence of 64bit ints, but the entire input does not need to be
887d88c1a5aSDimitry Andric // available at once. This interface is necessary for functionHash because it
888d88c1a5aSDimitry Andric // needs to accumulate the hash as the structure of the function is traversed
889d88c1a5aSDimitry Andric // without saving these values to an intermediate buffer. This form of hashing
890d88c1a5aSDimitry Andric // is not often needed, as usually the object to hash is just read from a
891d88c1a5aSDimitry Andric // buffer.
892d88c1a5aSDimitry Andric class HashAccumulator64 {
893d88c1a5aSDimitry Andric   uint64_t Hash;
8942cab237bSDimitry Andric 
895d88c1a5aSDimitry Andric public:
896d88c1a5aSDimitry Andric   // Initialize to random constant, so the state isn't zero.
HashAccumulator64()897d88c1a5aSDimitry Andric   HashAccumulator64() { Hash = 0x6acaa36bef8325c5ULL; }
8982cab237bSDimitry Andric 
add(uint64_t V)899d88c1a5aSDimitry Andric   void add(uint64_t V) {
9002cab237bSDimitry Andric      Hash = hashing::detail::hash_16_bytes(Hash, V);
901d88c1a5aSDimitry Andric   }
9022cab237bSDimitry Andric 
903d88c1a5aSDimitry Andric   // No finishing is required, because the entire hash value is used.
getHash()904d88c1a5aSDimitry Andric   uint64_t getHash() { return Hash; }
905d88c1a5aSDimitry Andric };
9062cab237bSDimitry Andric 
907d88c1a5aSDimitry Andric } // end anonymous namespace
908d88c1a5aSDimitry Andric 
909d88c1a5aSDimitry Andric // A function hash is calculated by considering only the number of arguments and
910d88c1a5aSDimitry Andric // whether a function is varargs, the order of basic blocks (given by the
911d88c1a5aSDimitry Andric // successors of each basic block in depth first order), and the order of
912d88c1a5aSDimitry Andric // opcodes of each instruction within each of these basic blocks. This mirrors
913d88c1a5aSDimitry Andric // the strategy compare() uses to compare functions by walking the BBs in depth
914d88c1a5aSDimitry Andric // first order and comparing each instruction in sequence. Because this hash
915d88c1a5aSDimitry Andric // does not look at the operands, it is insensitive to things such as the
916d88c1a5aSDimitry Andric // target of calls and the constants used in the function, which makes it useful
917d88c1a5aSDimitry Andric // when possibly merging functions which are the same modulo constants and call
918d88c1a5aSDimitry Andric // targets.
functionHash(Function & F)919d88c1a5aSDimitry Andric FunctionComparator::FunctionHash FunctionComparator::functionHash(Function &F) {
920d88c1a5aSDimitry Andric   HashAccumulator64 H;
921d88c1a5aSDimitry Andric   H.add(F.isVarArg());
922d88c1a5aSDimitry Andric   H.add(F.arg_size());
923d88c1a5aSDimitry Andric 
924d88c1a5aSDimitry Andric   SmallVector<const BasicBlock *, 8> BBs;
9254ba319b5SDimitry Andric   SmallPtrSet<const BasicBlock *, 16> VisitedBBs;
926d88c1a5aSDimitry Andric 
927d88c1a5aSDimitry Andric   // Walk the blocks in the same order as FunctionComparator::cmpBasicBlocks(),
928d88c1a5aSDimitry Andric   // accumulating the hash of the function "structure." (BB and opcode sequence)
929d88c1a5aSDimitry Andric   BBs.push_back(&F.getEntryBlock());
930d88c1a5aSDimitry Andric   VisitedBBs.insert(BBs[0]);
931d88c1a5aSDimitry Andric   while (!BBs.empty()) {
932d88c1a5aSDimitry Andric     const BasicBlock *BB = BBs.pop_back_val();
933d88c1a5aSDimitry Andric     // This random value acts as a block header, as otherwise the partition of
934d88c1a5aSDimitry Andric     // opcodes into BBs wouldn't affect the hash, only the order of the opcodes
935d88c1a5aSDimitry Andric     H.add(45798);
936d88c1a5aSDimitry Andric     for (auto &Inst : *BB) {
937d88c1a5aSDimitry Andric       H.add(Inst.getOpcode());
938d88c1a5aSDimitry Andric     }
939*b5893f02SDimitry Andric     const Instruction *Term = BB->getTerminator();
940d88c1a5aSDimitry Andric     for (unsigned i = 0, e = Term->getNumSuccessors(); i != e; ++i) {
941d88c1a5aSDimitry Andric       if (!VisitedBBs.insert(Term->getSuccessor(i)).second)
942d88c1a5aSDimitry Andric         continue;
943d88c1a5aSDimitry Andric       BBs.push_back(Term->getSuccessor(i));
944d88c1a5aSDimitry Andric     }
945d88c1a5aSDimitry Andric   }
946d88c1a5aSDimitry Andric   return H.getHash();
947d88c1a5aSDimitry Andric }
948