On Sep 13, 2012, at 12:22 AM, Chandler Carruth wrote:
> With all that discussion, here is an updated patch. I've included most of the 
> tricky test cases described here (where they seemed valuable) along with lots 
> of comments to help document some of this discussion and the conclusions.

+  // See if there are other bits in the bitfield's storage we'll need to load
+  // and mask together with source before storing.
+  if (Info.StorageSize != Info.Size) {
+    assert(Info.StorageSize > Info.Size && "Invalid bitfield size.");

Info.StorageSize is always a multiple of the byte size, right?  If a bitfield
is all alone in its storage unit, shouldn't we be able to avoid the
load/mask/or stuff?

+    // Mask out the original value.
+    Val = Builder.CreateAnd(Val,
+                            ~llvm::APInt::getBitsSet(Info.StorageSize,
+                                                     Info.Offset,
+                                                     Info.Offset + Info.Size),
+                            "bf.clear");

This masking is unnecessary if the value is known to be all-ones.
The backend can do this peephole pretty easily, but it's worth doing
ourselves for -O0 goodness.

+    // Or together the unchanged values and the source value.
+    SrcVal = Builder.CreateOr(Val, SrcVal, "bf.set");

And analogously, this is unnecessary if the value is known to be
all-zeroes.

+  /// The storage size in bits which should be used when accessing this
+  /// bitfield.
+  unsigned StorageSize;

This should document any invariants like "this is always a multiple of
the bit-width of a char".

-    assert(!FD->isBitField() && "Invalid call for bit-field decl!");

Is removing this assertion important?  It's a nice way to ensure that
code isn't naively accessing a bitfield like a normal field.

I'll admit to only skimming right now;  if you want a full review,
feel free to wait longer. :)

John.
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to