[flang-commits] [flang] b6c1930 - [mlir][openacc][NFC] Use assembly format for acc.loop

Valentin Clement via flang-commits flang-commits at lists.llvm.org
Mon Apr 17 12:45:12 PDT 2023


Author: Valentin Clement
Date: 2023-04-17T12:45:04-07:00
New Revision: b6c1930d56e879ae1ebb513b8aaaa98a6190bbf3

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

LOG: [mlir][openacc][NFC] Use assembly format for acc.loop

Use the assembly format with custom parser/printer
for specific clauses instead of a full custom parser/printer.

Reviewed By: PeteSteinfeld

Differential Revision: https://reviews.llvm.org/D148391

Added: 
    

Modified: 
    flang/lib/Lower/OpenACC.cpp
    flang/test/Lower/OpenACC/acc-kernels-loop.f90
    flang/test/Lower/OpenACC/acc-loop.f90
    flang/test/Lower/OpenACC/acc-parallel-loop.f90
    flang/test/Lower/OpenACC/acc-serial-loop.f90
    mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
    mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
    mlir/test/Dialect/OpenACC/invalid.mlir
    mlir/test/Dialect/OpenACC/ops.mlir

Removed: 
    


################################################################################
diff  --git a/flang/lib/Lower/OpenACC.cpp b/flang/lib/Lower/OpenACC.cpp
index 48ce1bae1e77f..3a48177942e08 100644
--- a/flang/lib/Lower/OpenACC.cpp
+++ b/flang/lib/Lower/OpenACC.cpp
@@ -263,7 +263,7 @@ createLoopOp(Fortran::lower::AbstractConverter &converter,
   mlir::Value gangStatic;
   llvm::SmallVector<mlir::Value, 2> tileOperands, privateOperands,
       reductionOperands;
-  std::int64_t executionMapping = mlir::acc::OpenACCExecMapping::NONE;
+  bool hasGang = false, hasVector = false, hasWorker = false;
 
   for (const Fortran::parser::AccClause &clause : accClauseList.v) {
     mlir::Location clauseLocation = converter.genLocation(clause.source);
@@ -292,21 +292,21 @@ createLoopOp(Fortran::lower::AbstractConverter &converter,
           }
         }
       }
