[flang-commits] [flang] [mlir] [Flang][OpenMP] Fix compilation error with integer(kind=8) in LINEAR clause. (PR #182474)

Urvi Rav via flang-commits flang-commits at lists.llvm.org
Fri Feb 20 03:17:29 PST 2026


https://github.com/ravurvi20 updated https://github.com/llvm/llvm-project/pull/182474

>From dacc441738c26f9bbe27feffd893de4c6538e5fd Mon Sep 17 00:00:00 2001
From: urvi-rav <urvi.rav at hpe.com>
Date: Fri, 20 Feb 2026 04:55:17 -0600
Subject: [PATCH] linear clause lowering for 8-byte integer step

---
 flang/test/Lower/OpenMP/simd-linear.f90        | 18 ++++++++++++++++++
 .../mlir/Dialect/OpenMP/OpenMPClauses.td       |  4 ++--
 mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp   |  6 ++++--
 3 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/flang/test/Lower/OpenMP/simd-linear.f90 b/flang/test/Lower/OpenMP/simd-linear.f90
index 2caf1b0ad05fa..820bd4f98af71 100644
--- a/flang/test/Lower/OpenMP/simd-linear.f90
+++ b/flang/test/Lower/OpenMP/simd-linear.f90
@@ -80,3 +80,21 @@ subroutine linear_expr
     !CHECK: } {linear_var_types = [i32]}
     !IMPLICIT: } {linear_var_types = [i32, i32]}
 end subroutine
+
+subroutine simple_linear_i8
+  implicit none
+  integer(kind=8) :: x, y, i
+
+  ! CHECK-LABEL: func.func @_QPsimple_linear_i8
+
+  ! CHECK-DAG: %[[X_ALLOC:.*]] = fir.alloca i64 {bindc_name = "x"
+  ! CHECK: %[[C1_I32:.*]] = arith.constant 1 : i32
+
+  ! CHECK: omp.simd linear(%[[X_DECL:.*]]#0 = %[[C1_I32]] : !fir.ref<i64>) {{.*}}
+
+  !$omp simd linear(x)
+  do i = 1_8, 10_8
+  end do
+
+  ! CHECK: } {linear_var_types = [i64]}
+end subroutine
diff --git a/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td b/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td
index ba52e52ebf58d..91826738e16d3 100644
--- a/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td
+++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td
@@ -770,13 +770,13 @@ class OpenMP_LinearClauseSkip<
   > : OpenMP_Clause<traits, arguments, assemblyFormat, description,
                     extraClassDeclaration> {
   let arguments = (ins Variadic<AnyType>:$linear_vars,
-      Variadic<I32>:$linear_step_vars,
+      Variadic<AnySignlessInteger>:$linear_step_vars,
       OptionalAttr<ArrayAttr>:$linear_var_types);
 
   let optAssemblyFormat = [{
     `linear` `(`
       custom<LinearClause>($linear_vars, type($linear_vars),
-                           $linear_step_vars) `)`
+                           $linear_step_vars, type($linear_step_vars)) `)`
   }];
 
   let description = [{
diff --git a/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp b/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
index 601c970bc8a69..85d10208ebc1d 100644
--- a/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
+++ b/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
@@ -423,7 +423,8 @@ static ParseResult parseLinearClause(
     OpAsmParser &parser,
     SmallVectorImpl<OpAsmParser::UnresolvedOperand> &linearVars,
     SmallVectorImpl<Type> &linearTypes,
-    SmallVectorImpl<OpAsmParser::UnresolvedOperand> &linearStepVars) {
+    SmallVectorImpl<OpAsmParser::UnresolvedOperand> &linearStepVars,
+    SmallVectorImpl<Type> &linearStepTypes) {
   return parser.parseCommaSeparatedList([&]() {
     OpAsmParser::UnresolvedOperand var;
     Type type;
@@ -442,7 +443,8 @@ static ParseResult parseLinearClause(
 /// Print Linear Clause
 static void printLinearClause(OpAsmPrinter &p, Operation *op,
                               ValueRange linearVars, TypeRange linearTypes,
-                              ValueRange linearStepVars) {
+                              ValueRange linearStepVars,
+                              TypeRange linearStepTypes) {
   size_t linearVarsSize = linearVars.size();
   for (unsigned i = 0; i < linearVarsSize; ++i) {
     std::string separator = i == linearVarsSize - 1 ? "" : ", ";



More information about the flang-commits mailing list