Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[flang] Introduce hlfir.elemental lowerings to omp.workshare_loop_nest #104748

Merged
merged 1 commit into from
Nov 20, 2024

Conversation

ivanradanov
Copy link
Contributor

@ivanradanov ivanradanov commented Aug 19, 2024

WIP I will be adding unit tests and I am considering if we should have integrations tests for the entire omp.workshare pipeline.

Continuation from #101446

@ivanradanov ivanradanov force-pushed the users/ivanradanov/flang-workshare-hlfir-lower branch from c948ec6 to a687658 Compare August 19, 2024 08:40
@ivanradanov ivanradanov force-pushed the users/ivanradanov/flang-workshare branch from e58e6ec to 8fffc3d Compare August 19, 2024 08:40
@ivanradanov ivanradanov force-pushed the users/ivanradanov/flang-workshare-hlfir-lower branch 3 times, most recently from 414205f to dc0e626 Compare August 21, 2024 14:06
@ivanradanov ivanradanov force-pushed the users/ivanradanov/flang-workshare branch from a45ef32 to f5eaf66 Compare August 21, 2024 14:06
@ivanradanov ivanradanov force-pushed the users/ivanradanov/flang-workshare-hlfir-lower branch from dc0e626 to aa824a0 Compare August 22, 2024 03:48
@ivanradanov ivanradanov force-pushed the users/ivanradanov/flang-workshare branch from f5eaf66 to 1ef3d69 Compare August 22, 2024 03:48
@ivanradanov ivanradanov force-pushed the users/ivanradanov/flang-workshare-hlfir-lower branch from aa824a0 to a942ae8 Compare August 22, 2024 08:59
@ivanradanov ivanradanov force-pushed the users/ivanradanov/flang-workshare branch from 1ef3d69 to acee889 Compare August 22, 2024 08:59
@ivanradanov ivanradanov force-pushed the users/ivanradanov/flang-workshare-hlfir-lower branch from a942ae8 to e0ef194 Compare August 22, 2024 09:08
@ivanradanov ivanradanov force-pushed the users/ivanradanov/flang-workshare branch from acee889 to e56dbd6 Compare August 22, 2024 09:08
@ivanradanov ivanradanov force-pushed the users/ivanradanov/flang-workshare-hlfir-lower branch 3 times, most recently from 7f69c40 to c16dc88 Compare September 23, 2024 07:26
@ivanradanov ivanradanov requested a review from mjklemm September 25, 2024 06:02
@ivanradanov ivanradanov marked this pull request as ready for review September 25, 2024 06:36
@llvmbot llvmbot added flang Flang issues not falling into any other category flang:fir-hlfir flang:openmp labels Sep 25, 2024
@llvmbot
Copy link
Member

llvmbot commented Sep 25, 2024

@llvm/pr-subscribers-flang-fir-hlfir

Author: Ivan R. Ivanov (ivanradanov)

Changes

WIP I will be adding unit tests and I am considering if we should have integrations tests for the entire omp.workshare pipeline.

Continuation from #101446


Full diff: https://github.com/llvm/llvm-project/pull/104748.diff

7 Files Affected:

  • (modified) flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp (+3-1)
  • (modified) flang/lib/Optimizer/HLFIR/Transforms/OptimizedBufferization.cpp (+7-3)
  • (added) flang/test/HLFIR/bufferize-workshare.fir (+58)
  • (added) flang/test/Integration/OpenMP/workshare.f90 (+57)
  • (modified) flang/test/Transforms/OpenMP/lower-workshare-todo-cfg-dom.mlir (+1-1)
  • (modified) flang/test/Transforms/OpenMP/lower-workshare-todo-cfg.mlir (+1-1)
  • (added) flang/test/Transforms/OpenMP/should-use-workshare-lowering.mlir (+140)
diff --git a/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp b/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp
index 07794828fce267..1848dbe2c7a2c2 100644
--- a/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp
+++ b/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp
@@ -26,6 +26,7 @@
 #include "flang/Optimizer/HLFIR/HLFIRDialect.h"
 #include "flang/Optimizer/HLFIR/HLFIROps.h"
 #include "flang/Optimizer/HLFIR/Passes.h"
+#include "flang/Optimizer/OpenMP/Passes.h"
 #include "mlir/Dialect/OpenMP/OpenMPDialect.h"
 #include "mlir/IR/Dominance.h"
 #include "mlir/IR/PatternMatch.h"
@@ -792,7 +793,8 @@ struct ElementalOpConversion
     // Generate a loop nest looping around the fir.elemental shape and clone
     // fir.elemental region inside the inner loop.
     hlfir::LoopNest loopNest =