-      executionMapping |= mlir::acc::OpenACCExecMapping::GANG;
+      hasGang = true;
     } else if (const auto *workerClause =
                    std::get_if<Fortran::parser::AccClause::Worker>(&clause.u)) {
       if (workerClause->v) {
         workerNum = fir::getBase(converter.genExprValue(
             *Fortran::semantics::GetExpr(*workerClause->v), stmtCtx));
       }
-      executionMapping |= mlir::acc::OpenACCExecMapping::WORKER;
+      hasWorker = true;
     } else if (const auto *vectorClause =
                    std::get_if<Fortran::parser::AccClause::Vector>(&clause.u)) {
       if (vectorClause->v) {
         vectorNum = fir::getBase(converter.genExprValue(
             *Fortran::semantics::GetExpr(*vectorClause->v), stmtCtx));
       }
-      executionMapping |= mlir::acc::OpenACCExecMapping::VECTOR;
+      hasVector = true;
     } else if (const auto *tileClause =
                    std::get_if<Fortran::parser::AccClause::Tile>(&clause.u)) {
       const Fortran::parser::AccTileExprList &accTileExprList = tileClause->v;
@@ -350,7 +350,12 @@ createLoopOp(Fortran::lower::AbstractConverter &converter,
   auto loopOp = createRegionOp<mlir::acc::LoopOp, mlir::acc::YieldOp>(
       firOpBuilder, currentLocation, operands, operandSegments);
 
-  loopOp.setExecMappingAttr(firOpBuilder.getI64IntegerAttr(executionMapping));
+  if (hasGang)
+    loopOp.setHasGangAttr(firOpBuilder.getUnitAttr());
+  if (hasWorker)
+    loopOp.setHasWorkerAttr(firOpBuilder.getUnitAttr());
+  if (hasVector)
+    loopOp.setHasVectorAttr(firOpBuilder.getUnitAttr());
 
   // Lower clauses mapped to attributes
   for (const Fortran::parser::AccClause &clause : accClauseList.v) {

diff  --git a/flang/test/Lower/OpenACC/acc-kernels-loop.f90 b/flang/test/Lower/OpenACC/acc-kernels-loop.f90
index e8f6b0d704292..b160fc528070f 100644
--- a/flang/test/Lower/OpenACC/acc-kernels-loop.f90
+++ b/flang/test/Lower/OpenACC/acc-kernels-loop.f90
@@ -471,7 +471,7 @@ subroutine acc_kernels_loop
 
 !CHECK:      acc.kernels {
 !CHECK:        [[GANGNUM1:%.*]] = arith.constant 8 : i32
-!CHECK-NEXT:   acc.loop gang(num=[[GANGNUM1]]: i32) {
+!CHECK-NEXT:   acc.loop gang(num=[[GANGNUM1]] : i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -485,7 +485,7 @@ subroutine acc_kernels_loop
 
 !CHECK:      acc.kernels {
 !CHECK:        [[GANGNUM2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>
-!CHECK-NEXT:   acc.loop gang(num=[[GANGNUM2]]: i32) {
+!CHECK-NEXT:   acc.loop gang(num=[[GANGNUM2]] : i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -524,7 +524,7 @@ subroutine acc_kernels_loop
 
 !CHECK:      acc.kernels {
 !CHECK:        [[CONSTANT128:%.*]] = arith.constant 128 : i32
-!CHECK:        acc.loop vector([[CONSTANT128]]: i32) {
+!CHECK:        acc.loop vector([[CONSTANT128]] : i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -538,7 +538,7 @@ subroutine acc_kernels_loop
 
 !CHECK:      acc.kernels {
 !CHECK:        [[VECTORLENGTH:%.*]] = fir.load %{{.*}} : !fir.ref<i32>
-!CHECK:        acc.loop vector([[VECTORLENGTH]]: i32) {
+!CHECK:        acc.loop vector([[VECTORLENGTH]] : i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -565,7 +565,7 @@ subroutine acc_kernels_loop
 
 !CHECK:      acc.kernels {
 !CHECK:        [[WORKER128:%.*]] = arith.constant 128 : i32
-!CHECK:        acc.loop worker([[WORKER128]]: i32) {
+!CHECK:        acc.loop worker([[WORKER128]] : i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -615,7 +615,7 @@ subroutine acc_kernels_loop
 
 !CHECK:      acc.kernels {
 !CHECK:        [[TILESIZE:%.*]] = arith.constant 2 : i32
-!CHECK:        acc.loop tile([[TILESIZE]]: i32) {
+!CHECK:        acc.loop tile([[TILESIZE]] : i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -629,7 +629,7 @@ subroutine acc_kernels_loop
 
 !CHECK:      acc.kernels {
 !CHECK:        [[TILESIZEM1:%.*]] = arith.constant -1 : i32
-!CHECK:        acc.loop tile([[TILESIZEM1]]: i32) {
+!CHECK:        acc.loop tile([[TILESIZEM1]] : i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -646,7 +646,7 @@ subroutine acc_kernels_loop
 !CHECK:      acc.kernels {
 !CHECK:        [[TILESIZE1:%.*]] = arith.constant 2 : i32
 !CHECK:        [[TILESIZE2:%.*]] = arith.constant 2 : i32
-!CHECK:        acc.loop tile([[TILESIZE1]]: i32, [[TILESIZE2]]: i32) {
+!CHECK:        acc.loop tile([[TILESIZE1]], [[TILESIZE2]] : i32, i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -674,7 +674,7 @@ subroutine acc_kernels_loop
   END DO
 
 !CHECK:      acc.kernels {
-!CHECK:        acc.loop tile(%{{.*}}: i32, %{{.*}}: i32) {
+!CHECK:        acc.loop tile(%{{.*}}, %{{.*}} : i32, i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}

diff  --git a/flang/test/Lower/OpenACC/acc-loop.f90 b/flang/test/Lower/OpenACC/acc-loop.f90
index ac9be539cd6d3..00b295a0899dd 100644
--- a/flang/test/Lower/OpenACC/acc-loop.f90
+++ b/flang/test/Lower/OpenACC/acc-loop.f90
@@ -70,7 +70,7 @@ program acc_loop
   END DO
 
 !CHECK:      [[GANGNUM1:%.*]] = arith.constant 8 : i32
-!CHECK-NEXT: acc.loop gang(num=[[GANGNUM1]]: i32) {
+!CHECK-NEXT: acc.loop gang(num=[[GANGNUM1]] : i32) {
 !CHECK:        fir.do_loop
 !CHECK:        acc.yield
 !CHECK-NEXT: }{{$}}
@@ -81,7 +81,7 @@ program acc_loop
   END DO
 
 !CHECK:      [[GANGNUM2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>
-!CHECK-NEXT: acc.loop gang(num=[[GANGNUM2]]: i32) {
+!CHECK-NEXT: acc.loop gang(num=[[GANGNUM2]] : i32) {
 !CHECK:        fir.do_loop
 !CHECK:        acc.yield
 !CHECK-NEXT: }{{$}}
@@ -91,7 +91,7 @@ program acc_loop
     a(i) = b(i)
   END DO
 
-!CHECK: acc.loop gang(num=%{{.*}}: i32, static=%{{.*}}: i32) {
+!CHECK: acc.loop gang(num=%{{.*}} : i32, static=%{{.*}} : i32) {
 !CHECK:        fir.do_loop
 !CHECK:        acc.yield
 !CHECK-NEXT: }{{$}}
@@ -112,7 +112,7 @@ program acc_loop
   END DO
 
 !CHECK: [[CONSTANT128:%.*]] = arith.constant 128 : i32
-!CHECK:      acc.loop vector([[CONSTANT128]]: i32) {
+!CHECK:      acc.loop vector([[CONSTANT128]] : i32) {
 !CHECK:        fir.do_loop
 !CHECK:        acc.yield
 !CHECK-NEXT: }{{$}}
@@ -123,7 +123,7 @@ program acc_loop
   END DO
 
 !CHECK:      [[VECTORLENGTH:%.*]] = fir.load %{{.*}} : !fir.ref<i32>
-!CHECK:      acc.loop vector([[VECTORLENGTH]]: i32) {
+!CHECK:      acc.loop vector([[VECTORLENGTH]] : i32) {
 !CHECK:        fir.do_loop
 !CHECK:        acc.yield
 !CHECK-NEXT: }{{$}}
@@ -144,7 +144,7 @@ program acc_loop
   END DO
 
 !CHECK: [[WORKER128:%.*]] = arith.constant 128 : i32
-!CHECK:      acc.loop worker([[WORKER128]]: i32) {
+!CHECK:      acc.loop worker([[WORKER128]] : i32) {
 !CHECK:        fir.do_loop
 !CHECK:        acc.yield
 !CHECK-NEXT: }{{$}}
@@ -154,7 +154,7 @@ program acc_loop
     a(i) = b(i)
   END DO
 
-!CHECK:      acc.loop private(%{{.*}}: !fir.ref<!fir.array<10x10xf32>>) {
+!CHECK:      acc.loop private(%{{.*}} : !fir.ref<!fir.array<10x10xf32>>) {
 !CHECK:        fir.do_loop
 !CHECK:        acc.yield
 !CHECK-NEXT: }{{$}}
@@ -164,7 +164,7 @@ program acc_loop
     a(i) = b(i)
   END DO
 
-!CHECK:      acc.loop private(%{{.*}}: !fir.ref<!fir.array<10x10xf32>>, %{{.*}}: !fir.ref<!fir.array<10x10xf32>>) {
+!CHECK:      acc.loop private(%{{.*}}, %{{.*}} : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {
 !CHECK:        fir.do_loop
 !CHECK:        acc.yield
 !CHECK-NEXT: }{{$}}
@@ -174,7 +174,7 @@ program acc_loop
     a(i) = b(i)
   END DO
 
-!CHECK:      acc.loop private(%{{.*}}: !fir.ref<!fir.array<10x10xf32>>, %{{.*}}: !fir.ref<!fir.array<10x10xf32>>) {
+!CHECK:      acc.loop private(%{{.*}}, %{{.*}} : !fir.ref<!fir.array<10x10xf32>>, !fir.ref<!fir.array<10x10xf32>>) {
 !CHECK:        fir.do_loop
 !CHECK:        acc.yield
 !CHECK-NEXT: }{{$}}
@@ -184,7 +184,7 @@ program acc_loop
     a(i) = b(i)
   END DO
 !CHECK:      [[TILESIZE:%.*]] = arith.constant 2 : i32
-!CHECK:      acc.loop tile([[TILESIZE]]: i32) {
+!CHECK:      acc.loop tile([[TILESIZE]] : i32) {
 !CHECK:        fir.do_loop
 !CHECK:        acc.yield
 !CHECK-NEXT: }{{$}}
@@ -194,7 +194,7 @@ program acc_loop
     a(i) = b(i)
   END DO
 !CHECK:      [[TILESIZEM1:%.*]] = arith.constant -1 : i32
-!CHECK:      acc.loop tile([[TILESIZEM1]]: i32) {
+!CHECK:      acc.loop tile([[TILESIZEM1]] : i32) {
 !CHECK:        fir.do_loop
 !CHECK:        acc.yield
 !CHECK-NEXT: }{{$}}
@@ -208,7 +208,7 @@ program acc_loop
 
 !CHECK:      [[TILESIZE1:%.*]] = arith.constant 2 : i32
 !CHECK:      [[TILESIZE2:%.*]] = arith.constant 2 : i32
-!CHECK:      acc.loop tile([[TILESIZE1]]: i32, [[TILESIZE2]]: i32) {
+!CHECK:      acc.loop tile([[TILESIZE1]], [[TILESIZE2]] : i32, i32) {
 !CHECK:        fir.do_loop
 !CHECK:        acc.yield
 !CHECK-NEXT: }{{$}}
@@ -218,7 +218,7 @@ program acc_loop
     a(i) = b(i)
   END DO
 
-!CHECK:      acc.loop tile(%{{.*}}: i32) {
+!CHECK:      acc.loop tile(%{{.*}} : i32) {
 !CHECK:        fir.do_loop
 !CHECK:        acc.yield
 !CHECK-NEXT: }{{$}}
@@ -230,7 +230,7 @@ program acc_loop
     END DO
   END DO
 
-!CHECK:      acc.loop tile(%{{.*}}: i32, %{{.*}}: i32) {
+!CHECK:      acc.loop tile(%{{.*}}, %{{.*}} : i32, i32) {
 !CHECK:        fir.do_loop
 !CHECK:        acc.yield
 !CHECK-NEXT: }{{$}}

diff  --git a/flang/test/Lower/OpenACC/acc-parallel-loop.f90 b/flang/test/Lower/OpenACC/acc-parallel-loop.f90
index f16448fb3d53f..ab662ab35a53e 100644
--- a/flang/test/Lower/OpenACC/acc-parallel-loop.f90
+++ b/flang/test/Lower/OpenACC/acc-parallel-loop.f90
@@ -418,7 +418,7 @@ subroutine acc_parallel_loop
   END DO
 
 !CHECK:      acc.parallel firstprivate([[B]] : !fir.ref<!fir.array<10xf32>>) private([[A]] : !fir.ref<!fir.array<10xf32>>) {
-!CHECK:        acc.loop private([[A]]: !fir.ref<!fir.array<10xf32>>) {
+!CHECK:        acc.loop private([[A]] : !fir.ref<!fir.array<10xf32>>) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -484,7 +484,7 @@ subroutine acc_parallel_loop
 
 !CHECK:      acc.parallel {
 !CHECK:        [[GANGNUM1:%.*]] = arith.constant 8 : i32
-!CHECK-NEXT:   acc.loop gang(num=[[GANGNUM1]]: i32) {
+!CHECK-NEXT:   acc.loop gang(num=[[GANGNUM1]] : i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -498,7 +498,7 @@ subroutine acc_parallel_loop
 
 !CHECK:      acc.parallel {
 !CHECK:        [[GANGNUM2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>
-!CHECK-NEXT:   acc.loop gang(num=[[GANGNUM2]]: i32) {
+!CHECK-NEXT:   acc.loop gang(num=[[GANGNUM2]] : i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -511,7 +511,7 @@ subroutine acc_parallel_loop
   END DO
 
 !CHECK:      acc.parallel {
-!CHECK:        acc.loop gang(num=%{{.*}}: i32, static=%{{.*}}: i32) {
+!CHECK:        acc.loop gang(num=%{{.*}} : i32, static=%{{.*}} : i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -537,7 +537,7 @@ subroutine acc_parallel_loop
 
 !CHECK:      acc.parallel {
 !CHECK:        [[CONSTANT128:%.*]] = arith.constant 128 : i32
-!CHECK:        acc.loop vector([[CONSTANT128]]: i32) {
+!CHECK:        acc.loop vector([[CONSTANT128]] : i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -551,7 +551,7 @@ subroutine acc_parallel_loop
 
 !CHECK:      acc.parallel {
 !CHECK:        [[VECTORLENGTH:%.*]] = fir.load %{{.*}} : !fir.ref<i32>
-!CHECK:        acc.loop vector([[VECTORLENGTH]]: i32) {
+!CHECK:        acc.loop vector([[VECTORLENGTH]] : i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -578,7 +578,7 @@ subroutine acc_parallel_loop
 
 !CHECK:      acc.parallel {
 !CHECK:        [[WORKER128:%.*]] = arith.constant 128 : i32
-!CHECK:        acc.loop worker([[WORKER128]]: i32) {
+!CHECK:        acc.loop worker([[WORKER128]] : i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -628,7 +628,7 @@ subroutine acc_parallel_loop
 
 !CHECK:      acc.parallel {
 !CHECK:        [[TILESIZE:%.*]] = arith.constant 2 : i32
-!CHECK:        acc.loop tile([[TILESIZE]]: i32) {
+!CHECK:        acc.loop tile([[TILESIZE]] : i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -642,7 +642,7 @@ subroutine acc_parallel_loop
 
 !CHECK:      acc.parallel {
 !CHECK:        [[TILESIZEM1:%.*]] = arith.constant -1 : i32
-!CHECK:        acc.loop tile([[TILESIZEM1]]: i32) {
+!CHECK:        acc.loop tile([[TILESIZEM1]] : i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -659,7 +659,7 @@ subroutine acc_parallel_loop
 !CHECK:      acc.parallel {
 !CHECK:        [[TILESIZE1:%.*]] = arith.constant 2 : i32
 !CHECK:        [[TILESIZE2:%.*]] = arith.constant 2 : i32
-!CHECK:        acc.loop tile([[TILESIZE1]]: i32, [[TILESIZE2]]: i32) {
+!CHECK:        acc.loop tile([[TILESIZE1]], [[TILESIZE2]] : i32, i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -672,7 +672,7 @@ subroutine acc_parallel_loop
   END DO
 
 !CHECK:      acc.parallel {
-!CHECK:        acc.loop tile(%{{.*}}: i32) {
+!CHECK:        acc.loop tile(%{{.*}} : i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -687,7 +687,7 @@ subroutine acc_parallel_loop
   END DO
 
 !CHECK:      acc.parallel {
-!CHECK:        acc.loop tile(%{{.*}}: i32, %{{.*}}: i32) {
+!CHECK:        acc.loop tile(%{{.*}}, %{{.*}} : i32, i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}

diff  --git a/flang/test/Lower/OpenACC/acc-serial-loop.f90 b/flang/test/Lower/OpenACC/acc-serial-loop.f90
index e952554c7f48d..c2ee38a7c4f00 100644
--- a/flang/test/Lower/OpenACC/acc-serial-loop.f90
+++ b/flang/test/Lower/OpenACC/acc-serial-loop.f90
@@ -334,7 +334,7 @@ subroutine acc_serial_loop
   END DO
 
 !CHECK:      acc.serial firstprivate([[B]] : !fir.ref<!fir.array<10xf32>>) private([[A]] : !fir.ref<!fir.array<10xf32>>) {
-!CHECK:        acc.loop private([[A]]: !fir.ref<!fir.array<10xf32>>) {
+!CHECK:        acc.loop private([[A]] : !fir.ref<!fir.array<10xf32>>) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -400,7 +400,7 @@ subroutine acc_serial_loop
 
 !CHECK:      acc.serial {
 !CHECK:        [[GANGNUM1:%.*]] = arith.constant 8 : i32
-!CHECK-NEXT:   acc.loop gang(num=[[GANGNUM1]]: i32) {
+!CHECK-NEXT:   acc.loop gang(num=[[GANGNUM1]] : i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -414,7 +414,7 @@ subroutine acc_serial_loop
 
 !CHECK:      acc.serial {
 !CHECK:        [[GANGNUM2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>
-!CHECK-NEXT:   acc.loop gang(num=[[GANGNUM2]]: i32) {
+!CHECK-NEXT:   acc.loop gang(num=[[GANGNUM2]] : i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -427,7 +427,7 @@ subroutine acc_serial_loop
   END DO
 
 !CHECK:      acc.serial {
-!CHECK:        acc.loop gang(num=%{{.*}}: i32, static=%{{.*}}: i32) {
+!CHECK:        acc.loop gang(num=%{{.*}} : i32, static=%{{.*}} : i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -453,7 +453,7 @@ subroutine acc_serial_loop
 
 !CHECK:      acc.serial {
 !CHECK:        [[CONSTANT128:%.*]] = arith.constant 128 : i32
-!CHECK:        acc.loop vector([[CONSTANT128]]: i32) {
+!CHECK:        acc.loop vector([[CONSTANT128]] : i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -467,7 +467,7 @@ subroutine acc_serial_loop
 
 !CHECK:      acc.serial {
 !CHECK:        [[VECTORLENGTH:%.*]] = fir.load %{{.*}} : !fir.ref<i32>
-!CHECK:        acc.loop vector([[VECTORLENGTH]]: i32) {
+!CHECK:        acc.loop vector([[VECTORLENGTH]] : i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -494,7 +494,7 @@ subroutine acc_serial_loop
 
 !CHECK:      acc.serial {
 !CHECK:        [[WORKER128:%.*]] = arith.constant 128 : i32
-!CHECK:        acc.loop worker([[WORKER128]]: i32) {
+!CHECK:        acc.loop worker([[WORKER128]] : i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -544,7 +544,7 @@ subroutine acc_serial_loop
 
 !CHECK:      acc.serial {
 !CHECK:        [[TILESIZE:%.*]] = arith.constant 2 : i32
-!CHECK:        acc.loop tile([[TILESIZE]]: i32) {
+!CHECK:        acc.loop tile([[TILESIZE]] : i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -558,7 +558,7 @@ subroutine acc_serial_loop
 
 !CHECK:      acc.serial {
 !CHECK:        [[TILESIZEM1:%.*]] = arith.constant -1 : i32
-!CHECK:        acc.loop tile([[TILESIZEM1]]: i32) {
+!CHECK:        acc.loop tile([[TILESIZEM1]] : i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -575,7 +575,7 @@ subroutine acc_serial_loop
 !CHECK:      acc.serial {
 !CHECK:        [[TILESIZE1:%.*]] = arith.constant 2 : i32
 !CHECK:        [[TILESIZE2:%.*]] = arith.constant 2 : i32
-!CHECK:        acc.loop tile([[TILESIZE1]]: i32, [[TILESIZE2]]: i32) {
+!CHECK:        acc.loop tile([[TILESIZE1]], [[TILESIZE2]] : i32, i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -588,7 +588,7 @@ subroutine acc_serial_loop
   END DO
 
 !CHECK:      acc.serial {
-!CHECK:        acc.loop tile(%{{.*}}: i32) {
+!CHECK:        acc.loop tile(%{{.*}} : i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}
@@ -603,7 +603,7 @@ subroutine acc_serial_loop
   END DO
 
 !CHECK:      acc.serial {
-!CHECK:        acc.loop tile(%{{.*}}: i32, %{{.*}}: i32) {
+!CHECK:        acc.loop tile(%{{.*}}, %{{.*}} : i32, i32) {
 !CHECK:          fir.do_loop
 !CHECK:          acc.yield
 !CHECK-NEXT:   }{{$}}

diff  --git a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
index b2b3caf10bf7d..1e8e1dee48f92 100644
--- a/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
+++ b/mlir/include/mlir/Dialect/OpenACC/OpenACCOps.td
@@ -547,32 +547,39 @@ def OpenACC_LoopOp : OpenACC_Op<"loop", [AttrSizedOperandSegments]> {
                        UnitAttr:$seq,
                        UnitAttr:$independent,
                        UnitAttr:$auto_,
+                       UnitAttr:$hasGang,
+                       UnitAttr:$hasWorker,
+                       UnitAttr:$hasVector,
                        Variadic<IntOrIndex>:$tileOperands,
                        Variadic<AnyType>:$privateOperands,
                        OptionalAttr<OpenACC_ReductionOpAttr>:$reductionOp,
-                       Variadic<AnyType>:$reductionOperands,
-                       DefaultValuedAttr<I64Attr, "0">:$exec_mapping);
+                       Variadic<AnyType>:$reductionOperands);
 
   let results = (outs Variadic<AnyType>:$results);
 
   let regions = (region AnyRegion:$region);
 
   let extraClassDeclaration = [{
-    static StringRef getCollapseAttrStrName() { return "collapse"; }
-    static StringRef getSeqAttrStrName() { return "seq"; }
-    static StringRef getIndependentAttrStrName() { return "independent"; }
     static StringRef getAutoAttrStrName() { return "auto"; }
-    static StringRef getExecutionMappingAttrStrName() { return "exec_mapping"; }
-    static StringRef getGangKeyword() { return "gang"; }
     static StringRef getGangNumKeyword() { return "num"; }
     static StringRef getGangStaticKeyword() { return "static"; }
-    static StringRef getVectorKeyword() { return "vector"; }
-    static StringRef getWorkerKeyword() { return "worker"; }
-    static StringRef getTileKeyword() { return "tile"; }
-    static StringRef getPrivateKeyword() { return "private"; }
-    static StringRef getReductionKeyword() { return "reduction"; }
   }];
+
   let hasCustomAssemblyFormat = 1;
+  let assemblyFormat = [{
+    oilist(
+        `gang` `` custom<GangClause>($gangNum, type($gangNum), $gangStatic, type($gangStatic), $hasGang)
+      | `worker` `` custom<WorkerClause>($workerNum, type($workerNum), $hasWorker)
+      | `vector` `` custom<VectorClause>($vectorLength, type($vectorLength), $hasVector)
+      | `private` `(` $privateOperands `:` type($privateOperands) `)`
+      | `tile` `(` $tileOperands `:` type($tileOperands) `)`
+      | `reduction` `(` $reductionOperands `:` type($reductionOperands) `)`
+    )
+    $region
+    ( `(` type($results)^ `)` )?
+    attr-dict-with-keyword
+  }];
+
   let hasVerifier = 1;
 }
 

diff  --git a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
index 82b358d659a24..4b3b43881975a 100644
--- a/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
+++ b/mlir/lib/Dialect/OpenACC/IR/OpenACC.cpp
@@ -52,85 +52,6 @@ static ParseResult parseRegions(OpAsmParser &parser, OperationState &state,
   return success();
 }
 
-static ParseResult
-parseOperandList(OpAsmParser &parser, StringRef keyword,
-                 SmallVectorImpl<OpAsmParser::UnresolvedOperand> &args,
-                 SmallVectorImpl<Type> &argTypes, OperationState &result) {
-  if (failed(parser.parseOptionalKeyword(keyword)))
-    return success();
-
-  if (failed(parser.parseLParen()))
-    return failure();
-
-  // Exit early if the list is empty.
-  if (succeeded(parser.parseOptionalRParen()))
-    return success();
-
-  if (failed(parser.parseCommaSeparatedList([&]() {
-        OpAsmParser::UnresolvedOperand arg;
-        Type type;
-
-        if (parser.parseOperand(arg, /*allowResultNumber=*/false) ||
-            parser.parseColonType(type))
-          return failure();
-
-        args.push_back(arg);
-        argTypes.push_back(type);
-        return success();
-      })) ||
-      failed(parser.parseRParen()))
-    return failure();
-
-  return parser.resolveOperands(args, argTypes, parser.getCurrentLocation(),
-                                result.operands);
-}
-
-static void printOperandList(Operation::operand_range operands,
-                             StringRef listName, OpAsmPrinter &printer) {
-
-  if (!operands.empty()) {
-    printer << " " << listName << "(";
-    llvm::interleaveComma(operands, printer, [&](Value op) {
-      printer << op << ": " << op.getType();
-    });
-    printer << ")";
-  }
-}
-
-static ParseResult parseOperandAndType(OpAsmParser &parser,
-                                       OperationState &result) {
-  OpAsmParser::UnresolvedOperand operand;
-  Type type;
-  if (parser.parseOperand(operand) || parser.parseColonType(type) ||
-      parser.resolveOperand(operand, type, result.operands))
-    return failure();
-  return success();
-}
-
-/// Parse optional operand and its type wrapped in parenthesis.
-/// Example:
-///   `(` %vectorLength: i64 `)`
-static OptionalParseResult parseOptionalOperandAndType(OpAsmParser &parser,
-                                                       OperationState &result) {
-  if (succeeded(parser.parseOptionalLParen())) {
-    return failure(parseOperandAndType(parser, result) || parser.parseRParen());
-  }
-  return std::nullopt;
-}
-
-/// Parse optional operand with its type prefixed with prefixKeyword `=`.
-/// Example:
-///   num=%gangNum: i32
-static OptionalParseResult parserOptionalOperandAndTypeWithPrefix(
-    OpAsmParser &parser, OperationState &result, StringRef prefixKeyword) {
-  if (succeeded(parser.parseOptionalKeyword(prefixKeyword))) {
-    if (parser.parseEqual() || parseOperandAndType(parser, result))
-      return failure();
-    return success();
-  }
-  return std::nullopt;
-}
-
 static bool isComputeOperation(Operation *op) {
   return isa<acc::ParallelOp>(op) || isa<acc::LoopOp>(op);
 }
@@ -232,180 +153,114 @@ Value KernelsOp::getDataOperand(unsigned i) {
 // LoopOp
 //===----------------------------------------------------------------------===//
 
-/// Parse acc.loop operation
-/// operation := `acc.loop`
-///              (`gang` ( `(` (`num=` value)? (`,` `static=` value `)`)? )? )?
-///              (`vector` ( `(` value `)` )? )? (`worker` (`(` value `)`)? )?
-///              (`vector_length` `(` value `)`)?
-///              (`tile` `(` value-list `)`)?
-///              (`private` `(` value-list `)`)?
-///              (`reduction` `(` value-list `)`)?
-///              region attr-dict?
-ParseResult LoopOp::parse(OpAsmParser &parser, OperationState &result) {
-  Builder &builder = parser.getBuilder();
-  unsigned executionMapping = OpenACCExecMapping::NONE;
-  SmallVector<Type, 8> operandTypes;
-  SmallVector<OpAsmParser::UnresolvedOperand, 8> privateOperands,
-      reductionOperands;
-  SmallVector<OpAsmParser::UnresolvedOperand, 8> tileOperands;
-  OptionalParseResult gangNum, gangStatic, worker, vector;
-
-  // gang?
-  if (succeeded(parser.parseOptionalKeyword(LoopOp::getGangKeyword())))
-    executionMapping |= OpenACCExecMapping::GANG;
-
-  // optional gang operand
+static ParseResult
+parseGangClause(OpAsmParser &parser,
+                std::optional<OpAsmParser::UnresolvedOperand> &gangNum,
+                Type &gangNumType,
+                std::optional<OpAsmParser::UnresolvedOperand> &gangStatic,
+                Type &gangStaticType, UnitAttr &hasGang) {
+  hasGang = UnitAttr::get(parser.getBuilder().getContext());
+  // optional gang operands
   if (succeeded(parser.parseOptionalLParen())) {
-    gangNum = parserOptionalOperandAndTypeWithPrefix(
-        parser, result, LoopOp::getGangNumKeyword());
-    if (gangNum.has_value() && failed(*gangNum))
-      return failure();
+    if (succeeded(parser.parseOptionalKeyword(LoopOp::getGangNumKeyword()))) {
+      if (parser.parseEqual())
+        return failure();
+      gangNum = OpAsmParser::UnresolvedOperand{};
+      if (parser.parseOperand(*gangNum) || parser.parseColonType(gangNumType))
+        return failure();
+    } else {
+      gangNum = std::nullopt;
+    }
     // FIXME: Comma should require subsequent operands.
     (void)parser.parseOptionalComma();
-    gangStatic = parserOptionalOperandAndTypeWithPrefix(
-        parser, result, LoopOp::getGangStaticKeyword());
-    if (gangStatic.has_value() && failed(*gangStatic))
-      return failure();
+    if (succeeded(
+            parser.parseOptionalKeyword(LoopOp::getGangStaticKeyword()))) {
+      gangStatic = OpAsmParser::UnresolvedOperand{};
+      if (parser.parseEqual())
+        return failure();
+      gangStatic = OpAsmParser::UnresolvedOperand{};
+      if (parser.parseOperand(*gangStatic) ||
+          parser.parseColonType(gangStaticType))
+        return failure();
+    }
     // FIXME: Why allow optional last commas?
     (void)parser.parseOptionalComma();
     if (failed(parser.parseRParen()))
       return failure();
   }
-
-  // worker?
-  if (succeeded(parser.parseOptionalKeyword(LoopOp::getWorkerKeyword())))
-    executionMapping |= OpenACCExecMapping::WORKER;
-
-  // optional worker operand
-  worker = parseOptionalOperandAndType(parser, result);
-  if (worker.has_value() && failed(*worker))
-    return failure();
-
-  // vector?
-  if (succeeded(parser.parseOptionalKeyword(LoopOp::getVectorKeyword())))
-    executionMapping |= OpenACCExecMapping::VECTOR;
-
-  // optional vector operand
-  vector = parseOptionalOperandAndType(parser, result);
-  if (vector.has_value() && failed(*vector))
-    return failure();
-
-  // tile()?
-  if (failed(parseOperandList(parser, LoopOp::getTileKeyword(), tileOperands,
-                              operandTypes, result)))
-    return failure();
-
-  // private()?
-  if (failed(parseOperandList(parser, LoopOp::getPrivateKeyword(),
-                              privateOperands, operandTypes, result)))
-    return failure();
-
-  // reduction()?
-  if (failed(parseOperandList(parser, LoopOp::getReductionKeyword(),
-                              reductionOperands, operandTypes, result)))
-    return failure();
-
-  if (executionMapping != acc::OpenACCExecMapping::NONE)
-    result.addAttribute(LoopOp::getExecutionMappingAttrStrName(),
-                        builder.getI64IntegerAttr(executionMapping));
-
-  // Parse optional results in case there is a reduce.
-  if (parser.parseOptionalArrowTypeList(result.types))
-    return failure();
-
-  if (failed(parseRegions<LoopOp>(parser, result)))
-    return failure();
-
-  result.addAttribute(LoopOp::getOperandSegmentSizeAttr(),
-                      builder.getDenseI32ArrayAttr(
-                          {static_cast<int32_t>(gangNum.has_value() ? 1 : 0),
-                           static_cast<int32_t>(gangStatic.has_value() ? 1 : 0),
-                           static_cast<int32_t>(worker.has_value() ? 1 : 0),
-                           static_cast<int32_t>(vector.has_value() ? 1 : 0),
-                           static_cast<int32_t>(tileOperands.size()),
-                           static_cast<int32_t>(privateOperands.size()),
-                           static_cast<int32_t>(reductionOperands.size())}));
-
-  if (failed(parser.parseOptionalAttrDictWithKeyword(result.attributes)))
-    return failure();
-
   return success();
 }
 
-void LoopOp::print(OpAsmPrinter &printer) {
-  unsigned execMapping = getExecMapping();
-  if (execMapping & OpenACCExecMapping::GANG) {
-    printer << " " << LoopOp::getGangKeyword();
-    Value gangNum = getGangNum();
-    Value gangStatic = getGangStatic();
-
-    // Print optional gang operands
-    if (gangNum || gangStatic) {
-      printer << "(";
-      if (gangNum) {
-        printer << LoopOp::getGangNumKeyword() << "=" << gangNum << ": "
-                << gangNum.getType();
-        if (gangStatic)
-          printer << ", ";
-      }
+void printGangClause(OpAsmPrinter &p, Operation *op, Value gangNum,
+                     Type gangNumType, Value gangStatic, Type gangStaticType,
+                     UnitAttr hasGang) {
+  if (gangNum || gangStatic) {
+    p << "(";
+    if (gangNum) {
+      p << LoopOp::getGangNumKeyword() << "=" << gangNum << " : "
+        << gangNumType;
       if (gangStatic)
-        printer << LoopOp::getGangStaticKeyword() << "=" << gangStatic << ": "
-                << gangStatic.getType();
-      printer << ")";
+        p << ", ";
     }
+    if (gangStatic)
+      p << LoopOp::getGangStaticKeyword() << "=" << gangStatic << " : "
+        << gangStaticType;
+    p << ")";
   }
+}
 
-  if (execMapping & OpenACCExecMapping::WORKER) {
-    printer << " " << LoopOp::getWorkerKeyword();
-
-    // Print optional worker operand if present
-    if (Value workerNum = getWorkerNum())
-      printer << "(" << workerNum << ": " << workerNum.getType() << ")";
+static ParseResult
+parseWorkerClause(OpAsmParser &parser,
+                  std::optional<OpAsmParser::UnresolvedOperand> &workerNum,
+                  Type &workerNumType, UnitAttr &hasWorker) {
+  hasWorker = UnitAttr::get(parser.getBuilder().getContext());
+  if (succeeded(parser.parseOptionalLParen())) {
+    workerNum = OpAsmParser::UnresolvedOperand{};
+    if (parser.parseOperand(*workerNum) ||
+        parser.parseColonType(workerNumType) || parser.parseRParen())
+      return failure();
   }
+  return success();
+}
 
-  if (execMapping & OpenACCExecMapping::VECTOR) {
-    printer << " " << LoopOp::getVectorKeyword();
+void printWorkerClause(OpAsmPrinter &p, Operation *op, Value workerNum,
+                       Type workerNumType, UnitAttr hasWorker) {
+  if (workerNum)
+    p << "(" << workerNum << " : " << workerNumType << ")";
+}
 
-    // Print optional vector operand if present
-    if (Value vectorLength = this->getVectorLength())
-      printer << "(" << vectorLength << ": " << vectorLength.getType() << ")";
+static ParseResult
+parseVectorClause(OpAsmParser &parser,
+                  std::optional<OpAsmParser::UnresolvedOperand> &vectorLength,
+                  Type &vectorLengthType, UnitAttr &hasVector) {
+  hasVector = UnitAttr::get(parser.getBuilder().getContext());
+  if (succeeded(parser.parseOptionalLParen())) {
+    vectorLength = OpAsmParser::UnresolvedOperand{};
+    if (parser.parseOperand(*vectorLength) ||
+        parser.parseColonType(vectorLengthType) || parser.parseRParen())
+      return failure();
   }
+  return success();
+}
 
-  // tile()?
-  printOperandList(getTileOperands(), LoopOp::getTileKeyword(), printer);
-
-  // private()?
-  printOperandList(getPrivateOperands(), LoopOp::getPrivateKeyword(), printer);
-
-  // reduction()?
-  printOperandList(getReductionOperands(), LoopOp::getReductionKeyword(),
-                   printer);
-
-  if (getNumResults() > 0)
-    printer << " -> (" << getResultTypes() << ")";
-
-  printer << ' ';
-  printer.printRegion(getRegion(),
-                      /*printEntryBlockArgs=*/false,
-                      /*printBlockTerminators=*/true);
-
-  printer.printOptionalAttrDictWithKeyword(
-      (*this)->getAttrs(), {LoopOp::getExecutionMappingAttrStrName(),
-                            LoopOp::getOperandSegmentSizeAttr()});
+void printVectorClause(OpAsmPrinter &p, Operation *op, Value vectorLength,
+                       Type vectorLengthType, UnitAttr hasVector) {
+  if (vectorLength)
+    p << "(" << vectorLength << " : " << vectorLengthType << ")";
 }
 
 LogicalResult acc::LoopOp::verify() {
   // auto, independent and seq attribute are mutually exclusive.
   if ((getAuto_() && (getIndependent() || getSeq())) ||
       (getIndependent() && getSeq())) {
-    return emitError("only one of " + acc::LoopOp::getAutoAttrStrName() + ", " +
-                     acc::LoopOp::getIndependentAttrStrName() + ", " +
-                     acc::LoopOp::getSeqAttrStrName() +
-                     " can be present at the same time");
+    return emitError() << "only one of \"" << acc::LoopOp::getAutoAttrStrName()
+                       << "\", " << getIndependentAttrName() << ", "
+                       << getSeqAttrName()
+                       << " can be present at the same time";
   }
 
   // Gang, worker and vector are incompatible with seq.
-  if (getSeq() && getExecMapping() != OpenACCExecMapping::NONE)
+  if (getSeq() && (getHasGang() || getHasWorker() || getHasVector()))
     return emitError("gang, worker or vector cannot appear with the seq attr");
 
   // Check non-empty body().

diff  --git a/mlir/test/Dialect/OpenACC/invalid.mlir b/mlir/test/Dialect/OpenACC/invalid.mlir
index e99508b18ecde..d7dc39c280a2d 100644
--- a/mlir/test/Dialect/OpenACC/invalid.mlir
+++ b/mlir/test/Dialect/OpenACC/invalid.mlir
@@ -62,7 +62,7 @@ acc.loop {
 
 // -----
 
-// expected-error at +1 {{only one of auto, independent, seq can be present at the same time}}
+// expected-error at +1 {{only one of "auto", "independent", "seq" can be present at the same time}}
 acc.loop {
   acc.yield
 } attributes {auto_, seq}

diff  --git a/mlir/test/Dialect/OpenACC/ops.mlir b/mlir/test/Dialect/OpenACC/ops.mlir
index c1eaa499496e0..b1ee051699a8b 100644
--- a/mlir/test/Dialect/OpenACC/ops.mlir
+++ b/mlir/test/Dialect/OpenACC/ops.mlir
@@ -250,11 +250,11 @@ func.func @testloopop() -> () {
     "test.openacc_dummy_op"() : () -> ()
     acc.yield
   }
-  acc.loop tile(%i64Value: i64, %i64Value: i64) {
+  acc.loop tile(%i64Value, %i64Value : i64, i64) {
     "test.openacc_dummy_op"() : () -> ()
     acc.yield
   }
-  acc.loop tile(%i32Value: i32, %i32Value: i32) {
+  acc.loop tile(%i32Value, %i32Value : i32, i32) {
     "test.openacc_dummy_op"() : () -> ()
     acc.yield
   }
@@ -268,55 +268,55 @@ func.func @testloopop() -> () {
 // CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
 // CHECK-NEXT:   acc.yield
 // CHECK-NEXT: }
-// CHECK:      acc.loop gang(num=[[I64VALUE]]: i64) {
+// CHECK:      acc.loop gang(num=[[I64VALUE]] : i64) {
 // CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
 // CHECK-NEXT:   acc.yield
 // CHECK-NEXT: }
-// CHECK:      acc.loop gang(static=[[I64VALUE]]: i64) {
+// CHECK:      acc.loop gang(static=[[I64VALUE]] : i64) {
 // CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
 // CHECK-NEXT:   acc.yield
 // CHECK-NEXT: }
-// CHECK:      acc.loop worker([[I64VALUE]]: i64) {
+// CHECK:      acc.loop worker([[I64VALUE]] : i64) {
 // CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
 // CHECK-NEXT:   acc.yield
 // CHECK-NEXT: }
-// CHECK:      acc.loop worker([[I32VALUE]]: i32) {
+// CHECK:      acc.loop worker([[I32VALUE]] : i32) {
 // CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
 // CHECK-NEXT:   acc.yield
 // CHECK-NEXT: }
-// CHECK:      acc.loop worker([[IDXVALUE]]: index) {
+// CHECK:      acc.loop worker([[IDXVALUE]] : index) {
 // CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
 // CHECK-NEXT:   acc.yield
 // CHECK-NEXT: }
-// CHECK:      acc.loop vector([[I64VALUE]]: i64) {
+// CHECK:      acc.loop vector([[I64VALUE]] : i64) {
 // CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
 // CHECK-NEXT:   acc.yield
 // CHECK-NEXT: }
-// CHECK:      acc.loop vector([[I32VALUE]]: i32) {
+// CHECK:      acc.loop vector([[I32VALUE]] : i32) {
 // CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
 // CHECK-NEXT:   acc.yield
 // CHECK-NEXT: }
-// CHECK:      acc.loop vector([[IDXVALUE]]: index) {
+// CHECK:      acc.loop vector([[IDXVALUE]] : index) {
 // CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
 // CHECK-NEXT:   acc.yield
 // CHECK-NEXT: }
-// CHECK:      acc.loop gang(num=[[I64VALUE]]: i64) worker vector {
+// CHECK:      acc.loop gang(num=[[I64VALUE]] : i64) worker vector {
 // CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
 // CHECK-NEXT:   acc.yield
 // CHECK-NEXT: }
-// CHECK:      acc.loop gang(num=[[I64VALUE]]: i64, static=[[I64VALUE]]: i64) worker([[I64VALUE]]: i64) vector([[I64VALUE]]: i64) {
+// CHECK:      acc.loop gang(num=[[I64VALUE]] : i64, static=[[I64VALUE]] : i64) worker([[I64VALUE]] : i64) vector([[I64VALUE]] : i64) {
 // CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
 // CHECK-NEXT:   acc.yield
 // CHECK-NEXT: }
-// CHECK:      acc.loop gang(num=[[I32VALUE]]: i32, static=[[IDXVALUE]]: index) {
+// CHECK:      acc.loop gang(num=[[I32VALUE]] : i32, static=[[IDXVALUE]] : index) {
 // CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
 // CHECK-NEXT:   acc.yield
 // CHECK-NEXT: }
-// CHECK:      acc.loop tile([[I64VALUE]]: i64, [[I64VALUE]]: i64) {
+// CHECK:      acc.loop tile([[I64VALUE]], [[I64VALUE]] : i64, i64) {
 // CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
 // CHECK-NEXT:   acc.yield
 // CHECK-NEXT: }
-// CHECK:      acc.loop tile([[I32VALUE]]: i32, [[I32VALUE]]: i32) {
+// CHECK:      acc.loop tile([[I32VALUE]], [[I32VALUE]] : i32, i32) {
 // CHECK-NEXT:   "test.openacc_dummy_op"() : () -> ()
 // CHECK-NEXT:   acc.yield
 // CHECK-NEXT: }


        


More information about the flang-commits mailing list