xref: /llvm-project/flang/unittests/Optimizer/Builder/DoLoopHelperTest.cpp (revision fac349a169976f822fb27f03e623fa0d28aec1f3)
1bde89ac7SEric Schweitz //===- DoLoopHelper.cpp -- DoLoopHelper unit tests ------------------------===//
2bde89ac7SEric Schweitz //
3bde89ac7SEric Schweitz // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4bde89ac7SEric Schweitz // See https://llvm.org/LICENSE.txt for license information.
5bde89ac7SEric Schweitz // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6bde89ac7SEric Schweitz //
7bde89ac7SEric Schweitz //===----------------------------------------------------------------------===//
8bde89ac7SEric Schweitz 
9bde89ac7SEric Schweitz #include "flang/Optimizer/Builder/DoLoopHelper.h"
10bde89ac7SEric Schweitz #include "gtest/gtest.h"
11b07ef9e7SRenaud-K #include "flang/Optimizer/Dialect/Support/KindMapping.h"
12bde89ac7SEric Schweitz #include "flang/Optimizer/Support/InitFIR.h"
13bde89ac7SEric Schweitz #include <string>
14bde89ac7SEric Schweitz 
15092601d4SAndrzej Warzynski using namespace mlir;
16092601d4SAndrzej Warzynski 
17bde89ac7SEric Schweitz struct DoLoopHelperTest : public testing::Test {
18bde89ac7SEric Schweitz public:
SetUpDoLoopHelperTest19bde89ac7SEric Schweitz   void SetUp() {
20f97731c7SKiran Chandramohan     kindMap = std::make_unique<fir::KindMapping>(&context);
21bde89ac7SEric Schweitz     mlir::OpBuilder builder(&context);
22f97731c7SKiran Chandramohan     firBuilder = new fir::FirOpBuilder(builder, *kindMap);
23bde89ac7SEric Schweitz     fir::support::loadDialects(context);
24bde89ac7SEric Schweitz   }
TearDownDoLoopHelperTest25bde89ac7SEric Schweitz   void TearDown() { delete firBuilder; }
26bde89ac7SEric Schweitz 
getBuilderDoLoopHelperTest27bde89ac7SEric Schweitz   fir::FirOpBuilder &getBuilder() { return *firBuilder; }
28bde89ac7SEric Schweitz 
29bde89ac7SEric Schweitz   mlir::MLIRContext context;
30f97731c7SKiran Chandramohan   std::unique_ptr<fir::KindMapping> kindMap;
31bde89ac7SEric Schweitz   fir::FirOpBuilder *firBuilder;
32bde89ac7SEric Schweitz };
33bde89ac7SEric Schweitz 
checkConstantValue(const mlir::Value & value,int64_t v)34bde89ac7SEric Schweitz void checkConstantValue(const mlir::Value &value, int64_t v) {
35aab4263aSValentin Clement   EXPECT_TRUE(mlir::isa<mlir::arith::ConstantOp>(value.getDefiningOp()));
36aab4263aSValentin Clement   auto cstOp = dyn_cast<mlir::arith::ConstantOp>(value.getDefiningOp());
37*fac349a1SChristian Sigg   auto valueAttr = dyn_cast_or_null<IntegerAttr>(cstOp.getValue());
38bde89ac7SEric Schweitz   EXPECT_EQ(v, valueAttr.getInt());
39bde89ac7SEric Schweitz }
40bde89ac7SEric Schweitz 
TEST_F(DoLoopHelperTest,createLoopWithCountTest)41bde89ac7SEric Schweitz TEST_F(DoLoopHelperTest, createLoopWithCountTest) {
42bde89ac7SEric Schweitz   auto firBuilder = getBuilder();
43bde89ac7SEric Schweitz   fir::factory::DoLoopHelper helper(firBuilder, firBuilder.getUnknownLoc());
44bde89ac7SEric Schweitz 
45bde89ac7SEric Schweitz   auto c10 = firBuilder.createIntegerConstant(
46bde89ac7SEric Schweitz       firBuilder.getUnknownLoc(), firBuilder.getIndexType(), 10);
47bde89ac7SEric Schweitz   auto loop =
48bde89ac7SEric Schweitz       helper.createLoop(c10, [&](fir::FirOpBuilder &, mlir::Value index) {});
49149ad3d5SShraiysh Vaishay   checkConstantValue(loop.getLowerBound(), 0);
50149ad3d5SShraiysh Vaishay   EXPECT_TRUE(mlir::isa<arith::SubIOp>(loop.getUpperBound().getDefiningOp()));
51149ad3d5SShraiysh Vaishay   auto subOp = dyn_cast<arith::SubIOp>(loop.getUpperBound().getDefiningOp());
52feeee78aSJacques Pienaar   EXPECT_EQ(c10, subOp.getLhs());
533012f35fSJacques Pienaar   checkConstantValue(subOp.getRhs(), 1);
543012f35fSJacques Pienaar   checkConstantValue(loop.getStep(), 1);
55bde89ac7SEric Schweitz }
56bde89ac7SEric Schweitz 
TEST_F(DoLoopHelperTest,createLoopWithLowerAndUpperBound)57bde89ac7SEric Schweitz TEST_F(DoLoopHelperTest, createLoopWithLowerAndUpperBound) {
58bde89ac7SEric Schweitz   auto firBuilder = getBuilder();
59bde89ac7SEric Schweitz   fir::factory::DoLoopHelper helper(firBuilder, firBuilder.getUnknownLoc());
60bde89ac7SEric Schweitz 
61bde89ac7SEric Schweitz   auto lb = firBuilder.createIntegerConstant(
62bde89ac7SEric Schweitz       firBuilder.getUnknownLoc(), firBuilder.getIndexType(), 1);
63bde89ac7SEric Schweitz   auto ub = firBuilder.createIntegerConstant(
64bde89ac7SEric Schweitz       firBuilder.getUnknownLoc(), firBuilder.getIndexType(), 20);
65bde89ac7SEric Schweitz   auto loop =
66bde89ac7SEric Schweitz       helper.createLoop(lb, ub, [&](fir::FirOpBuilder &, mlir::Value index) {});
673012f35fSJacques Pienaar   checkConstantValue(loop.getLowerBound(), 1);
683012f35fSJacques Pienaar   checkConstantValue(loop.getUpperBound(), 20);
693012f35fSJacques Pienaar   checkConstantValue(loop.getStep(), 1);
70bde89ac7SEric Schweitz }
71bde89ac7SEric Schweitz 
TEST_F(DoLoopHelperTest,createLoopWithStep)72bde89ac7SEric Schweitz TEST_F(DoLoopHelperTest, createLoopWithStep) {
73bde89ac7SEric Schweitz   auto firBuilder = getBuilder();
74bde89ac7SEric Schweitz   fir::factory::DoLoopHelper helper(firBuilder, firBuilder.getUnknownLoc());
75bde89ac7SEric Schweitz 
76bde89ac7SEric Schweitz   auto lb = firBuilder.createIntegerConstant(
77bde89ac7SEric Schweitz       firBuilder.getUnknownLoc(), firBuilder.getIndexType(), 1);
78bde89ac7SEric Schweitz   auto ub = firBuilder.createIntegerConstant(
79bde89ac7SEric Schweitz       firBuilder.getUnknownLoc(), firBuilder.getIndexType(), 20);
80bde89ac7SEric Schweitz   auto step = firBuilder.createIntegerConstant(
81bde89ac7SEric Schweitz       firBuilder.getUnknownLoc(), firBuilder.getIndexType(), 2);
82bde89ac7SEric Schweitz   auto loop = helper.createLoop(
83bde89ac7SEric Schweitz       lb, ub, step, [&](fir::FirOpBuilder &, mlir::Value index) {});
843012f35fSJacques Pienaar   checkConstantValue(loop.getLowerBound(), 1);
853012f35fSJacques Pienaar   checkConstantValue(loop.getUpperBound(), 20);
863012f35fSJacques Pienaar   checkConstantValue(loop.getStep(), 2);
87bde89ac7SEric Schweitz }
88