[clang] [clang] Lower _BitInt(129+) to a different type in LLVM IR (PR #91364)

John McCall via cfe-commits cfe-commits at lists.llvm.org
Wed Jul 10 12:52:55 PDT 2024


================
@@ -107,17 +107,52 @@ llvm::Type *CodeGenTypes::ConvertTypeForMem(QualType T, bool ForBitField) {
     return llvm::IntegerType::get(FixedVT->getContext(), BytePadded);
   }
 
-  // If this is a bool type, or a bit-precise integer type in a bitfield
-  // representation, map this integer to the target-specified size.
----------------
rjmccall wrote:

Let's keep this comment; we just need to update it a little:

```
  // If T is _Bool or a _BitInt type, ConvertType will produce an IR type
  // with the exact semantic bit-width of the AST type; for example,
  // _BitInt(17) will turn into i17.  In memory, however, we need to store
  // such values extended to their full storage size as decided by AST
  // layout; this is an ABI requirement.  Ideally, we would always use an
  // integer type that's just the bit-size of the AST type; for example, if
  // sizeof(_BitInt(17)) == 4, _BitInt(17) would turn into i32.  That is what's
  // returned by convertTypeForLoadStore.  However, that type does not
  // always satisfy the size requirement on memory representation types
  // describe above.  For example, a 32-bit platform might reasonably set
  // sizeof(_BitInt(65)) == 12, but i96 is likely to have to have an alloc size
  // of 16 bytes in the LLVM data layout.  In these cases, we simply return
  // a byte array of the appropriate size.
```

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


More information about the cfe-commits mailing list