Skip to content

Commit ace0160

Browse files
committed
[mlir] Split out a new ControlFlow dialect from Standard
This dialect is intended to model lower level/branch based control-flow constructs. The initial set of operations are: AssertOp, BranchOp, CondBranchOp, SwitchOp; all split out from the current standard dialect. See https://discourse.llvm.org/t/standard-dialect-the-final-chapter/6061 Differential Revision: https://reviews.llvm.org/D118966
1 parent edca177 commit ace0160

File tree

239 files changed

+3027
-2585
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

239 files changed

+3027
-2585
lines changed

flang/include/flang/Optimizer/Support/InitFIR.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ namespace fir::support {
2727
#define FLANG_NONCODEGEN_DIALECT_LIST \
2828
mlir::AffineDialect, FIROpsDialect, mlir::acc::OpenACCDialect, \
2929
mlir::omp::OpenMPDialect, mlir::scf::SCFDialect, \
30-
mlir::arith::ArithmeticDialect, mlir::StandardOpsDialect, \
31-
mlir::vector::VectorDialect
30+
mlir::arith::ArithmeticDialect, mlir::cf::ControlFlowDialect, \
31+
mlir::StandardOpsDialect, mlir::vector::VectorDialect
3232

3333
// The definitive list of dialects used by flang.
3434
#define FLANG_DIALECT_LIST \

flang/include/flang/Tools/CLOptions.inc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
/// This file defines some shared command-line options that can be used when
1010
/// debugging the test tools. This file must be included into the tool.
1111

12-
#include "mlir/Conversion/SCFToStandard/SCFToStandard.h"
12+
#include "mlir/Conversion/SCFToControlFlow/SCFToControlFlow.h"
1313
#include "mlir/Pass/PassManager.h"
1414
#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
1515
#include "mlir/Transforms/Passes.h"
@@ -139,7 +139,7 @@ inline void createDefaultFIROptimizerPassPipeline(mlir::PassManager &pm) {
139139

140140
// convert control flow to CFG form
141141
fir::addCfgConversionPass(pm);
142-
pm.addPass(mlir::createLowerToCFGPass());
142+
pm.addPass(mlir::createConvertSCFToCFPass());
143143

144144
pm.addPass(mlir::createCanonicalizerPass(config));
145145
}

flang/lib/Lower/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ add_flang_library(FortranLower
3232
FortranSemantics
3333
MLIRAffineToStandard
3434
MLIRLLVMIR
35-
MLIRSCFToStandard
35+
MLIRSCFToControlFlow
3636
MLIRStandard
3737

3838
LINK_COMPONENTS

flang/lib/Optimizer/CodeGen/CodeGen.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "flang/Optimizer/Dialect/FIROps.h"
1919
#include "flang/Optimizer/Support/TypeCode.h"
2020
#include "mlir/Conversion/ArithmeticToLLVM/ArithmeticToLLVM.h"
21+
#include "mlir/Conversion/ControlFlowToLLVM/ControlFlowToLLVM.h"
2122
#include "mlir/Conversion/LLVMCommon/Pattern.h"
2223
#include "mlir/Conversion/StandardToLLVM/ConvertStandardToLLVM.h"
2324
#include "mlir/IR/BuiltinTypes.h"
@@ -3293,6 +3294,8 @@ class FIRToLLVMLowering : public fir::FIRToLLVMLoweringBase<FIRToLLVMLowering> {
32933294
mlir::populateStdToLLVMConversionPatterns(typeConverter, pattern);
32943295
mlir::arith::populateArithmeticToLLVMConversionPatterns(typeConverter,
32953296
pattern);
3297+
mlir::cf::populateControlFlowToLLVMConversionPatterns(typeConverter,
3298+
pattern);
32963299
mlir::ConversionTarget target{*context};
32973300
target.addLegalDialect<mlir::LLVM::LLVMDialect>();
32983301

flang/lib/Optimizer/Transforms/ArrayValueCopy.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "flang/Optimizer/Dialect/FIRDialect.h"
1414
#include "flang/Optimizer/Support/FIRContext.h"
1515
#include "flang/Optimizer/Transforms/Passes.h"
16+
#include "mlir/Dialect/ControlFlow/IR/ControlFlowOps.h"
1617
#include "mlir/Dialect/SCF/SCF.h"
1718
#include "mlir/Transforms/DialectConversion.h"
1819
#include "llvm/Support/Debug.h"
@@ -332,9 +333,9 @@ ArrayCopyAnalysis::arrayAccesses(ArrayLoadOp load) {
332333
<< "add modify {" << *owner << "} to array value set\n");
333334
accesses.push_back(owner);
334335
appendToQueue(update.getResult(1));
335-
} else if (auto br = mlir::dyn_cast<mlir::BranchOp>(owner)) {
336+
} else if (auto br = mlir::dyn_cast<mlir::cf::BranchOp>(owner)) {
336337
branchOp(br.getDest(), br.getDestOperands());
337-
} else if (auto br = mlir::dyn_cast<mlir::CondBranchOp>(owner)) {
338+
} else if (auto br = mlir::dyn_cast<mlir::cf::CondBranchOp>(owner)) {
338339
branchOp(br.getTrueDest(), br.getTrueOperands());
339340
branchOp(br.getFalseDest(), br.getFalseOperands());
340341
} else if (mlir::isa<ArrayMergeStoreOp>(owner)) {
@@ -789,9 +790,9 @@ class ArrayValueCopyConverter
789790
patterns1.insert<ArrayUpdateConversion>(context, analysis, useMap);
790791
patterns1.insert<ArrayModifyConversion>(context, analysis, useMap);
791792
mlir::ConversionTarget target(*context);
792-
target.addLegalDialect<FIROpsDialect, mlir::scf::SCFDialect,
793-
mlir::arith::ArithmeticDialect,
794-
mlir::StandardOpsDialect>();
793+
target.addLegalDialect<
794+
FIROpsDialect, mlir::scf::SCFDialect, mlir::arith::ArithmeticDialect,
795+
mlir::cf::ControlFlowDialect, mlir::StandardOpsDialect>();
795796
target.addIllegalOp<ArrayFetchOp, ArrayUpdateOp, ArrayModifyOp>();
796797
// Rewrite the array fetch and array update ops.
797798
if (mlir::failed(

flang/lib/Optimizer/Transforms/RewriteLoop.cpp

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "flang/Optimizer/Dialect/FIROps.h"
1212
#include "flang/Optimizer/Transforms/Passes.h"
1313
#include "mlir/Dialect/Affine/IR/AffineOps.h"
14+
#include "mlir/Dialect/ControlFlow/IR/ControlFlowOps.h"
1415
#include "mlir/Dialect/StandardOps/IR/Ops.h"
1516
#include "mlir/Pass/Pass.h"
1617
#include "mlir/Transforms/DialectConversion.h"
@@ -84,7 +85,7 @@ class CfgLoopConv : public mlir::OpRewritePattern<fir::DoLoopOp> {
8485
loopOperands.append(operands.begin(), operands.end());
8586
loopOperands.push_back(iters);
8687

87-
rewriter.create<mlir::BranchOp>(loc, conditionalBlock, loopOperands);
88+
rewriter.create<mlir::cf::BranchOp>(loc, conditionalBlock, loopOperands);
8889

8990
// Last loop block
9091
auto *terminator = lastBlock->getTerminator();
@@ -105,7 +106,7 @@ class CfgLoopConv : public mlir::OpRewritePattern<fir::DoLoopOp> {
105106
: terminator->operand_begin();
106107
loopCarried.append(begin, terminator->operand_end());
107108
loopCarried.push_back(itersMinusOne);
108-
rewriter.create<mlir::BranchOp>(loc, conditionalBlock, loopCarried);
109+
rewriter.create<mlir::cf::BranchOp>(loc, conditionalBlock, loopCarried);
109110
rewriter.eraseOp(terminator);
110111

111112
// Conditional block
@@ -114,9 +115,9 @@ class CfgLoopConv : public mlir::OpRewritePattern<fir::DoLoopOp> {
114115
auto comparison = rewriter.create<mlir::arith::CmpIOp>(
115116
loc, arith::CmpIPredicate::sgt, itersLeft, zero);
116117

117-
rewriter.create<mlir::CondBranchOp>(loc, comparison, firstBlock,
118-
llvm::ArrayRef<mlir::Value>(), endBlock,
119-
llvm::ArrayRef<mlir::Value>());
118+
rewriter.create<mlir::cf::CondBranchOp>(
119+
loc, comparison, firstBlock, llvm::ArrayRef<mlir::Value>(), endBlock,
120+
llvm::ArrayRef<mlir::Value>());
120121

121122
// The result of the loop operation is the values of the condition block
122123
// arguments except the induction variable on the last iteration.
@@ -155,7 +156,7 @@ class CfgIfConv : public mlir::OpRewritePattern<fir::IfOp> {
155156
} else {
156157
continueBlock =
157158
rewriter.createBlock(remainingOpsBlock, ifOp.getResultTypes());
158-
rewriter.create<mlir::BranchOp>(loc, remainingOpsBlock);
159+
rewriter.create<mlir::cf::BranchOp>(loc, remainingOpsBlock);
159160
}
160161

161162
// Move blocks from the "then" region to the region containing 'fir.if',
@@ -165,7 +166,8 @@ class CfgIfConv : public mlir::OpRewritePattern<fir::IfOp> {
165166
auto *ifOpTerminator = ifOpRegion.back().getTerminator();
166167
auto ifOpTerminatorOperands = ifOpTerminator->getOperands();
167168
rewriter.setInsertionPointToEnd(&ifOpRegion.back());
168-
rewriter.create<mlir::BranchOp>(loc, continueBlock, ifOpTerminatorOperands);
169+
rewriter.create<mlir::cf::BranchOp>(loc, continueBlock,
170+
ifOpTerminatorOperands);
169171
rewriter.eraseOp(ifOpTerminator);
170172
rewriter.inlineRegionBefore(ifOpRegion, continueBlock);
171173

@@ -179,14 +181,14 @@ class CfgIfConv : public mlir::OpRewritePattern<fir::IfOp> {
179181
auto *otherwiseTerm = otherwiseRegion.back().getTerminator();
180182
auto otherwiseTermOperands = otherwiseTerm->getOperands();
181183
rewriter.setInsertionPointToEnd(&otherwiseRegion.back());
182-
rewriter.create<mlir::BranchOp>(loc, continueBlock,
183-
otherwiseTermOperands);
184+
rewriter.create<mlir::cf::BranchOp>(loc, continueBlock,
185+
otherwiseTermOperands);
184186
rewriter.eraseOp(otherwiseTerm);
185187
rewriter.inlineRegionBefore(otherwiseRegion, continueBlock);
186188
}
187189

188190
rewriter.setInsertionPointToEnd(condBlock);
189-
rewriter.create<mlir::CondBranchOp>(
191+
rewriter.create<mlir::cf::CondBranchOp>(
190192
loc, ifOp.condition(), ifOpBlock, llvm::ArrayRef<mlir::Value>(),
191193
otherwiseBlock, llvm::ArrayRef<mlir::Value>());
192194
rewriter.replaceOp(ifOp, continueBlock->getArguments());
@@ -241,7 +243,7 @@ class CfgIterWhileConv : public mlir::OpRewritePattern<fir::IterWhileOp> {
241243
auto begin = whileOp.finalValue() ? std::next(terminator->operand_begin())
242244
: terminator->operand_begin();
243245
loopCarried.append(begin, terminator->operand_end());
244-
rewriter.create<mlir::BranchOp>(loc, conditionBlock, loopCarried);
246+
rewriter.create<mlir::cf::BranchOp>(loc, conditionBlock, loopCarried);
245247
rewriter.eraseOp(terminator);
246248

247249
// Compute loop bounds before branching to the condition.
@@ -256,7 +258,7 @@ class CfgIterWhileConv : public mlir::OpRewritePattern<fir::IterWhileOp> {
256258
destOperands.push_back(lowerBound);
257259
auto iterOperands = whileOp.getIterOperands();
258260
destOperands.append(iterOperands.begin(), iterOperands.end());
259-
rewriter.create<mlir::BranchOp>(loc, conditionBlock, destOperands);
261+
rewriter.create<mlir::cf::BranchOp>(loc, conditionBlock, destOperands);
260262

261263
// With the body block done, we can fill in the condition block.
262264
rewriter.setInsertionPointToEnd(conditionBlock);
@@ -278,9 +280,9 @@ class CfgIterWhileConv : public mlir::OpRewritePattern<fir::IterWhileOp> {
278280
// Remember to AND in the early-exit bool.
279281
auto comparison =
280282
rewriter.create<mlir::arith::AndIOp>(loc, iterateVar, cmp2);
281-
rewriter.create<mlir::CondBranchOp>(loc, comparison, firstBodyBlock,
282-
llvm::ArrayRef<mlir::Value>(), endBlock,
283-
llvm::ArrayRef<mlir::Value>());
283+
rewriter.create<mlir::cf::CondBranchOp>(
284+
loc, comparison, firstBodyBlock, llvm::ArrayRef<mlir::Value>(),
285+
endBlock, llvm::ArrayRef<mlir::Value>());
284286
// The result of the loop operation is the values of the condition block
285287
// arguments except the induction variable on the last iteration.
286288
auto args = whileOp.finalValue()
@@ -300,8 +302,8 @@ class CfgConversion : public CFGConversionBase<CfgConversion> {
300302
patterns.insert<CfgLoopConv, CfgIfConv, CfgIterWhileConv>(
301303
context, forceLoopToExecuteOnce);
302304
mlir::ConversionTarget target(*context);
303-
target.addLegalDialect<mlir::AffineDialect, FIROpsDialect,
304-
mlir::StandardOpsDialect>();
305+
target.addLegalDialect<mlir::AffineDialect, mlir::cf::ControlFlowDialect,
306+
FIROpsDialect, mlir::StandardOpsDialect>();
305307

306308
// apply the patterns
307309
target.addIllegalOp<ResultOp, DoLoopOp, IfOp, IterWhileOp>();

flang/test/Fir/Todo/select_case_with_character.fir

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ func @select_case_charachter(%arg0: !fir.char<2, 10>, %arg1: !fir.char<2, 10>, %
1010
unit, ^bb3]
1111
^bb1:
1212
%c1_i32 = arith.constant 1 : i32
13-
br ^bb3
13+
cf.br ^bb3
1414
^bb2:
1515
%c2_i32 = arith.constant 2 : i32
16-
br ^bb3
16+
cf.br ^bb3
1717
^bb3:
1818
return
1919
}

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1175,23 +1175,23 @@ func @select_case_integer(%arg0: !fir.ref<i32>) -> i32 {
11751175
^bb1: // pred: ^bb0
11761176
%c1_i32_0 = arith.constant 1 : i32
11771177
fir.store %c1_i32_0 to %arg0 : !fir.ref<i32>
1178-
br ^bb6
1178+
cf.br ^bb6
11791179
^bb2: // pred: ^bb0
11801180
%c2_i32_1 = arith.constant 2 : i32
11811181
fir.store %c2_i32_1 to %arg0 : !fir.ref<i32>
1182-
br ^bb6
1182+
cf.br ^bb6
11831183
^bb3: // pred: ^bb0
11841184
%c0_i32 = arith.constant 0 : i32
11851185
fir.store %c0_i32 to %arg0 : !fir.ref<i32>
1186-
br ^bb6
1186+
cf.br ^bb6
11871187
^bb4: // pred: ^bb0
11881188
%c4_i32_2 = arith.constant 4 : i32
11891189
fir.store %c4_i32_2 to %arg0 : !fir.ref<i32>
1190-
br ^bb6
1190+
cf.br ^bb6
11911191
^bb5: // 3 preds: ^bb0, ^bb0, ^bb0
11921192
%c7_i32_3 = arith.constant 7 : i32
11931193
fir.store %c7_i32_3 to %arg0 : !fir.ref<i32>
1194-
br ^bb6
1194+
cf.br ^bb6
11951195
^bb6: // 5 preds: ^bb1, ^bb2, ^bb3, ^bb4, ^bb5
11961196
%3 = fir.load %arg0 : !fir.ref<i32>
11971197
return %3 : i32
@@ -1275,10 +1275,10 @@ func @select_case_logical(%arg0: !fir.ref<!fir.logical<4>>) {
12751275
unit, ^bb3]
12761276
^bb1:
12771277
%c1_i32 = arith.constant 1 : i32
1278-
br ^bb3
1278+
cf.br ^bb3
12791279
^bb2:
12801280
%c2_i32 = arith.constant 2 : i32
1281-
br ^bb3
1281+
cf.br ^bb3
12821282
^bb3:
12831283
return
12841284
}

flang/test/Fir/memref-data-flow.fir

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ func @load_store_chain_removal(%arg0: !fir.ref<!fir.array<60xi32>>, %arg1: !fir.
99
%c1 = arith.constant 1 : index
1010
%0 = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFf1dcEi"}
1111
%1 = fir.alloca !fir.array<60xi32> {bindc_name = "t1", uniq_name = "_QFf1dcEt1"}
12-
br ^bb1(%c1, %c60 : index, index)
12+
cf.br ^bb1(%c1, %c60 : index, index)
1313
^bb1(%2: index, %3: index): // 2 preds: ^bb0, ^bb2
1414
%4 = arith.cmpi sgt, %3, %c0 : index
15-
cond_br %4, ^bb2, ^bb3
15+
cf.cond_br %4, ^bb2, ^bb3
1616
^bb2: // pred: ^bb1
1717
%5 = fir.convert %2 : (index) -> i32
1818
fir.store %5 to %0 : !fir.ref<i32>
@@ -26,14 +26,14 @@ func @load_store_chain_removal(%arg0: !fir.ref<!fir.array<60xi32>>, %arg1: !fir.
2626
fir.store %11 to %12 : !fir.ref<i32>
2727
%13 = arith.addi %2, %c1 : index
2828
%14 = arith.subi %3, %c1 : index
29-
br ^bb1(%13, %14 : index, index)
29+
cf.br ^bb1(%13, %14 : index, index)
3030
^bb3: // pred: ^bb1
3131
%15 = fir.convert %2 : (index) -> i32
3232
fir.store %15 to %0 : !fir.ref<i32>
33-
br ^bb4(%c1, %c60 : index, index)
33+
cf.br ^bb4(%c1, %c60 : index, index)
3434
^bb4(%16: index, %17: index): // 2 preds: ^bb3, ^bb5
3535
%18 = arith.cmpi sgt, %17, %c0 : index
36-
cond_br %18, ^bb5, ^bb6
36+
cf.cond_br %18, ^bb5, ^bb6
3737
^bb5: // pred: ^bb4
3838
%19 = fir.convert %16 : (index) -> i32
3939
fir.store %19 to %0 : !fir.ref<i32>
@@ -49,7 +49,7 @@ func @load_store_chain_removal(%arg0: !fir.ref<!fir.array<60xi32>>, %arg1: !fir.
4949
fir.store %27 to %28 : !fir.ref<i32>
5050
%29 = arith.addi %16, %c1 : index
5151
%30 = arith.subi %17, %c1 : index
52-
br ^bb4(%29, %30 : index, index)
52+
cf.br ^bb4(%29, %30 : index, index)
5353
^bb6: // pred: ^bb4
5454
%31 = fir.convert %16 : (index) -> i32
5555
fir.store %31 to %0 : !fir.ref<i32>

flang/tools/bbc/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ FIRTransforms
1313
FIRBuilder
1414
${dialect_libs}
1515
MLIRAffineToStandard
16-
MLIRSCFToStandard
16+
MLIRSCFToControlFlow
1717
FortranCommon
1818
FortranParser
1919
FortranEvaluate

flang/tools/bbc/bbc.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
#include "flang/Semantics/semantics.h"
3939
#include "flang/Semantics/unparse-with-symbols.h"
4040
#include "flang/Version.inc"
41-
#include "mlir/Conversion/SCFToStandard/SCFToStandard.h"
4241
#include "mlir/IR/AsmState.h"
4342
#include "mlir/IR/BuiltinOps.h"
4443
#include "mlir/IR/MLIRContext.h"

flang/tools/fir-opt/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ target_link_libraries(fir-opt PRIVATE
1818
MLIRTransforms
1919
MLIRAffineToStandard
2020
MLIRAnalysis
21-
MLIRSCFToStandard
21+
MLIRSCFToControlFlow
2222
MLIRParser
2323
MLIRStandardToLLVM
2424
MLIRSupport

flang/tools/tco/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ target_link_libraries(tco PRIVATE
1717
MLIRTransforms
1818
MLIRAffineToStandard
1919
MLIRAnalysis
20-
MLIRSCFToStandard
20+
MLIRSCFToControlFlow
2121
MLIRParser
2222
MLIRStandardToLLVM
2323
MLIRSupport

flang/tools/tco/tco.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
#include "flang/Optimizer/Support/InternalNames.h"
1818
#include "flang/Optimizer/Support/KindMapping.h"
1919
#include "flang/Optimizer/Transforms/Passes.h"
20-
#include "mlir/Conversion/SCFToStandard/SCFToStandard.h"
2120
#include "mlir/IR/AsmState.h"
2221
#include "mlir/IR/BuiltinOps.h"
2322
#include "mlir/IR/MLIRContext.h"

mlir/benchmark/python/common.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def setup_passes(mlir_module):
2626
f"sparse-tensor-conversion,"
2727
f"builtin.func"
2828
f"(linalg-bufferize,convert-linalg-to-loops,convert-vector-to-scf),"
29-
f"convert-scf-to-std,"
29+
f"convert-scf-to-cf,"
3030
f"func-bufferize,"
3131
f"arith-bufferize,"
3232
f"builtin.func(tensor-bufferize,finalizing-bufferize),"

0 commit comments

Comments
 (0)