Author: Andy Kaylor
Date: 2025-12-04T12:05:36-08:00
New Revision: 2a10e91d8f2edf20bb0e6680e668b327334dc6e8

URL: 
https://github.com/llvm/llvm-project/commit/2a10e91d8f2edf20bb0e6680e668b327334dc6e8
DIFF: 
https://github.com/llvm/llvm-project/commit/2a10e91d8f2edf20bb0e6680e668b327334dc6e8.diff

LOG: [MLIR] Zero-extend unsigned and 1-bit values when translating IntegerAttr 
(#169751)

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.

Added: 
    

Modified: 
    clang/test/CIR/CodeGen/globals.cpp
    flang/test/Fir/global.fir
    mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
    mlir/test/Target/LLVMIR/llvmir.mlir

Removed: 
    


################################################################################
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/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>>

diff  --git a/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp 
b/mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
index 6a8b3858136ff..fad9bd6b78018 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 
diff erent 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 = 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


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to