Line data Source code
1 : //===- InstCombineWorklist.h - Worklist for InstCombine pass ----*- C++ -*-===//
2 : //
3 : // The LLVM Compiler Infrastructure
4 : //
5 : // This file is distributed under the University of Illinois Open Source
6 : // License. See LICENSE.TXT for details.
7 : //
8 : //===----------------------------------------------------------------------===//
9 :
10 : #ifndef LLVM_TRANSFORMS_INSTCOMBINE_INSTCOMBINEWORKLIST_H
11 : #define LLVM_TRANSFORMS_INSTCOMBINE_INSTCOMBINEWORKLIST_H
12 :
13 : #include "llvm/ADT/DenseMap.h"
14 : #include "llvm/ADT/STLExtras.h"
15 : #include "llvm/ADT/SmallVector.h"
16 : #include "llvm/IR/Instruction.h"
17 : #include "llvm/Support/Compiler.h"
18 : #include "llvm/Support/Debug.h"
19 : #include "llvm/Support/raw_ostream.h"
20 :
21 : #define DEBUG_TYPE "instcombine"
22 :
23 : namespace llvm {
24 :
25 : /// InstCombineWorklist - This is the worklist management logic for
26 : /// InstCombine.
27 : class InstCombineWorklist {
28 : SmallVector<Instruction*, 256> Worklist;
29 : DenseMap<Instruction*, unsigned> WorklistMap;
30 :
31 : public:
32 13317 : InstCombineWorklist() = default;
33 :
34 1324 : InstCombineWorklist(InstCombineWorklist &&) = default;
35 : InstCombineWorklist &operator=(InstCombineWorklist &&) = default;
36 :
37 28533011 : bool isEmpty() const { return Worklist.empty(); }
38 :
39 : /// Add - Add the specified instruction to the worklist if it isn't already
40 : /// in it.
41 1218418 : void Add(Instruction *I) {
42 1218418 : if (WorklistMap.insert(std::make_pair(I, Worklist.size())).second) {
43 : LLVM_DEBUG(dbgs() << "IC: ADD: " << *I << '\n');
44 834222 : Worklist.push_back(I);
45 : }
46 1218418 : }
47 :
48 : void AddValue(Value *V) {
49 : if (Instruction *I = dyn_cast<Instruction>(V))
50 21 : Add(I);
51 : }
52 :
53 : /// AddInitialGroup - Add the specified batch of stuff in reverse order.
54 : /// which should only be done when the worklist is empty and when the group
55 : /// has no duplicates.
56 334019 : void AddInitialGroup(ArrayRef<Instruction *> List) {
57 : assert(Worklist.empty() && "Worklist must be empty to add initial group");
58 334019 : Worklist.reserve(List.size()+16);
59 334019 : WorklistMap.reserve(List.size());
60 : LLVM_DEBUG(dbgs() << "IC: ADDING: " << List.size()
61 : << " instrs to worklist\n");
62 : unsigned Idx = 0;
63 27698789 : for (Instruction *I : reverse(List)) {
64 27364770 : WorklistMap.insert(std::make_pair(I, Idx++));
65 27364770 : Worklist.push_back(I);
66 : }
67 334019 : }
68 :
69 : // Remove - remove I from the worklist if it exists.
70 245317 : void Remove(Instruction *I) {
71 245317 : DenseMap<Instruction*, unsigned>::iterator It = WorklistMap.find(I);
72 245317 : if (It == WorklistMap.end()) return; // Not in worklist.
73 :
74 : // Don't bother moving everything down, just null out the slot.
75 27032 : Worklist[It->second] = nullptr;
76 :
77 : WorklistMap.erase(It);
78 : }
79 :
80 28198992 : Instruction *RemoveOne() {
81 28198992 : Instruction *I = Worklist.pop_back_val();
82 28198992 : WorklistMap.erase(I);
83 28198992 : return I;
84 : }
85 :
86 : /// AddUsersToWorkList - When an instruction is simplified, add all users of
87 : /// the instruction to the work lists because they might get more simplified
88 : /// now.
89 : ///
90 436479 : void AddUsersToWorkList(Instruction &I) {
91 826633 : for (User *U : I.users())
92 390154 : Add(cast<Instruction>(U));
93 436479 : }
94 :
95 :
96 : /// Zap - check that the worklist is empty and nuke the backing store for
97 : /// the map if it is large.
98 : void Zap() {
99 : assert(WorklistMap.empty() && "Worklist empty, but map not?");
100 :
101 : // Do an explicit clear, this shrinks the map if needed.
102 334019 : WorklistMap.clear();
103 : }
104 : };
105 :
106 : } // end namespace llvm.
107 :
108 : #undef DEBUG_TYPE
109 :
110 : #endif
|