[flang-commits] [flang] 9adef10 - [Flang][OpenMP] Add convert to match the argument and result of update Op

Kiran Chandramohan via flang-commits flang-commits at lists.llvm.org
Tue Feb 21 04:43:10 PST 2023


Author: Kiran Chandramohan
Date: 2023-02-21T12:34:16Z
New Revision: 9adef1048af2813fd5c8241d5a2e96c8a697f6a9

URL: https://github.com/llvm/llvm-project/commit/9adef1048af2813fd5c8241d5a2e96c8a697f6a9
DIFF: https://github.com/llvm/llvm-project/commit/9adef1048af2813fd5c8241d5a2e96c8a697f6a9.diff

LOG: [Flang][OpenMP] Add convert to match the argument and result of update Op

Fixes #60873

Reviewed By: peixin

Differential Revision: https://reviews.llvm.org/D144432

Added: 
    

Modified: 
    flang/lib/Lower/OpenMP.cpp
    flang/test/Lower/OpenMP/atomic-update.f90

Removed: 
    


################################################################################
diff  --git a/flang/lib/Lower/OpenMP.cpp b/flang/lib/Lower/OpenMP.cpp
index 5899ddbdcae6f..ea1c37131157f 100644
--- a/flang/lib/Lower/OpenMP.cpp
+++ b/flang/lib/Lower/OpenMP.cpp
@@ -1669,8 +1669,10 @@ static void genOmpAtomicUpdateStatement(
 
   mlir::Value result = fir::getBase(converter.genExprValue(
       *Fortran::semantics::GetExpr(assignmentStmtExpr), stmtCtx));
+  mlir::Value convertResult =
+      firOpBuilder.createConvert(currentLocation, varType, result);
   // Insert the terminator: YieldOp.
-  firOpBuilder.create<mlir::omp::YieldOp>(currentLocation, result);
+  firOpBuilder.create<mlir::omp::YieldOp>(currentLocation, convertResult);
   // Reset the insert point to before the terminator.
   firOpBuilder.setInsertionPointToStart(&block);
 }

diff  --git a/flang/test/Lower/OpenMP/atomic-update.f90 b/flang/test/Lower/OpenMP/atomic-update.f90
index 5dd90c0674472..5046dce38c989 100644
--- a/flang/test/Lower/OpenMP/atomic-update.f90
+++ b/flang/test/Lower/OpenMP/atomic-update.f90
@@ -7,6 +7,8 @@ program OmpAtomicUpdate
     integer :: x, y, z
     integer, pointer :: a, b
     integer, target :: c, d
+    integer(1) :: i1
+
     a=>c
     b=>d
 
@@ -21,6 +23,7 @@ program OmpAtomicUpdate
 !CHECK: fir.store %{{.*}} to %[[B_ADDR]] : !fir.ref<!fir.ptr<i32>>
 !CHECK: %[[C_ADDR:.*]] = fir.address_of(@_QFEc) : !fir.ref<i32>
 !CHECK: %[[D_ADDR:.*]] = fir.address_of(@_QFEd) : !fir.ref<i32>
+!CHECK: %[[I1:.*]] = fir.alloca i8 {bindc_name = "i1", uniq_name = "_QFEi1"}
 !CHECK: %[[X:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFEx"}
 !CHECK: %[[Y:.*]] = fir.alloca i32 {bindc_name = "y", uniq_name = "_QFEy"}
 !CHECK: %[[Z:.*]] = fir.alloca i32 {bindc_name = "z", uniq_name = "_QFEz"}
@@ -115,10 +118,22 @@ program OmpAtomicUpdate
 !CHECK:    %[[RESULT:.*]] = arith.addi %[[LOADED_Y]], %[[ARG]] : i32
 !CHECK:    omp.yield(%[[RESULT]] : i32)
 !CHECK:  }
-!CHECK:  return
-!CHECK: }
     !$omp atomic hint(omp_sync_hint_nonspeculative) seq_cst
         y = 10 + y
     !$omp atomic seq_cst update
         z = y + z
+
+!CHECK:  omp.atomic.update   %[[I1]] : !fir.ref<i8> {
+!CHECK:  ^bb0(%[[VAL:.*]]: i8):
+!CHECK:    %[[CVT_VAL:.*]] = fir.convert %[[VAL]] : (i8) -> i32
+!CHECK:    %[[C1_VAL:.*]] = arith.constant 1 : i32
+!CHECK:    %[[ADD_VAL:.*]] = arith.addi %[[CVT_VAL]], %[[C1_VAL]] : i32
+!CHECK:    %[[UPDATED_VAL:.*]] = fir.convert %[[ADD_VAL]] : (i32) -> i8
+!CHECK:    omp.yield(%[[UPDATED_VAL]] : i8)
+!CHECK:  }
+    !$omp atomic
+      i1 = i1 + 1
+    !$omp end atomic
+!CHECK:  return
+!CHECK: }
 end program OmpAtomicUpdate


        


More information about the flang-commits mailing list