-        hlfir::genLoopNest(loc, builder, extents, !elemental.isOrdered());
+        hlfir::genLoopNest(loc, builder, extents, !elemental.isOrdered(),
+                           flangomp::shouldUseWorkshareLowering(elemental));
     auto insPt = builder.saveInsertionPoint();
     builder.setInsertionPointToStart(loopNest.body);
     auto yield = hlfir::inlineElementalOp(loc, builder, elemental,
diff --git a/flang/lib/Optimizer/HLFIR/Transforms/OptimizedBufferization.cpp b/flang/lib/Optimizer/HLFIR/Transforms/OptimizedBufferization.cpp
index 3a0a98dc594463..f014724861e333 100644
--- a/flang/lib/Optimizer/HLFIR/Transforms/OptimizedBufferization.cpp
+++ b/flang/lib/Optimizer/HLFIR/Transforms/OptimizedBufferization.cpp
@@ -20,6 +20,7 @@
 #include "flang/Optimizer/HLFIR/HLFIRDialect.h"
 #include "flang/Optimizer/HLFIR/HLFIROps.h"
 #include "flang/Optimizer/HLFIR/Passes.h"
+#include "flang/Optimizer/OpenMP/Passes.h"
 #include "flang/Optimizer/Transforms/Utils.h"
 #include "mlir/Dialect/Func/IR/FuncOps.h"
 #include "mlir/IR/Dominance.h"
@@ -482,7 +483,8 @@ llvm::LogicalResult ElementalAssignBufferization::matchAndRewrite(
   // Generate a loop nest looping around the hlfir.elemental shape and clone
   // hlfir.elemental region inside the inner loop
   hlfir::LoopNest loopNest =
-      hlfir::genLoopNest(loc, builder, extents, !elemental.isOrdered());
+      hlfir::genLoopNest(loc, builder, extents, !elemental.isOrdered(),
+                         flangomp::shouldUseWorkshareLowering(elemental));
   builder.setInsertionPointToStart(loopNest.body);
   auto yield = hlfir::inlineElementalOp(loc, builder, elemental,
                                         loopNest.oneBasedIndices);
@@ -553,7 +555,8 @@ llvm::LogicalResult BroadcastAssignBufferization::matchAndRewrite(
   llvm::SmallVector<mlir::Value> extents =
       hlfir::getIndexExtents(loc, builder, shape);
   hlfir::LoopNest loopNest =
-      hlfir::genLoopNest(loc, builder, extents, /*isUnordered=*/true);
+      hlfir::genLoopNest(loc, builder, extents, /*isUnordered=*/true,
+                         flangomp::shouldUseWorkshareLowering(assign));
   builder.setInsertionPointToStart(loopNest.body);
   auto arrayElement =
       hlfir::getElementAt(loc, builder, lhs, loopNest.oneBasedIndices);
@@ -648,7 +651,8 @@ llvm::LogicalResult VariableAssignBufferization::matchAndRewrite(
   llvm::SmallVector<mlir::Value> extents =
       hlfir::getIndexExtents(loc, builder, shape);
   hlfir::LoopNest loopNest =
-      hlfir::genLoopNest(loc, builder, extents, /*isUnordered=*/true);
+      hlfir::genLoopNest(loc, builder, extents, /*isUnordered=*/true,
+                         flangomp::shouldUseWorkshareLowering(assign));
   builder.setInsertionPointToStart(loopNest.body);
   auto rhsArrayElement =
       hlfir::getElementAt(loc, builder, rhs, loopNest.oneBasedIndices);
diff --git a/flang/test/HLFIR/bufferize-workshare.fir b/flang/test/HLFIR/bufferize-workshare.fir
new file mode 100644
index 00000000000000..9b7341ae43398a
--- /dev/null
+++ b/flang/test/HLFIR/bufferize-workshare.fir
@@ -0,0 +1,58 @@
+// RUN: fir-opt --bufferize-hlfir %s | FileCheck %s
+
+// CHECK-LABEL:   func.func @simple(
+// CHECK-SAME:                      %[[VAL_0:.*]]: !fir.ref<!fir.array<42xi32>>) {
+// CHECK:           omp.parallel {
+// CHECK:             omp.workshare {
+// CHECK:               %[[VAL_1:.*]] = arith.constant 42 : index
+// CHECK:               %[[VAL_2:.*]] = arith.constant 1 : i32
+// CHECK:               %[[VAL_3:.*]] = fir.shape %[[VAL_1]] : (index) -> !fir.shape<1>
+// CHECK:               %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_0]](%[[VAL_3]]) {uniq_name = "array"} : (!fir.ref<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<42xi32>>, !fir.ref<!fir.array<42xi32>>)
+// CHECK:               %[[VAL_5:.*]] = fir.allocmem !fir.array<42xi32> {bindc_name = ".tmp.array", uniq_name = ""}
+// CHECK:               %[[VAL_6:.*]]:2 = hlfir.declare %[[VAL_5]](%[[VAL_3]]) {uniq_name = ".tmp.array"} : (!fir.heap<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.heap<!fir.array<42xi32>>, !fir.heap<!fir.array<42xi32>>)
+// CHECK:               %[[VAL_7:.*]] = arith.constant true
+// CHECK:               %[[VAL_8:.*]] = arith.constant 1 : index
+// CHECK:               omp.workshare.loop_wrapper {
+// CHECK:                 omp.loop_nest (%[[VAL_9:.*]]) : index = (%[[VAL_8]]) to (%[[VAL_1]]) inclusive step (%[[VAL_8]]) {
+// CHECK:                   %[[VAL_10:.*]] = hlfir.designate %[[VAL_4]]#0 (%[[VAL_9]])  : (!fir.ref<!fir.array<42xi32>>, index) -> !fir.ref<i32>
+// CHECK:                   %[[VAL_11:.*]] = fir.load %[[VAL_10]] : !fir.ref<i32>
+// CHECK:                   %[[VAL_12:.*]] = arith.subi %[[VAL_11]], %[[VAL_2]] : i32
+// CHECK:                   %[[VAL_13:.*]] = hlfir.designate %[[VAL_6]]#0 (%[[VAL_9]])  : (!fir.heap<!fir.array<42xi32>>, index) -> !fir.ref<i32>
+// CHECK:                   hlfir.assign %[[VAL_12]] to %[[VAL_13]] temporary_lhs : i32, !fir.ref<i32>
+// CHECK:                   omp.yield
+// CHECK:                 }
+// CHECK:                 omp.terminator
+// CHECK:               }
+// CHECK:               %[[VAL_14:.*]] = fir.undefined tuple<!fir.heap<!fir.array<42xi32>>, i1>
+// CHECK:               %[[VAL_15:.*]] = fir.insert_value %[[VAL_14]], %[[VAL_7]], [1 : index] : (tuple<!fir.heap<!fir.array<42xi32>>, i1>, i1) -> tuple<!fir.heap<!fir.array<42xi32>>, i1>
+// CHECK:               %[[VAL_16:.*]] = fir.insert_value %[[VAL_15]], %[[VAL_6]]#0, [0 : index] : (tuple<!fir.heap<!fir.array<42xi32>>, i1>, !fir.heap<!fir.array<42xi32>>) -> tuple<!fir.heap<!fir.array<42xi32>>, i1>
+// CHECK:               hlfir.assign %[[VAL_6]]#0 to %[[VAL_4]]#0 : !fir.heap<!fir.array<42xi32>>, !fir.ref<!fir.array<42xi32>>
+// CHECK:               fir.freemem %[[VAL_6]]#0 : !fir.heap<!fir.array<42xi32>>
+// CHECK:               omp.terminator
+// CHECK:             }
+// CHECK:             omp.terminator
+// CHECK:           }
+// CHECK:           return
+// CHECK:         }
+func.func @simple(%arg: !fir.ref<!fir.array<42xi32>>) {
+  omp.parallel {
+    omp.workshare {
+      %c42 = arith.constant 42 : index
+      %c1_i32 = arith.constant 1 : i32
+      %shape = fir.shape %c42 : (index) -> !fir.shape<1>
+      %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<42xi32>>, !fir.ref<!fir.array<42xi32>>)
+      %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> {
+      ^bb0(%i: index):
+        %ref = hlfir.designate %array#0 (%i) : (!fir.ref<!fir.array<42xi32>>, index) -> !fir.ref<i32>
+        %val = fir.load %ref : !fir.ref<i32>
+        %sub = arith.subi %val, %c1_i32 : i32
+        hlfir.yield_element %sub : i32
+      }
+      hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>>
+      hlfir.destroy %elemental : !hlfir.expr<42xi32>
+      omp.terminator
+    }
+    omp.terminator
+  }
+  return
+}
diff --git a/flang/test/Integration/OpenMP/workshare.f90 b/flang/test/Integration/OpenMP/workshare.f90
new file mode 100644
index 00000000000000..0c4524f8552906
--- /dev/null
+++ b/flang/test/Integration/OpenMP/workshare.f90
@@ -0,0 +1,57 @@
+!===----------------------------------------------------------------------===!
+! This directory can be used to add Integration tests involving multiple
+! stages of the compiler (for eg. from Fortran to LLVM IR). It should not
+! contain executable tests. We should only add tests here sparingly and only
+! if there is no other way to test. Repeat this message in each test that is
+! added to this directory and sub-directories.
+!===----------------------------------------------------------------------===!
+
+!RUN: %flang_fc1 -emit-hlfir -fopenmp -O3 %s -o - | FileCheck %s --check-prefix HLFIR
+!RUN: %flang_fc1 -emit-fir -fopenmp -O3 %s -o - | FileCheck %s --check-prefix FIR
+
+subroutine sb1(a, x, y, z)
+  integer :: a
+  integer :: x(:)
+  integer :: y(:)
+  integer :: z(:)
+  !$omp parallel workshare
+  z = a * x + y
+  !$omp end parallel workshare
+end subroutine
+
+! HLFIR:  func.func @_QPsb1
+! HLFIR:    omp.parallel {
+! HLFIR:      omp.workshare {
+! HLFIR:        hlfir.elemental {{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xi32> {
+! HLFIR:        hlfir.elemental {{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xi32> {
+! HLFIR:        hlfir.assign
+! HLFIR:        hlfir.destroy
+! HLFIR:        hlfir.destroy
+! HLFIR-NOT:    omp.barrier
+! HLFIR:        omp.terminator
+! HLFIR:      }
+! HLFIR-NOT:  omp.barrier
+! HLFIR:      omp.terminator
+! HLFIR:    }
+! HLFIR:    return
+! HLFIR:  }
+! HLFIR:}
+
+
+! FIR:  func.func private @_workshare_copy_heap_Uxi32(%{{[a-z0-9]+}}: !fir.ref<!fir.heap<!fir.array<?xi32>>>, %{{[a-z0-9]+}}: !fir.ref<!fir.heap<!fir.array<?xi32>>>
+! FIR:  func.func private @_workshare_copy_i32(%{{[a-z0-9]+}}: !fir.ref<i32>, %{{[a-z0-9]+}}: !fir.ref<i32>
+
+! FIR:  func.func @_QPsb1
+! FIR:    omp.parallel {
+! FIR:      omp.single copyprivate(%9 -> @_workshare_copy_i32 : !fir.ref<i32>, %10 -> @_workshare_copy_heap_Uxi32 : !fir.ref<!fir.heap<!fir.array<?xi32>>>) {
+! FIR:        fir.allocmem
+! FIR:      omp.wsloop {
+! FIR:        omp.loop_nest
+! FIR:      omp.single nowait {
+! FIR:        fir.call @_FortranAAssign
+! FIR:        fir.freemem
+! FIR:        omp.terminator
+! FIR:      }
+! FIR:      omp.barrier
+! FIR:      omp.terminator
+! FIR:    }
diff --git a/flang/test/Transforms/OpenMP/lower-workshare-todo-cfg-dom.mlir b/flang/test/Transforms/OpenMP/lower-workshare-todo-cfg-dom.mlir
index 1c47d448f597d9..d10996167ae623 100644
--- a/flang/test/Transforms/OpenMP/lower-workshare-todo-cfg-dom.mlir
+++ b/flang/test/Transforms/OpenMP/lower-workshare-todo-cfg-dom.mlir
@@ -1,4 +1,4 @@
-// RUN: fir-opt --lower-workshare --allow-unregistered-dialect %s 2>&1 | FileCheck %s
+// RUN: %not_todo_cmd fir-opt --lower-workshare --allow-unregistered-dialect %s 2>&1 | FileCheck %s
 
 // CHECK: not yet implemented: omp workshare with unstructured control flow
 
diff --git a/flang/test/Transforms/OpenMP/lower-workshare-todo-cfg.mlir b/flang/test/Transforms/OpenMP/lower-workshare-todo-cfg.mlir
index bf6c196a05b4a3..46d2a8e8d48a8a 100644
--- a/flang/test/Transforms/OpenMP/lower-workshare-todo-cfg.mlir
+++ b/flang/test/Transforms/OpenMP/lower-workshare-todo-cfg.mlir
@@ -1,4 +1,4 @@
-// RUN: fir-opt --lower-workshare --allow-unregistered-dialect %s 2>&1 | FileCheck %s
+// RUN: %not_todo_cmd fir-opt --lower-workshare --allow-unregistered-dialect %s 2>&1 | FileCheck %s
 
 // CHECK: not yet implemented: omp workshare with unstructured control flow
 
diff --git a/flang/test/Transforms/OpenMP/should-use-workshare-lowering.mlir b/flang/test/Transforms/OpenMP/should-use-workshare-lowering.mlir
new file mode 100644
index 00000000000000..229fe592a02b9b
--- /dev/null
+++ b/flang/test/Transforms/OpenMP/should-use-workshare-lowering.mlir
@@ -0,0 +1,140 @@
+// RUN: fir-opt --bufferize-hlfir %s | FileCheck %s
+
+// Checks that we correctly identify when to use the lowering to
+// omp.workshare.loop_wrapper
+
+// CHECK-LABEL: @should_parallelize_0
+// CHECK: omp.workshare.loop_wrapper
+func.func @should_parallelize_0(%arg: !fir.ref<!fir.array<42xi32>>, %idx : index) {
+  omp.workshare {
+    %c42 = arith.constant 42 : index
+    %c1_i32 = arith.constant 1 : i32
+    %shape = fir.shape %c42 : (index) -> !fir.shape<1>
+    %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<42xi32>>, !fir.ref<!fir.array<42xi32>>)
+    %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> {
+    ^bb0(%i: index):
+      hlfir.yield_element %c1_i32 : i32
+    }
+    hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>>
+    hlfir.destroy %elemental : !hlfir.expr<42xi32>
+    omp.terminator
+  }
+  return
+}
+
+// CHECK-LABEL: @should_parallelize_1
+// CHECK: omp.workshare.loop_wrapper
+func.func @should_parallelize_1(%arg: !fir.ref<!fir.array<42xi32>>, %idx : index) {
+  omp.parallel {
+    omp.workshare {
+      %c42 = arith.constant 42 : index
+      %c1_i32 = arith.constant 1 : i32
+      %shape = fir.shape %c42 : (index) -> !fir.shape<1>
+      %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<42xi32>>, !fir.ref<!fir.array<42xi32>>)
+      %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> {
+      ^bb0(%i: index):
+        hlfir.yield_element %c1_i32 : i32
+      }
+      hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>>
+      hlfir.destroy %elemental : !hlfir.expr<42xi32>
+      omp.terminator
+    }
+    omp.terminator
+  }
+  return
+}
+
+
+// CHECK-LABEL: @should_not_parallelize_0
+// CHECK-NOT: omp.workshare.loop_wrapper
+func.func @should_not_parallelize_0(%arg: !fir.ref<!fir.array<42xi32>>, %idx : index) {
+  omp.workshare {
+    omp.single {
+      %c42 = arith.constant 42 : index
+      %c1_i32 = arith.constant 1 : i32
+      %shape = fir.shape %c42 : (index) -> !fir.shape<1>
+      %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<42xi32>>, !fir.ref<!fir.array<42xi32>>)
+      %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> {
+      ^bb0(%i: index):
+        hlfir.yield_element %c1_i32 : i32
+      }
+      hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>>
+      hlfir.destroy %elemental : !hlfir.expr<42xi32>
+      omp.terminator
+    }
+    omp.terminator
+  }
+  return
+}
+
+// CHECK-LABEL: @should_not_parallelize_1
+// CHECK-NOT: omp.workshare.loop_wrapper
+func.func @should_not_parallelize_1(%arg: !fir.ref<!fir.array<42xi32>>, %idx : index) {
+  omp.workshare {
+    omp.critical {
+      %c42 = arith.constant 42 : index
+      %c1_i32 = arith.constant 1 : i32
+      %shape = fir.shape %c42 : (index) -> !fir.shape<1>
+      %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<42xi32>>, !fir.ref<!fir.array<42xi32>>)
+      %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> {
+      ^bb0(%i: index):
+        hlfir.yield_element %c1_i32 : i32
+      }
+      hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>>
+      hlfir.destroy %elemental : !hlfir.expr<42xi32>
+      omp.terminator
+    }
+    omp.terminator
+  }
+  return
+}
+
+// CHECK-LABEL: @should_not_parallelize_2
+// CHECK-NOT: omp.workshare.loop_wrapper
+func.func @should_not_parallelize_2(%arg: !fir.ref<!fir.array<42xi32>>, %idx : index) {
+  omp.workshare {
+    omp.parallel {
+      %c42 = arith.constant 42 : index
+      %c1_i32 = arith.constant 1 : i32
+      %shape = fir.shape %c42 : (index) -> !fir.shape<1>
+      %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<42xi32>>, !fir.ref<!fir.array<42xi32>>)
+      %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> {
+      ^bb0(%i: index):
+        hlfir.yield_element %c1_i32 : i32
+      }
+      hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>>
+      hlfir.destroy %elemental : !hlfir.expr<42xi32>
+      omp.terminator
+    }
+    omp.terminator
+  }
+  return
+}
+
+// CHECK-LABEL: @should_not_parallelize_3
+// CHECK-NOT: omp.workshare.loop_wrapper
+func.func @should_not_parallelize_3(%arg: !fir.ref<!fir.array<42xi32>>, %idx : index) {
+  omp.workshare {
+    omp.parallel {
+      omp.workshare {
+        omp.parallel {
+          %c42 = arith.constant 42 : index
+          %c1_i32 = arith.constant 1 : i32
+          %shape = fir.shape %c42 : (index) -> !fir.shape<1>
+          %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<42xi32>>, !fir.ref<!fir.array<42xi32>>)
+          %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> {
+          ^bb0(%i: index):
+            hlfir.yield_element %c1_i32 : i32
+          }
+          hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>>
+          hlfir.destroy %elemental : !hlfir.expr<42xi32>
+          omp.terminator
+        }
+        omp.terminator
+      }
+      omp.terminator
+    }
+    omp.terminator
+  }
+  return
+}

@llvmbot
Copy link
Member

llvmbot commented Sep 25, 2024

@llvm/pr-subscribers-flang-openmp

Author: Ivan R. Ivanov (ivanradanov)

Changes

WIP I will be adding unit tests and I am considering if we should have integrations tests for the entire omp.workshare pipeline.

Continuation from #101446


Full diff: https://github.com/llvm/llvm-project/pull/104748.diff

7 Files Affected:

  • (modified) flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp (+3-1)
  • (modified) flang/lib/Optimizer/HLFIR/Transforms/OptimizedBufferization.cpp (+7-3)
  • (added) flang/test/HLFIR/bufferize-workshare.fir (+58)
  • (added) flang/test/Integration/OpenMP/workshare.f90 (+57)
  • (modified) flang/test/Transforms/OpenMP/lower-workshare-todo-cfg-dom.mlir (+1-1)
  • (modified) flang/test/Transforms/OpenMP/lower-workshare-todo-cfg.mlir (+1-1)
  • (added) flang/test/Transforms/OpenMP/should-use-workshare-lowering.mlir (+140)
diff --git a/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp b/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp
index 07794828fce267..1848dbe2c7a2c2 100644
--- a/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp
+++ b/flang/lib/Optimizer/HLFIR/Transforms/BufferizeHLFIR.cpp
@@ -26,6 +26,7 @@
 #include "flang/Optimizer/HLFIR/HLFIRDialect.h"
 #include "flang/Optimizer/HLFIR/HLFIROps.h"
 #include "flang/Optimizer/HLFIR/Passes.h"
+#include "flang/Optimizer/OpenMP/Passes.h"
 #include "mlir/Dialect/OpenMP/OpenMPDialect.h"
 #include "mlir/IR/Dominance.h"
 #include "mlir/IR/PatternMatch.h"
@@ -792,7 +793,8 @@ struct ElementalOpConversion
     // Generate a loop nest looping around the fir.elemental shape and clone
     // fir.elemental region inside the inner loop.
     hlfir::LoopNest loopNest =
-        hlfir::genLoopNest(loc, builder, extents, !elemental.isOrdered());
+        hlfir::genLoopNest(loc, builder, extents, !elemental.isOrdered(),
+                           flangomp::shouldUseWorkshareLowering(elemental));
     auto insPt = builder.saveInsertionPoint();
     builder.setInsertionPointToStart(loopNest.body);
     auto yield = hlfir::inlineElementalOp(loc, builder, elemental,
diff --git a/flang/lib/Optimizer/HLFIR/Transforms/OptimizedBufferization.cpp b/flang/lib/Optimizer/HLFIR/Transforms/OptimizedBufferization.cpp
index 3a0a98dc594463..f014724861e333 100644
--- a/flang/lib/Optimizer/HLFIR/Transforms/OptimizedBufferization.cpp
+++ b/flang/lib/Optimizer/HLFIR/Transforms/OptimizedBufferization.cpp
@@ -20,6 +20,7 @@
 #include "flang/Optimizer/HLFIR/HLFIRDialect.h"
 #include "flang/Optimizer/HLFIR/HLFIROps.h"
 #include "flang/Optimizer/HLFIR/Passes.h"
+#include "flang/Optimizer/OpenMP/Passes.h"
 #include "flang/Optimizer/Transforms/Utils.h"
 #include "mlir/Dialect/Func/IR/FuncOps.h"
 #include "mlir/IR/Dominance.h"
@@ -482,7 +483,8 @@ llvm::LogicalResult ElementalAssignBufferization::matchAndRewrite(
   // Generate a loop nest looping around the hlfir.elemental shape and clone
   // hlfir.elemental region inside the inner loop
   hlfir::LoopNest loopNest =
-      hlfir::genLoopNest(loc, builder, extents, !elemental.isOrdered());
+      hlfir::genLoopNest(loc, builder, extents, !elemental.isOrdered(),
+                         flangomp::shouldUseWorkshareLowering(elemental));
   builder.setInsertionPointToStart(loopNest.body);
   auto yield = hlfir::inlineElementalOp(loc, builder, elemental,
                                         loopNest.oneBasedIndices);
@@ -553,7 +555,8 @@ llvm::LogicalResult BroadcastAssignBufferization::matchAndRewrite(
   llvm::SmallVector<mlir::Value> extents =
       hlfir::getIndexExtents(loc, builder, shape);
   hlfir::LoopNest loopNest =
-      hlfir::genLoopNest(loc, builder, extents, /*isUnordered=*/true);
+      hlfir::genLoopNest(loc, builder, extents, /*isUnordered=*/true,
+                         flangomp::shouldUseWorkshareLowering(assign));
   builder.setInsertionPointToStart(loopNest.body);
   auto arrayElement =
       hlfir::getElementAt(loc, builder, lhs, loopNest.oneBasedIndices);
@@ -648,7 +651,8 @@ llvm::LogicalResult VariableAssignBufferization::matchAndRewrite(
   llvm::SmallVector<mlir::Value> extents =
       hlfir::getIndexExtents(loc, builder, shape);
   hlfir::LoopNest loopNest =
-      hlfir::genLoopNest(loc, builder, extents, /*isUnordered=*/true);
+      hlfir::genLoopNest(loc, builder, extents, /*isUnordered=*/true,
+                         flangomp::shouldUseWorkshareLowering(assign));
   builder.setInsertionPointToStart(loopNest.body);
   auto rhsArrayElement =
       hlfir::getElementAt(loc, builder, rhs, loopNest.oneBasedIndices);
diff --git a/flang/test/HLFIR/bufferize-workshare.fir b/flang/test/HLFIR/bufferize-workshare.fir
new file mode 100644
index 00000000000000..9b7341ae43398a
--- /dev/null
+++ b/flang/test/HLFIR/bufferize-workshare.fir
@@ -0,0 +1,58 @@
+// RUN: fir-opt --bufferize-hlfir %s | FileCheck %s
+
+// CHECK-LABEL:   func.func @simple(
+// CHECK-SAME:                      %[[VAL_0:.*]]: !fir.ref<!fir.array<42xi32>>) {
+// CHECK:           omp.parallel {
+// CHECK:             omp.workshare {
+// CHECK:               %[[VAL_1:.*]] = arith.constant 42 : index
+// CHECK:               %[[VAL_2:.*]] = arith.constant 1 : i32
+// CHECK:               %[[VAL_3:.*]] = fir.shape %[[VAL_1]] : (index) -> !fir.shape<1>
+// CHECK:               %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_0]](%[[VAL_3]]) {uniq_name = "array"} : (!fir.ref<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<42xi32>>, !fir.ref<!fir.array<42xi32>>)
+// CHECK:               %[[VAL_5:.*]] = fir.allocmem !fir.array<42xi32> {bindc_name = ".tmp.array", uniq_name = ""}
+// CHECK:               %[[VAL_6:.*]]:2 = hlfir.declare %[[VAL_5]](%[[VAL_3]]) {uniq_name = ".tmp.array"} : (!fir.heap<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.heap<!fir.array<42xi32>>, !fir.heap<!fir.array<42xi32>>)
+// CHECK:               %[[VAL_7:.*]] = arith.constant true
+// CHECK:               %[[VAL_8:.*]] = arith.constant 1 : index
+// CHECK:               omp.workshare.loop_wrapper {
+// CHECK:                 omp.loop_nest (%[[VAL_9:.*]]) : index = (%[[VAL_8]]) to (%[[VAL_1]]) inclusive step (%[[VAL_8]]) {
+// CHECK:                   %[[VAL_10:.*]] = hlfir.designate %[[VAL_4]]#0 (%[[VAL_9]])  : (!fir.ref<!fir.array<42xi32>>, index) -> !fir.ref<i32>
+// CHECK:                   %[[VAL_11:.*]] = fir.load %[[VAL_10]] : !fir.ref<i32>
+// CHECK:                   %[[VAL_12:.*]] = arith.subi %[[VAL_11]], %[[VAL_2]] : i32
+// CHECK:                   %[[VAL_13:.*]] = hlfir.designate %[[VAL_6]]#0 (%[[VAL_9]])  : (!fir.heap<!fir.array<42xi32>>, index) -> !fir.ref<i32>
+// CHECK:                   hlfir.assign %[[VAL_12]] to %[[VAL_13]] temporary_lhs : i32, !fir.ref<i32>
+// CHECK:                   omp.yield
+// CHECK:                 }
+// CHECK:                 omp.terminator
+// CHECK:               }
+// CHECK:               %[[VAL_14:.*]] = fir.undefined tuple<!fir.heap<!fir.array<42xi32>>, i1>
+// CHECK:               %[[VAL_15:.*]] = fir.insert_value %[[VAL_14]], %[[VAL_7]], [1 : index] : (tuple<!fir.heap<!fir.array<42xi32>>, i1>, i1) -> tuple<!fir.heap<!fir.array<42xi32>>, i1>
+// CHECK:               %[[VAL_16:.*]] = fir.insert_value %[[VAL_15]], %[[VAL_6]]#0, [0 : index] : (tuple<!fir.heap<!fir.array<42xi32>>, i1>, !fir.heap<!fir.array<42xi32>>) -> tuple<!fir.heap<!fir.array<42xi32>>, i1>
+// CHECK:               hlfir.assign %[[VAL_6]]#0 to %[[VAL_4]]#0 : !fir.heap<!fir.array<42xi32>>, !fir.ref<!fir.array<42xi32>>
+// CHECK:               fir.freemem %[[VAL_6]]#0 : !fir.heap<!fir.array<42xi32>>
+// CHECK:               omp.terminator
+// CHECK:             }
+// CHECK:             omp.terminator
+// CHECK:           }
+// CHECK:           return
+// CHECK:         }
+func.func @simple(%arg: !fir.ref<!fir.array<42xi32>>) {
+  omp.parallel {
+    omp.workshare {
+      %c42 = arith.constant 42 : index
+      %c1_i32 = arith.constant 1 : i32
+      %shape = fir.shape %c42 : (index) -> !fir.shape<1>
+      %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<42xi32>>, !fir.ref<!fir.array<42xi32>>)
+      %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> {
+      ^bb0(%i: index):
+        %ref = hlfir.designate %array#0 (%i) : (!fir.ref<!fir.array<42xi32>>, index) -> !fir.ref<i32>
+        %val = fir.load %ref : !fir.ref<i32>
+        %sub = arith.subi %val, %c1_i32 : i32
+        hlfir.yield_element %sub : i32
+      }
+      hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>>
+      hlfir.destroy %elemental : !hlfir.expr<42xi32>
+      omp.terminator
+    }
+    omp.terminator
+  }
+  return
+}
diff --git a/flang/test/Integration/OpenMP/workshare.f90 b/flang/test/Integration/OpenMP/workshare.f90
new file mode 100644
index 00000000000000..0c4524f8552906
--- /dev/null
+++ b/flang/test/Integration/OpenMP/workshare.f90
@@ -0,0 +1,57 @@
+!===----------------------------------------------------------------------===!
+! This directory can be used to add Integration tests involving multiple
+! stages of the compiler (for eg. from Fortran to LLVM IR). It should not
+! contain executable tests. We should only add tests here sparingly and only
+! if there is no other way to test. Repeat this message in each test that is
+! added to this directory and sub-directories.
+!===----------------------------------------------------------------------===!
+
+!RUN: %flang_fc1 -emit-hlfir -fopenmp -O3 %s -o - | FileCheck %s --check-prefix HLFIR
+!RUN: %flang_fc1 -emit-fir -fopenmp -O3 %s -o - | FileCheck %s --check-prefix FIR
+
+subroutine sb1(a, x, y, z)
+  integer :: a
+  integer :: x(:)
+  integer :: y(:)
+  integer :: z(:)
+  !$omp parallel workshare
+  z = a * x + y
+  !$omp end parallel workshare
+end subroutine
+
+! HLFIR:  func.func @_QPsb1
+! HLFIR:    omp.parallel {
+! HLFIR:      omp.workshare {
+! HLFIR:        hlfir.elemental {{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xi32> {
+! HLFIR:        hlfir.elemental {{.*}} unordered : (!fir.shape<1>) -> !hlfir.expr<?xi32> {
+! HLFIR:        hlfir.assign
+! HLFIR:        hlfir.destroy
+! HLFIR:        hlfir.destroy
+! HLFIR-NOT:    omp.barrier
+! HLFIR:        omp.terminator
+! HLFIR:      }
+! HLFIR-NOT:  omp.barrier
+! HLFIR:      omp.terminator
+! HLFIR:    }
+! HLFIR:    return
+! HLFIR:  }
+! HLFIR:}
+
+
+! FIR:  func.func private @_workshare_copy_heap_Uxi32(%{{[a-z0-9]+}}: !fir.ref<!fir.heap<!fir.array<?xi32>>>, %{{[a-z0-9]+}}: !fir.ref<!fir.heap<!fir.array<?xi32>>>
+! FIR:  func.func private @_workshare_copy_i32(%{{[a-z0-9]+}}: !fir.ref<i32>, %{{[a-z0-9]+}}: !fir.ref<i32>
+
+! FIR:  func.func @_QPsb1
+! FIR:    omp.parallel {
+! FIR:      omp.single copyprivate(%9 -> @_workshare_copy_i32 : !fir.ref<i32>, %10 -> @_workshare_copy_heap_Uxi32 : !fir.ref<!fir.heap<!fir.array<?xi32>>>) {
+! FIR:        fir.allocmem
+! FIR:      omp.wsloop {
+! FIR:        omp.loop_nest
+! FIR:      omp.single nowait {
+! FIR:        fir.call @_FortranAAssign
+! FIR:        fir.freemem
+! FIR:        omp.terminator
+! FIR:      }
+! FIR:      omp.barrier
+! FIR:      omp.terminator
+! FIR:    }
diff --git a/flang/test/Transforms/OpenMP/lower-workshare-todo-cfg-dom.mlir b/flang/test/Transforms/OpenMP/lower-workshare-todo-cfg-dom.mlir
index 1c47d448f597d9..d10996167ae623 100644
--- a/flang/test/Transforms/OpenMP/lower-workshare-todo-cfg-dom.mlir
+++ b/flang/test/Transforms/OpenMP/lower-workshare-todo-cfg-dom.mlir
@@ -1,4 +1,4 @@
-// RUN: fir-opt --lower-workshare --allow-unregistered-dialect %s 2>&1 | FileCheck %s
+// RUN: %not_todo_cmd fir-opt --lower-workshare --allow-unregistered-dialect %s 2>&1 | FileCheck %s
 
 // CHECK: not yet implemented: omp workshare with unstructured control flow
 
diff --git a/flang/test/Transforms/OpenMP/lower-workshare-todo-cfg.mlir b/flang/test/Transforms/OpenMP/lower-workshare-todo-cfg.mlir
index bf6c196a05b4a3..46d2a8e8d48a8a 100644
--- a/flang/test/Transforms/OpenMP/lower-workshare-todo-cfg.mlir
+++ b/flang/test/Transforms/OpenMP/lower-workshare-todo-cfg.mlir
@@ -1,4 +1,4 @@
-// RUN: fir-opt --lower-workshare --allow-unregistered-dialect %s 2>&1 | FileCheck %s
+// RUN: %not_todo_cmd fir-opt --lower-workshare --allow-unregistered-dialect %s 2>&1 | FileCheck %s
 
 // CHECK: not yet implemented: omp workshare with unstructured control flow
 
diff --git a/flang/test/Transforms/OpenMP/should-use-workshare-lowering.mlir b/flang/test/Transforms/OpenMP/should-use-workshare-lowering.mlir
new file mode 100644
index 00000000000000..229fe592a02b9b
--- /dev/null
+++ b/flang/test/Transforms/OpenMP/should-use-workshare-lowering.mlir
@@ -0,0 +1,140 @@
+// RUN: fir-opt --bufferize-hlfir %s | FileCheck %s
+
+// Checks that we correctly identify when to use the lowering to
+// omp.workshare.loop_wrapper
+
+// CHECK-LABEL: @should_parallelize_0
+// CHECK: omp.workshare.loop_wrapper
+func.func @should_parallelize_0(%arg: !fir.ref<!fir.array<42xi32>>, %idx : index) {
+  omp.workshare {
+    %c42 = arith.constant 42 : index
+    %c1_i32 = arith.constant 1 : i32
+    %shape = fir.shape %c42 : (index) -> !fir.shape<1>
+    %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<42xi32>>, !fir.ref<!fir.array<42xi32>>)
+    %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> {
+    ^bb0(%i: index):
+      hlfir.yield_element %c1_i32 : i32
+    }
+    hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>>
+    hlfir.destroy %elemental : !hlfir.expr<42xi32>
+    omp.terminator
+  }
+  return
+}
+
+// CHECK-LABEL: @should_parallelize_1
+// CHECK: omp.workshare.loop_wrapper
+func.func @should_parallelize_1(%arg: !fir.ref<!fir.array<42xi32>>, %idx : index) {
+  omp.parallel {
+    omp.workshare {
+      %c42 = arith.constant 42 : index
+      %c1_i32 = arith.constant 1 : i32
+      %shape = fir.shape %c42 : (index) -> !fir.shape<1>
+      %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<42xi32>>, !fir.ref<!fir.array<42xi32>>)
+      %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> {
+      ^bb0(%i: index):
+        hlfir.yield_element %c1_i32 : i32
+      }
+      hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>>
+      hlfir.destroy %elemental : !hlfir.expr<42xi32>
+      omp.terminator
+    }
+    omp.terminator
+  }
+  return
+}
+
+
+// CHECK-LABEL: @should_not_parallelize_0
+// CHECK-NOT: omp.workshare.loop_wrapper
+func.func @should_not_parallelize_0(%arg: !fir.ref<!fir.array<42xi32>>, %idx : index) {
+  omp.workshare {
+    omp.single {
+      %c42 = arith.constant 42 : index
+      %c1_i32 = arith.constant 1 : i32
+      %shape = fir.shape %c42 : (index) -> !fir.shape<1>
+      %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<42xi32>>, !fir.ref<!fir.array<42xi32>>)
+      %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> {
+      ^bb0(%i: index):
+        hlfir.yield_element %c1_i32 : i32
+      }
+      hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>>
+      hlfir.destroy %elemental : !hlfir.expr<42xi32>
+      omp.terminator
+    }
+    omp.terminator
+  }
+  return
+}
+
+// CHECK-LABEL: @should_not_parallelize_1
+// CHECK-NOT: omp.workshare.loop_wrapper
+func.func @should_not_parallelize_1(%arg: !fir.ref<!fir.array<42xi32>>, %idx : index) {
+  omp.workshare {
+    omp.critical {
+      %c42 = arith.constant 42 : index
+      %c1_i32 = arith.constant 1 : i32
+      %shape = fir.shape %c42 : (index) -> !fir.shape<1>
+      %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<42xi32>>, !fir.ref<!fir.array<42xi32>>)
+      %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> {
+      ^bb0(%i: index):
+        hlfir.yield_element %c1_i32 : i32
+      }
+      hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>>
+      hlfir.destroy %elemental : !hlfir.expr<42xi32>
+      omp.terminator
+    }
+    omp.terminator
+  }
+  return
+}
+
+// CHECK-LABEL: @should_not_parallelize_2
+// CHECK-NOT: omp.workshare.loop_wrapper
+func.func @should_not_parallelize_2(%arg: !fir.ref<!fir.array<42xi32>>, %idx : index) {
+  omp.workshare {
+    omp.parallel {
+      %c42 = arith.constant 42 : index
+      %c1_i32 = arith.constant 1 : i32
+      %shape = fir.shape %c42 : (index) -> !fir.shape<1>
+      %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<42xi32>>, !fir.ref<!fir.array<42xi32>>)
+      %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> {
+      ^bb0(%i: index):
+        hlfir.yield_element %c1_i32 : i32
+      }
+      hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>>
+      hlfir.destroy %elemental : !hlfir.expr<42xi32>
+      omp.terminator
+    }
+    omp.terminator
+  }
+  return
+}
+
+// CHECK-LABEL: @should_not_parallelize_3
+// CHECK-NOT: omp.workshare.loop_wrapper
+func.func @should_not_parallelize_3(%arg: !fir.ref<!fir.array<42xi32>>, %idx : index) {
+  omp.workshare {
+    omp.parallel {
+      omp.workshare {
+        omp.parallel {
+          %c42 = arith.constant 42 : index
+          %c1_i32 = arith.constant 1 : i32
+          %shape = fir.shape %c42 : (index) -> !fir.shape<1>
+          %array:2 = hlfir.declare %arg(%shape) {uniq_name = "array"} : (!fir.ref<!fir.array<42xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<42xi32>>, !fir.ref<!fir.array<42xi32>>)
+          %elemental = hlfir.elemental %shape unordered : (!fir.shape<1>) -> !hlfir.expr<42xi32> {
+          ^bb0(%i: index):
+            hlfir.yield_element %c1_i32 : i32
+          }
+          hlfir.assign %elemental to %array#0 : !hlfir.expr<42xi32>, !fir.ref<!fir.array<42xi32>>
+          hlfir.destroy %elemental : !hlfir.expr<42xi32>
+          omp.terminator
+        }
+        omp.terminator
+      }
+      omp.terminator
+    }
+    omp.terminator
+  }
+  return
+}

@ivanradanov ivanradanov marked this pull request as draft September 25, 2024 06:37
@Thirumalai-Shaktivel
Copy link
Member

Thirumalai-Shaktivel commented Oct 3, 2024

Hi @ivanradanov, thanks for the PR!

I tried building and testing this PR. And came across a case where it seg faults. Can you please check it?

program test
  real :: arr_01(10)
  !$omp parallel workshare
    arr_01 = arr_01*2
  !$omp end parallel workshare
end program

@ivanradanov
Copy link
Contributor Author

Thank you very much - it seems to only happen with -O0, I am trying to find the root cause now...

@ivanradanov ivanradanov force-pushed the users/ivanradanov/flang-workshare-hlfir-lower branch from c16dc88 to 41c738a Compare October 4, 2024 06:14
@ivanradanov
Copy link
Contributor Author

@Thirumalai-Shaktivel Fixed, it was a very stupid mistake with the argument order of the copyprivate copy function. Thank you.

@ivanradanov ivanradanov changed the title [WIP][flang] Introduce HLFIR lowerings to omp.workshare_loop_nest [flang] Introduce HLFIR lowerings to omp.workshare_loop_nest Nov 14, 2024
@ivanradanov
Copy link
Contributor Author

@tblah It is ready for review, I had just forgotten to take the [WIP] in the title away, sorry for that.

Copy link
Contributor

@tblah tblah left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@ivanradanov ivanradanov force-pushed the users/ivanradanov/flang-workshare-hlfir-lower branch from b76551b to a0f2307 Compare November 19, 2024 04:02
@ivanradanov ivanradanov force-pushed the users/ivanradanov/flang-workshare branch 2 times, most recently from fbd9ab0 to e2ac361 Compare November 19, 2024 08:01
Base automatically changed from users/ivanradanov/flang-workshare to main November 19, 2024 08:02
Bufferize test

Bufferize test

Bufferize test

Add test for should use workshare lowering

Add integration test for workshare

One more integration test

Add test for cfg workshare bufferization

Fix tests

Test coverage for all changes

Integration tests

bufferize fix
@ivanradanov ivanradanov force-pushed the users/ivanradanov/flang-workshare-hlfir-lower branch from a0f2307 to 0abf058 Compare November 19, 2024 08:03
@ivanradanov ivanradanov changed the title [flang] Introduce HLFIR lowerings to omp.workshare_loop_nest [flang] Introduce hlfir.elemental lowerings to omp.workshare_loop_nest Nov 19, 2024
@ivanradanov ivanradanov merged commit 40c8938 into main Nov 20, 2024
8 checks passed
@ivanradanov ivanradanov deleted the users/ivanradanov/flang-workshare-hlfir-lower branch November 20, 2024 01:49
@llvm-ci
Copy link
Collaborator

llvm-ci commented Nov 20, 2024

LLVM Buildbot has detected a new failure on builder flang-aarch64-libcxx running on linaro-flang-aarch64-libcxx while building flang at step 5 "build-unified-tree".

Full details are available at: https://lab.llvm.org/buildbot/#/builders/89/builds/10917

Here is the relevant piece of the build log for the reference
Step 5 (build-unified-tree) failure: build (failure)
...
73.103 [148/8/7119] Linking CXX executable tools/flang/unittests/Evaluate/integer.test
73.108 [148/7/7120] Linking CXX executable tools/flang/unittests/Evaluate/logical.test
73.111 [148/6/7121] Linking CXX executable tools/flang/unittests/Evaluate/real.test
73.257 [148/5/7122] Linking CXX executable tools/flang/unittests/Evaluate/folding.test
73.309 [148/4/7123] Linking CXX executable tools/flang/unittests/Evaluate/expression.test
79.921 [148/3/7124] Linking CXX shared library lib/libFortranLower.so.20.0git
79.928 [147/3/7125] Creating library symlink lib/libFortranLower.so
82.904 [147/2/7126] Building CXX object tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/OptimizedBufferization.cpp.o
92.287 [147/1/7127] Building CXX object tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/BufferizeHLFIR.cpp.o
92.834 [146/1/7128] Linking CXX shared library lib/libHLFIRTransforms.so.20.0git
FAILED: lib/libHLFIRTransforms.so.20.0git 
: && /usr/local/bin/c++ -fPIC -stdlib=libc++ -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color -ffunction-sections -fdata-sections -Werror -Wno-deprecated-copy -Wno-string-conversion -Wno-ctad-maybe-unsupported -Wno-unused-command-line-argument -Wstring-conversion           -Wcovered-switch-default -Wno-nested-anon-types -O3 -DNDEBUG  -stdlib=libc++ -Wl,-z,defs -Wl,-z,nodelete   -Wl,-rpath-link,/home/tcwg-buildbot/worker/flang-aarch64-libcxx/build/./lib  -Wl,--gc-sections -shared -Wl,-soname,libHLFIRTransforms.so.20.0git -o lib/libHLFIRTransforms.so.20.0git tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/BufferizeHLFIR.cpp.o tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/ConvertToFIR.cpp.o tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/InlineElementals.cpp.o tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/LowerHLFIRIntrinsics.cpp.o tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/LowerHLFIROrderedAssignments.cpp.o tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/ScheduleOrderedAssignments.cpp.o tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/SimplifyHLFIRIntrinsics.cpp.o tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/OptimizedBufferization.cpp.o  -Wl,-rpath,"\$ORIGIN/../lib:/home/tcwg-buildbot/worker/flang-aarch64-libcxx/build/lib:"  lib/libFIRTransforms.so.20.0git  lib/libFIRAnalysis.so.20.0git  lib/libFIRBuilder.so.20.0git  lib/libHLFIRDialect.so.20.0git  lib/libFIRSupport.so.20.0git  lib/libFIRDialect.so.20.0git  lib/libCUFAttrs.so.20.0git  lib/libFIRDialectSupport.so.20.0git  lib/libMLIRAffineTransformOps.so.20.0git  lib/libMLIRAMDGPUTransforms.so.20.0git  lib/libMLIRAMDGPUUtils.so.20.0git  lib/libMLIRAMDGPUDialect.so.20.0git  lib/libMLIRArithValueBoundsOpInterfaceImpl.so.20.0git  lib/libMLIRArmNeonTransforms.so.20.0git  lib/libMLIRArmSMETransforms.so.20.0git  lib/libMLIRArmSMEDialect.so.20.0git  lib/libMLIRAsyncTransforms.so.20.0git  lib/libMLIRBufferizationPipelines.so.20.0git  lib/libMLIRBufferizationTransformOps.so.20.0git  lib/libMLIRControlFlowTransforms.so.20.0git  lib/libMLIRDLTITransformOps.so.20.0git  lib/libMLIREmitCTransforms.so.20.0git  lib/libMLIREmitCDialect.so.20.0git  lib/libMLIRFuncTransformOps.so.20.0git  lib/libMLIRGPUTransformOps.so.20.0git  lib/libMLIRGPUPipelines.so.20.0git  lib/libMLIRIndexToLLVM.so.20.0git  lib/libMLIRNVVMToLLVM.so.20.0git  lib/libMLIRVCIXDialect.so.20.0git  lib/libMLIRMathTransforms.so.20.0git  lib/libMLIRMemRefTransformOps.so.20.0git  lib/libMLIRMLProgramTransforms.so.20.0git  lib/libMLIRMLProgramDialect.so.20.0git  lib/libMLIRMPIDialect.so.20.0git  lib/libMLIRNVGPUUtils.so.20.0git  lib/libMLIRNVGPUTransformOps.so.20.0git  lib/libMLIRNVGPUToNVVM.so.20.0git  lib/libMLIRNVGPUTransforms.so.20.0git  lib/libMLIROpenACCTransforms.so.20.0git  lib/libMLIRPolynomialDialect.so.20.0git  lib/libMLIRPtrDialect.so.20.0git  lib/libMLIRQuantTransforms.so.20.0git  lib/libMLIRSCFTransformOps.so.20.0git  lib/libMLIRShapeOpsTransforms.so.20.0git  lib/libMLIRShapeDialect.so.20.0git  lib/libMLIRSparseTensorPipelines.so.20.0git  lib/libMLIRSCFToControlFlow.so.20.0git  lib/libMLIRGPUToNVVMTransforms.so.20.0git  lib/libMLIRAffineToStandard.so.20.0git  lib/libMLIRReconcileUnrealizedCasts.so.20.0git  lib/libMLIRComplexToLibm.so.20.0git  lib/libMLIRVectorToLLVMPass.so.20.0git  lib/libMLIRAMXTransforms.so.20.0git  lib/libMLIRAMXDialect.so.20.0git  lib/libMLIRArmNeonDialect.so.20.0git  lib/libMLIRArmSVETransforms.so.20.0git  lib/libMLIRArmSVEDialect.so.20.0git  lib/libMLIRSparseTensorTransformOps.so.20.0git  lib/libMLIRLinalgTransformOps.so.20.0git  lib/libMLIRSparseTensorTransforms.so.20.0git  lib/libMLIRLinalgTransforms.so.20.0git  lib/libMLIRMemRefTransforms.so.20.0git  lib/libMLIRArithTransforms.so.20.0git  lib/libMLIRNVGPUDialect.so.20.0git  lib/libMLIRMeshTransforms.so.20.0git  lib/libMLIRSCFTransforms.so.20.0git  lib/libMLIRBufferizationTransforms.so.20.0git  lib/libMLIRSparseTensorUtils.so.20.0git  lib/libMLIRSPIRVModuleCombiner.so.20.0git  lib/libMLIRSPIRVTransforms.so.20.0git  lib/libMLIRSPIRVConversion.so.20.0git  lib/libMLIRSPIRVUtils.so.20.0git  lib/libMLIRTensorInferTypeOpInterfaceImpl.so.20.0git  lib/libMLIRTensorTilingInterfaceImpl.so.20.0git  lib/libMLIRLinalgUtils.so.20.0git  lib/libMLIRTensorTransformOps.so.20.0git  lib/libMLIRTensorTransforms.so.20.0git  lib/libMLIRAffineTransforms.so.20.0git  lib/libMLIRSCFUtils.so.20.0git  lib/libMLIRTilingInterface.so.20.0git  lib/libMLIRTensorUtils.so.20.0git  lib/libMLIRTosaShardingInterfaceImpl.so.20.0git  lib/libMLIRTosaTransforms.so.20.0git  lib/libMLIRTransformDebugExtension.so.20.0git  lib/libMLIRTransformDialectIRDLExtension.so.20.0git  lib/libMLIRIRDL.so.20.0git  lib/libMLIRTransformLoopExtension.so.20.0git  lib/libMLIRTransformPDLExtension.so.20.0git  lib/libMLIRTransformDialectTransforms.so.20.0git  lib/libMLIRVectorTransformOps.so.20.0git  lib/libMLIRTransformDialect.so.20.0git  lib/libMLIRTransformDialectInterfaces.so.20.0git  lib/libMLIRTransformDialectUtils.so.20.0git  lib/libMLIRVectorToSCF.so.20.0git  lib/libMLIRX86VectorTransforms.so.20.0git  lib/libMLIRX86VectorDialect.so.20.0git  lib/libMLIRXeGPUTransforms.so.20.0git  lib/libMLIRXeGPUDialect.so.20.0git  lib/libMLIRTestDynDialect.so.20.0git  lib/libMLIRTosaTestPasses.so.20.0git  lib/libMLIRTosaDialect.so.20.0git  lib/libMLIRQuantUtils.so.20.0git  lib/libMLIRQuantDialect.so.20.0git  lib/libMLIRShardingInterface.so.20.0git  lib/libMLIRMeshDialect.so.20.0git  lib/libMLIROpenACCDialect.so.20.0git  lib/libLLVMAsmPrinter.so.20.0git  lib/libMLIRMathToLLVM.so.20.0git  lib/libMLIRComplexToLLVM.so.20.0git  lib/libMLIRComplexToStandard.so.20.0git  lib/libMLIRMathToLibm.so.20.0git  lib/libMLIROpenMPDialect.so.20.0git  lib/libMLIROpenACCMPCommon.so.20.0git  lib/libMLIRGPUToGPURuntimeTransforms.so.20.0git  lib/libMLIRGPUTransforms.so.20.0git  lib/libMLIRIndexDialect.so.20.0git  lib/libMLIRSPIRVTarget.so.20.0git  lib/libMLIRSPIRVSerialization.so.20.0git  lib/libMLIRSPIRVDialect.so.20.0git  lib/libMLIRSPIRVBinaryUtils.so.20.0git  lib/libMLIRNVVMTarget.so.20.0git  lib/libMLIRNVVMToLLVMIRTranslation.so.20.0git  lib/libMLIRROCDLTarget.so.20.0git  lib/libMLIRTargetLLVM.so.20.0git  lib/libMLIRROCDLToLLVMIRTranslation.so.20.0git  lib/libMLIRROCDLDialect.so.20.0git  lib/libMLIRExecutionEngineUtils.so.20.0git  lib/libLLVMPasses.so.20.0git  lib/libLLVMTarget.so.20.0git  lib/libLLVMipo.so.20.0git  lib/libLLVMLinker.so.20.0git  lib/libMLIRMemRefToLLVM.so.20.0git  lib/libMLIRVectorToLLVM.so.20.0git  lib/libMLIRVectorTransforms.so.20.0git  lib/libMLIRAffineUtils.so.20.0git  lib/libMLIRGPUDialect.so.20.0git  lib/libMLIRLinalgDialect.so.20.0git  lib/libMLIRBufferizationDialect.so.20.0git  lib/libMLIRMathDialect.so.20.0git  lib/libMLIRSparseTensorDialect.so.20.0git  lib/libMLIRMemRefUtils.so.20.0git  lib/libMLIRVectorUtils.so.20.0git  lib/libMLIRAffineAnalysis.so.20.0git  lib/libMLIRSCFDialect.so.20.0git  lib/libMLIRVectorDialect.so.20.0git  lib/libMLIRTensorDialect.so.20.0git  lib/libMLIRAffineDialect.so.20.0git  lib/libMLIRParallelCombiningOpInterface.so.20.0git  lib/libMLIRMaskableOpInterface.so.20.0git  lib/libMLIRMaskingOpInterface.so.20.0git  lib/libMLIRVectorInterfaces.so.20.0git  lib/libMLIRTargetLLVMIRExport.so.20.0git  lib/libMLIRDLTIDialect.so.20.0git  lib/libMLIRLLVMIRTransforms.so.20.0git  lib/libMLIRNVVMDialect.so.20.0git  lib/libMLIRTranslateLib.so.20.0git  lib/libMLIRParser.so.20.0git  lib/libMLIRBytecodeReader.so.20.0git  lib/libMLIRAsmParser.so.20.0git  lib/libLLVMFrontendOpenMP.so.20.0git  lib/libLLVMFrontendOffloading.so.20.0git  lib/libLLVMTransformUtils.so.20.0git  lib/libMLIRAsyncToLLVM.so.20.0git  lib/libMLIRAsyncDialect.so.20.0git  lib/libMLIRFuncTransforms.so.20.0git  lib/libMLIRMemRefDialect.so.20.0git  lib/libMLIRArithUtils.so.20.0git  lib/libMLIRComplexDialect.so.20.0git  lib/libMLIRDialectUtils.so.20.0git  lib/libMLIRShapedOpInterfaces.so.20.0git  lib/libMLIRFuncToLLVM.so.20.0git  lib/libMLIRFuncDialect.so.20.0git  lib/libMLIRArithToLLVM.so.20.0git  lib/libMLIRArithAttrToLLVMConversion.so.20.0git  lib/libMLIRControlFlowToLLVM.so.20.0git  lib/libMLIRControlFlowDialect.so.20.0git  lib/libMLIRArithDialect.so.20.0git  lib/libMLIRUBDialect.so.20.0git  lib/libMLIRCastInterfaces.so.20.0git  lib/libMLIRDialect.so.20.0git  lib/libMLIRInferIntRangeCommon.so.20.0git  lib/libMLIRConvertToLLVMPass.so.20.0git  lib/libMLIRLLVMCommonConversion.so.20.0git  lib/libMLIRLLVMDialect.so.20.0git  lib/libLLVMBitWriter.so.20.0git  lib/libLLVMMCParser.so.20.0git  lib/libLLVMIRReader.so.20.0git  lib/libLLVMAsmParser.so.20.0git  lib/libLLVMBitReader.so.20.0git  lib/libLLVMMC.so.20.0git  lib/libMLIRTransforms.so.20.0git  lib/libMLIRTransformUtils.so.20.0git  lib/libMLIRSubsetOpInterface.so.20.0git  lib/libMLIRValueBoundsOpInterface.so.20.0git  lib/libMLIRDestinationStyleOpInterface.so.20.0git  lib/libMLIRMemorySlotInterfaces.so.20.0git  lib/libMLIRRuntimeVerifiableOpInterface.so.20.0git  lib/libLLVMCore.so.20.0git  lib/libLLVMRemarks.so.20.0git  lib/libLLVMBinaryFormat.so.20.0git  lib/libLLVMTargetParser.so.20.0git  lib/libMLIRRewrite.so.20.0git  lib/libMLIRRewritePDL.so.20.0git  lib/libMLIRPDLToPDLInterp.so.20.0git  lib/libMLIRPDLInterpDialect.so.20.0git  lib/libMLIRPDLDialect.so.20.0git  lib/libMLIRPass.so.20.0git  lib/libMLIRAnalysis.so.20.0git  lib/libMLIRCallInterfaces.so.20.0git  lib/libMLIRControlFlowInterfaces.so.20.0git  lib/libMLIRInferTypeOpInterface.so.20.0git  lib/libMLIRSideEffectInterfaces.so.20.0git  lib/libMLIRPresburger.so.20.0git  lib/libMLIRLoopLikeInterface.so.20.0git  lib/libMLIRViewLikeInterface.so.20.0git  lib/libMLIRInferIntRangeInterface.so.20.0git  lib/libMLIRFunctionInterfaces.so.20.0git  lib/libMLIRDataLayoutInterfaces.so.20.0git  lib/libMLIRIR.so.20.0git  lib/libMLIRSupport.so.20.0git  lib/libLLVMSupport.so.20.0git  -Wl,-rpath-link,/home/tcwg-buildbot/worker/flang-aarch64-libcxx/build/lib && :
/usr/bin/ld: tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/BufferizeHLFIR.cpp.o: in function `(anonymous namespace)::ElementalOpConversion::matchAndRewrite(hlfir::ElementalOp, hlfir::ElementalOpAdaptor, mlir::ConversionPatternRewriter&) const':
BufferizeHLFIR.cpp:(.text._ZNK12_GLOBAL__N_121ElementalOpConversion15matchAndRewriteEN5hlfir11ElementalOpENS1_18ElementalOpAdaptorERN4mlir25ConversionPatternRewriterE+0x668): undefined reference to `flangomp::shouldUseWorkshareLowering(mlir::Operation*)'
/usr/bin/ld: tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/OptimizedBufferization.cpp.o: in function `(anonymous namespace)::ElementalAssignBufferization::matchAndRewrite(hlfir::ElementalOp, mlir::PatternRewriter&) const':
OptimizedBufferization.cpp:(.text._ZNK12_GLOBAL__N_128ElementalAssignBufferization15matchAndRewriteEN5hlfir11ElementalOpERN4mlir15PatternRewriterE+0xa40): undefined reference to `flangomp::shouldUseWorkshareLowering(mlir::Operation*)'
/usr/bin/ld: tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/OptimizedBufferization.cpp.o: in function `(anonymous namespace)::BroadcastAssignBufferization::matchAndRewrite(hlfir::AssignOp, mlir::PatternRewriter&) const':
OptimizedBufferization.cpp:(.text._ZNK12_GLOBAL__N_128BroadcastAssignBufferization15matchAndRewriteEN5hlfir8AssignOpERN4mlir15PatternRewriterE+0x24c): undefined reference to `flangomp::shouldUseWorkshareLowering(mlir::Operation*)'
/usr/bin/ld: tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/OptimizedBufferization.cpp.o: in function `(anonymous namespace)::VariableAssignBufferization::matchAndRewrite(hlfir::AssignOp, mlir::PatternRewriter&) const':
OptimizedBufferization.cpp:(.text._ZNK12_GLOBAL__N_127VariableAssignBufferization15matchAndRewriteEN5hlfir8AssignOpERN4mlir15PatternRewriterE+0x3dc): undefined reference to `flangomp::shouldUseWorkshareLowering(mlir::Operation*)'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

ivanradanov added a commit that referenced this pull request Nov 20, 2024
…loop_nest (#104748)"

This reverts commit 40c8938.

Linking errors in buildbot build
@llvm-ci
Copy link
Collaborator

llvm-ci commented Nov 20, 2024

LLVM Buildbot has detected a new failure on builder flang-aarch64-latest-gcc running on linaro-flang-aarch64-latest-gcc while building flang at step 5 "build-unified-tree".

Full details are available at: https://lab.llvm.org/buildbot/#/builders/130/builds/6419

Here is the relevant piece of the build log for the reference
Step 5 (build-unified-tree) failure: build (failure)
...
153.376 [582/2/6707] Building CXX object tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/OptimizedBufferization.cpp.o
153.433 [578/5/6708] Building C object tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/metadata.c.o
153.451 [578/4/6709] Building C object tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/object.c.o
153.514 [578/3/6710] Building C object tools/llvm-c-test/CMakeFiles/llvm-c-test.dir/targets.c.o
153.789 [577/3/6711] Linking CXX executable bin/llvm-c-test
153.890 [573/6/6712] Building CXX object tools/llvm-cat/CMakeFiles/llvm-cat.dir/llvm-cat.cpp.o
153.910 [573/5/6713] Linking CXX static library lib/libLLVMCFIVerify_static.a
153.934 [573/4/6714] Linking CXX shared library lib/libFortranLower.so.20.0git
154.106 [573/3/6715] Building CXX object tools/llvm-cfi-verify/CMakeFiles/llvm-cfi-verify.dir/llvm-cfi-verify.cpp.o
154.114 [573/2/6716] Linking CXX shared library lib/libHLFIRTransforms.so.20.0git
FAILED: lib/libHLFIRTransforms.so.20.0git 
: && /usr/local/bin/c++ -fPIC -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror=date-time -fno-lifetime-dse -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wno-missing-field-initializers -pedantic -Wno-long-long -Wimplicit-fallthrough -Wno-maybe-uninitialized -Wno-nonnull -Wno-class-memaccess -Wno-redundant-move -Wno-pessimizing-move -Wno-noexcept-type -Wdelete-non-virtual-dtor -Wsuggest-override -Wno-comment -Wno-misleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color -ffunction-sections -fdata-sections -Wno-deprecated-copy -Wno-ctad-maybe-unsupported -fno-strict-aliasing -fno-semantic-interposition -O3 -DNDEBUG -fno-semantic-interposition  -Wl,-z,defs -Wl,-z,nodelete   -Wl,-rpath-link,/home/tcwg-buildbot/worker/flang-aarch64-latest-gcc/build/./lib  -Wl,--gc-sections -shared -Wl,-soname,libHLFIRTransforms.so.20.0git -o lib/libHLFIRTransforms.so.20.0git tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/BufferizeHLFIR.cpp.o tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/ConvertToFIR.cpp.o tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/InlineElementals.cpp.o tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/LowerHLFIRIntrinsics.cpp.o tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/LowerHLFIROrderedAssignments.cpp.o tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/ScheduleOrderedAssignments.cpp.o tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/SimplifyHLFIRIntrinsics.cpp.o tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/OptimizedBufferization.cpp.o  -Wl,-rpath,"\$ORIGIN/../lib:/home/tcwg-buildbot/worker/flang-aarch64-latest-gcc/build/lib:"  lib/libFIRTransforms.so.20.0git  lib/libFIRAnalysis.so.20.0git  lib/libFIRBuilder.so.20.0git  lib/libHLFIRDialect.so.20.0git  lib/libFIRSupport.so.20.0git  lib/libFIRDialect.so.20.0git  lib/libCUFAttrs.so.20.0git  lib/libFIRDialectSupport.so.20.0git  lib/libMLIRAffineTransformOps.so.20.0git  lib/libMLIRAMDGPUTransforms.so.20.0git  lib/libMLIRAMDGPUUtils.so.20.0git  lib/libMLIRAMDGPUDialect.so.20.0git  lib/libMLIRArithValueBoundsOpInterfaceImpl.so.20.0git  lib/libMLIRArmNeonTransforms.so.20.0git  lib/libMLIRArmSMETransforms.so.20.0git  lib/libMLIRArmSMEDialect.so.20.0git  lib/libMLIRAsyncTransforms.so.20.0git  lib/libMLIRBufferizationPipelines.so.20.0git  lib/libMLIRBufferizationTransformOps.so.20.0git  lib/libMLIRControlFlowTransforms.so.20.0git  lib/libMLIRDLTITransformOps.so.20.0git  lib/libMLIREmitCTransforms.so.20.0git  lib/libMLIREmitCDialect.so.20.0git  lib/libMLIRFuncTransformOps.so.20.0git  lib/libMLIRGPUTransformOps.so.20.0git  lib/libMLIRGPUPipelines.so.20.0git  lib/libMLIRIndexToLLVM.so.20.0git  lib/libMLIRNVVMToLLVM.so.20.0git  lib/libMLIRVCIXDialect.so.20.0git  lib/libMLIRMathTransforms.so.20.0git  lib/libMLIRMemRefTransformOps.so.20.0git  lib/libMLIRMLProgramTransforms.so.20.0git  lib/libMLIRMLProgramDialect.so.20.0git  lib/libMLIRMPIDialect.so.20.0git  lib/libMLIRNVGPUUtils.so.20.0git  lib/libMLIRNVGPUTransformOps.so.20.0git  lib/libMLIRNVGPUToNVVM.so.20.0git  lib/libMLIRNVGPUTransforms.so.20.0git  lib/libMLIROpenACCTransforms.so.20.0git  lib/libMLIRPolynomialDialect.so.20.0git  lib/libMLIRPtrDialect.so.20.0git  lib/libMLIRQuantTransforms.so.20.0git  lib/libMLIRSCFTransformOps.so.20.0git  lib/libMLIRShapeOpsTransforms.so.20.0git  lib/libMLIRShapeDialect.so.20.0git  lib/libMLIRSparseTensorPipelines.so.20.0git  lib/libMLIRSCFToControlFlow.so.20.0git  lib/libMLIRGPUToNVVMTransforms.so.20.0git  lib/libMLIRAffineToStandard.so.20.0git  lib/libMLIRReconcileUnrealizedCasts.so.20.0git  lib/libMLIRComplexToLibm.so.20.0git  lib/libMLIRVectorToLLVMPass.so.20.0git  lib/libMLIRAMXTransforms.so.20.0git  lib/libMLIRAMXDialect.so.20.0git  lib/libMLIRArmNeonDialect.so.20.0git  lib/libMLIRArmSVETransforms.so.20.0git  lib/libMLIRArmSVEDialect.so.20.0git  lib/libMLIRSparseTensorTransformOps.so.20.0git  lib/libMLIRLinalgTransformOps.so.20.0git  lib/libMLIRSparseTensorTransforms.so.20.0git  lib/libMLIRLinalgTransforms.so.20.0git  lib/libMLIRMemRefTransforms.so.20.0git  lib/libMLIRArithTransforms.so.20.0git  lib/libMLIRNVGPUDialect.so.20.0git  lib/libMLIRMeshTransforms.so.20.0git  lib/libMLIRSCFTransforms.so.20.0git  lib/libMLIRBufferizationTransforms.so.20.0git  lib/libMLIRSparseTensorUtils.so.20.0git  lib/libMLIRSPIRVModuleCombiner.so.20.0git  lib/libMLIRSPIRVTransforms.so.20.0git  lib/libMLIRSPIRVConversion.so.20.0git  lib/libMLIRSPIRVUtils.so.20.0git  lib/libMLIRTensorInferTypeOpInterfaceImpl.so.20.0git  lib/libMLIRTensorTilingInterfaceImpl.so.20.0git  lib/libMLIRLinalgUtils.so.20.0git  lib/libMLIRTensorTransformOps.so.20.0git  lib/libMLIRTensorTransforms.so.20.0git  lib/libMLIRAffineTransforms.so.20.0git  lib/libMLIRSCFUtils.so.20.0git  lib/libMLIRTilingInterface.so.20.0git  lib/libMLIRTensorUtils.so.20.0git  lib/libMLIRTosaShardingInterfaceImpl.so.20.0git  lib/libMLIRTosaTransforms.so.20.0git  lib/libMLIRTransformDebugExtension.so.20.0git  lib/libMLIRTransformDialectIRDLExtension.so.20.0git  lib/libMLIRIRDL.so.20.0git  lib/libMLIRTransformLoopExtension.so.20.0git  lib/libMLIRTransformPDLExtension.so.20.0git  lib/libMLIRTransformDialectTransforms.so.20.0git  lib/libMLIRVectorTransformOps.so.20.0git  lib/libMLIRTransformDialect.so.20.0git  lib/libMLIRTransformDialectInterfaces.so.20.0git  lib/libMLIRTransformDialectUtils.so.20.0git  lib/libMLIRVectorToSCF.so.20.0git  lib/libMLIRX86VectorTransforms.so.20.0git  lib/libMLIRX86VectorDialect.so.20.0git  lib/libMLIRXeGPUTransforms.so.20.0git  lib/libMLIRXeGPUDialect.so.20.0git  lib/libMLIRTestDynDialect.so.20.0git  lib/libMLIRTosaTestPasses.so.20.0git  lib/libMLIRTosaDialect.so.20.0git  lib/libMLIRQuantUtils.so.20.0git  lib/libMLIRQuantDialect.so.20.0git  lib/libMLIRShardingInterface.so.20.0git  lib/libMLIRMeshDialect.so.20.0git  lib/libMLIROpenACCDialect.so.20.0git  lib/libLLVMAsmPrinter.so.20.0git  lib/libMLIRMathToLLVM.so.20.0git  lib/libMLIRComplexToLLVM.so.20.0git  lib/libMLIRComplexToStandard.so.20.0git  lib/libMLIRMathToLibm.so.20.0git  lib/libMLIROpenMPDialect.so.20.0git  lib/libMLIROpenACCMPCommon.so.20.0git  lib/libMLIRGPUToGPURuntimeTransforms.so.20.0git  lib/libMLIRGPUTransforms.so.20.0git  lib/libMLIRIndexDialect.so.20.0git  lib/libMLIRSPIRVTarget.so.20.0git  lib/libMLIRSPIRVSerialization.so.20.0git  lib/libMLIRSPIRVDialect.so.20.0git  lib/libMLIRSPIRVBinaryUtils.so.20.0git  lib/libMLIRNVVMTarget.so.20.0git  lib/libMLIRNVVMToLLVMIRTranslation.so.20.0git  lib/libMLIRROCDLTarget.so.20.0git  lib/libMLIRTargetLLVM.so.20.0git  lib/libMLIRROCDLToLLVMIRTranslation.so.20.0git  lib/libMLIRROCDLDialect.so.20.0git  lib/libMLIRExecutionEngineUtils.so.20.0git  lib/libLLVMPasses.so.20.0git  lib/libLLVMTarget.so.20.0git  lib/libLLVMipo.so.20.0git  lib/libLLVMLinker.so.20.0git  lib/libMLIRMemRefToLLVM.so.20.0git  lib/libMLIRVectorToLLVM.so.20.0git  lib/libMLIRVectorTransforms.so.20.0git  lib/libMLIRAffineUtils.so.20.0git  lib/libMLIRGPUDialect.so.20.0git  lib/libMLIRLinalgDialect.so.20.0git  lib/libMLIRBufferizationDialect.so.20.0git  lib/libMLIRMathDialect.so.20.0git  lib/libMLIRSparseTensorDialect.so.20.0git  lib/libMLIRMemRefUtils.so.20.0git  lib/libMLIRVectorUtils.so.20.0git  lib/libMLIRAffineAnalysis.so.20.0git  lib/libMLIRSCFDialect.so.20.0git  lib/libMLIRVectorDialect.so.20.0git  lib/libMLIRTensorDialect.so.20.0git  lib/libMLIRAffineDialect.so.20.0git  lib/libMLIRParallelCombiningOpInterface.so.20.0git  lib/libMLIRMaskableOpInterface.so.20.0git  lib/libMLIRMaskingOpInterface.so.20.0git  lib/libMLIRVectorInterfaces.so.20.0git  lib/libMLIRTargetLLVMIRExport.so.20.0git  lib/libMLIRDLTIDialect.so.20.0git  lib/libMLIRLLVMIRTransforms.so.20.0git  lib/libMLIRNVVMDialect.so.20.0git  lib/libMLIRTranslateLib.so.20.0git  lib/libMLIRParser.so.20.0git  lib/libMLIRBytecodeReader.so.20.0git  lib/libMLIRAsmParser.so.20.0git  lib/libLLVMFrontendOpenMP.so.20.0git  lib/libLLVMFrontendOffloading.so.20.0git  lib/libLLVMTransformUtils.so.20.0git  lib/libMLIRAsyncToLLVM.so.20.0git  lib/libMLIRAsyncDialect.so.20.0git  lib/libMLIRFuncTransforms.so.20.0git  lib/libMLIRMemRefDialect.so.20.0git  lib/libMLIRArithUtils.so.20.0git  lib/libMLIRComplexDialect.so.20.0git  lib/libMLIRDialectUtils.so.20.0git  lib/libMLIRShapedOpInterfaces.so.20.0git  lib/libMLIRFuncToLLVM.so.20.0git  lib/libMLIRFuncDialect.so.20.0git  lib/libMLIRArithToLLVM.so.20.0git  lib/libMLIRArithAttrToLLVMConversion.so.20.0git  lib/libMLIRControlFlowToLLVM.so.20.0git  lib/libMLIRControlFlowDialect.so.20.0git  lib/libMLIRArithDialect.so.20.0git  lib/libMLIRUBDialect.so.20.0git  lib/libMLIRCastInterfaces.so.20.0git  lib/libMLIRDialect.so.20.0git  lib/libMLIRInferIntRangeCommon.so.20.0git  lib/libMLIRConvertToLLVMPass.so.20.0git  lib/libMLIRLLVMCommonConversion.so.20.0git  lib/libMLIRLLVMDialect.so.20.0git  lib/libLLVMBitWriter.so.20.0git  lib/libLLVMMCParser.so.20.0git  lib/libLLVMIRReader.so.20.0git  lib/libLLVMAsmParser.so.20.0git  lib/libLLVMBitReader.so.20.0git  lib/libLLVMMC.so.20.0git  lib/libMLIRTransforms.so.20.0git  lib/libMLIRTransformUtils.so.20.0git  lib/libMLIRSubsetOpInterface.so.20.0git  lib/libMLIRValueBoundsOpInterface.so.20.0git  lib/libMLIRDestinationStyleOpInterface.so.20.0git  lib/libMLIRMemorySlotInterfaces.so.20.0git  lib/libMLIRRuntimeVerifiableOpInterface.so.20.0git  lib/libLLVMCore.so.20.0git  lib/libLLVMRemarks.so.20.0git  lib/libLLVMBinaryFormat.so.20.0git  lib/libLLVMTargetParser.so.20.0git  lib/libMLIRRewrite.so.20.0git  lib/libMLIRRewritePDL.so.20.0git  lib/libMLIRPDLToPDLInterp.so.20.0git  lib/libMLIRPDLInterpDialect.so.20.0git  lib/libMLIRPDLDialect.so.20.0git  lib/libMLIRPass.so.20.0git  lib/libMLIRAnalysis.so.20.0git  lib/libMLIRCallInterfaces.so.20.0git  lib/libMLIRControlFlowInterfaces.so.20.0git  lib/libMLIRInferTypeOpInterface.so.20.0git  lib/libMLIRSideEffectInterfaces.so.20.0git  lib/libMLIRPresburger.so.20.0git  lib/libMLIRLoopLikeInterface.so.20.0git  lib/libMLIRViewLikeInterface.so.20.0git  lib/libMLIRInferIntRangeInterface.so.20.0git  lib/libMLIRFunctionInterfaces.so.20.0git  lib/libMLIRDataLayoutInterfaces.so.20.0git  lib/libMLIRIR.so.20.0git  lib/libMLIRSupport.so.20.0git  lib/libLLVMSupport.so.20.0git  -Wl,-rpath-link,/home/tcwg-buildbot/worker/flang-aarch64-latest-gcc/build/lib && :
/usr/bin/ld: tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/BufferizeHLFIR.cpp.o: in function `(anonymous namespace)::ElementalOpConversion::matchAndRewrite(hlfir::ElementalOp, hlfir::ElementalOpAdaptor, mlir::ConversionPatternRewriter&) const':
BufferizeHLFIR.cpp:(.text._ZNK12_GLOBAL__N_121ElementalOpConversion15matchAndRewriteEN5hlfir11ElementalOpENS1_18ElementalOpAdaptorERN4mlir25ConversionPatternRewriterE+0x368): undefined reference to `flangomp::shouldUseWorkshareLowering(mlir::Operation*)'
/usr/bin/ld: tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/OptimizedBufferization.cpp.o: in function `(anonymous namespace)::BroadcastAssignBufferization::matchAndRewrite(hlfir::AssignOp, mlir::PatternRewriter&) const':
OptimizedBufferization.cpp:(.text._ZNK12_GLOBAL__N_128BroadcastAssignBufferization15matchAndRewriteEN5hlfir8AssignOpERN4mlir15PatternRewriterE+0x1c0): undefined reference to `flangomp::shouldUseWorkshareLowering(mlir::Operation*)'
/usr/bin/ld: tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/OptimizedBufferization.cpp.o: in function `(anonymous namespace)::VariableAssignBufferization::matchAndRewrite(hlfir::AssignOp, mlir::PatternRewriter&) const':
OptimizedBufferization.cpp:(.text._ZNK12_GLOBAL__N_127VariableAssignBufferization15matchAndRewriteEN5hlfir8AssignOpERN4mlir15PatternRewriterE+0x3b4): undefined reference to `flangomp::shouldUseWorkshareLowering(mlir::Operation*)'
/usr/bin/ld: tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/OptimizedBufferization.cpp.o: in function `(anonymous namespace)::ElementalAssignBufferization::matchAndRewrite(hlfir::ElementalOp, mlir::PatternRewriter&) const':
OptimizedBufferization.cpp:(.text._ZNK12_GLOBAL__N_128ElementalAssignBufferization15matchAndRewriteEN5hlfir11ElementalOpERN4mlir15PatternRewriterE+0x628): undefined reference to `flangomp::shouldUseWorkshareLowering(mlir::Operation*)'
collect2: error: ld returned 1 exit status
154.326 [573/1/6717] Linking CXX shared library lib/libLLVMCFIVerify.so.20.0git
ninja: build stopped: subcommand failed.

@llvm-ci
Copy link
Collaborator

llvm-ci commented Nov 20, 2024

LLVM Buildbot has detected a new failure on builder flang-aarch64-sharedlibs running on linaro-flang-aarch64-sharedlibs while building flang at step 5 "build-unified-tree".

Full details are available at: https://lab.llvm.org/buildbot/#/builders/80/builds/6543

Here is the relevant piece of the build log for the reference
Step 5 (build-unified-tree) failure: build (failure)
...
141.631 [293/4/7190] Linking CXX executable bin/llvm-strings
141.661 [271/25/7191] Linking CXX executable bin/llvm-size
141.661 [271/24/7192] Building Opts.inc...
141.677 [271/23/7193] Building CXX object tools/remarks-shlib/CMakeFiles/Remarks.dir/libremarks.cpp.o
141.683 [271/22/7194] Linking CXX static library lib/libLLVMOptDriver_static.a
141.691 [271/21/7195] Building CXX object tools/reduce-chunk-list/CMakeFiles/reduce-chunk-list.dir/reduce-chunk-list.cpp.o
141.693 [271/20/7196] Building CXX object examples/Kaleidoscope/Chapter2/CMakeFiles/Kaleidoscope-Ch2.dir/toy.cpp.o
141.704 [267/23/7197] Building CXX object tools/sanstats/CMakeFiles/sanstats.dir/sanstats.cpp.o
141.713 [267/22/7198] Building CXX object examples/Kaleidoscope/Chapter3/CMakeFiles/Kaleidoscope-Ch3.dir/toy.cpp.o
141.732 [255/33/7199] Linking CXX shared library lib/libHLFIRTransforms.so.20.0git
FAILED: lib/libHLFIRTransforms.so.20.0git 
: && /usr/local/bin/c++ -fPIC -fPIC -fno-semantic-interposition -fvisibility-inlines-hidden -Werror=date-time -Werror=unguarded-availability-new -Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual -Wmissing-field-initializers -pedantic -Wno-long-long -Wc++98-compat-extra-semi -Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type -Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wsuggest-override -Wstring-conversion -Wmisleading-indentation -Wctad-maybe-unsupported -fdiagnostics-color -ffunction-sections -fdata-sections -Wno-deprecated-copy -Wno-string-conversion -Wno-ctad-maybe-unsupported -Wno-unused-command-line-argument -Wstring-conversion           -Wcovered-switch-default -Wno-nested-anon-types -O3 -DNDEBUG  -Wl,-z,defs -Wl,-z,nodelete   -Wl,-rpath-link,/home/tcwg-buildbot/worker/flang-aarch64-sharedlibs/build/./lib  -Wl,--gc-sections -shared -Wl,-soname,libHLFIRTransforms.so.20.0git -o lib/libHLFIRTransforms.so.20.0git tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/BufferizeHLFIR.cpp.o tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/ConvertToFIR.cpp.o tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/InlineElementals.cpp.o tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/LowerHLFIRIntrinsics.cpp.o tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/LowerHLFIROrderedAssignments.cpp.o tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/ScheduleOrderedAssignments.cpp.o tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/SimplifyHLFIRIntrinsics.cpp.o tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/OptimizedBufferization.cpp.o  -Wl,-rpath,"\$ORIGIN/../lib:/home/tcwg-buildbot/worker/flang-aarch64-sharedlibs/build/lib:"  lib/libFIRTransforms.so.20.0git  lib/libFIRAnalysis.so.20.0git  lib/libFIRBuilder.so.20.0git  lib/libHLFIRDialect.so.20.0git  lib/libFIRSupport.so.20.0git  lib/libFIRDialect.so.20.0git  lib/libCUFAttrs.so.20.0git  lib/libFIRDialectSupport.so.20.0git  lib/libMLIRAffineTransformOps.so.20.0git  lib/libMLIRAMDGPUTransforms.so.20.0git  lib/libMLIRAMDGPUUtils.so.20.0git  lib/libMLIRAMDGPUDialect.so.20.0git  lib/libMLIRArithValueBoundsOpInterfaceImpl.so.20.0git  lib/libMLIRArmNeonTransforms.so.20.0git  lib/libMLIRArmSMETransforms.so.20.0git  lib/libMLIRArmSMEDialect.so.20.0git  lib/libMLIRAsyncTransforms.so.20.0git  lib/libMLIRBufferizationPipelines.so.20.0git  lib/libMLIRBufferizationTransformOps.so.20.0git  lib/libMLIRControlFlowTransforms.so.20.0git  lib/libMLIRDLTITransformOps.so.20.0git  lib/libMLIREmitCTransforms.so.20.0git  lib/libMLIREmitCDialect.so.20.0git  lib/libMLIRFuncTransformOps.so.20.0git  lib/libMLIRGPUTransformOps.so.20.0git  lib/libMLIRGPUPipelines.so.20.0git  lib/libMLIRIndexToLLVM.so.20.0git  lib/libMLIRNVVMToLLVM.so.20.0git  lib/libMLIRVCIXDialect.so.20.0git  lib/libMLIRMathTransforms.so.20.0git  lib/libMLIRMemRefTransformOps.so.20.0git  lib/libMLIRMLProgramTransforms.so.20.0git  lib/libMLIRMLProgramDialect.so.20.0git  lib/libMLIRMPIDialect.so.20.0git  lib/libMLIRNVGPUUtils.so.20.0git  lib/libMLIRNVGPUTransformOps.so.20.0git  lib/libMLIRNVGPUToNVVM.so.20.0git  lib/libMLIRNVGPUTransforms.so.20.0git  lib/libMLIROpenACCTransforms.so.20.0git  lib/libMLIRPolynomialDialect.so.20.0git  lib/libMLIRPtrDialect.so.20.0git  lib/libMLIRQuantTransforms.so.20.0git  lib/libMLIRSCFTransformOps.so.20.0git  lib/libMLIRShapeOpsTransforms.so.20.0git  lib/libMLIRShapeDialect.so.20.0git  lib/libMLIRSparseTensorPipelines.so.20.0git  lib/libMLIRSCFToControlFlow.so.20.0git  lib/libMLIRGPUToNVVMTransforms.so.20.0git  lib/libMLIRAffineToStandard.so.20.0git  lib/libMLIRReconcileUnrealizedCasts.so.20.0git  lib/libMLIRComplexToLibm.so.20.0git  lib/libMLIRVectorToLLVMPass.so.20.0git  lib/libMLIRAMXTransforms.so.20.0git  lib/libMLIRAMXDialect.so.20.0git  lib/libMLIRArmNeonDialect.so.20.0git  lib/libMLIRArmSVETransforms.so.20.0git  lib/libMLIRArmSVEDialect.so.20.0git  lib/libMLIRSparseTensorTransformOps.so.20.0git  lib/libMLIRLinalgTransformOps.so.20.0git  lib/libMLIRSparseTensorTransforms.so.20.0git  lib/libMLIRLinalgTransforms.so.20.0git  lib/libMLIRMemRefTransforms.so.20.0git  lib/libMLIRArithTransforms.so.20.0git  lib/libMLIRNVGPUDialect.so.20.0git  lib/libMLIRMeshTransforms.so.20.0git  lib/libMLIRSCFTransforms.so.20.0git  lib/libMLIRBufferizationTransforms.so.20.0git  lib/libMLIRSparseTensorUtils.so.20.0git  lib/libMLIRSPIRVModuleCombiner.so.20.0git  lib/libMLIRSPIRVTransforms.so.20.0git  lib/libMLIRSPIRVConversion.so.20.0git  lib/libMLIRSPIRVUtils.so.20.0git  lib/libMLIRTensorInferTypeOpInterfaceImpl.so.20.0git  lib/libMLIRTensorTilingInterfaceImpl.so.20.0git  lib/libMLIRLinalgUtils.so.20.0git  lib/libMLIRTensorTransformOps.so.20.0git  lib/libMLIRTensorTransforms.so.20.0git  lib/libMLIRAffineTransforms.so.20.0git  lib/libMLIRSCFUtils.so.20.0git  lib/libMLIRTilingInterface.so.20.0git  lib/libMLIRTensorUtils.so.20.0git  lib/libMLIRTosaShardingInterfaceImpl.so.20.0git  lib/libMLIRTosaTransforms.so.20.0git  lib/libMLIRTransformDebugExtension.so.20.0git  lib/libMLIRTransformDialectIRDLExtension.so.20.0git  lib/libMLIRIRDL.so.20.0git  lib/libMLIRTransformLoopExtension.so.20.0git  lib/libMLIRTransformPDLExtension.so.20.0git  lib/libMLIRTransformDialectTransforms.so.20.0git  lib/libMLIRVectorTransformOps.so.20.0git  lib/libMLIRTransformDialect.so.20.0git  lib/libMLIRTransformDialectInterfaces.so.20.0git  lib/libMLIRTransformDialectUtils.so.20.0git  lib/libMLIRVectorToSCF.so.20.0git  lib/libMLIRX86VectorTransforms.so.20.0git  lib/libMLIRX86VectorDialect.so.20.0git  lib/libMLIRXeGPUTransforms.so.20.0git  lib/libMLIRXeGPUDialect.so.20.0git  lib/libMLIRTestDynDialect.so.20.0git  lib/libMLIRTosaTestPasses.so.20.0git  lib/libMLIRTosaDialect.so.20.0git  lib/libMLIRQuantUtils.so.20.0git  lib/libMLIRQuantDialect.so.20.0git  lib/libMLIRShardingInterface.so.20.0git  lib/libMLIRMeshDialect.so.20.0git  lib/libMLIROpenACCDialect.so.20.0git  lib/libLLVMAsmPrinter.so.20.0git  lib/libMLIRMathToLLVM.so.20.0git  lib/libMLIRComplexToLLVM.so.20.0git  lib/libMLIRComplexToStandard.so.20.0git  lib/libMLIRMathToLibm.so.20.0git  lib/libMLIROpenMPDialect.so.20.0git  lib/libMLIROpenACCMPCommon.so.20.0git  lib/libMLIRGPUToGPURuntimeTransforms.so.20.0git  lib/libMLIRGPUTransforms.so.20.0git  lib/libMLIRIndexDialect.so.20.0git  lib/libMLIRSPIRVTarget.so.20.0git  lib/libMLIRSPIRVSerialization.so.20.0git  lib/libMLIRSPIRVDialect.so.20.0git  lib/libMLIRSPIRVBinaryUtils.so.20.0git  lib/libMLIRNVVMTarget.so.20.0git  lib/libMLIRNVVMToLLVMIRTranslation.so.20.0git  lib/libMLIRROCDLTarget.so.20.0git  lib/libMLIRTargetLLVM.so.20.0git  lib/libMLIRROCDLToLLVMIRTranslation.so.20.0git  lib/libMLIRROCDLDialect.so.20.0git  lib/libMLIRExecutionEngineUtils.so.20.0git  lib/libLLVMPasses.so.20.0git  lib/libLLVMTarget.so.20.0git  lib/libLLVMipo.so.20.0git  lib/libLLVMLinker.so.20.0git  lib/libMLIRMemRefToLLVM.so.20.0git  lib/libMLIRVectorToLLVM.so.20.0git  lib/libMLIRVectorTransforms.so.20.0git  lib/libMLIRAffineUtils.so.20.0git  lib/libMLIRGPUDialect.so.20.0git  lib/libMLIRLinalgDialect.so.20.0git  lib/libMLIRBufferizationDialect.so.20.0git  lib/libMLIRMathDialect.so.20.0git  lib/libMLIRSparseTensorDialect.so.20.0git  lib/libMLIRMemRefUtils.so.20.0git  lib/libMLIRVectorUtils.so.20.0git  lib/libMLIRAffineAnalysis.so.20.0git  lib/libMLIRSCFDialect.so.20.0git  lib/libMLIRVectorDialect.so.20.0git  lib/libMLIRTensorDialect.so.20.0git  lib/libMLIRAffineDialect.so.20.0git  lib/libMLIRParallelCombiningOpInterface.so.20.0git  lib/libMLIRMaskableOpInterface.so.20.0git  lib/libMLIRMaskingOpInterface.so.20.0git  lib/libMLIRVectorInterfaces.so.20.0git  lib/libMLIRTargetLLVMIRExport.so.20.0git  lib/libMLIRDLTIDialect.so.20.0git  lib/libMLIRLLVMIRTransforms.so.20.0git  lib/libMLIRNVVMDialect.so.20.0git  lib/libMLIRTranslateLib.so.20.0git  lib/libMLIRParser.so.20.0git  lib/libMLIRBytecodeReader.so.20.0git  lib/libMLIRAsmParser.so.20.0git  lib/libLLVMFrontendOpenMP.so.20.0git  lib/libLLVMFrontendOffloading.so.20.0git  lib/libLLVMTransformUtils.so.20.0git  lib/libMLIRAsyncToLLVM.so.20.0git  lib/libMLIRAsyncDialect.so.20.0git  lib/libMLIRFuncTransforms.so.20.0git  lib/libMLIRMemRefDialect.so.20.0git  lib/libMLIRArithUtils.so.20.0git  lib/libMLIRComplexDialect.so.20.0git  lib/libMLIRDialectUtils.so.20.0git  lib/libMLIRShapedOpInterfaces.so.20.0git  lib/libMLIRFuncToLLVM.so.20.0git  lib/libMLIRFuncDialect.so.20.0git  lib/libMLIRArithToLLVM.so.20.0git  lib/libMLIRArithAttrToLLVMConversion.so.20.0git  lib/libMLIRControlFlowToLLVM.so.20.0git  lib/libMLIRControlFlowDialect.so.20.0git  lib/libMLIRArithDialect.so.20.0git  lib/libMLIRUBDialect.so.20.0git  lib/libMLIRCastInterfaces.so.20.0git  lib/libMLIRDialect.so.20.0git  lib/libMLIRInferIntRangeCommon.so.20.0git  lib/libMLIRConvertToLLVMPass.so.20.0git  lib/libMLIRLLVMCommonConversion.so.20.0git  lib/libMLIRLLVMDialect.so.20.0git  lib/libLLVMBitWriter.so.20.0git  lib/libLLVMMCParser.so.20.0git  lib/libLLVMIRReader.so.20.0git  lib/libLLVMAsmParser.so.20.0git  lib/libLLVMBitReader.so.20.0git  lib/libLLVMMC.so.20.0git  lib/libMLIRTransforms.so.20.0git  lib/libMLIRTransformUtils.so.20.0git  lib/libMLIRSubsetOpInterface.so.20.0git  lib/libMLIRValueBoundsOpInterface.so.20.0git  lib/libMLIRDestinationStyleOpInterface.so.20.0git  lib/libMLIRMemorySlotInterfaces.so.20.0git  lib/libMLIRRuntimeVerifiableOpInterface.so.20.0git  lib/libLLVMCore.so.20.0git  lib/libLLVMRemarks.so.20.0git  lib/libLLVMBinaryFormat.so.20.0git  lib/libLLVMTargetParser.so.20.0git  lib/libMLIRRewrite.so.20.0git  lib/libMLIRRewritePDL.so.20.0git  lib/libMLIRPDLToPDLInterp.so.20.0git  lib/libMLIRPDLInterpDialect.so.20.0git  lib/libMLIRPDLDialect.so.20.0git  lib/libMLIRPass.so.20.0git  lib/libMLIRAnalysis.so.20.0git  lib/libMLIRCallInterfaces.so.20.0git  lib/libMLIRControlFlowInterfaces.so.20.0git  lib/libMLIRInferTypeOpInterface.so.20.0git  lib/libMLIRSideEffectInterfaces.so.20.0git  lib/libMLIRPresburger.so.20.0git  lib/libMLIRLoopLikeInterface.so.20.0git  lib/libMLIRViewLikeInterface.so.20.0git  lib/libMLIRInferIntRangeInterface.so.20.0git  lib/libMLIRFunctionInterfaces.so.20.0git  lib/libMLIRDataLayoutInterfaces.so.20.0git  lib/libMLIRIR.so.20.0git  lib/libMLIRSupport.so.20.0git  lib/libLLVMSupport.so.20.0git  -Wl,-rpath-link,/home/tcwg-buildbot/worker/flang-aarch64-sharedlibs/build/lib && :
/usr/bin/ld: tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/BufferizeHLFIR.cpp.o: in function `(anonymous namespace)::ElementalOpConversion::matchAndRewrite(hlfir::ElementalOp, hlfir::ElementalOpAdaptor, mlir::ConversionPatternRewriter&) const':
BufferizeHLFIR.cpp:(.text._ZNK12_GLOBAL__N_121ElementalOpConversion15matchAndRewriteEN5hlfir11ElementalOpENS1_18ElementalOpAdaptorERN4mlir25ConversionPatternRewriterE+0x664): undefined reference to `flangomp::shouldUseWorkshareLowering(mlir::Operation*)'
/usr/bin/ld: tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/OptimizedBufferization.cpp.o: in function `(anonymous namespace)::ElementalAssignBufferization::matchAndRewrite(hlfir::ElementalOp, mlir::PatternRewriter&) const':
OptimizedBufferization.cpp:(.text._ZNK12_GLOBAL__N_128ElementalAssignBufferization15matchAndRewriteEN5hlfir11ElementalOpERN4mlir15PatternRewriterE+0xa44): undefined reference to `flangomp::shouldUseWorkshareLowering(mlir::Operation*)'
/usr/bin/ld: tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/OptimizedBufferization.cpp.o: in function `(anonymous namespace)::BroadcastAssignBufferization::matchAndRewrite(hlfir::AssignOp, mlir::PatternRewriter&) const':
OptimizedBufferization.cpp:(.text._ZNK12_GLOBAL__N_128BroadcastAssignBufferization15matchAndRewriteEN5hlfir8AssignOpERN4mlir15PatternRewriterE+0x24c): undefined reference to `flangomp::shouldUseWorkshareLowering(mlir::Operation*)'
/usr/bin/ld: tools/flang/lib/Optimizer/HLFIR/Transforms/CMakeFiles/HLFIRTransforms.dir/OptimizedBufferization.cpp.o: in function `(anonymous namespace)::VariableAssignBufferization::matchAndRewrite(hlfir::AssignOp, mlir::PatternRewriter&) const':
OptimizedBufferization.cpp:(.text._ZNK12_GLOBAL__N_127VariableAssignBufferization15matchAndRewriteEN5hlfir8AssignOpERN4mlir15PatternRewriterE+0x3dc): undefined reference to `flangomp::shouldUseWorkshareLowering(mlir::Operation*)'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
141.738 [255/32/7200] Building CXX object examples/Kaleidoscope/Chapter4/CMakeFiles/Kaleidoscope-Ch4.dir/toy.cpp.o
141.738 [255/31/7201] Building CXX object examples/Kaleidoscope/BuildingAJIT/Chapter2/CMakeFiles/BuildingAJIT-Ch2.dir/toy.cpp.o
141.739 [255/30/7202] Building CXX object examples/Kaleidoscope/BuildingAJIT/Chapter3/CMakeFiles/BuildingAJIT-Ch3.dir/toy.cpp.o
141.740 [255/29/7203] Building CXX object examples/Kaleidoscope/BuildingAJIT/Chapter4/CMakeFiles/BuildingAJIT-Ch4.dir/toy.cpp.o
141.741 [255/28/7204] Building CXX object examples/Kaleidoscope/Chapter5/CMakeFiles/Kaleidoscope-Ch5.dir/toy.cpp.o
141.742 [255/27/7205] Building CXX object examples/Kaleidoscope/Chapter6/CMakeFiles/Kaleidoscope-Ch6.dir/toy.cpp.o
141.743 [255/26/7206] Building CXX object examples/Kaleidoscope/Chapter7/CMakeFiles/Kaleidoscope-Ch7.dir/toy.cpp.o
141.743 [255/25/7207] Building CXX object examples/Kaleidoscope/Chapter8/CMakeFiles/Kaleidoscope-Ch8.dir/toy.cpp.o
141.744 [255/24/7208] Building CXX object tools/sancov/CMakeFiles/sancov.dir/sancov-driver.cpp.o
141.754 [255/23/7209] Building CXX object tools/sancov/CMakeFiles/sancov.dir/sancov.cpp.o
141.772 [255/22/7210] Building CXX object examples/ModuleMaker/CMakeFiles/ModuleMaker.dir/ModuleMaker.cpp.o
141.806 [255/21/7211] Linking CXX executable bin/llvm-yaml-numeric-parser-fuzzer
141.807 [255/20/7212] Linking CXX executable bin/llvm-yaml-parser-fuzzer
141.820 [255/19/7213] Linking CXX executable bin/llvm-symbolizer
141.831 [255/18/7214] Building CXX object examples/OrcV2Examples/LLJITDumpObjects/CMakeFiles/LLJITDumpObjects.dir/LLJITDumpObjects.cpp.o
141.832 [255/17/7215] Building CXX object examples/Kaleidoscope/Chapter9/CMakeFiles/Kaleidoscope-Ch9.dir/toy.cpp.o
141.833 [255/16/7216] Building CXX object examples/OrcV2Examples/LLJITRemovableCode/CMakeFiles/LLJITRemovableCode.dir/LLJITRemovableCode.cpp.o
141.834 [255/15/7217] Building CXX object examples/OrcV2Examples/LLJITWithCustomObjectLinkingLayer/CMakeFiles/LLJITWithCustomObjectLinkingLayer.dir/LLJITWithCustomObjectLinkingLayer.cpp.o
141.835 [255/14/7218] Building CXX object examples/OrcV2Examples/LLJITWithExecutorProcessControl/CMakeFiles/LLJITWithExecutorProcessControl.dir/LLJITWithExecutorProcessControl.cpp.o
141.836 [255/13/7219] Building CXX object examples/OrcV2Examples/LLJITWithGDBRegistrationListener/CMakeFiles/LLJITWithGDBRegistrationListener.dir/LLJITWithGDBRegistrationListener.cpp.o
141.837 [255/12/7220] Building CXX object examples/OrcV2Examples/LLJITWithInitializers/CMakeFiles/LLJITWithInitializers.dir/LLJITWithInitializers.cpp.o
141.838 [255/11/7221] Building CXX object examples/OrcV2Examples/LLJITWithLazyReexports/CMakeFiles/LLJITWithLazyReexports.dir/LLJITWithLazyReexports.cpp.o
141.838 [255/10/7222] Linking CXX shared library lib/libRemarks.so.20.0git
141.840 [255/9/7223] Linking CXX executable bin/reduce-chunk-list
141.847 [255/8/7224] Linking CXX executable bin/Kaleidoscope-Ch2
141.850 [255/7/7225] Linking CXX executable bin/llvm-tli-checker
141.869 [255/6/7226] Linking CXX executable bin/llvm-xray
141.872 [255/5/7227] Linking CXX executable bin/obj2yaml

ivanradanov added a commit that referenced this pull request Nov 21, 2024
#104748)

This patch adds parallelization support for the following expression in OpenMP
workshare constructs:

* Elemental procedures in array expressions

(reapplied with linking fix)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
flang:fir-hlfir flang:openmp flang Flang issues not falling into any other category
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants