[flang-commits] [clang] [flang] [llvm] [flang][clang][OpenMP] Fix context selector matching and scoring (PR #231668)

via flang-commits flang-commits at lists.llvm.org
Tue Oct 13 18:51:22 PDT 2026


================
@@ -2621,8 +2624,10 @@ std::optional<MetadirectiveCandidateSet> BuildMetadirectiveCandidateSet(
           staticVMI.ScoreMap.erase(scoreIt);
         }
         staticVMI.RequiredTraits.reset(unsigned(dynamicConditionTrait));
+        staticVMI.UserCondition = {};
----------------
MattPD wrote:

Clearing the identity lets the unguarded alternative compare as a subset of a WHEN clause with a different condition. Compile this with `flang -fopenmp -fopenmp-version=52 -S -emit-llvm repro.f90 -o -`:

```fortran
subroutine s(a, b)
  logical :: a, b
  !$omp metadirective &
  !$omp& when(implementation={vendor(score(50): llvm), extension(match_any)}, &
  !$omp& user={condition(a)}: taskyield) &
  !$omp& when(implementation={vendor(llvm), extension(match_any)}, &
  !$omp& device={kind(cpu)}, user={condition(b)}: taskwait)
end subroutine
```

At 82f18330, the result is TASKYIELD when `a` is true and TASKWAIT otherwise. The [parent](https://github.com/llvm/llvm-project/commit/6544686b4a86193fc0bf6d229d59df20a4251e7f) emits unconditional TASKYIELD. The first WHEN is always applicable through `vendor(llvm)` and scores 51 against 2. Its distinct `condition(a)` prevents a subset relationship with the second WHEN. Could the unguarded alternative preserve the original WHEN's condition identity for subset checks?

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


More information about the flang-commits mailing list