[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