[llvm-branch-commits] [clang] 3a856a2 - Revert "[Clang][OpenMP] Convert `flatten` floating-point trip-count to intege…"

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Mon Oct 19 19:42:23 PDT 2026


Author: Hubert Tong
Date: 2026-10-19T22:42:19-04:00
New Revision: 3a856a27332fca811df228d4a8cda3b104cbfdaf

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

LOG: Revert "[Clang][OpenMP] Convert `flatten` floating-point trip-count to intege…"

This reverts commit 5db657b9d7afdf469398f562288aba6aa2fb68e4.

Added: 
    

Modified: 
    clang/lib/Sema/SemaOpenMP.cpp
    clang/test/OpenMP/flatten_codegen.cpp

Removed: 
    openmp/runtime/test/transform/flatten/floating-bounds.c


################################################################################
diff  --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index 6a77044ed4988..efe8c9338b5a9 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -17368,32 +17368,10 @@ SemaOpenMP::ActOnOpenMPFlattenDirective(ArrayRef<OMPClause *> Clauses,
   }
 
   CaptureVars CopyTransformer(SemaRef);
-  // Convert a non-integer trip count. Width matches buildNumIterations.
-  // Signedness follows an integer loop variable so a float count stays signed.
-  auto MakeNumIterations = [&CopyTransformer, &LoopHelpers, &Context,
-                            &SemaRef =
-                                this->SemaRef](unsigned I) -> ExprResult {
-    ExprResult N = CopyTransformer.TransformExpr(LoopHelpers[I].NumIterations);
-    if (!N.isUsable())
-      return ExprError();
-    QualType Type = N.get()->getType();
-    if (Type->isIntegerType())
-      return N;
-    const auto *Counter = cast<DeclRefExpr>(LoopHelpers[I].Counters.front());
-    QualType VarType = Counter->getType().getNonReferenceType();
-    bool VarIsInt = VarType->hasIntegerRepresentation();
-    bool UseVarWidth =
-        VarIsInt && Context.getTypeSize(Type) > Context.getTypeSize(VarType);
-    unsigned NewSize =
-        UseVarWidth ? Context.getTypeSize(VarType) : Context.getTypeSize(Type);
-    bool IsSigned = VarIsInt ? VarType->hasSignedIntegerRepresentation()
-                             : Type->hasFloatingRepresentation();
-    QualType IntTy = getIntTypeForBitwidthOrBitInt(Context, NewSize, IsSigned);
-    N = SemaRef.PerformImplicitConversion(
-        N.get(), IntTy, AssignmentAction::Converting, /*AllowExplicit=*/true);
-    if (!N.isUsable())
-      return ExprError();
-    return N;
+  auto MakeNumIterations = [&CopyTransformer,
+                            &LoopHelpers](unsigned I) -> Expr * {
+    return AssertSuccess(
+        CopyTransformer.TransformExpr(LoopHelpers[I].NumIterations));
   };
 
   OMPLoopBasedDirective::HelperExprs &OutermostHelper = LoopHelpers[0];
@@ -17408,10 +17386,7 @@ SemaOpenMP::ActOnOpenMPFlattenDirective(ArrayRef<OMPClause *> Clauses,
   auto BuildTripCount = [&](unsigned Bits) -> ExprResult {
     ExprResult Product;
     for (unsigned I = 0; I < NumLoops; ++I) {
-      ExprResult N = MakeNumIterations(I);
-      if (!N.isUsable())
-        return ExprError();
-      N = widenIterationCount(Bits, N.get(), SemaRef);
+      ExprResult N = widenIterationCount(Bits, MakeNumIterations(I), SemaRef);
       if (!N.isUsable())
         return ExprError();
       if (I == 0)
@@ -17489,31 +17464,27 @@ SemaOpenMP::ActOnOpenMPFlattenDirective(ArrayRef<OMPClause *> Clauses,
   if (!TripCount.isUsable())
     return StmtError();
 
-  auto MakeNumIterationsInIVTy = [&](unsigned I) -> ExprResult {
-    ExprResult N = MakeNumIterations(I);
-    if (!N.isUsable())
-      return ExprError();
-    return SemaRef.PerformImplicitConversion(
-        N.get(), IVTy, AssignmentAction::Converting, /*AllowExplicit=*/true);
+  auto MakeNumIterationsInIVTy = [&](unsigned I) -> Expr * {
+    return AssertSuccess(SemaRef.PerformImplicitConversion(
+        MakeNumIterations(I), IVTy, AssignmentAction::Converting,
+        /*AllowExplicit=*/true));
   };
 
   // Divisors in index recovery use (N == 0 ? 1 : N) so a zero trip count does
   // not warn.
-  auto MakeDivisorInIVTy = [&](unsigned I) -> ExprResult {
-    ExprResult N = MakeNumIterationsInIVTy(I);
-    ExprResult NCmp = MakeNumIterationsInIVTy(I);
-    if (!N.isUsable() || !NCmp.isUsable())
-      return ExprError();
+  auto MakeDivisorInIVTy = [&](unsigned I) -> Expr * {
+    Expr *N = MakeNumIterationsInIVTy(I);
+    Expr *NCmp = MakeNumIterationsInIVTy(I);
     auto MakeCst = [&](uint64_t V) -> Expr * {
       return IntegerLiteral::Create(Context, llvm::APInt(IVWidth, V), IVTy,
                                     CondLoc);
     };
     ExprResult IsZero =
-        SemaRef.BuildBinOp(CurScope, CondLoc, BO_EQ, NCmp.get(), MakeCst(0));
+        SemaRef.BuildBinOp(CurScope, CondLoc, BO_EQ, NCmp, MakeCst(0));
     if (!IsZero.isUsable())
       return N;
-    return SemaRef.ActOnConditionalOp(CondLoc, CondLoc, IsZero.get(),
-                                      MakeCst(1), N.get());
+    return AssertSuccess(SemaRef.ActOnConditionalOp(
+        CondLoc, CondLoc, IsZero.get(), MakeCst(1), N));
   };
 
   // \code{.cpp}
@@ -17578,14 +17549,9 @@ SemaOpenMP::ActOnOpenMPFlattenDirective(ArrayRef<OMPClause *> Clauses,
     ExprResult Value = MakeFlattenedRef();
     if (I + 1 < NumLoops) {
       ExprResult Divisor = MakeDivisorInIVTy(I + 1);
-      if (!Divisor.isUsable())
-        return StmtError();
       for (unsigned J = I + 2; J < NumLoops; ++J) {
-        ExprResult Next = MakeDivisorInIVTy(J);
-        if (!Next.isUsable())
-          return StmtError();
         Divisor = SemaRef.BuildBinOp(CurScope, OrigVarLoc, BO_Mul,
-                                     Divisor.get(), Next.get());
+                                     Divisor.get(), MakeDivisorInIVTy(J));
         if (!Divisor.isUsable())
           return StmtError();
       }
@@ -17595,11 +17561,8 @@ SemaOpenMP::ActOnOpenMPFlattenDirective(ArrayRef<OMPClause *> Clauses,
         return StmtError();
     }
     if (I > 0) {
-      ExprResult RemDivisor = MakeDivisorInIVTy(I);
-      if (!RemDivisor.isUsable())
-        return StmtError();
       Value = SemaRef.BuildBinOp(CurScope, OrigVarLoc, BO_Rem, Value.get(),
-                                 RemDivisor.get());
+                                 MakeDivisorInIVTy(I));
       if (!Value.isUsable())
         return StmtError();
     }

diff  --git a/clang/test/OpenMP/flatten_codegen.cpp b/clang/test/OpenMP/flatten_codegen.cpp
index f9bc03c55ed2c..109aa16e3e079 100644
--- a/clang/test/OpenMP/flatten_codegen.cpp
+++ b/clang/test/OpenMP/flatten_codegen.cpp
@@ -102,34 +102,6 @@ extern "C" void both_neg() {
       body(i, j);
 }
 
-// A floating-point expression that initializes an integer loop counter can
-// make the calculated trip count floating-point. Flatten converts such counts
-// to an integer type before building its flattened induction variable.
-// CHECK-LABEL: define {{.*}}void @floating_init(
-// CHECK:   %.flatten.iv = alloca i32
-// CHECK:   icmp slt i32
-// CHECK:   sdiv i32
-// CHECK:   srem i32
-extern "C" void floating_init() {
-#pragma omp flatten
-  for (int i = 0; i < 2; ++i)
-    for (int j = 0.; j < 2; ++j)
-      body(i, j);
-}
-
-// long and double are the same width, so the count is not narrowed to the
-// variable. Signedness still follows the signed loop variable (i64, not u64).
-// CHECK-LABEL: define {{.*}}void @floating_long(
-// CHECK:   %.flatten.iv = alloca i64
-// CHECK:   icmp slt i64
-// CHECK:   sdiv i64
-extern "C" void floating_long() {
-#pragma omp flatten
-  for (long i = 0.; i < 2; ++i)
-    for (int j = 0; j < 2; ++j)
-      body(0, 0);
-}
-
 // Mixed signed/unsigned trip counts: the flattened IV is unsigned, and the
 // signed inner count is converted into that type for (N == 0 ? 1 : N).
 // CHECK-LABEL: define {{.*}}void @mixed_sign(

diff  --git a/openmp/runtime/test/transform/flatten/floating-bounds.c b/openmp/runtime/test/transform/flatten/floating-bounds.c
deleted file mode 100644
index 1c45b5febbecf..0000000000000
--- a/openmp/runtime/test/transform/flatten/floating-bounds.c
+++ /dev/null
@@ -1,32 +0,0 @@
-// RUN: %libomp-compile -fopenmp-version=61 && %libomp-run \
-// RUN:   | FileCheck %s --match-full-lines
-
-#ifndef HEADER
-#define HEADER
-
-#include <stdlib.h>
-#include <stdio.h>
-
-int main(void) {
-  int count = 0;
-
-#pragma omp flatten
-  for (int i = 0; i < 2; ++i)
-    for (int j = 0.; j < 2; ++j)
-      ++count;
-  printf("floating-init=%d\n", count);
-
-  count = 0;
-#pragma omp flatten
-  for (int i = 0; i < 2; ++i)
-    for (int j = 0; j < 2.; ++j)
-      ++count;
-  printf("floating-bound=%d\n", count);
-
-  return EXIT_SUCCESS;
-}
-
-#endif /* HEADER */
-
-// CHECK:      floating-init=4
-// CHECK-NEXT: floating-bound=4


        


More information about the llvm-branch-commits mailing list