Skip to content

Commit da50d66

Browse files
authored
Merge pull request #23089 from gottesmm/pr-71f5c35dee085d55e543277b2c59a6e48f16840b
2 parents fcaa02f + fd08550 commit da50d66

File tree

1 file changed

+40
-13
lines changed

1 file changed

+40
-13
lines changed

include/swift/SIL/SILBuilder.h

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2257,18 +2257,45 @@ class SILBuilderWithScope : public SILBuilder {
22572257
};
22582258

22592259
class SavedInsertionPointRAII {
2260-
SILBuilder &Builder;
2261-
PointerUnion<SILInstruction *, SILBasicBlock *> SavedIP;
2260+
SILBuilder &builder;
2261+
PointerUnion<SILInstruction *, SILBasicBlock *> savedInsertionPoint;
22622262

22632263
public:
2264-
SavedInsertionPointRAII(SILBuilder &B, SILInstruction *NewIP)
2265-
: Builder(B), SavedIP(&*B.getInsertionPoint()) {
2266-
Builder.setInsertionPoint(NewIP);
2264+
/// Constructor that saves a Builder's insertion point without changing the
2265+
/// builder's underlying insertion point.
2266+
SavedInsertionPointRAII(SILBuilder &B) : builder(B), savedInsertionPoint() {
2267+
// If our builder does not have a valid insertion point, just put nullptr
2268+
// into SavedIP.
2269+
if (!builder.hasValidInsertionPoint()) {
2270+
savedInsertionPoint = static_cast<SILBasicBlock *>(nullptr);
2271+
return;
2272+
}
2273+
2274+
// If we are inserting into the end of the block, stash the insertion block.
2275+
if (builder.insertingAtEndOfBlock()) {
2276+
savedInsertionPoint = builder.getInsertionBB();
2277+
return;
2278+
}
2279+
2280+
// Otherwise, stash the instruction.
2281+
SILInstruction *i = &*builder.getInsertionPoint();
2282+
savedInsertionPoint = i;
2283+
}
2284+
2285+
SavedInsertionPointRAII(SILBuilder &b, SILInstruction *insertionPoint)
2286+
: SavedInsertionPointRAII(b) {
2287+
builder.setInsertionPoint(insertionPoint);
2288+
}
2289+
2290+
SavedInsertionPointRAII(SILBuilder &b, SILBasicBlock *block,
2291+
SILBasicBlock::iterator iter)
2292+
: SavedInsertionPointRAII(b) {
2293+
builder.setInsertionPoint(block, iter);
22672294
}
22682295

2269-
SavedInsertionPointRAII(SILBuilder &B, SILBasicBlock *NewIP)
2270-
: Builder(B), SavedIP(B.getInsertionBB()) {
2271-
Builder.setInsertionPoint(NewIP);
2296+
SavedInsertionPointRAII(SILBuilder &b, SILBasicBlock *insertionBlock)
2297+
: SavedInsertionPointRAII(b) {
2298+
builder.setInsertionPoint(insertionBlock);
22722299
}
22732300

22742301
SavedInsertionPointRAII(const SavedInsertionPointRAII &) = delete;
@@ -2277,12 +2304,12 @@ class SavedInsertionPointRAII {
22772304
SavedInsertionPointRAII &operator=(SavedInsertionPointRAII &&) = delete;
22782305

22792306
~SavedInsertionPointRAII() {
2280-
if (SavedIP.isNull()) {
2281-
Builder.clearInsertionPoint();
2282-
} else if (SavedIP.is<SILInstruction *>()) {
2283-
Builder.setInsertionPoint(SavedIP.get<SILInstruction *>());
2307+
if (savedInsertionPoint.isNull()) {
2308+
builder.clearInsertionPoint();
2309+
} else if (savedInsertionPoint.is<SILInstruction *>()) {
2310+
builder.setInsertionPoint(savedInsertionPoint.get<SILInstruction *>());
22842311
} else {
2285-
Builder.setInsertionPoint(SavedIP.get<SILBasicBlock *>());
2312+
builder.setInsertionPoint(savedInsertionPoint.get<SILBasicBlock *>());
22862313
}
22872314
}
22882315
};

0 commit comments

Comments
 (0)