Skip to content

Commit 971f021

Browse files
committed
[flang] Preserve DeclareOp info in pre-cg-rewrite.
Currently, cg-rewrite removes the DeclareOp. As AddDebugInfo runs after that, it cannot process the DeclareOp. My initial plan was to make the AddDebugInfo pass run before the cg-rewrite but that has few issues. 1. Initially I was thinking to use the memref op to carry the variable attr. But as @tblah suggested in the llvm#86939, it makes more sense to carry that information on DeclareOp. It also makes it easy to handle it in codegen and there is no special handling needed for arguments. For that, we need to preserve the DeclareOp till the codegen. 2. Running earlier, we will miss the changes in passes that run between cg-rewrite and codegen. But not removing the DeclareOp in cg-rewrite has the issue that ShapeOp remains and it causes errors during codegen. To solve this problem, I convert DeclareOp to XDeclareOp in cg-rewrite instead of removing it. This was mentioned as possible solution by @jeanPerier in https://reviews.llvm.org/D136254 The conversion follows similar logic as used for other operators in that file. The FortranAttr and CudaAttr are currently not converted but left as TODO when the need arise. A later commit will use the XDeclareOp to extract the variable information.
1 parent d9fc5ba commit 971f021

File tree

7 files changed

+92
-20
lines changed

7 files changed

+92
-20
lines changed

flang/lib/Optimizer/CodeGen/CGOps.h renamed to flang/include/flang/Optimizer/CodeGen/CGOps.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#ifndef OPTIMIZER_CODEGEN_CGOPS_H
1414
#define OPTIMIZER_CODEGEN_CGOPS_H
1515

16+
#include "flang/Optimizer/Dialect/FIRAttr.h"
1617
#include "flang/Optimizer/Dialect/FIRType.h"
1718
#include "mlir/Dialect/Func/IR/FuncOps.h"
1819

flang/include/flang/Optimizer/CodeGen/CGOps.td

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
include "mlir/IR/SymbolInterfaces.td"
1818
include "flang/Optimizer/Dialect/FIRTypes.td"
19+
include "flang/Optimizer/Dialect/FIRAttr.td"
20+
include "mlir/IR/BuiltinAttributes.td"
1921

2022
def fircg_Dialect : Dialect {
2123
let name = "fircg";
@@ -202,4 +204,36 @@ def fircg_XArrayCoorOp : fircg_Op<"ext_array_coor", [AttrSizedOperandSegments]>
202204
}];
203205
}
204206

207+
// Extended Declare operation.
208+
def fircg_XDeclareOp : fircg_Op<"ext_declare", [AttrSizedOperandSegments]> {
209+
let summary = "for internal conversion only";
210+
211+
let description = [{
212+
Prior to lowering to LLVM IR dialect, a DeclareOp will
213+
be converted to an extended DeclareOp.
214+
}];
215+
216+
let arguments = (ins
217+
AnyRefOrBox:$memref,
218+
Variadic<AnyIntegerType>:$shape,
219+
Variadic<AnyIntegerType>:$shift,
220+
Variadic<AnyIntegerType>:$typeparams,
221+
Optional<fir_DummyScopeType>:$dummy_scope,
222+
Builtin_StringAttr:$uniq_name
223+
);
224+
let results = (outs AnyRefOrBox);
225+
226+
let assemblyFormat = [{
227+
$memref (`(` $shape^ `)`)? (`origin` $shift^)? (`typeparams` $typeparams^)?
228+
(`dummy_scope` $dummy_scope^)?
229+
attr-dict `:` functional-type(operands, results)
230+
}];
231+
232+
let extraClassDeclaration = [{
233+
// Shape is optional, but if it exists, it will be at offset 1.
234+
unsigned shapeOffset() { return 1; }
235+
unsigned shiftOffset() { return shapeOffset() + getShape().size(); }
236+
}];
237+
}
238+
205239
#endif

flang/lib/Optimizer/CodeGen/CGOps.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13-
#include "CGOps.h"
13+
#include "flang/Optimizer/CodeGen/CGOps.h"
1414
#include "flang/Optimizer/Dialect/FIRDialect.h"
1515
#include "flang/Optimizer/Dialect/FIROps.h"
1616
#include "flang/Optimizer/Dialect/FIRType.h"

