================
@@ -118,6 +124,37 @@ llvm::Type *CodeGenTypes::ConvertTypeForMem(QualType T, 
bool ForBitField) {
   return R;
 }
 
+bool CodeGenTypes::LLVMTypeLayoutMatchesAST(QualType ASTTy,
+                                            llvm::Type *LLVMTy) {
+  CharUnits ASTSize = Context.getTypeSizeInChars(ASTTy);
+  CharUnits LLVMSize =
+      CharUnits::fromQuantity(getDataLayout().getTypeAllocSize(LLVMTy));
+  return ASTSize == LLVMSize;
+}
+
+llvm::Type *CodeGenTypes::convertTypeForLoadStore(QualType T,
+                                                  llvm::Type *LLVMTy) {
+  if (!LLVMTy)
+    LLVMTy = ConvertType(T);
+
+  if (!T->isBitIntType() && LLVMTy->isIntegerTy(1))
+    return llvm::IntegerType::get(getLLVMContext(),
+                                  (unsigned)Context.getTypeSize(T));
+
+  if (T->isBitIntType()) {
+    llvm::Type *R = ConvertType(T);
+    if (!LLVMTypeLayoutMatchesAST(T, R))
+      return llvm::Type::getIntNTy(
+          getLLVMContext(), Context.getTypeSizeInChars(T).getQuantity() * 8);
----------------
Fznamznon wrote:

We intend to support all types. In general, _BitInt(N) is lowered to iN type in 
LLVM IR. However it is not possible for certain sizes and some targets now due 
to different alignment defined for iN and _BitInt(N). This now happens for 
_BitInt(>=129) for x86_64 targets. `LLVMTypeLayoutMatchesAST` checks for this 
mismatch. If there is mismatch, say NBytes = sizeof(_BitInt(N)), we use [i8 x 
NBytes] as in-memory type. It is better to load and store value using iNBytes 
type instead of an array type since it is better for optimization and 
guarantees that all bits of the loaded/stores value is valid. For more info, 
please refer to 
https://github.com/llvm/llvm-project/pull/91364#issuecomment-2099351151 as well.

https://github.com/llvm/llvm-project/pull/91364
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to