Skip to content

Commit 633b65d

Browse files
NexMingHoney Goyal
authored andcommitted
[Flang][Fir] Fix the error when lowering fir.iterate_while to scf while. (llvm#170630)
The lowering fails when `fir.iterate_while` has no final value; this patch fixes the bug.
1 parent 9f7686d commit 633b65d

File tree

2 files changed

+38
-5
lines changed

2 files changed

+38
-5
lines changed

flang/lib/Optimizer/Transforms/FIRToSCF.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ struct IterWhileConversion : public mlir::OpRewritePattern<fir::IterWhileOp> {
126126

127127
mlir::Value okInit = iterWhileOp.getIterateIn();
128128
mlir::ValueRange iterArgs = iterWhileOp.getInitArgs();
129+
bool hasFinalValue = iterWhileOp.getFinalValue().has_value();
129130

130131
mlir::SmallVector<mlir::Value> initVals;
131132
initVals.push_back(lowerBound);
@@ -164,17 +165,22 @@ struct IterWhileConversion : public mlir::OpRewritePattern<fir::IterWhileOp> {
164165

165166
auto *afterBody = scfWhileOp.getAfterBody();
166167
auto resultOp = mlir::cast<fir::ResultOp>(afterBody->getTerminator());
167-
mlir::SmallVector<mlir::Value> results(resultOp->getOperands());
168-
mlir::Value ivInAfter = scfWhileOp.getAfterArguments()[0];
168+
mlir::SmallVector<mlir::Value> results;
169+
mlir::Value iv = scfWhileOp.getAfterArguments()[0];
169170

170171
rewriter.setInsertionPointToStart(afterBody);
171-
results[0] = mlir::arith::AddIOp::create(rewriter, loc, ivInAfter, step);
172+
results.push_back(mlir::arith::AddIOp::create(rewriter, loc, iv, step));
173+
llvm::append_range(results, hasFinalValue
174+
? resultOp->getOperands().drop_front()
175+
: resultOp->getOperands());
172176

173177
rewriter.setInsertionPointToEnd(afterBody);
174178
rewriter.replaceOpWithNewOp<mlir::scf::YieldOp>(resultOp, results);
175179

176180
scfWhileOp->setAttrs(iterWhileOp->getAttrs());
177-
rewriter.replaceOp(iterWhileOp, scfWhileOp);
181+
rewriter.replaceOp(iterWhileOp,
182+
hasFinalValue ? scfWhileOp->getResults()
183+
: scfWhileOp->getResults().drop_front());
178184
return mlir::success();
179185
}
180186
};

flang/test/Fir/FirToSCF/iter-while.fir

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// RUN: fir-opt %s --fir-to-scf | FileCheck %s
1+
// RUN: fir-opt %s --fir-to-scf --allow-unregistered-dialect | FileCheck %s
22

33
// CHECK-LABEL: func.func @test_simple_iterate_while_1() -> (index, i1, i16, i32) {
44
// CHECK: %[[VAL_0:.*]] = arith.constant 11 : index
@@ -97,3 +97,30 @@ func.func @test_zero_iterations() -> (index, i1, i8) {
9797

9898
return %res#0, %res#1, %res#2 : index, i1, i8
9999
}
100+
101+
// CHECK-LABEL: func.func @test_without_final_value(
102+
// CHECK-SAME: %[[ARG0:.*]]: index,
103+
// CHECK-SAME: %[[ARG1:.*]]: index) -> i1 {
104+
// CHECK: %[[CONSTANT_0:.*]] = arith.constant 1 : index
105+
// CHECK: %[[CONSTANT_1:.*]] = arith.constant true
106+
// CHECK: %[[WHILE_0:.*]]:2 = scf.while (%[[VAL_0:.*]] = %[[ARG0]], %[[VAL_1:.*]] = %[[CONSTANT_1]]) : (index, i1) -> (index, i1) {
107+
// CHECK: %[[CMPI_0:.*]] = arith.cmpi sle, %[[VAL_0]], %[[ARG1]] : index
108+
// CHECK: %[[ANDI_0:.*]] = arith.andi %[[CMPI_0]], %[[VAL_1]] : i1
109+
// CHECK: scf.condition(%[[ANDI_0]]) %[[VAL_0]], %[[VAL_1]] : index, i1
110+
// CHECK: } do {
111+
// CHECK: ^bb0(%[[VAL_2:.*]]: index, %[[VAL_3:.*]]: i1):
112+
// CHECK: %[[ADDI_0:.*]] = arith.addi %[[VAL_2]], %[[CONSTANT_0]] : index
113+
// CHECK: %[[VAL_4:.*]] = "test.get_some_value"() : () -> i1
114+
// CHECK: scf.yield %[[ADDI_0]], %[[VAL_4]] : index, i1
115+
// CHECK: }
116+
// CHECK: return %[[VAL_5:.*]]#1 : i1
117+
// CHECK: }
118+
func.func @test_without_final_value(%lo : index, %up : index) -> i1 {
119+
%c1 = arith.constant 1 : index
120+
%ok1 = arith.constant true
121+
%ok2 = fir.iterate_while (%i = %lo to %up step %c1) and (%j = %ok1) {
122+
%ok = "test.get_some_value"() : () -> i1
123+
fir.result %ok : i1
124+
}
125+
return %ok2 : i1
126+
}

0 commit comments

Comments
 (0)