Skip to content

Commit a3309fd

Browse files
Rename and add option to disable
1 parent 8d05dfa commit a3309fd

File tree

7 files changed

+60
-44
lines changed

7 files changed

+60
-44
lines changed

flang/include/flang/Optimizer/Transforms/Passes.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ createExternalNameConversionPass(bool appendUnderscore);
6060
std::unique_ptr<mlir::Pass> createMemDataFlowOptPass();
6161
std::unique_ptr<mlir::Pass> createPromoteToAffinePass();
6262
std::unique_ptr<mlir::Pass> createMemoryAllocationPass();
63-
std::unique_ptr<mlir::Pass> createConstExtruderPass();
63+
std::unique_ptr<mlir::Pass> createConstantArgumentGlobalisationPass();
6464
std::unique_ptr<mlir::Pass> createStackArraysPass();
6565
std::unique_ptr<mlir::Pass> createAliasTagsPass();
6666
std::unique_ptr<mlir::Pass> createSimplifyIntrinsicsPass();

flang/include/flang/Optimizer/Transforms/Passes.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -243,13 +243,13 @@ def MemoryAllocationOpt : Pass<"memory-allocation-opt", "mlir::func::FuncOp"> {
243243
}
244244

245245
// This needs to be a "mlir::ModuleOp" pass, because it inserts global constants
246-
def ConstExtruderOpt : Pass<"const-extruder-opt", "mlir::ModuleOp"> {
246+
def ConstantArgumentGlobalisationOpt : Pass<"constant-argument-globalisation-opt", "mlir::ModuleOp"> {
247247
let summary = "Convert constant function arguments to global constants.";
248248
let description = [{
249249
Convert scalar literals of function arguments to global constants.
250250
}];
251251
let dependentDialects = [ "fir::FIROpsDialect" ];
252-
let constructor = "::fir::createConstExtruderPass()";
252+
let constructor = "::fir::createConstantArgumentGlobalisationPass()";
253253
}
254254

255255
def StackArrays : Pass<"stack-arrays", "mlir::ModuleOp"> {

flang/include/flang/Tools/CLOptions.inc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ DisableOption(BoxedProcedureRewrite, "boxed-procedure-rewrite",
8484

8585
DisableOption(ExternalNameConversion, "external-name-interop",
8686
"convert names with external convention");
87+
DisableOption(ConstantArgumentGlobalisation, "constant-argument-globalisation",
88+
"disable the local constants to global constant conversion");
8789

8890
/// Generic for adding a pass to the pass manager if it is not disabled.
8991
template <typename F>
@@ -204,6 +206,8 @@ inline void createDefaultFIROptimizerPassPipeline(
204206
// These passes may increase code size.
205207
pm.addPass(fir::createSimplifyIntrinsicsPass());
206208
pm.addPass(fir::createAlgebraicSimplificationPass(config));
209+
if (!disableConstantArgumentGlobalisation)
210+
pm.addPass(fir::createConstantArgumentGlobalisationPass());
207211
}
208212

209213
if (pc.LoopVersioning)
@@ -216,8 +220,6 @@ inline void createDefaultFIROptimizerPassPipeline(
216220
else
217221
fir::addMemoryAllocationOpt(pm);
218222

219-
pm.addPass(fir::createConstExtruderPass());
220-
221223
// The default inliner pass adds the canonicalizer pass with the default
222224
// configuration. Create the inliner pass with tco config.
223225
llvm::StringMap<mlir::OpPassManager> pipelines;

flang/lib/Optimizer/Transforms/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ add_flang_library(FIRTransforms
55
AffineDemotion.cpp
66
AnnotateConstant.cpp
77
CharacterConversion.cpp
8-
ConstExtruder.cpp
8+
ConstantArgumentGlobalisation.cpp
99
ControlFlowConverter.cpp
1010
ArrayValueCopy.cpp
1111
ExternalNameConversion.cpp

flang/lib/Optimizer/Transforms/ConstExtruder.cpp renamed to flang/lib/Optimizer/Transforms/ConstantArgumentGlobalisation.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
1919

2020
namespace fir {
21-
#define GEN_PASS_DEF_CONSTEXTRUDEROPT
21+
#define GEN_PASS_DEF_CONSTANTARGUMENTGLOBALISATIONOPT
2222
#include "flang/Optimizer/Transforms/Passes.h.inc"
2323
} // namespace fir
2424

@@ -151,10 +151,11 @@ class CallOpRewriter : public mlir::OpRewritePattern<fir::CallOp> {
151151

152152
// this pass attempts to convert immediate scalar literals in function calls
153153
// to global constants to allow transformations as Dead Argument Elimination
154-
class ConstExtruderOpt
155-
: public fir::impl::ConstExtruderOptBase<ConstExtruderOpt> {
154+
class ConstantArgumentGlobalisationOpt
155+
: public fir::impl::ConstantArgumentGlobalisationOptBase<
156+
ConstantArgumentGlobalisationOpt> {
156157
public:
157-
ConstExtruderOpt() = default;
158+
ConstantArgumentGlobalisationOpt() = default;
158159

159160
void runOnOperation() override {
160161
mlir::ModuleOp mod = getOperation();
@@ -184,6 +185,6 @@ class ConstExtruderOpt
184185
};
185186
} // namespace
186187

187-
std::unique_ptr<mlir::Pass> fir::createConstExtruderPass() {
188-
return std::make_unique<ConstExtruderOpt>();
188+
std::unique_ptr<mlir::Pass> fir::createConstantArgumentGlobalisationPass() {
189+
return std::make_unique<ConstantArgumentGlobalisationOpt>();
189190
}

flang/test/Transforms/const-extrude.f90

Lines changed: 0 additions & 32 deletions
This file was deleted.
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// RUN: fir-opt --constant-argument-globalisation-opt < %s | FileCheck %s
2+
module {
3+
func.func @sub1(%arg0: !fir.ref<i32> {fir.bindc_name = "x"}, %arg1: !fir.ref<i32> {fir.bindc_name = "y"}) {
4+
%0 = fir.alloca i32 {adapt.valuebyref}
5+
%1 = fir.alloca f64 {adapt.valuebyref}
6+
%2 = fir.alloca f64 {adapt.valuebyref}
7+
%c1_i32 = arith.constant 1 : i32
8+
%cst = arith.constant 1.000000e+00 : f64
9+
%cst_0 = arith.constant 0.000000e+00 : f64
10+
%3 = fir.declare %arg0 {uniq_name = "_QFsub1Ex"} : (!fir.ref<i32>) -> !fir.ref<i32>
11+
%4 = fir.declare %arg1 {uniq_name = "_QFsub1Ey"} : (!fir.ref<i32>) -> !fir.ref<i32>
12+
fir.store %cst_0 to %2 : !fir.ref<f64>
13+
%false = arith.constant false
14+
fir.store %cst to %1 : !fir.ref<f64>
15+
%false_1 = arith.constant false
16+
fir.store %c1_i32 to %0 : !fir.ref<i32>
17+
%false_2 = arith.constant false
18+
fir.call @sub2(%2, %1, %3, %4, %0) fastmath<contract> : (!fir.ref<f64>, !fir.ref<f64>, !fir.ref<i32>, !fir.ref<i32>, !fir.ref<i32>) -> ()
19+
return
20+
}
21+
func.func private @sub2(!fir.ref<f64>, !fir.ref<f64>, !fir.ref<i32>, !fir.ref<i32>, !fir.ref<i32>)
22+
}
23+
// CHECK-LABEL: func.func @sub1
24+
// CHECK-SAME: [[ARG0:%.*]]: !fir.ref<i32> {{{.*}}},
25+
// CHECK-SAME: [[ARG1:%.*]]: !fir.ref<i32> {{{.*}}}) {
26+
// CHECK: [[X:%.*]] = fir.declare [[ARG0]] {{.*}}
27+
// CHECK: [[Y:%.*]] = fir.declare [[ARG1]] {{.*}}
28+
// CHECK: [[CONST_R0:%.*]] = fir.address_of([[EXTR_0:@.*]]) : !fir.ref<f64>
29+
// CHECK: [[CONST_R1:%.*]] = fir.address_of([[EXTR_1:@.*]]) : !fir.ref<f64>
30+
// CHECK: [[CONST_I:%.*]] = fir.address_of([[EXTR_2:@.*]]) : !fir.ref<i32>
31+
// CHECK: fir.call @sub2([[CONST_R0]], [[CONST_R1]], [[X]], [[Y]], [[CONST_I]])
32+
// CHECK: return
33+
34+
// CHECK: fir.global internal [[EXTR_0]] constant : f64 {
35+
// CHECK: %{{.*}} = arith.constant 0.000000e+00 : f64
36+
// CHECK: fir.has_value %{{.*}} : f64
37+
// CHECK: }
38+
// CHECK: fir.global internal [[EXTR_1]] constant : f64 {
39+
// CHECK: %{{.*}} = arith.constant 1.000000e+00 : f64
40+
// CHECK: fir.has_value %{{.*}} : f64
41+
// CHECK: }
42+
// CHECK: fir.global internal [[EXTR_2]] constant : i32 {
43+
// CHECK: %{{.*}} = arith.constant 1 : i32
44+
// CHECK: fir.has_value %{{.*}} : i32
45+
// CHECK: }

0 commit comments

Comments
 (0)