Skip to content

Commit 9052652

Browse files
committed
add the prepareInitialization builtin.
It is like `zeroInitializer`, but does not actually initialize the memory. It only indicates to mandatory passes that the memory is going to be initialized.
1 parent 3cbe94d commit 9052652

File tree

12 files changed

+24
-5
lines changed

12 files changed

+24
-5
lines changed

SwiftCompilerSources/Sources/Optimizer/Utilities/AddressUtils.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ extension AddressUseVisitor {
159159
.GenericFDiv, .GenericMul, .GenericFMul, .GenericSDiv,
160160
.GenericExactSDiv, .GenericShl, .GenericSRem, .GenericSub,
161161
.GenericFSub, .GenericUDiv, .GenericExactUDiv, .GenericURem,
162-
.GenericFRem, .GenericXor, .TaskRunInline, .ZeroInitializer,
162+
.GenericFRem, .GenericXor, .TaskRunInline, .ZeroInitializer, .PrepareInitialization,
163163
.GetEnumTag, .InjectEnumTag:
164164
return leafAddressUse(of: operand)
165165
default:

include/swift/AST/Builtins.def

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -851,6 +851,10 @@ BUILTIN_MISC_OPERATION_WITH_SILGEN(Alignof, "alignof", "n", Special)
851851
/// own rules.
852852
BUILTIN_MISC_OPERATION_WITH_SILGEN(ZeroInitializer, "zeroInitializer", "n", Special)
853853

854+
/// Like `zeroInitializer`, but does not actually initialize the memory.
855+
/// It only indicates to mandatory passes that the memory is going to be initialized.
856+
BUILTIN_MISC_OPERATION(PrepareInitialization, "prepareInitialization", "n", Special)
857+
854858
// getCurrentExecutor: () async -> Builtin.Executor?
855859
//
856860
// Retrieve the SerialExecutorRef on which the current asynchronous

include/swift/SIL/AddressWalker.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,7 @@ TransitiveAddressWalker<Impl>::walk(SILValue projectedAddress) {
288288
case BuiltinValueKind::GenericXor:
289289
case BuiltinValueKind::TaskRunInline:
290290
case BuiltinValueKind::ZeroInitializer:
291+
case BuiltinValueKind::PrepareInitialization:
291292
case BuiltinValueKind::GetEnumTag:
292293
case BuiltinValueKind::InjectEnumTag:
293294
case BuiltinValueKind::AddressOfRawLayout:

lib/AST/Builtins.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3132,6 +3132,7 @@ ValueDecl *swift::getBuiltinValueDecl(ASTContext &Context, Identifier Id) {
31323132
return getUnreachableOperation(Context, Id);
31333133

31343134
case BuiltinValueKind::ZeroInitializer:
3135+
case BuiltinValueKind::PrepareInitialization:
31353136
return getZeroInitializerOperation(Context, Id);
31363137

31373138
case BuiltinValueKind::Once:

lib/IRGen/GenBuiltin.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1353,7 +1353,13 @@ void irgen::emitBuiltinCall(IRGenFunction &IGF, const BuiltinInfo &Builtin,
13531353
}
13541354
return;
13551355
}
1356-
1356+
1357+
if (Builtin.ID == BuiltinValueKind::PrepareInitialization) {
1358+
ASSERT(args.size() > 0 && "only address-variant of prepareInitialization is supported");
1359+
(void)args.claimNext();
1360+
return;
1361+
}
1362+
13571363
if (Builtin.ID == BuiltinValueKind::GetObjCTypeEncoding) {
13581364
(void)args.claimAll();
13591365
Type valueTy = substitutions.getReplacementTypes()[0];

lib/SIL/IR/OperandOwnership.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -917,6 +917,7 @@ BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, GenericXor)
917917
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, ZExt)
918918
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, ZExtOrBitCast)
919919
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, ZeroInitializer)
920+
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, PrepareInitialization)
920921
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, PoundAssert)
921922
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, GlobalStringTablePointer)
922923
BUILTIN_OPERAND_OWNERSHIP(InstantaneousUse, TypePtrAuthDiscriminator)

