https://github.com/andykaylor updated https://github.com/llvm/llvm-project/pull/169751
>From 922635d570bd53e61b5f505a48afb25193805c17 Mon Sep 17 00:00:00 2001 From: Andy Kaylor <[email protected]> Date: Wed, 26 Nov 2025 14:09:40 -0800 Subject: [PATCH 1/2] [MLIR] Zero-extend unsigned and 1-bit integers when translating to LLVM IR This updates the LLVM IR ConstantInt creation from mlir::IntegerAttr so that unsigned integers and 1-bit integers are zero-extended rather than sign-extended. --- clang/test/CIR/CodeGen/globals.cpp | 6 ++++++ mlir/lib/Target/LLVMIR/ModuleTranslation.cpp | 15 +++++++++++---- mlir/test/Target/LLVMIR/llvmir.mlir | 3 +++ 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/clang/test/CIR/CodeGen/globals.cpp b/clang/test/CIR/CodeGen/globals.cpp index a3e16139a41a9..848cac8a46299 100644 --- a/clang/test/CIR/CodeGen/globals.cpp +++ b/clang/test/CIR/CodeGen/globals.cpp @@ -35,3 +35,9 @@ int *constArrAddr = &arr[2][1]; // LLVM: @constArrAddr = global ptr getelementptr inbounds nuw (i8, ptr @arr, i64 132), align 8 // OGCG: @constArrAddr = global ptr getelementptr (i8, ptr @arr, i64 132), align 8 + +bool bool_global = true; + +// CIR: cir.global external @bool_global = #true {alignment = 1 : i64} +// LLVM: @bool_global = global i8 1, align 1 +// OGCG: @bool_global = global i8 1, align 1 diff --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp index 412a5f76d5753..0d36dcef56123 100644 --- a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp @@ -588,10 +588,17 @@ llvm::Constant *mlir::LLVM::detail::getLLVMConstant( } // For integer types, we allow a mismatch in sizes as the index type in // MLIR might have a different size than the index type in the LLVM module. - if (auto intAttr = dyn_cast<IntegerAttr>(attr)) - return llvm::ConstantInt::get( - llvmType, - intAttr.getValue().sextOrTrunc(llvmType->getIntegerBitWidth())); + if (auto intAttr = dyn_cast<IntegerAttr>(attr)) { + // If the attribute is an unsigned integer or a 1-bit integer, zero-extend + // the value to the bit width of the LLVM type. Otherwise, sign-extend. + auto intTy = mlir::dyn_cast<IntegerType>(intAttr.getType()); + APInt value; + if (intTy && (intTy.isUnsigned() || intTy.getWidth() == 1)) + value = intAttr.getValue().zextOrTrunc(llvmType->getIntegerBitWidth()); + else + value = intAttr.getValue().sextOrTrunc(llvmType->getIntegerBitWidth()); + return llvm::ConstantInt::get(llvmType, value); + } if (auto floatAttr = dyn_cast<FloatAttr>(attr)) { const llvm::fltSemantics &sem = floatAttr.getValue().getSemantics(); // Special case for 8-bit floats, which are represented by integers due to diff --git a/mlir/test/Target/LLVMIR/llvmir.mlir b/mlir/test/Target/LLVMIR/llvmir.mlir index d1ed1b4bfa064..819a514bc8b7e 100644 --- a/mlir/test/Target/LLVMIR/llvmir.mlir +++ b/mlir/test/Target/LLVMIR/llvmir.mlir @@ -78,6 +78,9 @@ llvm.mlir.global internal @f8E8M0FNU_global_as_i8(1.0 : f8E8M0FNU) : i8 // CHECK: @bf16_global_as_i16 = internal global i16 16320 llvm.mlir.global internal @bf16_global_as_i16(1.5 : bf16) : i16 +// CHECK: @bool_global_as_i8 = internal global i8 1 +llvm.mlir.global internal @bool_global_as_i8(true) : i8 + // CHECK: @explicit_undef = global i32 undef llvm.mlir.global external @explicit_undef() : i32 { %0 = llvm.mlir.undef : i32 >From 49c4d1c3871d242ad16aab847950b14f9a2ba4a3 Mon Sep 17 00:00:00 2001 From: Andy Kaylor <[email protected]> Date: Mon, 1 Dec 2025 10:43:25 -0800 Subject: [PATCH 2/2] Fix global.fir test --- flang/test/Fir/global.fir | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flang/test/Fir/global.fir b/flang/test/Fir/global.fir index 598fcb3da60c9..b57d3ed6538b9 100644 --- a/flang/test/Fir/global.fir +++ b/flang/test/Fir/global.fir @@ -50,7 +50,7 @@ fir.global internal @_QEmultiarray : !fir.array<32x32xi32> { fir.has_value %2 : !fir.array<32x32xi32> } -// CHECK: @_QEmasklogical = internal global [32768 x i32] [i32 -1, i32 -1, +// CHECK: @_QEmasklogical = internal global [32768 x i32] [i32 1, i32 1, fir.global internal @_QEmasklogical : !fir.array<32768x!fir.logical<4>> { %true = arith.constant true %0 = fir.undefined !fir.array<32768x!fir.logical<4>> _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
