[flang-commits] [flang] [mlir] [flang][openmp] Add support for ordered regions in SIMD directives (PR #181012)

via flang-commits flang-commits at lists.llvm.org
Wed Feb 18 20:55:16 PST 2026


================
@@ -3151,9 +3146,27 @@ convertOmpWsloop(Operation &opInst, llvm::IRBuilderBase &builder,
                                                 loopInfo->getLastIter());
     if (failed(handleError(afterBarrierIP, *loopOp)))
       return failure();
-    for (size_t index = 0; index < wsloopOp.getLinearVars().size(); index++)
+
+    // Check if this worksharing loop contains ordered regions (with SIMD)
+    bool hasOrderedRegions = false;
+    wsloopOp.getRegion().walk([&](omp::OrderedRegionOp orderedOp) {
+      hasOrderedRegions = true;
+      return WalkResult::interrupt();
+    });
+
+    for (size_t index = 0; index < wsloopOp.getLinearVars().size(); index++) {
       linearClauseProcessor.rewriteInPlace(builder, "omp.loop_nest.region",
                                            index);
+      // Only do extra rewrites if we have both SIMD and ordered regions
+      if (isSimd && hasOrderedRegions) {
----------------
NimishMishra wrote:

Would it make more sense to house this check and subsequent rewrites in `convertOmpSimd` instead? From the test case,

```
omp.wsloop ordered(0) {
   omp.simd linear({{.*}}) private({{.*}}) {
   omp.loop_nest (%{{.*}}) : i32 = (%{{.*}}) to (%{{.*}}) inclusive step (%{{.*}}) {
      omp.ordered.region par_level_simd {
    omp.terminator
   }
  omp.yield
 }
 } {linear_var_types = [i32], omp.composite}
} {omp.composite}
```

So `convertOmpSimd` would be inherently called. 

https://github.com/llvm/llvm-project/pull/181012


More information about the flang-commits mailing list