Skip to content

Commit 350107e

Browse files
committed
[embedded] Also cover DestroyArray builtin in embedded Swift mode
1 parent 7a00393 commit 350107e

File tree

4 files changed

+48
-2
lines changed

4 files changed

+48
-2
lines changed

SwiftCompilerSources/Sources/Optimizer/InstructionSimplification/SimplifyBuiltin.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ extension BuiltinInst : OnoneSimplifyable {
3232
.Strideof,
3333
.Alignof:
3434
optimizeTargetTypeConst(context)
35-
case .CopyArray,
35+
case .DestroyArray,
36+
.CopyArray,
3637
.TakeArrayNoAlias,
3738
.TakeArrayFrontToBack,
3839
.TakeArrayBackToFront,

lib/IRGen/GenBuiltin.cpp

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1105,7 +1105,42 @@ void irgen::emitBuiltinCall(IRGenFunction &IGF, const BuiltinInfo &Builtin,
11051105

11061106
auto valueTy = getLoweredTypeAndTypeInfo(IGF.IGM,
11071107
substitutions.getReplacementTypes()[0]);
1108-
1108+
1109+
if (IGF.IGM.Context.LangOpts.hasFeature(Feature::Embedded)) {
1110+
SILType elemTy = valueTy.first;
1111+
const TypeInfo &elemTI = valueTy.second;
1112+
1113+
llvm::Value *firstElem = IGF.Builder.CreateBitCast(
1114+
ptr, elemTI.getStorageType()->getPointerTo());
1115+
1116+
auto *origBB = IGF.Builder.GetInsertBlock();
1117+
auto *headerBB = IGF.createBasicBlock("loop_header");
1118+
auto *loopBB = IGF.createBasicBlock("loop_body");
1119+
auto *exitBB = IGF.createBasicBlock("loop_exit");
1120+
IGF.Builder.CreateBr(headerBB);
1121+
IGF.Builder.emitBlock(headerBB);
1122+
auto *phi = IGF.Builder.CreatePHI(count->getType(), 2);
1123+
phi->addIncoming(llvm::ConstantInt::get(count->getType(), 0), origBB);
1124+
llvm::Value *cmp = IGF.Builder.CreateICmpSLT(phi, count);
1125+
IGF.Builder.CreateCondBr(cmp, loopBB, exitBB);
1126+
1127+
IGF.Builder.emitBlock(loopBB);
1128+
auto *addr = IGF.Builder.CreateInBoundsGEP(elemTI.getStorageType(),
1129+
firstElem, phi);
1130+
1131+
bool isOutlined = false;
1132+
elemTI.destroy(IGF, elemTI.getAddressForPointer(addr), elemTy,
1133+
isOutlined);
1134+
1135+
auto *one = llvm::ConstantInt::get(count->getType(), 1);
1136+
auto *add = IGF.Builder.CreateAdd(phi, one);
1137+
phi->addIncoming(add, loopBB);
1138+
IGF.Builder.CreateBr(headerBB);
1139+
1140+
IGF.Builder.emitBlock(exitBB);
1141+
return;
1142+
}
1143+
11091144
ptr = IGF.Builder.CreateBitCast(ptr,
11101145
valueTy.second.getStorageType()->getPointerTo());
11111146
Address array = valueTy.second.getAddressForPointer(ptr);

test/embedded/array-builtins-no-stdlib.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,16 @@ public func foo(x: Builtin.RawPointer, y: Builtin.RawPointer, count: Builtin.Wor
1616
Builtin.assignCopyArrayFrontToBack(MyStruct.self, x, y, count)
1717
Builtin.assignCopyArrayBackToFront(MyStruct.self, x, y, count)
1818
Builtin.assignTakeArray(MyStruct.self, x, y, count)
19+
Builtin.destroyArray(MyStruct.self, x, count)
1920
}
2021

2122
// No runtime calls should be present.
2223
// CHECK-NOT: @swift_arrayInitWithCopy
24+
// CHECK-NOT: @swift_arrayInitWithTakeNoAlias
25+
// CHECK-NOT: @swift_arrayInitWithTakeFrontToBack
26+
// CHECK-NOT: @swift_arrayInitWithTakeBackToFront
2327
// CHECK-NOT: @swift_arrayAssignWithCopyNoAlias
2428
// CHECK-NOT: @swift_arrayAssignWithCopyFrontToBack
2529
// CHECK-NOT: @swift_arrayAssignWithCopyBackToFront
2630
// CHECK-NOT: @swift_arrayAssignWithTake
31+
// CHECK-NOT: @swift_arrayDestroy

test/embedded/array-builtins2-no-stdlib.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,17 @@ public struct MyGenericStruct<T> {
2424
Builtin.assignCopyArrayFrontToBack(T.self, x, y, count)
2525
Builtin.assignCopyArrayBackToFront(T.self, x, y, count)
2626
Builtin.assignTakeArray(T.self, x, y, count)
27+
Builtin.destroyArray(T.self, x, count)
2728
}
2829
}
2930

3031
// No runtime calls should be present.
3132
// CHECK-NOT: @swift_arrayInitWithCopy
33+
// CHECK-NOT: @swift_arrayInitWithTakeNoAlias
34+
// CHECK-NOT: @swift_arrayInitWithTakeFrontToBack
35+
// CHECK-NOT: @swift_arrayInitWithTakeBackToFront
3236
// CHECK-NOT: @swift_arrayAssignWithCopyNoAlias
3337
// CHECK-NOT: @swift_arrayAssignWithCopyFrontToBack
3438
// CHECK-NOT: @swift_arrayAssignWithCopyBackToFront
3539
// CHECK-NOT: @swift_arrayAssignWithTake
40+
// CHECK-NOT: @swift_arrayDestroy

0 commit comments

Comments
 (0)