lib/SIL/IR/SILInstruction.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1009,7 +1009,8 @@ MemoryBehavior SILInstruction::getMemoryBehavior() const {
10091009
if (auto *BI = dyn_cast<BuiltinInst>(this)) {
10101010
// Handle Swift builtin functions.
10111011
const BuiltinInfo &BInfo = BI->getBuiltinInfo();
1012-
if (BInfo.ID == BuiltinValueKind::ZeroInitializer) {
1012+
if (BInfo.ID == BuiltinValueKind::ZeroInitializer ||
1013+
BInfo.ID == BuiltinValueKind::PrepareInitialization) {
10131014
// The address form of `zeroInitializer` writes to its argument to
10141015
// initialize it. The value form has no side effects.
10151016
return BI->getArguments().size() > 0

lib/SIL/IR/ValueOwnership.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -694,6 +694,7 @@ UNOWNED_OR_NONE_DEPENDING_ON_RESULT(ShuffleVector)
694694
// fields. The initialized value is immediately consumed by an assignment, so it
695695
// must be owned.
696696
OWNED_OR_NONE_DEPENDING_ON_RESULT(ZeroInitializer)
697+
OWNED_OR_NONE_DEPENDING_ON_RESULT(PrepareInitialization)
697698
#undef OWNED_OR_NONE_DEPENDING_ON_RESULT
698699

699700
#define BUILTIN(X,Y,Z)

lib/SIL/Utils/MemAccessUtils.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2657,6 +2657,7 @@ static void visitBuiltinAddress(BuiltinInst *builtin,
26572657

26582658
// zeroInitializer with an address operand zeroes the address.
26592659
case BuiltinValueKind::ZeroInitializer:
2660+
case BuiltinValueKind::PrepareInitialization:
26602661
if (builtin->getAllOperands().size() > 0) {
26612662
visitor(&builtin->getAllOperands()[0]);
26622663
}

lib/SIL/Verifier/SILVerifier.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2387,7 +2387,8 @@ class SILVerifier : public SILVerifierBase<SILVerifier> {
23872387
auto builtinKind = BI->getBuiltinKind();
23882388
auto arguments = BI->getArguments();
23892389

2390-
if (builtinKind == BuiltinValueKind::ZeroInitializer) {
2390+
if (builtinKind == BuiltinValueKind::ZeroInitializer ||
2391+
builtinKind == BuiltinValueKind::PrepareInitialization) {
23912392
require(!BI->getSubstitutions(),
23922393
"zeroInitializer has no generic arguments as a SIL builtin");
23932394
if (arguments.size() == 0) {

lib/SILOptimizer/Mandatory/MoveOnlyUtils.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,8 @@ bool noncopyable::memInstMustInitialize(Operand *memOper) {
218218
}
219219
case SILInstructionKind::BuiltinInst: {
220220
auto bi = cast<BuiltinInst>(memInst);
221-
if (bi->getBuiltinKind() == BuiltinValueKind::ZeroInitializer) {
221+
if (bi->getBuiltinKind() == BuiltinValueKind::ZeroInitializer ||
222+
bi->getBuiltinKind() == BuiltinValueKind::PrepareInitialization) {
222223
// `zeroInitializer` with an address operand zeroes out the address operand
223224
return true;
224225
}

lib/SILOptimizer/Transforms/AccessEnforcementReleaseSinking.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ static bool isBarrier(SILInstruction *inst) {
135135
case BuiltinValueKind::IsNegative:
136136
case BuiltinValueKind::WordAtIndex:
137137
case BuiltinValueKind::ZeroInitializer:
138+
case BuiltinValueKind::PrepareInitialization:
138139
case BuiltinValueKind::Once:
139140
case BuiltinValueKind::OnceWithContext:
140141
case BuiltinValueKind::GetObjCTypeEncoding:

0 commit comments

Comments
 (0)