Skip to content

Commit f5db67c

Browse files
committed
[embedded] Fix miscompile in IRGen in offset computation of Builtin.destroyArray
1 parent 4d3307a commit f5db67c

File tree

1 file changed

+9
-4
lines changed

1 file changed

+9
-4
lines changed

lib/IRGen/GenBuiltin.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1103,8 +1103,9 @@ void irgen::emitBuiltinCall(IRGenFunction &IGF, const BuiltinInfo &Builtin,
11031103
IsTriviallyDestroyable)
11041104
return;
11051105

1106-
llvm::Value *firstElem = IGF.Builder.CreateBitCast(
1107-
ptr, elemTI.getStorageType()->getPointerTo());
1106+
llvm::Value *firstElem =
1107+
IGF.Builder.CreatePtrToInt(IGF.Builder.CreateBitCast(
1108+
ptr, elemTI.getStorageType()->getPointerTo()));
11081109

11091110
auto *origBB = IGF.Builder.GetInsertBlock();
11101111
auto *headerBB = IGF.createBasicBlock("loop_header");
@@ -1118,8 +1119,12 @@ void irgen::emitBuiltinCall(IRGenFunction &IGF, const BuiltinInfo &Builtin,
11181119
IGF.Builder.CreateCondBr(cmp, loopBB, exitBB);
11191120

11201121
IGF.Builder.emitBlock(loopBB);
1121-
auto *addr = IGF.Builder.CreateInBoundsGEP(elemTI.getStorageType(),
1122-
firstElem, phi);
1122+
1123+
llvm::Value *offset =
1124+
IGF.Builder.CreateMul(phi, elemTI.getStaticStride(IGF.IGM));
1125+
llvm::Value *added = IGF.Builder.CreateAdd(firstElem, offset);
1126+
llvm::Value *addr = IGF.Builder.CreateIntToPtr(
1127+
added, elemTI.getStorageType()->getPointerTo());
11231128

11241129
bool isOutlined = false;
11251130
elemTI.destroy(IGF, elemTI.getAddressForPointer(addr), elemTy,

0 commit comments

Comments
 (0)