Skip to content

Commit 067ecad

Browse files
[Flang][OpenMP] Convert elementTypeAttr for AtomicRead Op
Convert the elementTypeAttr of AtomicRead Op for LLVMConversion. This is required when the elementType is non-integer, non-real. Reviewed By: NimishMishra Differential Revision: https://reviews.llvm.org/D155817
1 parent 1547b81 commit 067ecad

File tree

2 files changed

+37
-9
lines changed

2 files changed

+37
-9
lines changed

flang/test/Fir/convert-to-llvm-openmp-and-fir.fir

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -644,3 +644,14 @@ func.func @_QPsimple_reduction(%arg0: !fir.ref<!fir.array<100x!fir.logical<4>>>
644644
}
645645
return
646646
}
647+
648+
// -----
649+
650+
// CHECK: llvm.func @_QPs
651+
// CHECK: omp.atomic.read %{{.*}} = %{{.*}} : !llvm.ptr<struct<(f32, f32)>>, !llvm.struct<(f32, f32)>
652+
653+
func.func @_QPs(%arg0: !fir.ref<!fir.complex<4>> {fir.bindc_name = "x"}) {
654+
%0 = fir.alloca !fir.complex<4> {bindc_name = "v", uniq_name = "_QFsEv"}
655+
omp.atomic.read %0 = %arg0 : !fir.ref<!fir.complex<4>>, !fir.complex<4>
656+
return
657+
}

mlir/lib/Conversion/OpenMPToLLVM/OpenMPToLLVM.cpp

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ struct RegionLessOpWithVarOperandsConversion
7777
}
7878
convertedOperands.emplace_back(adaptor.getOperands()[idx]);
7979
}
80+
8081
rewriter.replaceOpWithNewOp<T>(curOp, resTypes, convertedOperands,
8182
curOp->getAttrs());
8283
return success();
@@ -138,6 +139,23 @@ struct RegionLessOpConversion : public ConvertOpToLLVMPattern<T> {
138139
}
139140
};
140141

142+
struct AtomicReadOpConversion
143+
: public ConvertOpToLLVMPattern<omp::AtomicReadOp> {
144+
using ConvertOpToLLVMPattern<omp::AtomicReadOp>::ConvertOpToLLVMPattern;
145+
LogicalResult
146+
matchAndRewrite(omp::AtomicReadOp curOp, OpAdaptor adaptor,
147+
ConversionPatternRewriter &rewriter) const override {
148+
TypeConverter *converter = ConvertToLLVMPattern::getTypeConverter();
149+
Type curElementType = curOp.getElementType();
150+
auto newOp = rewriter.create<omp::AtomicReadOp>(
151+
curOp.getLoc(), TypeRange(), adaptor.getOperands(), curOp->getAttrs());
152+
TypeAttr typeAttr = TypeAttr::get(converter->convertType(curElementType));
153+
newOp.setElementTypeAttr(typeAttr);
154+
rewriter.eraseOp(curOp);
155+
return success();
156+
}
157+
};
158+
141159
struct ReductionOpConversion : public ConvertOpToLLVMPattern<omp::ReductionOp> {
142160
using ConvertOpToLLVMPattern<omp::ReductionOp>::ConvertOpToLLVMPattern;
143161
LogicalResult
@@ -213,15 +231,14 @@ void mlir::configureOpenMPToLLVMConversionLegality(
213231
void mlir::populateOpenMPToLLVMConversionPatterns(LLVMTypeConverter &converter,
214232
RewritePatternSet &patterns) {
215233
patterns.add<
216-
ReductionOpConversion, ReductionDeclareOpConversion,
217-
RegionOpConversion<omp::CriticalOp>, RegionOpConversion<omp::MasterOp>,
218-
ReductionOpConversion, RegionOpConversion<omp::ParallelOp>,
219-
RegionOpConversion<omp::WsLoopOp>, RegionOpConversion<omp::SectionsOp>,
220-
RegionOpConversion<omp::SectionOp>, RegionOpConversion<omp::SimdLoopOp>,
221-
RegionOpConversion<omp::SingleOp>, RegionOpConversion<omp::TaskGroupOp>,
222-
RegionOpConversion<omp::TaskOp>, RegionOpConversion<omp::DataOp>,
223-
RegionOpConversion<omp::TargetOp>,
224-
RegionLessOpWithVarOperandsConversion<omp::AtomicReadOp>,
234+
AtomicReadOpConversion, ReductionOpConversion,
235+
ReductionDeclareOpConversion, RegionOpConversion<omp::CriticalOp>,
236+
RegionOpConversion<omp::MasterOp>, ReductionOpConversion,
237+
RegionOpConversion<omp::ParallelOp>, RegionOpConversion<omp::WsLoopOp>,
238+
RegionOpConversion<omp::SectionsOp>, RegionOpConversion<omp::SectionOp>,
239+
RegionOpConversion<omp::SimdLoopOp>, RegionOpConversion<omp::SingleOp>,
240+
RegionOpConversion<omp::TaskGroupOp>, RegionOpConversion<omp::TaskOp>,
241+
RegionOpConversion<omp::DataOp>, RegionOpConversion<omp::TargetOp>,
225242
RegionLessOpWithVarOperandsConversion<omp::AtomicWriteOp>,
226243
RegionOpWithVarOperandsConversion<omp::AtomicUpdateOp>,
227244
RegionLessOpWithVarOperandsConversion<omp::FlushOp>,

0 commit comments

Comments
 (0)