[Mlir-commits] [clang] [mlir] [MLIR] Zero-extend unsigned and 1-bit values when translating IntegerAttr (PR #169751)
Andy Kaylor
llvmlistbot at llvm.org
Wed Nov 26 17:04:55 PST 2025
https://github.com/andykaylor created https://github.com/llvm/llvm-project/pull/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.
>From 922635d570bd53e61b5f505a48afb25193805c17 Mon Sep 17 00:00:00 2001
From: Andy Kaylor <akaylor at nvidia.com>
Date: Wed, 26 Nov 2025 14:09:40 -0800
Subject: [PATCH] [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
More information about the Mlir-commits
mailing list