Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 14 | pmbaty | 1 | //===- FunctionComparator.h - Function Comparator ---------------*- C++ -*-===// |
| 2 | // |
||
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
||
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
||
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
||
| 6 | // |
||
| 7 | //===----------------------------------------------------------------------===// |
||
| 8 | // |
||
| 9 | // This file defines the FunctionComparator and GlobalNumberState classes which |
||
| 10 | // are used by the MergeFunctions pass for comparing functions. |
||
| 11 | // |
||
| 12 | //===----------------------------------------------------------------------===// |
||
| 13 | |||
| 14 | #ifndef LLVM_TRANSFORMS_UTILS_FUNCTIONCOMPARATOR_H |
||
| 15 | #define LLVM_TRANSFORMS_UTILS_FUNCTIONCOMPARATOR_H |
||
| 16 | |||
| 17 | #include "llvm/ADT/DenseMap.h" |
||
| 18 | #include "llvm/ADT/StringRef.h" |
||
| 19 | #include "llvm/IR/Instructions.h" |
||
| 20 | #include "llvm/IR/Operator.h" |
||
| 21 | #include "llvm/IR/ValueMap.h" |
||
| 22 | #include "llvm/Support/AtomicOrdering.h" |
||
| 23 | #include "llvm/Support/Casting.h" |
||
| 24 | #include <cstdint> |
||
| 25 | #include <tuple> |
||
| 26 | |||
| 27 | namespace llvm { |
||
| 28 | |||
| 29 | class APFloat; |
||
| 30 | class AttributeList; |
||
| 31 | class APInt; |
||
| 32 | class BasicBlock; |
||
| 33 | class Constant; |
||
| 34 | class Function; |
||
| 35 | class GlobalValue; |
||
| 36 | class InlineAsm; |
||
| 37 | class Instruction; |
||
| 38 | class MDNode; |
||
| 39 | class Type; |
||
| 40 | class Value; |
||
| 41 | |||
| 42 | /// GlobalNumberState assigns an integer to each global value in the program, |
||
| 43 | /// which is used by the comparison routine to order references to globals. This |
||
| 44 | /// state must be preserved throughout the pass, because Functions and other |
||
| 45 | /// globals need to maintain their relative order. Globals are assigned a number |
||
| 46 | /// when they are first visited. This order is deterministic, and so the |
||
| 47 | /// assigned numbers are as well. When two functions are merged, neither number |
||
| 48 | /// is updated. If the symbols are weak, this would be incorrect. If they are |
||
| 49 | /// strong, then one will be replaced at all references to the other, and so |
||
| 50 | /// direct callsites will now see one or the other symbol, and no update is |
||
| 51 | /// necessary. Note that if we were guaranteed unique names, we could just |
||
| 52 | /// compare those, but this would not work for stripped bitcodes or for those |
||
| 53 | /// few symbols without a name. |
||
| 54 | class GlobalNumberState { |
||
| 55 | struct Config : ValueMapConfig<GlobalValue *> { |
||
| 56 | enum { FollowRAUW = false }; |
||
| 57 | }; |
||
| 58 | |||
| 59 | // Each GlobalValue is mapped to an identifier. The Config ensures when RAUW |
||
| 60 | // occurs, the mapping does not change. Tracking changes is unnecessary, and |
||
| 61 | // also problematic for weak symbols (which may be overwritten). |
||
| 62 | using ValueNumberMap = ValueMap<GlobalValue *, uint64_t, Config>; |
||
| 63 | ValueNumberMap GlobalNumbers; |
||
| 64 | |||
| 65 | // The next unused serial number to assign to a global. |
||
| 66 | uint64_t NextNumber = 0; |
||
| 67 | |||
| 68 | public: |
||
| 69 | GlobalNumberState() = default; |
||
| 70 | |||
| 71 | uint64_t getNumber(GlobalValue* Global) { |
||
| 72 | ValueNumberMap::iterator MapIter; |
||
| 73 | bool Inserted; |
||
| 74 | std::tie(MapIter, Inserted) = GlobalNumbers.insert({Global, NextNumber}); |
||
| 75 | if (Inserted) |
||
| 76 | NextNumber++; |
||
| 77 | return MapIter->second; |
||
| 78 | } |
||
| 79 | |||
| 80 | void erase(GlobalValue *Global) { |
||
| 81 | GlobalNumbers.erase(Global); |
||
| 82 | } |
||
| 83 | |||
| 84 | void clear() { |
||
| 85 | GlobalNumbers.clear(); |
||
| 86 | } |
||
| 87 | }; |
||
| 88 | |||
| 89 | /// FunctionComparator - Compares two functions to determine whether or not |
||
| 90 | /// they will generate machine code with the same behaviour. DataLayout is |
||
| 91 | /// used if available. The comparator always fails conservatively (erring on the |
||
| 92 | /// side of claiming that two functions are different). |
||
| 93 | class FunctionComparator { |
||
| 94 | public: |
||
| 95 | FunctionComparator(const Function *F1, const Function *F2, |
||
| 96 | GlobalNumberState* GN) |
||
| 97 | : FnL(F1), FnR(F2), GlobalNumbers(GN) {} |
||
| 98 | |||
| 99 | /// Test whether the two functions have equivalent behaviour. |
||
| 100 | int compare(); |
||
| 101 | |||
| 102 | /// Hash a function. Equivalent functions will have the same hash, and unequal |
||
| 103 | /// functions will have different hashes with high probability. |
||
| 104 | using FunctionHash = uint64_t; |
||
| 105 | static FunctionHash functionHash(Function &); |
||
| 106 | |||
| 107 | protected: |
||
| 108 | /// Start the comparison. |
||
| 109 | void beginCompare() { |
||
| 110 | sn_mapL.clear(); |
||
| 111 | sn_mapR.clear(); |
||
| 112 | } |
||
| 113 | |||
| 114 | /// Compares the signature and other general attributes of the two functions. |
||
| 115 | int compareSignature() const; |
||
| 116 | |||
| 117 | /// Test whether two basic blocks have equivalent behaviour. |
||
| 118 | int cmpBasicBlocks(const BasicBlock *BBL, const BasicBlock *BBR) const; |
||
| 119 | |||
| 120 | /// Constants comparison. |
||
| 121 | /// Its analog to lexicographical comparison between hypothetical numbers |
||
| 122 | /// of next format: |
||
| 123 | /// <bitcastability-trait><raw-bit-contents> |
||
| 124 | /// |
||
| 125 | /// 1. Bitcastability. |
||
| 126 | /// Check whether L's type could be losslessly bitcasted to R's type. |
||
| 127 | /// On this stage method, in case when lossless bitcast is not possible |
||
| 128 | /// method returns -1 or 1, thus also defining which type is greater in |
||
| 129 | /// context of bitcastability. |
||
| 130 | /// Stage 0: If types are equal in terms of cmpTypes, then we can go straight |
||
| 131 | /// to the contents comparison. |
||
| 132 | /// If types differ, remember types comparison result and check |
||
| 133 | /// whether we still can bitcast types. |
||
| 134 | /// Stage 1: Types that satisfies isFirstClassType conditions are always |
||
| 135 | /// greater then others. |
||
| 136 | /// Stage 2: Vector is greater then non-vector. |
||
| 137 | /// If both types are vectors, then vector with greater bitwidth is |
||
| 138 | /// greater. |
||
| 139 | /// If both types are vectors with the same bitwidth, then types |
||
| 140 | /// are bitcastable, and we can skip other stages, and go to contents |
||
| 141 | /// comparison. |
||
| 142 | /// Stage 3: Pointer types are greater than non-pointers. If both types are |
||
| 143 | /// pointers of the same address space - go to contents comparison. |
||
| 144 | /// Different address spaces: pointer with greater address space is |
||
| 145 | /// greater. |
||
| 146 | /// Stage 4: Types are neither vectors, nor pointers. And they differ. |
||
| 147 | /// We don't know how to bitcast them. So, we better don't do it, |
||
| 148 | /// and return types comparison result (so it determines the |
||
| 149 | /// relationship among constants we don't know how to bitcast). |
||
| 150 | /// |
||
| 151 | /// Just for clearance, let's see how the set of constants could look |
||
| 152 | /// on single dimension axis: |
||
| 153 | /// |
||
| 154 | /// [NFCT], [FCT, "others"], [FCT, pointers], [FCT, vectors] |
||
| 155 | /// Where: NFCT - Not a FirstClassType |
||
| 156 | /// FCT - FirstClassTyp: |
||
| 157 | /// |
||
| 158 | /// 2. Compare raw contents. |
||
| 159 | /// It ignores types on this stage and only compares bits from L and R. |
||
| 160 | /// Returns 0, if L and R has equivalent contents. |
||
| 161 | /// -1 or 1 if values are different. |
||
| 162 | /// Pretty trivial: |
||
| 163 | /// 2.1. If contents are numbers, compare numbers. |
||
| 164 | /// Ints with greater bitwidth are greater. Ints with same bitwidths |
||
| 165 | /// compared by their contents. |
||
| 166 | /// 2.2. "And so on". Just to avoid discrepancies with comments |
||
| 167 | /// perhaps it would be better to read the implementation itself. |
||
| 168 | /// 3. And again about overall picture. Let's look back at how the ordered set |
||
| 169 | /// of constants will look like: |
||
| 170 | /// [NFCT], [FCT, "others"], [FCT, pointers], [FCT, vectors] |
||
| 171 | /// |
||
| 172 | /// Now look, what could be inside [FCT, "others"], for example: |
||
| 173 | /// [FCT, "others"] = |
||
| 174 | /// [ |
||
| 175 | /// [double 0.1], [double 1.23], |
||
| 176 | /// [i32 1], [i32 2], |
||
| 177 | /// { double 1.0 }, ; StructTyID, NumElements = 1 |
||
| 178 | /// { i32 1 }, ; StructTyID, NumElements = 1 |
||
| 179 | /// { double 1, i32 1 }, ; StructTyID, NumElements = 2 |
||
| 180 | /// { i32 1, double 1 } ; StructTyID, NumElements = 2 |
||
| 181 | /// ] |
||
| 182 | /// |
||
| 183 | /// Let's explain the order. Float numbers will be less than integers, just |
||
| 184 | /// because of cmpType terms: FloatTyID < IntegerTyID. |
||
| 185 | /// Floats (with same fltSemantics) are sorted according to their value. |
||
| 186 | /// Then you can see integers, and they are, like a floats, |
||
| 187 | /// could be easy sorted among each others. |
||
| 188 | /// The structures. Structures are grouped at the tail, again because of their |
||
| 189 | /// TypeID: StructTyID > IntegerTyID > FloatTyID. |
||
| 190 | /// Structures with greater number of elements are greater. Structures with |
||
| 191 | /// greater elements going first are greater. |
||
| 192 | /// The same logic with vectors, arrays and other possible complex types. |
||
| 193 | /// |
||
| 194 | /// Bitcastable constants. |
||
| 195 | /// Let's assume, that some constant, belongs to some group of |
||
| 196 | /// "so-called-equal" values with different types, and at the same time |
||
| 197 | /// belongs to another group of constants with equal types |
||
| 198 | /// and "really" equal values. |
||
| 199 | /// |
||
| 200 | /// Now, prove that this is impossible: |
||
| 201 | /// |
||
| 202 | /// If constant A with type TyA is bitcastable to B with type TyB, then: |
||
| 203 | /// 1. All constants with equal types to TyA, are bitcastable to B. Since |
||
| 204 | /// those should be vectors (if TyA is vector), pointers |
||
| 205 | /// (if TyA is pointer), or else (if TyA equal to TyB), those types should |
||
| 206 | /// be equal to TyB. |
||
| 207 | /// 2. All constants with non-equal, but bitcastable types to TyA, are |
||
| 208 | /// bitcastable to B. |
||
| 209 | /// Once again, just because we allow it to vectors and pointers only. |
||
| 210 | /// This statement could be expanded as below: |
||
| 211 | /// 2.1. All vectors with equal bitwidth to vector A, has equal bitwidth to |
||
| 212 | /// vector B, and thus bitcastable to B as well. |
||
| 213 | /// 2.2. All pointers of the same address space, no matter what they point to, |
||
| 214 | /// bitcastable. So if C is pointer, it could be bitcasted to A and to B. |
||
| 215 | /// So any constant equal or bitcastable to A is equal or bitcastable to B. |
||
| 216 | /// QED. |
||
| 217 | /// |
||
| 218 | /// In another words, for pointers and vectors, we ignore top-level type and |
||
| 219 | /// look at their particular properties (bit-width for vectors, and |
||
| 220 | /// address space for pointers). |
||
| 221 | /// If these properties are equal - compare their contents. |
||
| 222 | int cmpConstants(const Constant *L, const Constant *R) const; |
||
| 223 | |||
| 224 | /// Compares two global values by number. Uses the GlobalNumbersState to |
||
| 225 | /// identify the same gobals across function calls. |
||
| 226 | int cmpGlobalValues(GlobalValue *L, GlobalValue *R) const; |
||
| 227 | |||
| 228 | /// Assign or look up previously assigned numbers for the two values, and |
||
| 229 | /// return whether the numbers are equal. Numbers are assigned in the order |
||
| 230 | /// visited. |
||
| 231 | /// Comparison order: |
||
| 232 | /// Stage 0: Value that is function itself is always greater then others. |
||
| 233 | /// If left and right values are references to their functions, then |
||
| 234 | /// they are equal. |
||
| 235 | /// Stage 1: Constants are greater than non-constants. |
||
| 236 | /// If both left and right are constants, then the result of |
||
| 237 | /// cmpConstants is used as cmpValues result. |
||
| 238 | /// Stage 2: InlineAsm instances are greater than others. If both left and |
||
| 239 | /// right are InlineAsm instances, InlineAsm* pointers casted to |
||
| 240 | /// integers and compared as numbers. |
||
| 241 | /// Stage 3: For all other cases we compare order we meet these values in |
||
| 242 | /// their functions. If right value was met first during scanning, |
||
| 243 | /// then left value is greater. |
||
| 244 | /// In another words, we compare serial numbers, for more details |
||
| 245 | /// see comments for sn_mapL and sn_mapR. |
||
| 246 | int cmpValues(const Value *L, const Value *R) const; |
||
| 247 | |||
| 248 | /// Compare two Instructions for equivalence, similar to |
||
| 249 | /// Instruction::isSameOperationAs. |
||
| 250 | /// |
||
| 251 | /// Stages are listed in "most significant stage first" order: |
||
| 252 | /// On each stage below, we do comparison between some left and right |
||
| 253 | /// operation parts. If parts are non-equal, we assign parts comparison |
||
| 254 | /// result to the operation comparison result and exit from method. |
||
| 255 | /// Otherwise we proceed to the next stage. |
||
| 256 | /// Stages: |
||
| 257 | /// 1. Operations opcodes. Compared as numbers. |
||
| 258 | /// 2. Number of operands. |
||
| 259 | /// 3. Operation types. Compared with cmpType method. |
||
| 260 | /// 4. Compare operation subclass optional data as stream of bytes: |
||
| 261 | /// just convert it to integers and call cmpNumbers. |
||
| 262 | /// 5. Compare in operation operand types with cmpType in |
||
| 263 | /// most significant operand first order. |
||
| 264 | /// 6. Last stage. Check operations for some specific attributes. |
||
| 265 | /// For example, for Load it would be: |
||
| 266 | /// 6.1.Load: volatile (as boolean flag) |
||
| 267 | /// 6.2.Load: alignment (as integer numbers) |
||
| 268 | /// 6.3.Load: ordering (as underlying enum class value) |
||
| 269 | /// 6.4.Load: synch-scope (as integer numbers) |
||
| 270 | /// 6.5.Load: range metadata (as integer ranges) |
||
| 271 | /// On this stage its better to see the code, since its not more than 10-15 |
||
| 272 | /// strings for particular instruction, and could change sometimes. |
||
| 273 | /// |
||
| 274 | /// Sets \p needToCmpOperands to true if the operands of the instructions |
||
| 275 | /// still must be compared afterwards. In this case it's already guaranteed |
||
| 276 | /// that both instructions have the same number of operands. |
||
| 277 | int cmpOperations(const Instruction *L, const Instruction *R, |
||
| 278 | bool &needToCmpOperands) const; |
||
| 279 | |||
| 280 | /// cmpType - compares two types, |
||
| 281 | /// defines total ordering among the types set. |
||
| 282 | /// |
||
| 283 | /// Return values: |
||
| 284 | /// 0 if types are equal, |
||
| 285 | /// -1 if Left is less than Right, |
||
| 286 | /// +1 if Left is greater than Right. |
||
| 287 | /// |
||
| 288 | /// Description: |
||
| 289 | /// Comparison is broken onto stages. Like in lexicographical comparison |
||
| 290 | /// stage coming first has higher priority. |
||
| 291 | /// On each explanation stage keep in mind total ordering properties. |
||
| 292 | /// |
||
| 293 | /// 0. Before comparison we coerce pointer types of 0 address space to |
||
| 294 | /// integer. |
||
| 295 | /// We also don't bother with same type at left and right, so |
||
| 296 | /// just return 0 in this case. |
||
| 297 | /// |
||
| 298 | /// 1. If types are of different kind (different type IDs). |
||
| 299 | /// Return result of type IDs comparison, treating them as numbers. |
||
| 300 | /// 2. If types are integers, check that they have the same width. If they |
||
| 301 | /// are vectors, check that they have the same count and subtype. |
||
| 302 | /// 3. Types have the same ID, so check whether they are one of: |
||
| 303 | /// * Void |
||
| 304 | /// * Float |
||
| 305 | /// * Double |
||
| 306 | /// * X86_FP80 |
||
| 307 | /// * FP128 |
||
| 308 | /// * PPC_FP128 |
||
| 309 | /// * Label |
||
| 310 | /// * Metadata |
||
| 311 | /// We can treat these types as equal whenever their IDs are same. |
||
| 312 | /// 4. If Left and Right are pointers, return result of address space |
||
| 313 | /// comparison (numbers comparison). We can treat pointer types of same |
||
| 314 | /// address space as equal. |
||
| 315 | /// 5. If types are complex. |
||
| 316 | /// Then both Left and Right are to be expanded and their element types will |
||
| 317 | /// be checked with the same way. If we get Res != 0 on some stage, return it. |
||
| 318 | /// Otherwise return 0. |
||
| 319 | /// 6. For all other cases put llvm_unreachable. |
||
| 320 | int cmpTypes(Type *TyL, Type *TyR) const; |
||
| 321 | |||
| 322 | int cmpNumbers(uint64_t L, uint64_t R) const; |
||
| 323 | int cmpAligns(Align L, Align R) const; |
||
| 324 | int cmpAPInts(const APInt &L, const APInt &R) const; |
||
| 325 | int cmpAPFloats(const APFloat &L, const APFloat &R) const; |
||
| 326 | int cmpMem(StringRef L, StringRef R) const; |
||
| 327 | |||
| 328 | // The two functions undergoing comparison. |
||
| 329 | const Function *FnL, *FnR; |
||
| 330 | |||
| 331 | private: |
||
| 332 | int cmpOrderings(AtomicOrdering L, AtomicOrdering R) const; |
||
| 333 | int cmpInlineAsm(const InlineAsm *L, const InlineAsm *R) const; |
||
| 334 | int cmpAttrs(const AttributeList L, const AttributeList R) const; |
||
| 335 | int cmpRangeMetadata(const MDNode *L, const MDNode *R) const; |
||
| 336 | int cmpOperandBundlesSchema(const CallBase &LCS, const CallBase &RCS) const; |
||
| 337 | |||
| 338 | /// Compare two GEPs for equivalent pointer arithmetic. |
||
| 339 | /// Parts to be compared for each comparison stage, |
||
| 340 | /// most significant stage first: |
||
| 341 | /// 1. Address space. As numbers. |
||
| 342 | /// 2. Constant offset, (using GEPOperator::accumulateConstantOffset method). |
||
| 343 | /// 3. Pointer operand type (using cmpType method). |
||
| 344 | /// 4. Number of operands. |
||
| 345 | /// 5. Compare operands, using cmpValues method. |
||
| 346 | int cmpGEPs(const GEPOperator *GEPL, const GEPOperator *GEPR) const; |
||
| 347 | int cmpGEPs(const GetElementPtrInst *GEPL, |
||
| 348 | const GetElementPtrInst *GEPR) const { |
||
| 349 | return cmpGEPs(cast<GEPOperator>(GEPL), cast<GEPOperator>(GEPR)); |
||
| 350 | } |
||
| 351 | |||
| 352 | /// Assign serial numbers to values from left function, and values from |
||
| 353 | /// right function. |
||
| 354 | /// Explanation: |
||
| 355 | /// Being comparing functions we need to compare values we meet at left and |
||
| 356 | /// right sides. |
||
| 357 | /// Its easy to sort things out for external values. It just should be |
||
| 358 | /// the same value at left and right. |
||
| 359 | /// But for local values (those were introduced inside function body) |
||
| 360 | /// we have to ensure they were introduced at exactly the same place, |
||
| 361 | /// and plays the same role. |
||
| 362 | /// Let's assign serial number to each value when we meet it first time. |
||
| 363 | /// Values that were met at same place will be with same serial numbers. |
||
| 364 | /// In this case it would be good to explain few points about values assigned |
||
| 365 | /// to BBs and other ways of implementation (see below). |
||
| 366 | /// |
||
| 367 | /// 1. Safety of BB reordering. |
||
| 368 | /// It's safe to change the order of BasicBlocks in function. |
||
| 369 | /// Relationship with other functions and serial numbering will not be |
||
| 370 | /// changed in this case. |
||
| 371 | /// As follows from FunctionComparator::compare(), we do CFG walk: we start |
||
| 372 | /// from the entry, and then take each terminator. So it doesn't matter how in |
||
| 373 | /// fact BBs are ordered in function. And since cmpValues are called during |
||
| 374 | /// this walk, the numbering depends only on how BBs located inside the CFG. |
||
| 375 | /// So the answer is - yes. We will get the same numbering. |
||
| 376 | /// |
||
| 377 | /// 2. Impossibility to use dominance properties of values. |
||
| 378 | /// If we compare two instruction operands: first is usage of local |
||
| 379 | /// variable AL from function FL, and second is usage of local variable AR |
||
| 380 | /// from FR, we could compare their origins and check whether they are |
||
| 381 | /// defined at the same place. |
||
| 382 | /// But, we are still not able to compare operands of PHI nodes, since those |
||
| 383 | /// could be operands from further BBs we didn't scan yet. |
||
| 384 | /// So it's impossible to use dominance properties in general. |
||
| 385 | mutable DenseMap<const Value*, int> sn_mapL, sn_mapR; |
||
| 386 | |||
| 387 | // The global state we will use |
||
| 388 | GlobalNumberState* GlobalNumbers; |
||
| 389 | }; |
||
| 390 | |||
| 391 | } // end namespace llvm |
||
| 392 | |||
| 393 | #endif // LLVM_TRANSFORMS_UTILS_FUNCTIONCOMPARATOR_H |