Skip to content

Commit 7d04806

Browse files
committed
compiler: switch to CreateInBoundsGEP
1 parent 1e40948 commit 7d04806

File tree

1 file changed

+13
-8
lines changed

1 file changed

+13
-8
lines changed

compiler/map.go

+13-8
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,8 @@ func (b *builder) zeroUndefBytes(llvmType llvm.Type, ptr llvm.Value) error {
275275
// we handle nested types. Next, we determine if there are any padding bytes before the next
276276
// element and zero those as well.
277277

278+
zero := llvm.ConstInt(b.ctx.Int32Type(), 0, false)
279+
278280
switch llvmType.TypeKind() {
279281
case llvm.IntegerTypeKind:
280282
// no padding bytes
@@ -286,9 +288,11 @@ func (b *builder) zeroUndefBytes(llvmType llvm.Type, ptr llvm.Value) error {
286288
llvmArrayType := llvmType
287289
llvmElemType := llvmType.ElementType()
288290

291+
zero := llvm.ConstInt(b.ctx.Int32Type(), 0, false)
292+
289293
for i := 0; i < llvmArrayType.ArrayLength(); i++ {
290294
idx := llvm.ConstInt(b.uintptrType, uint64(i), false)
291-
elemPtr := b.CreateGEP(llvmArrayType, ptr, []llvm.Value{idx}, "")
295+
elemPtr := b.CreateInBoundsGEP(llvmArrayType, ptr, []llvm.Value{zero, idx}, "")
292296

293297
// zero any padding bytes in this element
294298
b.zeroUndefBytes(llvmElemType, elemPtr)
@@ -300,21 +304,22 @@ func (b *builder) zeroUndefBytes(llvmType llvm.Type, ptr llvm.Value) error {
300304
llvmElementTypes := llvmStructType.StructElementTypes()
301305

302306
for i := 0; i < llvmStructType.StructElementTypesCount(); i++ {
303-
offset := b.targetData.ElementOffset(llvmStructType, i)
304-
llvmOffset := llvm.ConstInt(b.uintptrType, offset, false)
305-
elemPtr := b.CreateGEP(b.ctx.Int8Type(), ptr, []llvm.Value{llvmOffset}, "")
307+
idx := llvm.ConstInt(b.ctx.Int32Type(), uint64(i), false)
308+
elemPtr := b.CreateInBoundsGEP(llvmType, ptr, []llvm.Value{zero, idx}, "")
306309

307310
// zero any padding bytes in this field
308311
llvmElemType := llvmElementTypes[i]
309312
b.zeroUndefBytes(llvmElemType, elemPtr)
310313

311314
// zero any padding bytes before the next field, if any
312315
if i < numFields-1 {
316+
offset := b.targetData.ElementOffset(llvmStructType, i)
313317
nextOffset := b.targetData.ElementOffset(llvmStructType, i+1)
314318
if storeSize := b.targetData.TypeStoreSize(llvmElemType); offset+storeSize != nextOffset {
315319
n := llvm.ConstInt(b.uintptrType, nextOffset-(offset+storeSize), false)
316-
llvmSize := llvm.ConstInt(b.uintptrType, storeSize, false)
317-
paddingStart := b.CreateGEP(b.ctx.Int8Type(), elemPtr, []llvm.Value{llvmSize}, "")
320+
llvmStoreSize := llvm.ConstInt(b.uintptrType, storeSize, false)
321+
elemPtr = b.CreateBitCast(elemPtr, b.i8ptrType, "")
322+
paddingStart := b.CreateInBoundsGEP(b.i8ptrType, elemPtr, []llvm.Value{llvmStoreSize}, "")
318323
b.createRuntimeCall("memzero", []llvm.Value{paddingStart, n}, "")
319324
}
320325
}
@@ -327,8 +332,8 @@ func (b *builder) zeroUndefBytes(llvmType llvm.Type, ptr llvm.Value) error {
327332

328333
if allocSize != lastElemOffset+lastElemStore {
329334
n := llvm.ConstInt(b.uintptrType, allocSize-(lastElemOffset+lastElemStore), false)
330-
llvmSize := llvm.ConstInt(b.uintptrType, lastElemOffset+lastElemStore, false)
331-
paddingStart := b.CreateGEP(b.ctx.Int8Type(), ptr, []llvm.Value{llvmSize}, "")
335+
llvmStoreSize := llvm.ConstInt(b.uintptrType, lastElemOffset+lastElemStore, false)
336+
paddingStart := b.CreateInBoundsGEP(b.ctx.Int8Type(), ptr, []llvm.Value{llvmStoreSize}, "")
332337
b.createRuntimeCall("memzero", []llvm.Value{paddingStart, n}, "")
333338
}
334339
}

0 commit comments

Comments
 (0)