Skip to content

Commit 2fe1ee5

Browse files
committed
Swift SIL: add a few Builder functions
* add `createAllocStack` * add `createDeallocStack` * add `createCopyAddr` * add `@discardableResult` to the existing `createDeallocStackRef`
1 parent 0e59dde commit 2fe1ee5

File tree

4 files changed

+62
-3
lines changed

4 files changed

+62
-3
lines changed

SwiftCompilerSources/Sources/Optimizer/FunctionPasses/StackPromotion.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,13 +175,13 @@ func tryPromoteAlloc(_ allocRef: AllocRefInstBase,
175175
for exitInst in innerRange.exits {
176176
if !deadEndBlocks.isDeadEnd(exitInst.block) {
177177
let builder = Builder(at: exitInst, context)
178-
_ = builder.createDeallocStackRef(allocRef)
178+
builder.createDeallocStackRef(allocRef)
179179
}
180180
}
181181

182182
for endInst in innerRange.ends {
183183
Builder.insert(after: endInst, location: allocRef.location, context) {
184-
(builder) in _ = builder.createDeallocStackRef(allocRef)
184+
(builder) in builder.createDeallocStackRef(allocRef)
185185
}
186186
}
187187

SwiftCompilerSources/Sources/SIL/Builder.swift

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,23 @@ public struct Builder {
8282
let literal = SILBuilder_createIntegerLiteral(bridged, type.bridged, value)
8383
return literal.getAs(IntegerLiteralInst.self)
8484
}
85-
85+
86+
public func createAllocStack(_ type: Type, hasDynamicLifetime: Bool = false,
87+
isLexical: Bool = false, wasMoved: Bool = false) -> AllocStackInst {
88+
notifyInstructionsChanged()
89+
let dr = SILBuilder_createAllocStack(bridged, type.bridged, hasDynamicLifetime ? 1 : 0,
90+
isLexical ? 1 : 0, wasMoved ? 1 : 0)
91+
return dr.getAs(AllocStackInst.self)
92+
}
93+
94+
@discardableResult
95+
public func createDeallocStack(_ operand: Value) -> DeallocStackInst {
96+
notifyInstructionsChanged()
97+
let dr = SILBuilder_createDeallocStack(bridged, operand.bridged)
98+
return dr.getAs(DeallocStackInst.self)
99+
}
100+
101+
@discardableResult
86102
public func createDeallocStackRef(_ operand: Value) -> DeallocStackRefInst {
87103
notifyInstructionsChanged()
88104
let dr = SILBuilder_createDeallocStackRef(bridged, operand.bridged)
@@ -113,6 +129,14 @@ public struct Builder {
113129
return SILBuilder_createCopyValue(bridged, operand.bridged).getAs(CopyValueInst.self)
114130
}
115131

132+
@discardableResult
133+
public func createCopyAddr(from fromAddr: Value, to toAddr: Value,
134+
takeSource: Bool = false, initializeDest: Bool = false) -> CopyAddrInst {
135+
notifyInstructionsChanged()
136+
return SILBuilder_createCopyAddr(bridged, fromAddr.bridged, toAddr.bridged,
137+
takeSource ? 1 : 0, initializeDest ? 1 : 0).getAs(CopyAddrInst.self)
138+
}
139+
116140
@discardableResult
117141
public func createDestroyValue(operand: Value) -> DestroyValueInst {
118142
notifyInstructionsChanged()

include/swift/SIL/SILBridging.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,11 @@ BridgedInstruction SILBuilder_createCondFail(BridgedBuilder builder,
412412
BridgedValue condition, llvm::StringRef message);
413413
BridgedInstruction SILBuilder_createIntegerLiteral(BridgedBuilder builder,
414414
BridgedType type, SwiftInt value);
415+
BridgedInstruction SILBuilder_createAllocStack(BridgedBuilder builder,
416+
BridgedType type, SwiftInt hasDynamicLifetime, SwiftInt isLexical,
417+
SwiftInt wasMoved);
418+
BridgedInstruction SILBuilder_createDeallocStack(BridgedBuilder builder,
419+
BridgedValue operand);
415420
BridgedInstruction SILBuilder_createDeallocStackRef(BridgedBuilder builder,
416421
BridgedValue operand);
417422
BridgedInstruction SILBuilder_createUncheckedRefCast(BridgedBuilder builder,
@@ -422,6 +427,9 @@ BridgedInstruction SILBuilder_createFunctionRef(BridgedBuilder builder,
422427
BridgedFunction function);
423428
BridgedInstruction SILBuilder_createCopyValue(BridgedBuilder builder,
424429
BridgedValue op);
430+
BridgedInstruction SILBuilder_createCopyAddr(BridgedBuilder builder,
431+
BridgedValue from, BridgedValue to,
432+
SwiftInt takeSource, SwiftInt initializeDest);
425433
BridgedInstruction SILBuilder_createDestroyValue(BridgedBuilder builder,
426434
BridgedValue op);
427435
BridgedInstruction SILBuilder_createApply(BridgedBuilder builder,

lib/SIL/Utils/SILBridging.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -960,6 +960,23 @@ BridgedInstruction SILBuilder_createIntegerLiteral(BridgedBuilder b,
960960
getSILType(type), value)};
961961
}
962962

963+
BridgedInstruction SILBuilder_createAllocStack(BridgedBuilder b,
964+
BridgedType type, SwiftInt hasDynamicLifetime, SwiftInt isLexical,
965+
SwiftInt wasMoved) {
966+
SILBuilder builder(castToInst(b.insertBefore), castToBasicBlock(b.insertAtEnd),
967+
getSILDebugScope(b.loc));
968+
return {builder.createAllocStack(getRegularLocation(b.loc), getSILType(type),
969+
None, hasDynamicLifetime != 0, isLexical != 0, wasMoved != 0)};
970+
}
971+
972+
BridgedInstruction SILBuilder_createDeallocStack(BridgedBuilder b,
973+
BridgedValue operand) {
974+
SILBuilder builder(castToInst(b.insertBefore), castToBasicBlock(b.insertAtEnd),
975+
getSILDebugScope(b.loc));
976+
return {builder.createDeallocStack(getRegularLocation(b.loc),
977+
castToSILValue(operand))};
978+
}
979+
963980
BridgedInstruction SILBuilder_createDeallocStackRef(BridgedBuilder b,
964981
BridgedValue operand) {
965982
SILBuilder builder(castToInst(b.insertBefore), castToBasicBlock(b.insertAtEnd),
@@ -1005,6 +1022,16 @@ BridgedInstruction SILBuilder_createCopyValue(BridgedBuilder b,
10051022
castToSILValue(op))};
10061023
}
10071024

1025+
BridgedInstruction SILBuilder_createCopyAddr(BridgedBuilder b,
1026+
BridgedValue from, BridgedValue to,
1027+
SwiftInt takeSource, SwiftInt initializeDest) {
1028+
SILBuilder builder(castToInst(b.insertBefore), castToBasicBlock(b.insertAtEnd),
1029+
getSILDebugScope(b.loc));
1030+
return {builder.createCopyAddr(getRegularLocation(b.loc), castToSILValue(from),
1031+
castToSILValue(to), IsTake_t(takeSource != 0),
1032+
IsInitialization_t(initializeDest != 0))};
1033+
}
1034+
10081035
BridgedInstruction SILBuilder_createDestroyValue(BridgedBuilder b,
10091036
BridgedValue op) {
10101037
SILBuilder builder(castToInst(b.insertBefore), castToBasicBlock(b.insertAtEnd),

0 commit comments

Comments
 (0)