Skip to content

Commit

Permalink
[Flang][OpenMP] Convert elementTypeAttr for AtomicRead Op
Browse files Browse the repository at this point in the history
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
  • Loading branch information
kiranchandramohan committed Aug 3, 2023
1 parent 1547b81 commit 067ecad
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 9 deletions.
11 changes: 11 additions & 0 deletions flang/test/Fir/convert-to-llvm-openmp-and-fir.fir
Original file line number Diff line number Diff line change
Expand Up @@ -644,3 +644,14 @@ func.func @_QPsimple_reduction(%arg0: !fir.ref<!fir.array<100x!fir.logical<4>>>
}
return
}

// -----

// CHECK: llvm.func @_QPs
// CHECK: omp.atomic.read %{{.*}} = %{{.*}} : !llvm.ptr<struct<(f32, f32)>>, !llvm.struct<(f32, f32)>

func.func @_QPs(%arg0: !fir.ref<!fir.complex<4>> {fir.bindc_name = "x"}) {
%0 = fir.alloca !fir.complex<4> {bindc_name = "v", uniq_name = "_QFsEv"}
omp.atomic.read %0 = %arg0 : !fir.ref<!fir.complex<4>>, !fir.complex<4>
return
}
35 changes: 26 additions & 9 deletions mlir/lib/Conversion/OpenMPToLLVM/OpenMPToLLVM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ struct RegionLessOpWithVarOperandsConversion
}
convertedOperands.emplace_back(adaptor.getOperands()[idx]);
}

rewriter.replaceOpWithNewOp<T>(curOp, resTypes, convertedOperands,
curOp->getAttrs());
return success();
Expand Down Expand Up @@ -138,6 +139,23 @@ struct RegionLessOpConversion : public ConvertOpToLLVMPattern<T> {
}
};

struct AtomicReadOpConversion
: public ConvertOpToLLVMPattern<omp::AtomicReadOp> {
using ConvertOpToLLVMPattern<omp::AtomicReadOp>::ConvertOpToLLVMPattern;
LogicalResult
matchAndRewrite(omp::AtomicReadOp curOp, OpAdaptor adaptor,
ConversionPatternRewriter &rewriter) const override {
TypeConverter *converter = ConvertToLLVMPattern::getTypeConverter();
Type curElementType = curOp.getElementType();
auto newOp = rewriter.create<omp::AtomicReadOp>(
curOp.getLoc(), TypeRange(), adaptor.getOperands(), curOp->getAttrs());
TypeAttr typeAttr = TypeAttr::get(converter->convertType(curElementType));
newOp.setElementTypeAttr(typeAttr);
rewriter.eraseOp(curOp);
return success();
}
};

struct ReductionOpConversion : public ConvertOpToLLVMPattern<omp::ReductionOp> {
using ConvertOpToLLVMPattern<omp::ReductionOp>::ConvertOpToLLVMPattern;
LogicalResult
Expand Down Expand Up @@ -213,15 +231,14 @@ void mlir::configureOpenMPToLLVMConversionLegality(
void mlir::populateOpenMPToLLVMConversionPatterns(LLVMTypeConverter &converter,
RewritePatternSet &patterns) {
patterns.add<
ReductionOpConversion, ReductionDeclareOpConversion,
RegionOpConversion<omp::CriticalOp>, RegionOpConversion<omp::MasterOp>,
ReductionOpConversion, RegionOpConversion<omp::ParallelOp>,
RegionOpConversion<omp::WsLoopOp>, RegionOpConversion<omp::SectionsOp>,
RegionOpConversion<omp::SectionOp>, RegionOpConversion<omp::SimdLoopOp>,
RegionOpConversion<omp::SingleOp>, RegionOpConversion<omp::TaskGroupOp>,
RegionOpConversion<omp::TaskOp>, RegionOpConversion<omp::DataOp>,
RegionOpConversion<omp::TargetOp>,
RegionLessOpWithVarOperandsConversion<omp::AtomicReadOp>,
AtomicReadOpConversion, ReductionOpConversion,
ReductionDeclareOpConversion, RegionOpConversion<omp::CriticalOp>,
RegionOpConversion<omp::MasterOp>, ReductionOpConversion,
RegionOpConversion<omp::ParallelOp>, RegionOpConversion<omp::WsLoopOp>,
RegionOpConversion<omp::SectionsOp>, RegionOpConversion<omp::SectionOp>,
RegionOpConversion<omp::SimdLoopOp>, RegionOpConversion<omp::SingleOp>,
RegionOpConversion<omp::TaskGroupOp>, RegionOpConversion<omp::TaskOp>,
RegionOpConversion<omp::DataOp>, RegionOpConversion<omp::TargetOp>,
RegionLessOpWithVarOperandsConversion<omp::AtomicWriteOp>,
RegionOpWithVarOperandsConversion<omp::AtomicUpdateOp>,
RegionLessOpWithVarOperandsConversion<omp::FlushOp>,
Expand Down

0 comments on commit 067ecad

Please sign in to comment.