================ @@ -570,23 +572,37 @@ class SMTConv { // TODO: Refactor to put elsewhere static inline QualType getAPSIntType(ASTContext &Ctx, const llvm::APSInt &Int) { - return Ctx.getIntTypeForBitwidth(Int.getBitWidth(), Int.isSigned()); + QualType Ty = Ctx.getIntTypeForBitwidth(Int.getBitWidth(), Int.isSigned()); + // If Ty is Null, could be because the original type was a _BitInt. + // Get the bit size and round up to next power of 2, max char size + if (Ty.isNull()) { + unsigned CharTypeSize = Ctx.getTypeSize(Ctx.CharTy); + unsigned Pow2DestWidth = + std::max(llvm::bit_ceil(Int.getBitWidth()), CharTypeSize); + Ty = Ctx.getIntTypeForBitwidth(Pow2DestWidth, Int.isSigned()); + } + return Ty; } // Get the QualTy for the input APSInt, and fix it if it has a bitwidth of 1. static inline std::pair<llvm::APSInt, QualType> fixAPSInt(ASTContext &Ctx, const llvm::APSInt &Int) { llvm::APSInt NewInt; + unsigned APSIntBitwidth = Int.getBitWidth(); + QualType Ty = getAPSIntType(Ctx, Int); // FIXME: This should be a cast from a 1-bit integer type to a boolean type, // but the former is not available in Clang. Instead, extend the APSInt // directly. - if (Int.getBitWidth() == 1 && getAPSIntType(Ctx, Int).isNull()) { + if (APSIntBitwidth == 1 && Ty.isNull()) { NewInt = Int.extend(Ctx.getTypeSize(Ctx.BoolTy)); + Ty = getAPSIntType(Ctx, NewInt); + } else if (!llvm::isPowerOf2_32(APSIntBitwidth) && !Ty.isNull()) { + NewInt = Int.extend(Ctx.getTypeSize(Ty)); } else NewInt = Int; - return std::make_pair(NewInt, getAPSIntType(Ctx, NewInt)); + return std::make_pair(NewInt, Ty); ---------------- steakhal wrote:
I was about to say that this is kinda complicated, but I can see now why. Maybe we could exploit some returns to handle the different cases to simplify this: ``` if (APSIntBitwidth == 1 && Ty.isNull()) return {Int.extend(Ctx.getTypeSize(Ctx.BoolTy)), getAPSIntType(Ctx, NewInt)}; if (!llvm::isPowerOf2_32(APSIntBitwidth) && !Ty.isNull()) return {Int.extend(Ctx.getTypeSize(Ty)), Ty}; return {Int, Ty}; ``` https://github.com/llvm/llvm-project/pull/143310 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits