[flang-commits] [flang] [llvm] [mlir] [flang][OpenMP] Support the FULL clause on the UNROLL construct (PR #214115)
Sairudra More via flang-commits
flang-commits at lists.llvm.org
Mon Aug 10 06:50:41 PDT 2026
================
@@ -443,6 +443,41 @@ void OmpStructureChecker::Enter(const parser::OpenMPLoopConstruct &x) {
beginName.v == llvm::omp::Directive::OMPD_distribute_simd) {
CheckDistLinear(x);
}
+ if (beginName.v == llvm::omp::Directive::OMPD_unroll) {
+ CheckUnrollFullTripCount(x);
+ }
+}
+
+// A loop that is fully unrolled must have a trip count that is known at compile
+// time, so its bounds and step have to be constant expressions.
+void OmpStructureChecker::CheckUnrollFullTripCount(
+ const parser::OpenMPLoopConstruct &x) {
+ const parser::OmpDirectiveSpecification &beginSpec{x.BeginDir()};
+ const parser::OmpClause *full{
+ parser::omp::FindClause(beginSpec, llvm::omp::Clause::OMPC_full)};
+ if (!full) {
+ return;
+ }
+
+ const parser::DoConstruct *doConstruct{x.GetNestedLoop()};
+ if (!doConstruct) {
+ return;
+ }
+ const auto &control{doConstruct->GetLoopControl()};
+ if (!control) {
+ return;
+ }
+ const auto *bounds{std::get_if<parser::LoopControl::Bounds>(&control->u)};
+ if (!bounds) {
+ return;
+ }
+ bool isConstant{GetIntValue(bounds->Lower()).has_value() &&
----------------
Saieiei wrote:
Could we check the folded trip count here instead of requiring each bound and the step to be constant? The OpenMP restriction is on the iteration count itself. For example, `do i = m, m` has a constant trip count of 1, but this check rejects it because `m` isn't constant. A positive test for that case would be useful.
https://github.com/llvm/llvm-project/pull/214115
More information about the flang-commits
mailing list