[clang] [CIR] Update bit-field representation (PR #221030)

Andy Kaylor via cfe-commits cfe-commits at lists.llvm.org
Thu Sep 3 15:05:26 PDT 2026


andykaylor wrote:

> So I don't see any changes to ConstRecordLayout/lowering of initializers, are we just leaving those alone? I guess that sorta makes sense...

The constant record initializers stay the same because the bitfield access unit represents the same type that it did before the change.

> I don't see any 'get-member' changes either though. I would expect (perhaps not today?) that our accesses in CIR do NOT do the bit-fiddling-math and instead do just 'get-member' with an additional index, then handle bit-fiddling during lowering. WDYT?

We have a separate `cir.get_bitfield` that abstracts all of the details of the bit manipulation. It's not affected by this change. The type returned by `cir.get_member` is a pointer to the storage type of the bitfield access unit rather than a pointer to the bitfield type. A bitfield read looks like this (before and after this PR):

```
    %3 = cir.get_member %2[1] {name = "bf2"} : !cir.ptr<!rec_S> -> !cir.ptr<!u32i> loc(#loc7)
    %4 = cir.get_bitfield align(4) (#bfi_bf2, %3 : !cir.ptr<!u32i>) -> !s32i loc(#loc8)
```
https://godbolt.org/z/93o4TKxcz

I think we'll be able to simplify `cir.get_bitfield` after this change lands, but I didn't want to do it here, given how huge this is already. The `cir.bitfield_info` attribute shown above contains information that's already contained in the bitfield type. The only thing it adds is the name of the field. So, we should be able to have `cir.get_member` return a pointer to the bitfield type rather than the storage type and then use that in `cir.get_bitfield` which would only need the index (or offset?) being read and the name of the field.

https://github.com/llvm/llvm-project/pull/221030


More information about the cfe-commits mailing list