Skip to content

Commit 305ad9a

Browse files
[Flang][OpenMP] Use typed assignment in Atomic Write lowering
Use typed assignment in Atomic Write lowering to better handle type conversions of allowed types. Note: We should make similar changes for other constructs in later patches. Reviewed By: NimishMishra Differential Revision: https://reviews.llvm.org/D154163
1 parent 78d00a1 commit 305ad9a

File tree

2 files changed

+18
-8
lines changed

2 files changed

+18
-8
lines changed

flang/lib/Lower/OpenMP.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2358,16 +2358,16 @@ genOmpAtomicWrite(Fortran::lower::AbstractConverter &converter,
23582358
std::get<2>(atomicWrite.t);
23592359
const Fortran::parser::OmpAtomicClauseList &leftHandClauseList =
23602360
std::get<0>(atomicWrite.t);
2361-
const auto &assignmentStmtExpr =
2362-
std::get<Fortran::parser::Expr>(std::get<3>(atomicWrite.t).statement.t);
2363-
const auto &assignmentStmtVariable = std::get<Fortran::parser::Variable>(
2364-
std::get<3>(atomicWrite.t).statement.t);
2361+
const Fortran::parser::AssignmentStmt &stmt =
2362+
std::get<3>(atomicWrite.t).statement;
2363+
const Fortran::evaluate::Assignment &assign = *stmt.typedAssignment->v;
23652364
Fortran::lower::StatementContext stmtCtx;
23662365
// Get the value and address of atomic write operands.
2367-
mlir::Value rhs_expr = fir::getBase(converter.genExprValue(
2368-
*Fortran::semantics::GetExpr(assignmentStmtExpr), stmtCtx));
2369-
mlir::Value lhs_addr = fir::getBase(converter.genExprAddr(
2370-
*Fortran::semantics::GetExpr(assignmentStmtVariable), stmtCtx));
2366+
mlir::Value rhs_expr =
2367+
fir::getBase(converter.genExprValue(assign.rhs, stmtCtx));
2368+
2369+
mlir::Value lhs_addr =
2370+
fir::getBase(converter.genExprAddr(assign.lhs, stmtCtx));
23712371
genOmpAtomicWriteStatement(converter, eval, lhs_addr, rhs_expr,
23722372
&leftHandClauseList, &rightHandClauseList);
23732373
}

flang/test/Lower/OpenMP/atomic-write.f90

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,13 @@ subroutine atomic_write_pointer()
6363
x = 2
6464
end
6565

66+
!CHECK-LABEL: func.func @_QPatomic_write_typed_assign
67+
!CHECK: %[[VAR:.*]] = fir.alloca f32 {bindc_name = "r2", uniq_name = "{{.*}}r2"}
68+
!CHECK: %[[CST:.*]] = arith.constant 0.000000e+00 : f32
69+
!CHECK: omp.atomic.write %[[VAR]] = %[[CST]] : !fir.ref<f32>, f32
70+
71+
subroutine atomic_write_typed_assign
72+
real :: r2
73+
!$omp atomic write
74+
r2 = 0
75+
end subroutine

0 commit comments

Comments
 (0)