|
70 | 70 |
|
71 | 71 | #include "llvm/ADT/SmallVector.h" |
72 | 72 | #include "llvm/ADT/StringRef.h" |
| 73 | +#include "llvm/ADT/Hashing.h" |
73 | 74 | #include "llvm/CodeGen/BasicBlockSectionUtils.h" |
74 | 75 | #include "llvm/CodeGen/BasicBlockSectionsProfileReader.h" |
75 | 76 | #include "llvm/CodeGen/MachineFunction.h" |
76 | 77 | #include "llvm/CodeGen/MachineFunctionPass.h" |
77 | 78 | #include "llvm/CodeGen/Passes.h" |
78 | 79 | #include "llvm/CodeGen/TargetInstrInfo.h" |
79 | 80 | #include "llvm/InitializePasses.h" |
| 81 | +#include "llvm/IR/Constants.h" |
80 | 82 | #include "llvm/Target/TargetMachine.h" |
81 | 83 | #include <optional> |
82 | 84 |
|
@@ -289,12 +291,43 @@ bool llvm::hasInstrProfHashMismatch(MachineFunction &MF) { |
289 | 291 | return false; |
290 | 292 | } |
291 | 293 |
|
| 294 | +void computeBBHash(MachineFunction &MF) { |
| 295 | + for (auto &MBB : MF) { |
| 296 | + llvm::hash_code Hash = llvm::hash_value(0); |
| 297 | + for (const MachineInstr &MI : MBB) { |
| 298 | + if (MI.isPseudo() || MI.isDebugOrPseudoInstr()) |
| 299 | + continue; |
| 300 | + if (MI.isUnconditionalBranch()) |
| 301 | + continue; |
| 302 | + Hash = llvm::hash_combine(Hash, MI.getOpcode()); |
| 303 | + |
| 304 | + for (const MachineOperand &MO : MI.operands()) { |
| 305 | + if (MO.isReg()) { |
| 306 | + Hash = llvm::hash_combine(Hash, MO.getReg()); |
| 307 | + } else if (MO.isImm()) { |
| 308 | + Hash = llvm::hash_combine(Hash, MO.getImm()); |
| 309 | + } else if (MO.isCImm()) { |
| 310 | + Hash = llvm::hash_combine(Hash, MO.getCImm()->getZExtValue()); |
| 311 | + } else if (MO.isFPImm()) { |
| 312 | + Hash = llvm::hash_combine(Hash, MO.getFPImm()->getValueAPF().bitcastToAPInt().getZExtValue()); |
| 313 | + } else if (MO.isGlobal()) { |
| 314 | + Hash = llvm::hash_combine(Hash, MO.getGlobal()->getName()); |
| 315 | + } else if (MO.isSymbol()) { |
| 316 | + Hash = llvm::hash_combine(Hash, MO.getSymbolName()); |
| 317 | + } |
| 318 | + } |
| 319 | + } |
| 320 | + MBB.setHash(Hash); |
| 321 | + } |
| 322 | +} |
| 323 | + |
292 | 324 | // Identify, arrange, and modify basic blocks which need separate sections |
293 | 325 | // according to the specification provided by the -fbasic-block-sections flag. |
294 | 326 | bool BasicBlockSections::handleBBSections(MachineFunction &MF) { |
295 | 327 | auto BBSectionsType = MF.getTarget().getBBSectionsType(); |
296 | 328 | if (BBSectionsType == BasicBlockSection::None) |
297 | 329 | return false; |
| 330 | + computeBBHash(MF); |
298 | 331 |
|
299 | 332 | // Check for source drift. If the source has changed since the profiles |
300 | 333 | // were obtained, optimizing basic blocks might be sub-optimal. |
@@ -384,6 +417,7 @@ bool BasicBlockSections::handleBBAddrMap(MachineFunction &MF) { |
384 | 417 | return false; |
385 | 418 | if (!MF.getTarget().Options.BBAddrMap) |
386 | 419 | return false; |
| 420 | + computeBBHash(MF); |
387 | 421 | MF.RenumberBlocks(); |
388 | 422 | return true; |
389 | 423 | } |
|
0 commit comments