File tree Expand file tree Collapse file tree 3 files changed +28
-19
lines changed Expand file tree Collapse file tree 3 files changed +28
-19
lines changed Original file line number Diff line number Diff line change @@ -8094,6 +8094,15 @@ inline EnumElementDecl **SelectEnumInstBase::getEnumElementDeclStorage() {
8094
8094
llvm_unreachable (" Unhandled SelectEnumInstBase subclass" );
8095
8095
}
8096
8096
8097
+ inline void SILSuccessor::pred_iterator::cacheBasicBlock () {
8098
+ if (Cur != nullptr ) {
8099
+ Block = Cur->ContainingInst ->getParent ();
8100
+ assert (Block != nullptr );
8101
+ } else {
8102
+ Block = nullptr ;
8103
+ }
8104
+ }
8105
+
8097
8106
} // end swift namespace
8098
8107
8099
8108
// ===----------------------------------------------------------------------===//
Original file line number Diff line number Diff line change @@ -87,33 +87,45 @@ class SILSuccessor {
87
87
class pred_iterator {
88
88
SILSuccessor *Cur;
89
89
90
+ // Cache the basic block to avoid repeated pointer chasing.
91
+ SILBasicBlock *Block;
92
+
93
+ void cacheBasicBlock ();
94
+
90
95
public:
91
96
using difference_type = std::ptrdiff_t ;
92
97
using value_type = SILBasicBlock *;
93
98
using pointer = SILBasicBlock **;
94
99
using reference = SILBasicBlock *&;
95
100
using iterator_category = std::forward_iterator_tag;
96
101
97
- pred_iterator (SILSuccessor *Cur = 0 ) : Cur(Cur) {}
102
+ pred_iterator (SILSuccessor *Cur = nullptr ) : Cur(Cur), Block(nullptr ) {
103
+ cacheBasicBlock ();
104
+ }
98
105
99
106
bool operator ==(pred_iterator I2) const { return Cur == I2.Cur ; }
100
107
bool operator !=(pred_iterator I2) const { return Cur != I2.Cur ; }
101
108
102
109
pred_iterator &operator ++() {
103
- assert (Cur && " Trying to advance past end " );
110
+ assert (Cur != nullptr );
104
111
Cur = Cur->Next ;
112
+ cacheBasicBlock ();
105
113
return *this ;
106
114
}
107
115
108
- pred_iterator operator ++(int ) {
109
- pred_iterator copy = *this ;
110
- ++*this ;
116
+ pred_iterator operator +(unsigned distance) const {
117
+ auto copy = *this ;
118
+ if (distance == 0 )
119
+ return copy;
120
+ do {
121
+ copy.Cur = Cur->Next ;
122
+ } while (--distance > 0 );
123
+ copy.cacheBasicBlock ();
111
124
return copy;
112
125
}
113
126
114
127
SILSuccessor *getSuccessorRef () const { return Cur; }
115
- SILBasicBlock *operator *();
116
- const SILBasicBlock *operator *() const ;
128
+ SILBasicBlock *operator *() const { return Block; }
117
129
};
118
130
};
119
131
Original file line number Diff line number Diff line change @@ -37,15 +37,3 @@ void SILSuccessor::operator=(SILBasicBlock *BB) {
37
37
38
38
SuccessorBlock = BB;
39
39
}
40
-
41
- // Dereferencing the pred_iterator returns the predecessor's SILBasicBlock.
42
- SILBasicBlock *SILSuccessor::pred_iterator::operator *() {
43
- assert (Cur && " Can't deference end (or default constructed) iterator" );
44
- return Cur->ContainingInst ->getParent ();
45
- }
46
-
47
- // Dereferencing the pred_iterator returns the predecessor's SILBasicBlock.
48
- const SILBasicBlock *SILSuccessor::pred_iterator::operator *() const {
49
- assert (Cur && " Can't deference end (or default constructed) iterator" );
50
- return Cur->ContainingInst ->getParent ();
51
- }
You can’t perform that action at this time.
0 commit comments