Skip to content

Commit fbfe8d5

Browse files
committed
---
yaml --- r: 323183 b: refs/heads/tensorflow-next c: ec3470e h: refs/heads/master i: 323181: 4349731 323179: 9738e5d 323175: 9305c2c 323167: a6e2e61
1 parent bd504ff commit fbfe8d5

File tree

3 files changed

+35
-12
lines changed

3 files changed

+35
-12
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1461,4 +1461,4 @@ refs/heads/master-rebranch: 86e95c23aa0d37f24ec138b7853146c1cead2e40
14611461
refs/heads/rdar-53901732: 9bd06af3284e18a109cdbf9aa59d833b24eeca7b
14621462
refs/heads/revert-26776-subst-always-returns-a-type: 1b8e18fdd391903a348970a4c848995d4cdd789c
14631463
refs/heads/tensorflow-merge: 8b854f62f80d4476cb383d43c4aac2001dde3cec
1464-
refs/heads/tensorflow-next: ded2dcfa61c2a64aa9c8ce56debebb80d63f6c80
1464+
refs/heads/tensorflow-next: ec3470ea6d66099759384a60fbd148544fe79d10

branches/tensorflow-next/lib/IRGen/StructLayout.cpp

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ StructLayout::StructLayout(IRGenModule &IGM,
7878
} else {
7979
MinimumAlign = builder.getAlignment();
8080
MinimumSize = builder.getSize();
81-
SpareBits = std::move(builder.getSpareBits());
81+
SpareBits = builder.getSpareBits();
8282
IsFixedLayout = builder.isFixedLayout();
8383
IsKnownPOD = builder.isPOD();
8484
IsKnownBitwiseTakable = builder.isBitwiseTakable();
@@ -263,9 +263,11 @@ void StructLayoutBuilder::addFixedSizeElement(ElementLayout &elt) {
263263
if (isFixedLayout()) {
264264
auto paddingTy = llvm::ArrayType::get(IGM.Int8Ty, paddingRequired);
265265
StructFields.push_back(paddingTy);
266-
266+
267267
// The padding can be used as spare bits by enum layout.
268-
CurSpareBits.appendSetBits(Size(paddingRequired).getValueInBits());
268+
auto numBits = Size(paddingRequired).getValueInBits();
269+
auto mask = llvm::APInt::getAllOnesValue(numBits);
270+
CurSpareBits.push_back(SpareBitVector::fromAPInt(mask));
269271
}
270272
}
271273

@@ -318,15 +320,15 @@ void StructLayoutBuilder::addElementAtFixedOffset(ElementLayout &elt) {
318320
StructFields.push_back(elt.getType().getStorageType());
319321

320322
// Carry over the spare bits from the element.
321-
CurSpareBits.append(eltTI.getSpareBits());
323+
CurSpareBits.push_back(eltTI.getSpareBits());
322324
}
323325

324326
/// Add an element at a non-fixed offset to the aggregate.
325327
void StructLayoutBuilder::addElementAtNonFixedOffset(ElementLayout &elt) {
326328
assert(!isFixedLayout());
327329
elt.completeNonFixed(elt.getType().isPOD(ResilienceExpansion::Maximal),
328330
NextNonFixedOffsetIndex);
329-
CurSpareBits.clear();
331+
CurSpareBits = SmallVector<SpareBitVector, 8>(); // clear spare bits
330332
}
331333

332334
/// Add a non-fixed-size element to the aggregate at offset zero.
@@ -335,7 +337,7 @@ void StructLayoutBuilder::addNonFixedSizeElementAtOffsetZero(ElementLayout &elt)
335337
assert(!isa<FixedTypeInfo>(elt.getType()));
336338
assert(CurSize.isZero());
337339
elt.completeInitialNonFixedSize(elt.getType().isPOD(ResilienceExpansion::Maximal));
338-
CurSpareBits.clear();
340+
CurSpareBits = SmallVector<SpareBitVector, 8>(); // clear spare bits
339341
}
340342

341343
/// Produce the current fields as an anonymous structure.
@@ -358,3 +360,27 @@ void StructLayoutBuilder::setAsBodyOfStruct(llvm::StructType *type) const {
358360
== CurSize.getValue())
359361
&& "LLVM size of fixed struct type does not match StructLayout size");
360362
}
363+
364+
/// Return the spare bit mask of the structure built so far.
365+
SpareBitVector StructLayoutBuilder::getSpareBits() const {
366+
// Calculate the size up front to reduce possible allocations.
367+
unsigned numBits = 0;
368+
for (auto &v : CurSpareBits) {
369+
numBits += v.size();
370+
}
371+
if (numBits == 0) {
372+
return SpareBitVector();
373+
}
374+
// Assemble the spare bit mask.
375+
auto mask = llvm::APInt::getNullValue(numBits);
376+
unsigned offset = 0;
377+
for (auto &v : CurSpareBits) {
378+
if (v.size() == 0) {
379+
continue;
380+
}
381+
mask.insertBits(v.asAPInt(), offset);
382+
offset += v.size();
383+
}
384+
assert(offset == numBits);
385+
return SpareBitVector::fromAPInt(std::move(mask));
386+
}

branches/tensorflow-next/lib/IRGen/StructLayout.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ class StructLayoutBuilder {
239239
Size CurSize = Size(0);
240240
private:
241241
Alignment CurAlignment = Alignment(1);
242-
SpareBitVector CurSpareBits;
242+
SmallVector<SpareBitVector, 8> CurSpareBits;
243243
unsigned NextNonFixedOffsetIndex = 0;
244244
bool IsFixedLayout = true;
245245
IsPOD_t IsKnownPOD = IsPOD;
@@ -300,12 +300,9 @@ class StructLayoutBuilder {
300300

301301
/// Return the alignment of the structure built so far.
302302
Alignment getAlignment() const { return CurAlignment; }
303-
304-
/// Return the spare bit mask of the structure built so far.
305-
const SpareBitVector &getSpareBits() const { return CurSpareBits; }
306303

307304
/// Return the spare bit mask of the structure built so far.
308-
SpareBitVector &getSpareBits() { return CurSpareBits; }
305+
SpareBitVector getSpareBits() const;
309306

310307
/// Build the current elements as a new anonymous struct type.
311308
llvm::StructType *getAsAnonStruct() const;

0 commit comments

Comments
 (0)