[flang-commits] [flang] d91735b - [flang][NFC] Move genMaxWithZero into fir:::factory
Valentin Clement via flang-commits
flang-commits at lists.llvm.org
Wed Jun 8 09:02:18 PDT 2022
Author: jeanPerier
Date: 2022-06-08T18:02:13+02:00
New Revision: d91735b5fad84883444acea4e64d4cd606786fd9
URL: https://github.com/llvm/llvm-project/commit/d91735b5fad84883444acea4e64d4cd606786fd9
DIFF: https://github.com/llvm/llvm-project/commit/d91735b5fad84883444acea4e64d4cd606786fd9.diff
LOG: [flang][NFC] Move genMaxWithZero into fir:::factory
Move tthe function to allow its usage in the Optimizer/Builder functions.
This patch is part of the upstreaming effort from fir-dev branch.
Reviewed By: jeanPerier
Differential Revision: https://reviews.llvm.org/D127295
Added:
Modified:
flang/include/flang/Lower/ConvertExpr.h
flang/include/flang/Optimizer/Builder/FIRBuilder.h
flang/lib/Lower/ConvertExpr.cpp
flang/lib/Lower/ConvertVariable.cpp
flang/lib/Optimizer/Builder/FIRBuilder.cpp
Removed:
################################################################################
diff --git a/flang/include/flang/Lower/ConvertExpr.h b/flang/include/flang/Lower/ConvertExpr.h
index 66f43904ead8c..c8dd645aa6d98 100644
--- a/flang/include/flang/Lower/ConvertExpr.h
+++ b/flang/include/flang/Lower/ConvertExpr.h
@@ -232,10 +232,6 @@ inline mlir::NamedAttribute getAdaptToByRefAttr(fir::FirOpBuilder &builder) {
builder.getUnitAttr()};
}
-/// Generate max(\p value, 0) where \p value is a scalar integer.
-mlir::Value genMaxWithZero(fir::FirOpBuilder &builder, mlir::Location loc,
- mlir::Value value);
-
} // namespace Fortran::lower
#endif // FORTRAN_LOWER_CONVERTEXPR_H
diff --git a/flang/include/flang/Optimizer/Builder/FIRBuilder.h b/flang/include/flang/Optimizer/Builder/FIRBuilder.h
index ab5b9317f71df..ddc99a3640a7e 100644
--- a/flang/include/flang/Optimizer/Builder/FIRBuilder.h
+++ b/flang/include/flang/Optimizer/Builder/FIRBuilder.h
@@ -542,6 +542,10 @@ mlir::Value createZeroValue(fir::FirOpBuilder &builder, mlir::Location loc,
/// Unwrap integer constant from an mlir::Value.
llvm::Optional<std::int64_t> getIntIfConstant(mlir::Value value);
+/// Generate max(\p value, 0) where \p value is a scalar integer.
+mlir::Value genMaxWithZero(fir::FirOpBuilder &builder, mlir::Location loc,
+ mlir::Value value);
+
} // namespace fir::factory
#endif // FORTRAN_OPTIMIZER_BUILDER_FIRBUILDER_H
diff --git a/flang/lib/Lower/ConvertExpr.cpp b/flang/lib/Lower/ConvertExpr.cpp
index 0e196693b393f..35b70c926c77d 100644
--- a/flang/lib/Lower/ConvertExpr.cpp
+++ b/flang/lib/Lower/ConvertExpr.cpp
@@ -839,7 +839,7 @@ class ScalarExprLowering {
mlir::Value rawLen = fir::getBase(genval(*lengthExpr));
// F2018 7.4.4.2 point 5.
funcPtrResultLength =
- Fortran::lower::genMaxWithZero(builder, getLoc(), rawLen);
+ fir::factory::genMaxWithZero(builder, getLoc(), rawLen);
}
}
if (!funcPtrResultLength)
@@ -2223,7 +2223,7 @@ class ScalarExprLowering {
type->characterTypeSpec().length().GetExplicit()) {
mlir::Value len = fir::getBase(genval(*lenExpr));
// F2018 7.4.4.2 point 5.
- len = Fortran::lower::genMaxWithZero(builder, getLoc(), len);
+ len = fir::factory::genMaxWithZero(builder, getLoc(), len);
symMap.addSymbol(*arg,
replaceScalarCharacterLength(gen(*expr), len));
continue;
@@ -7588,15 +7588,3 @@ void Fortran::lower::createArrayMergeStores(
esp.resetBindings();
esp.incrementCounter();
}
-
-mlir::Value Fortran::lower::genMaxWithZero(fir::FirOpBuilder &builder,
- mlir::Location loc,
- mlir::Value value) {
- mlir::Value zero = builder.createIntegerConstant(loc, value.getType(), 0);
- if (mlir::Operation *definingOp = value.getDefiningOp())
- if (auto cst = mlir::dyn_cast<mlir::arith::ConstantOp>(definingOp))
- if (auto intAttr = cst.getValue().dyn_cast<mlir::IntegerAttr>())
- return intAttr.getInt() < 0 ? zero : value;
- return Fortran::lower::genMax(builder, loc,
- llvm::SmallVector<mlir::Value>{value, zero});
-}
diff --git a/flang/lib/Lower/ConvertVariable.cpp b/flang/lib/Lower/ConvertVariable.cpp
index 86f7fac38c836..37e5ebadd836a 100644
--- a/flang/lib/Lower/ConvertVariable.cpp
+++ b/flang/lib/Lower/ConvertVariable.cpp
@@ -1090,7 +1090,7 @@ static mlir::Value computeExtent(fir::FirOpBuilder &builder, mlir::Location loc,
auto
diff = builder.create<mlir::arith::SubIOp>(loc, idxTy, ub, lb);
mlir::Value one = builder.createIntegerConstant(loc, idxTy, 1);
auto rawExtent = builder.create<mlir::arith::AddIOp>(loc, idxTy,
diff , one);
- return Fortran::lower::genMaxWithZero(builder, loc, rawExtent);
+ return fir::factory::genMaxWithZero(builder, loc, rawExtent);
}
/// Lower explicit lower bounds into \p result. Does nothing if this is not an
@@ -1145,7 +1145,7 @@ lowerExplicitExtents(Fortran::lower::AbstractConverter &converter,
mlir::Value ub = builder.createConvert(
loc, idxTy, genScalarValue(converter, loc, expr, symMap, stmtCtx));
if (lowerBounds.empty())
- result.emplace_back(Fortran::lower::genMaxWithZero(builder, loc, ub));
+ result.emplace_back(fir::factory::genMaxWithZero(builder, loc, ub));
else
result.emplace_back(
computeExtent(builder, loc, lowerBounds[spec.index()], ub));
@@ -1173,7 +1173,7 @@ lowerExplicitCharLen(Fortran::lower::AbstractConverter &converter,
if (llvm::Optional<Fortran::lower::SomeExpr> lenExpr = box.getCharLenExpr())
// If the length expression is negative, the length is zero. See F2018
// 7.4.4.2 point 5.
- return Fortran::lower::genMaxWithZero(
+ return fir::factory::genMaxWithZero(
builder, loc,
genScalarValue(converter, loc, *lenExpr, symMap, stmtCtx));
return mlir::Value{};
@@ -1338,7 +1338,7 @@ void Fortran::lower::mapSymbolAttributes(
Fortran::lower::SomeExpr highEx{*high};
mlir::Value ub = genValue(highEx);
ub = builder.createConvert(loc, idxTy, ub);
- shapes.emplace_back(genMaxWithZero(builder, loc, ub));
+ shapes.emplace_back(fir::factory::genMaxWithZero(builder, loc, ub));
} else if (spec->ubound().isColon()) {
assert(box && "assumed bounds require a descriptor");
mlir::Value dim =
@@ -1409,7 +1409,7 @@ void Fortran::lower::mapSymbolAttributes(
mlir::Value rawLen = genValue(*charLen);
// If the length expression is negative, the length is zero. See
// F2018 7.4.4.2 point 5.
- return genMaxWithZero(builder, loc, rawLen);
+ return fir::factory::genMaxWithZero(builder, loc, rawLen);
};
ba.match(
diff --git a/flang/lib/Optimizer/Builder/FIRBuilder.cpp b/flang/lib/Optimizer/Builder/FIRBuilder.cpp
index 6f62b5413ccdf..2ec1c7c4b8939 100644
--- a/flang/lib/Optimizer/Builder/FIRBuilder.cpp
+++ b/flang/lib/Optimizer/Builder/FIRBuilder.cpp
@@ -1216,3 +1216,17 @@ llvm::Optional<std::int64_t> fir::factory::getIntIfConstant(mlir::Value value) {
return intAttr.getInt();
return {};
}
+
+mlir::Value fir::factory::genMaxWithZero(fir::FirOpBuilder &builder,
+ mlir::Location loc,
+ mlir::Value value) {
+ mlir::Value zero = builder.createIntegerConstant(loc, value.getType(), 0);
+ if (mlir::Operation *definingOp = value.getDefiningOp())
+ if (auto cst = mlir::dyn_cast<mlir::arith::ConstantOp>(definingOp))
+ if (auto intAttr = cst.getValue().dyn_cast<mlir::IntegerAttr>())
+ return intAttr.getInt() > 0 ? value : zero;
+ mlir::Value valueIsGreater = builder.create<mlir::arith::CmpIOp>(
+ loc, mlir::arith::CmpIPredicate::sgt, value, zero);
+ return builder.create<mlir::arith::SelectOp>(loc, valueIsGreater, value,
+ zero);
+}
More information about the flang-commits
mailing list