flang/lib/Optimizer/CodeGen/CodeGen.cpp

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
#include "flang/Optimizer/CodeGen/CodeGen.h"
1414

15-
#include "CGOps.h"
15+
#include "flang/Optimizer/CodeGen/CGOps.h"
1616
#include "flang/Optimizer/CodeGen/CodeGenOpenMP.h"
1717
#include "flang/Optimizer/CodeGen/FIROpPatterns.h"
1818
#include "flang/Optimizer/CodeGen/TypeConverter.h"
@@ -170,6 +170,20 @@ genAllocationScaleSize(OP op, mlir::Type ity,
170170
return nullptr;
171171
}
172172

173+
namespace {
174+
struct DeclareOpConversion : public fir::FIROpConversion<fir::cg::XDeclareOp> {
175+
public:
176+
using FIROpConversion::FIROpConversion;
177+
mlir::LogicalResult
178+
matchAndRewrite(fir::cg::XDeclareOp declareOp, OpAdaptor adaptor,
179+
mlir::ConversionPatternRewriter &rewriter) const override {
180+
auto memRef = adaptor.getOperands()[0];
181+
rewriter.replaceOp(declareOp, memRef);
182+
return mlir::success();
183+
}
184+
};
185+
} // namespace
186+
173187
namespace {
174188
/// convert to LLVM IR dialect `alloca`
175189
struct AllocaOpConversion : public fir::FIROpConversion<fir::AllocaOp> {
@@ -3714,19 +3728,19 @@ void fir::populateFIRToLLVMConversionPatterns(
37143728
BoxOffsetOpConversion, BoxProcHostOpConversion, BoxRankOpConversion,
37153729
BoxTypeCodeOpConversion, BoxTypeDescOpConversion, CallOpConversion,
37163730
CmpcOpConversion, ConstcOpConversion, ConvertOpConversion,
3717-
CoordinateOpConversion, DTEntryOpConversion, DivcOpConversion,
3718-
EmboxOpConversion, EmboxCharOpConversion, EmboxProcOpConversion,
3719-
ExtractValueOpConversion, FieldIndexOpConversion, FirEndOpConversion,
3720-
FreeMemOpConversion, GlobalLenOpConversion, GlobalOpConversion,
3721-
HasValueOpConversion, InsertOnRangeOpConversion, InsertValueOpConversion,
3722-
IsPresentOpConversion, LenParamIndexOpConversion, LoadOpConversion,
3723-
MulcOpConversion, NegcOpConversion, NoReassocOpConversion,
3724-
SelectCaseOpConversion, SelectOpConversion, SelectRankOpConversion,
3725-
SelectTypeOpConversion, ShapeOpConversion, ShapeShiftOpConversion,
3726-
ShiftOpConversion, SliceOpConversion, StoreOpConversion,
3727-
StringLitOpConversion, SubcOpConversion, TypeDescOpConversion,
3728-
TypeInfoOpConversion, UnboxCharOpConversion, UnboxProcOpConversion,
3729-
UndefOpConversion, UnreachableOpConversion,
3731+
CoordinateOpConversion, DTEntryOpConversion, DeclareOpConversion,
3732+
DivcOpConversion, EmboxOpConversion, EmboxCharOpConversion,
3733+
EmboxProcOpConversion, ExtractValueOpConversion, FieldIndexOpConversion,
3734+
FirEndOpConversion, FreeMemOpConversion, GlobalLenOpConversion,
3735+
GlobalOpConversion, HasValueOpConversion, InsertOnRangeOpConversion,
3736+
InsertValueOpConversion, IsPresentOpConversion, LenParamIndexOpConversion,
3737+
LoadOpConversion, MulcOpConversion, NegcOpConversion,
3738+
NoReassocOpConversion, SelectCaseOpConversion, SelectOpConversion,
3739+
SelectRankOpConversion, SelectTypeOpConversion, ShapeOpConversion,
3740+
ShapeShiftOpConversion, ShiftOpConversion, SliceOpConversion,
3741+
StoreOpConversion, StringLitOpConversion, SubcOpConversion,
3742+
TypeDescOpConversion, TypeInfoOpConversion, UnboxCharOpConversion,
3743+
UnboxProcOpConversion, UndefOpConversion, UnreachableOpConversion,
37303744
UnrealizedConversionCastOpConversion, XArrayCoorOpConversion,
37313745
XEmboxOpConversion, XReboxOpConversion, ZeroOpConversion>(converter,
37323746
options);

flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212

1313
#include "flang/Optimizer/CodeGen/CodeGen.h"
1414

15-
#include "CGOps.h"
1615
#include "flang/Optimizer/Builder/Todo.h" // remove when TODO's are done
16+
#include "flang/Optimizer/CodeGen/CGOps.h"
1717
#include "flang/Optimizer/Dialect/FIRDialect.h"
1818
#include "flang/Optimizer/Dialect/FIROps.h"
1919
#include "flang/Optimizer/Dialect/FIRType.h"
@@ -276,7 +276,29 @@ class DeclareOpConversion : public mlir::OpRewritePattern<fir::DeclareOp> {
276276
mlir::LogicalResult
277277
matchAndRewrite(fir::DeclareOp declareOp,
278278
mlir::PatternRewriter &rewriter) const override {
279-
rewriter.replaceOp(declareOp, declareOp.getMemref());
279+
auto loc = declareOp.getLoc();
280+
llvm::SmallVector<mlir::Value> shapeOpers;
281+
llvm::SmallVector<mlir::Value> shiftOpers;
282+
if (auto shapeVal = declareOp.getShape()) {
283+
if (auto shapeOp = mlir::dyn_cast<fir::ShapeOp>(shapeVal.getDefiningOp()))
284+
populateShape(shapeOpers, shapeOp);
285+
else if (auto shiftOp =
286+
mlir::dyn_cast<fir::ShapeShiftOp>(shapeVal.getDefiningOp()))
287+
populateShapeAndShift(shapeOpers, shiftOpers, shiftOp);
288+
else if (auto shiftOp =
289+
mlir::dyn_cast<fir::ShiftOp>(shapeVal.getDefiningOp()))
290+
populateShift(shiftOpers, shiftOp);
291+
else
292+
return mlir::failure();
293+
}
294+
// FIXME: Add FortranAttrs and CudaAttrs
295+
auto xDeclOp = rewriter.create<fir::cg::XDeclareOp>(
296+
loc, declareOp.getType(), declareOp.getMemref(), shapeOpers, shiftOpers,
297+
declareOp.getTypeparams(), declareOp.getDummyScope(),
298+
declareOp.getUniqName());
299+
LLVM_DEBUG(llvm::dbgs()
300+
<< "rewriting " << declareOp << " to " << xDeclOp << '\n');
301+
rewriter.replaceOp(declareOp, xDeclOp.getOperation()->getResults());
280302
return mlir::success();
281303
}
282304
};

flang/test/Fir/declare-codegen.fir

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ func.func private @bar(%arg0: !fir.ref<!fir.array<12x23xi32>>)
1717

1818
// CHECK-LABEL: func.func @test(
1919
// CHECK-SAME: %[[arg0:.*]]: !fir.ref<!fir.array<12x23xi32>>) {
20-
// CHECK-NEXT: fir.call @bar(%[[arg0]]) : (!fir.ref<!fir.array<12x23xi32>>) -> ()
20+
// CHECK: fircg.ext_declare
21+
2122

2223
func.func @useless_shape_with_duplicate_extent_operand(%arg0: !fir.ref<!fir.array<3x3xf32>>) {
2324
%c3 = arith.constant 3 : index
@@ -27,4 +28,4 @@ func.func @useless_shape_with_duplicate_extent_operand(%arg0: !fir.ref<!fir.arra
2728
}
2829

2930
// CHECK-LABEL: func.func @useless_shape_with_duplicate_extent_operand(
30-
// CHECK-NEXT: return
31+
// CHECK: fircg.ext_declare

flang/test/Fir/dummy-scope-codegen.fir

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ func.func @dummy_scope(%arg0: !fir.ref<f32>) {
66
return
77
}
88
// CHECK-LABEL: func.func @dummy_scope(
9-
// CHECK-NEXT: return
9+
// CHECK: fircg.ext_declare

0 commit comments

Comments
 (0)