Skip to content

Commit 4546997

Browse files
committed
Updates and improvements
1 parent 71e7fbd commit 4546997

File tree

9 files changed

+381
-180
lines changed

9 files changed

+381
-180
lines changed

flang/include/flang/Parser/parse-tree.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4859,7 +4859,7 @@ struct OpenMPAtomicConstruct {
48594859

48604860
struct Op {
48614861
int what;
4862-
TypedExpr expr;
4862+
AssignmentStmt::TypedAssignment assign;
48634863
};
48644864
TypedExpr atom, cond;
48654865
Op op0, op1;

flang/lib/Lower/OpenMP/OpenMP.cpp

Lines changed: 73 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2673,38 +2673,65 @@ getAtomicMemoryOrder(lower::AbstractConverter &converter,
26732673
static mlir::Operation * //
26742674
genAtomicRead(lower::AbstractConverter &converter, mlir::Location loc,
26752675
lower::StatementContext &stmtCtx, mlir::Value atomAddr,
2676-
const semantics::SomeExpr &atom, const semantics::SomeExpr &expr,
2677-
mlir::IntegerAttr hint,
2676+
const semantics::SomeExpr &atom,
2677+
const evaluate::Assignment &assign, mlir::IntegerAttr hint,
26782678
mlir::omp::ClauseMemoryOrderKindAttr memOrder,
2679+
fir::FirOpBuilder::InsertPoint preAt,
26792680
fir::FirOpBuilder::InsertPoint atomicAt,
2680-
fir::FirOpBuilder::InsertPoint prepareAt) {
2681+
fir::FirOpBuilder::InsertPoint postAt) {
26812682
fir::FirOpBuilder &builder = converter.getFirOpBuilder();
26822683
fir::FirOpBuilder::InsertPoint saved = builder.saveInsertionPoint();
2683-
builder.restoreInsertionPoint(prepareAt);
2684+
builder.restoreInsertionPoint(preAt);
26842685

2685-
mlir::Value toAddr = fir::getBase(converter.genExprAddr(expr, stmtCtx, &loc));
2686+
mlir::Value storeAddr =
2687+
fir::getBase(converter.genExprAddr(assign.lhs, stmtCtx, &loc));
26862688
mlir::Type atomType = fir::unwrapRefType(atomAddr.getType());
2689+
mlir::Type storeType = fir::unwrapRefType(storeAddr.getType());
2690+
2691+
mlir::Value toAddr = [&]() {
2692+
if (atomType == storeType)
2693+
return storeAddr;
2694+
return builder.createTemporary(loc, atomType, ".tmp.atomval");
2695+
}();
26872696

26882697
builder.restoreInsertionPoint(atomicAt);
26892698
mlir::Operation *op = builder.create<mlir::omp::AtomicReadOp>(
26902699
loc, atomAddr, toAddr, mlir::TypeAttr::get(atomType), hint, memOrder);
2700+
2701+
if (atomType != storeType) {
2702+
lower::ExprToValueMap overrides;
2703+
// The READ operation could be a part of UPDATE CAPTURE, so make sure
2704+
// we don't emit extra code into the body of the atomic op.
2705+
builder.restoreInsertionPoint(postAt);
2706+
mlir::Value load = builder.create<fir::LoadOp>(loc, toAddr);
2707+
overrides.try_emplace(&atom, load);
2708+
2709+
converter.overrideExprValues(&overrides);
2710+
mlir::Value value =
2711+
fir::getBase(converter.genExprValue(assign.rhs, stmtCtx, &loc));
2712+
converter.resetExprOverrides();
2713+
2714+
builder.create<fir::StoreOp>(loc, value, storeAddr);
2715+
}
26912716
builder.restoreInsertionPoint(saved);
26922717
return op;
26932718
}
26942719

26952720
static mlir::Operation * //
26962721
genAtomicWrite(lower::AbstractConverter &converter, mlir::Location loc,
26972722
lower::StatementContext &stmtCtx, mlir::Value atomAddr,
2698-
const semantics::SomeExpr &atom, const semantics::SomeExpr &expr,
2699-
mlir::IntegerAttr hint,
2723+
const semantics::SomeExpr &atom,
2724+
const evaluate::Assignment &assign, mlir::IntegerAttr hint,
27002725
mlir::omp::ClauseMemoryOrderKindAttr memOrder,
2726+
fir::FirOpBuilder::InsertPoint preAt,
27012727
fir::FirOpBuilder::InsertPoint atomicAt,
2702-
fir::FirOpBuilder::InsertPoint prepareAt) {
2728+
fir::FirOpBuilder::InsertPoint postAt) {
27032729
fir::FirOpBuilder &builder = converter.getFirOpBuilder();
27042730
fir::FirOpBuilder::InsertPoint saved = builder.saveInsertionPoint();
2705-
builder.restoreInsertionPoint(prepareAt);
2731+
builder.restoreInsertionPoint(preAt);
27062732

2707-
mlir::Value value = fir::getBase(converter.genExprValue(expr, stmtCtx, &loc));
2733+
mlir::Value value =
2734+
fir::getBase(converter.genExprValue(assign.rhs, stmtCtx, &loc));
27082735
mlir::Type atomType = fir::unwrapRefType(atomAddr.getType());
27092736
mlir::Value converted = builder.createConvert(loc, atomType, value);
27102737

@@ -2719,19 +2746,20 @@ static mlir::Operation *
27192746
genAtomicUpdate(lower::AbstractConverter &converter, mlir::Location loc,
27202747
lower::StatementContext &stmtCtx, mlir::Value atomAddr,
27212748
const semantics::SomeExpr &atom,
2722-
const semantics::SomeExpr &expr, mlir::IntegerAttr hint,
2749+
const evaluate::Assignment &assign, mlir::IntegerAttr hint,
27232750
mlir::omp::ClauseMemoryOrderKindAttr memOrder,
2751+
fir::FirOpBuilder::InsertPoint preAt,
27242752
fir::FirOpBuilder::InsertPoint atomicAt,
2725-
fir::FirOpBuilder::InsertPoint prepareAt) {
2753+
fir::FirOpBuilder::InsertPoint postAt) {
27262754
lower::ExprToValueMap overrides;
27272755
lower::StatementContext naCtx;
27282756
fir::FirOpBuilder &builder = converter.getFirOpBuilder();
27292757
fir::FirOpBuilder::InsertPoint saved = builder.saveInsertionPoint();
2730-
builder.restoreInsertionPoint(prepareAt);
2758+
builder.restoreInsertionPoint(preAt);
27312759

27322760
mlir::Type atomType = fir::unwrapRefType(atomAddr.getType());
27332761

2734-
std::vector<SomeExpr> args{semantics::GetOpenMPTopLevelArguments(expr)};
2762+
std::vector<SomeExpr> args{semantics::GetOpenMPTopLevelArguments(assign.rhs)};
27352763
assert(!args.empty() && "Update operation without arguments");
27362764
for (auto &arg : args) {
27372765
if (!semantics::IsSameOrResizeOf(arg, atom)) {
@@ -2751,7 +2779,7 @@ genAtomicUpdate(lower::AbstractConverter &converter, mlir::Location loc,
27512779

27522780
converter.overrideExprValues(&overrides);
27532781
mlir::Value updated =
2754-
fir::getBase(converter.genExprValue(expr, stmtCtx, &loc));
2782+
fir::getBase(converter.genExprValue(assign.rhs, stmtCtx, &loc));
27552783
mlir::Value converted = builder.createConvert(loc, atomType, updated);
27562784
builder.create<mlir::omp::YieldOp>(loc, converted);
27572785
converter.resetExprOverrides();
@@ -2764,20 +2792,21 @@ static mlir::Operation *
27642792
genAtomicOperation(lower::AbstractConverter &converter, mlir::Location loc,
27652793
lower::StatementContext &stmtCtx, int action,
27662794
mlir::Value atomAddr, const semantics::SomeExpr &atom,
2767-
const semantics::SomeExpr &expr, mlir::IntegerAttr hint,
2795+
const evaluate::Assignment &assign, mlir::IntegerAttr hint,
27682796
mlir::omp::ClauseMemoryOrderKindAttr memOrder,
2797+
fir::FirOpBuilder::InsertPoint preAt,
27692798
fir::FirOpBuilder::InsertPoint atomicAt,
2770-
fir::FirOpBuilder::InsertPoint prepareAt) {
2799+
fir::FirOpBuilder::InsertPoint postAt) {
27712800
switch (action) {
27722801
case parser::OpenMPAtomicConstruct::Analysis::Read:
2773-
return genAtomicRead(converter, loc, stmtCtx, atomAddr, atom, expr, hint,
2774-
memOrder, atomicAt, prepareAt);
2802+
return genAtomicRead(converter, loc, stmtCtx, atomAddr, atom, assign, hint,
2803+
memOrder, preAt, atomicAt, postAt);
27752804
case parser::OpenMPAtomicConstruct::Analysis::Write:
2776-
return genAtomicWrite(converter, loc, stmtCtx, atomAddr, atom, expr, hint,
2777-
memOrder, atomicAt, prepareAt);
2805+
return genAtomicWrite(converter, loc, stmtCtx, atomAddr, atom, assign, hint,
2806+
memOrder, preAt, atomicAt, postAt);
27782807
case parser::OpenMPAtomicConstruct::Analysis::Update:
2779-
return genAtomicUpdate(converter, loc, stmtCtx, atomAddr, atom, expr, hint,
2780-
memOrder, atomicAt, prepareAt);
2808+
return genAtomicUpdate(converter, loc, stmtCtx, atomAddr, atom, assign,
2809+
hint, memOrder, preAt, atomicAt, postAt);
27812810
default:
27822811
return nullptr;
27832812
}
@@ -3724,6 +3753,15 @@ dumpAnalysis(const parser::OpenMPAtomicConstruct::Analysis &analysis) {
37243753
}
37253754
return "<null>"s;
37263755
};
3756+
auto assignStr = [&](const parser::AssignmentStmt::TypedAssignment &assign) {
3757+
if (auto *maybe = assign.get(); maybe && maybe->v) {
3758+
std::string str;
3759+
llvm::raw_string_ostream os(str);
3760+
maybe->v->AsFortran(os);
3761+
return str;
3762+
}
3763+
return "<null>"s;
3764+
};
37273765

37283766
const SomeExpr &atom = *analysis.atom.get()->v;
37293767

@@ -3732,11 +3770,11 @@ dumpAnalysis(const parser::OpenMPAtomicConstruct::Analysis &analysis) {
37323770
llvm::errs() << " cond: " << exprStr(analysis.cond) << "\n";
37333771
llvm::errs() << " op0 {\n";
37343772
llvm::errs() << " what: " << whatStr(analysis.op0.what) << "\n";
3735-
llvm::errs() << " expr: " << exprStr(analysis.op0.expr) << "\n";
3773+
llvm::errs() << " assign: " << assignStr(analysis.op0.assign) << "\n";
37363774
llvm::errs() << " }\n";
37373775
llvm::errs() << " op1 {\n";
37383776
llvm::errs() << " what: " << whatStr(analysis.op1.what) << "\n";
3739-
llvm::errs() << " expr: " << exprStr(analysis.op1.expr) << "\n";
3777+
llvm::errs() << " assign: " << assignStr(analysis.op1.assign) << "\n";
37403778
llvm::errs() << " }\n";
37413779
llvm::errs() << "}\n";
37423780
}
@@ -3745,8 +3783,8 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
37453783
semantics::SemanticsContext &semaCtx,
37463784
lower::pft::Evaluation &eval,
37473785
const parser::OpenMPAtomicConstruct &construct) {
3748-
auto get = [](const parser::TypedExpr &expr) -> const semantics::SomeExpr * {
3749-
if (auto *maybe = expr.get(); maybe && maybe->v) {
3786+
auto get = [](auto &&typedWrapper) -> decltype(&*typedWrapper.get()->v) {
3787+
if (auto *maybe = typedWrapper.get(); maybe && maybe->v) {
37503788
return &*maybe->v;
37513789
} else {
37523790
return nullptr;
@@ -3774,8 +3812,8 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
37743812
int action0 = analysis.op0.what & analysis.Action;
37753813
int action1 = analysis.op1.what & analysis.Action;
37763814
mlir::Operation *captureOp = nullptr;
3777-
fir::FirOpBuilder::InsertPoint atomicAt;
3778-
fir::FirOpBuilder::InsertPoint prepareAt = builder.saveInsertionPoint();
3815+
fir::FirOpBuilder::InsertPoint preAt = builder.saveInsertionPoint();
3816+
fir::FirOpBuilder::InsertPoint atomicAt, postAt;
37793817

37803818
if (construct.IsCapture()) {
37813819
// Capturing operation.
@@ -3784,35 +3822,36 @@ static void genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
37843822
captureOp =
37853823
builder.create<mlir::omp::AtomicCaptureOp>(loc, hint, memOrder);
37863824
// Set the non-atomic insertion point to before the atomic.capture.
3787-
prepareAt = getInsertionPointBefore(captureOp);
3825+
preAt = getInsertionPointBefore(captureOp);
37883826

37893827
mlir::Block *block = builder.createBlock(&captureOp->getRegion(0));
37903828
builder.setInsertionPointToEnd(block);
37913829
// Set the atomic insertion point to before the terminator inside
37923830
// atomic.capture.
37933831
mlir::Operation *term = builder.create<mlir::omp::TerminatorOp>(loc);
37943832
atomicAt = getInsertionPointBefore(term);
3833+
postAt = getInsertionPointAfter(captureOp);
37953834
hint = nullptr;
37963835
memOrder = nullptr;
37973836
} else {
37983837
// Non-capturing operation.
37993838
assert(action0 != analysis.None && action1 == analysis.None &&
38003839
"Expexcing single action");
38013840
assert(!(analysis.op0.what & analysis.Condition));
3802-
atomicAt = prepareAt;
3841+
postAt = atomicAt = preAt;
38033842
}
38043843

38053844
mlir::Operation *firstOp = genAtomicOperation(
38063845
converter, loc, stmtCtx, analysis.op0.what, atomAddr, atom,
3807-
*get(analysis.op0.expr), hint, memOrder, atomicAt, prepareAt);
3846+
*get(analysis.op0.assign), hint, memOrder, preAt, atomicAt, postAt);
38083847
assert(firstOp && "Should have created an atomic operation");
38093848
atomicAt = getInsertionPointAfter(firstOp);
38103849

38113850
mlir::Operation *secondOp = nullptr;
38123851
if (analysis.op1.what != analysis.None) {
38133852
secondOp = genAtomicOperation(converter, loc, stmtCtx, analysis.op1.what,
3814-
atomAddr, atom, *get(analysis.op1.expr),
3815-
hint, memOrder, atomicAt, prepareAt);
3853+
atomAddr, atom, *get(analysis.op1.assign),
3854+
hint, memOrder, preAt, atomicAt, postAt);
38163855
}
38173856

38183857
if (secondOp) {

0 commit comments

Comments
 (0)