brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.4 KiB · d0a9342 Raw
88 lines · cpp
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-exception6//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 15using namespace mlir;16 17struct DoLoopHelperTest : public testing::Test {18public:19  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  }25  void TearDown() { delete firBuilder; }26 27  fir::FirOpBuilder &getBuilder() { return *firBuilder; }28 29  mlir::MLIRContext context;30  std::unique_ptr<fir::KindMapping> kindMap;31  fir::FirOpBuilder *firBuilder;32};33 34void 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 41TEST_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 57TEST_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 72TEST_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