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