242 lines · cpp
1//===- TransformationalTest.cpp -- Transformational intrinsic generation --===//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/Runtime/Transformational.h"10#include "RuntimeCallTestBase.h"11#include "gtest/gtest.h"12 13void testGenBesselJn(14 fir::FirOpBuilder &builder, mlir::Type realTy, llvm::StringRef fctName) {15 mlir::Location loc = builder.getUnknownLoc();16 mlir::Type i32Ty = builder.getIntegerType(32);17 mlir::Type seqTy =18 fir::SequenceType::get(fir::SequenceType::Shape(1, 10), realTy);19 mlir::Value result = fir::UndefOp::create(builder, loc, seqTy);20 mlir::Value n1 = fir::UndefOp::create(builder, loc, i32Ty);21 mlir::Value n2 = fir::UndefOp::create(builder, loc, i32Ty);22 mlir::Value x = fir::UndefOp::create(builder, loc, realTy);23 mlir::Value bn1 = fir::UndefOp::create(builder, loc, realTy);24 mlir::Value bn2 = fir::UndefOp::create(builder, loc, realTy);25 fir::runtime::genBesselJn(builder, loc, result, n1, n2, x, bn1, bn2);26 checkCallOpFromResultBox(result, fctName, 6);27}28 29TEST_F(RuntimeCallTest, genBesselJnTest) {30 testGenBesselJn(*firBuilder, f32Ty, "_FortranABesselJn_4");31 testGenBesselJn(*firBuilder, f64Ty, "_FortranABesselJn_8");32 testGenBesselJn(*firBuilder, f80Ty, "_FortranABesselJn_10");33 testGenBesselJn(*firBuilder, f128Ty, "_FortranABesselJn_16");34}35 36void testGenBesselJnX0(37 fir::FirOpBuilder &builder, mlir::Type realTy, llvm::StringRef fctName) {38 mlir::Location loc = builder.getUnknownLoc();39 mlir::Type i32Ty = builder.getIntegerType(32);40 mlir::Type seqTy =41 fir::SequenceType::get(fir::SequenceType::Shape(1, 10), realTy);42 mlir::Value result = fir::UndefOp::create(builder, loc, seqTy);43 mlir::Value n1 = fir::UndefOp::create(builder, loc, i32Ty);44 mlir::Value n2 = fir::UndefOp::create(builder, loc, i32Ty);45 fir::runtime::genBesselJnX0(builder, loc, realTy, result, n1, n2);46 checkCallOpFromResultBox(result, fctName, 3);47}48 49TEST_F(RuntimeCallTest, genBesselJnX0Test) {50 testGenBesselJnX0(*firBuilder, f32Ty, "_FortranABesselJnX0_4");51 testGenBesselJnX0(*firBuilder, f64Ty, "_FortranABesselJnX0_8");52 testGenBesselJnX0(*firBuilder, f80Ty, "_FortranABesselJnX0_10");53 testGenBesselJnX0(*firBuilder, f128Ty, "_FortranABesselJnX0_16");54}55 56void testGenBesselYn(57 fir::FirOpBuilder &builder, mlir::Type realTy, llvm::StringRef fctName) {58 mlir::Location loc = builder.getUnknownLoc();59 mlir::Type i32Ty = builder.getIntegerType(32);60 mlir::Type seqTy =61 fir::SequenceType::get(fir::SequenceType::Shape(1, 10), realTy);62 mlir::Value result = fir::UndefOp::create(builder, loc, seqTy);63 mlir::Value n1 = fir::UndefOp::create(builder, loc, i32Ty);64 mlir::Value n2 = fir::UndefOp::create(builder, loc, i32Ty);65 mlir::Value x = fir::UndefOp::create(builder, loc, realTy);66 mlir::Value bn1 = fir::UndefOp::create(builder, loc, realTy);67 mlir::Value bn2 = fir::UndefOp::create(builder, loc, realTy);68 fir::runtime::genBesselYn(builder, loc, result, n1, n2, x, bn1, bn2);69 checkCallOpFromResultBox(result, fctName, 6);70}71 72TEST_F(RuntimeCallTest, genBesselYnTest) {73 testGenBesselYn(*firBuilder, f32Ty, "_FortranABesselYn_4");74 testGenBesselYn(*firBuilder, f64Ty, "_FortranABesselYn_8");75 testGenBesselYn(*firBuilder, f80Ty, "_FortranABesselYn_10");76 testGenBesselYn(*firBuilder, f128Ty, "_FortranABesselYn_16");77}78 79void testGenBesselYnX0(80 fir::FirOpBuilder &builder, mlir::Type realTy, llvm::StringRef fctName) {81 mlir::Location loc = builder.getUnknownLoc();82 mlir::Type i32Ty = builder.getIntegerType(32);83 mlir::Type seqTy =84 fir::SequenceType::get(fir::SequenceType::Shape(1, 10), realTy);85 mlir::Value result = fir::UndefOp::create(builder, loc, seqTy);86 mlir::Value n1 = fir::UndefOp::create(builder, loc, i32Ty);87 mlir::Value n2 = fir::UndefOp::create(builder, loc, i32Ty);88 fir::runtime::genBesselYnX0(builder, loc, realTy, result, n1, n2);89 checkCallOpFromResultBox(result, fctName, 3);90}91 92TEST_F(RuntimeCallTest, genBesselYnX0Test) {93 testGenBesselYnX0(*firBuilder, f32Ty, "_FortranABesselYnX0_4");94 testGenBesselYnX0(*firBuilder, f64Ty, "_FortranABesselYnX0_8");95 testGenBesselYnX0(*firBuilder, f80Ty, "_FortranABesselYnX0_10");96 testGenBesselYnX0(*firBuilder, f128Ty, "_FortranABesselYnX0_16");97}98 99TEST_F(RuntimeCallTest, genCshiftTest) {100 auto loc = firBuilder->getUnknownLoc();101 mlir::Type seqTy =102 fir::SequenceType::get(fir::SequenceType::Shape(1, 10), i32Ty);103 mlir::Value result = fir::UndefOp::create(*firBuilder, loc, seqTy);104 mlir::Value array = fir::UndefOp::create(*firBuilder, loc, seqTy);105 mlir::Value shift = fir::UndefOp::create(*firBuilder, loc, seqTy);106 mlir::Value dim = fir::UndefOp::create(*firBuilder, loc, seqTy);107 fir::runtime::genCshift(*firBuilder, loc, result, array, shift, dim);108 checkCallOpFromResultBox(result, "_FortranACshift", 4);109}110 111TEST_F(RuntimeCallTest, genCshiftVectorTest) {112 auto loc = firBuilder->getUnknownLoc();113 mlir::Type seqTy =114 fir::SequenceType::get(fir::SequenceType::Shape(1, 10), i32Ty);115 mlir::Value result = fir::UndefOp::create(*firBuilder, loc, seqTy);116 mlir::Value array = fir::UndefOp::create(*firBuilder, loc, seqTy);117 mlir::Value shift = fir::UndefOp::create(*firBuilder, loc, seqTy);118 fir::runtime::genCshiftVector(*firBuilder, loc, result, array, shift);119 checkCallOpFromResultBox(result, "_FortranACshiftVector", 3);120}121 122TEST_F(RuntimeCallTest, genEoshiftTest) {123 auto loc = firBuilder->getUnknownLoc();124 mlir::Type seqTy =125 fir::SequenceType::get(fir::SequenceType::Shape(1, 10), i32Ty);126 mlir::Value result = fir::UndefOp::create(*firBuilder, loc, seqTy);127 mlir::Value array = fir::UndefOp::create(*firBuilder, loc, seqTy);128 mlir::Value shift = fir::UndefOp::create(*firBuilder, loc, seqTy);129 mlir::Value bound = fir::UndefOp::create(*firBuilder, loc, seqTy);130 mlir::Value dim = fir::UndefOp::create(*firBuilder, loc, seqTy);131 fir::runtime::genEoshift(*firBuilder, loc, result, array, shift, bound, dim);132 checkCallOpFromResultBox(result, "_FortranAEoshift", 5);133}134 135TEST_F(RuntimeCallTest, genEoshiftVectorTest) {136 auto loc = firBuilder->getUnknownLoc();137 mlir::Type seqTy =138 fir::SequenceType::get(fir::SequenceType::Shape(1, 10), i32Ty);139 mlir::Value result = fir::UndefOp::create(*firBuilder, loc, seqTy);140 mlir::Value array = fir::UndefOp::create(*firBuilder, loc, seqTy);141 mlir::Value shift = fir::UndefOp::create(*firBuilder, loc, seqTy);142 mlir::Value bound = fir::UndefOp::create(*firBuilder, loc, seqTy);143 fir::runtime::genEoshiftVector(*firBuilder, loc, result, array, shift, bound);144 checkCallOpFromResultBox(result, "_FortranAEoshiftVector", 4);145}146 147void testGenMatmul(fir::FirOpBuilder &builder, mlir::Type eleTy1,148 mlir::Type eleTy2, llvm::StringRef funcName) {149 auto loc = builder.getUnknownLoc();150 mlir::Type resultTy =151 fir::ReferenceType::get(fir::BoxType::get(builder.getNoneType()));152 mlir::Type seqTy1 =153 fir::SequenceType::get(fir::SequenceType::Shape(2, 10), eleTy1);154 mlir::Type seqTy2 =155 fir::SequenceType::get(fir::SequenceType::Shape(2, 10), eleTy2);156 mlir::Type boxTy1 = fir::BoxType::get(seqTy1);157 mlir::Type boxTy2 = fir::BoxType::get(seqTy2);158 mlir::Value result = fir::UndefOp::create(builder, loc, resultTy);159 mlir::Value matrixA = fir::UndefOp::create(builder, loc, boxTy1);160 mlir::Value matrixB = fir::UndefOp::create(builder, loc, boxTy2);161 fir::runtime::genMatmul(builder, loc, result, matrixA, matrixB);162 checkCallOpFromResultBox(result, funcName, 3);163}164 165TEST_F(RuntimeCallTest, genMatmulTest) {166 testGenMatmul(*firBuilder, i32Ty, i16Ty, "_FortranAMatmulInteger4Integer2");167 testGenMatmul(*firBuilder, i32Ty, f64Ty, "_FortranAMatmulInteger4Real8");168 testGenMatmul(*firBuilder, i32Ty, c8Ty, "_FortranAMatmulInteger4Complex8");169 testGenMatmul(*firBuilder, f32Ty, i16Ty, "_FortranAMatmulReal4Integer2");170 testGenMatmul(*firBuilder, f32Ty, f64Ty, "_FortranAMatmulReal4Real8");171 testGenMatmul(*firBuilder, f32Ty, c8Ty, "_FortranAMatmulReal4Complex8");172 testGenMatmul(*firBuilder, c4Ty, i16Ty, "_FortranAMatmulComplex4Integer2");173 testGenMatmul(*firBuilder, c4Ty, f64Ty, "_FortranAMatmulComplex4Real8");174 testGenMatmul(*firBuilder, c4Ty, c8Ty, "_FortranAMatmulComplex4Complex8");175 testGenMatmul(*firBuilder, f80Ty, f128Ty, "_FortranAMatmulReal10Real16");176 testGenMatmul(*firBuilder, f80Ty, i128Ty, "_FortranAMatmulReal10Integer16");177 testGenMatmul(*firBuilder, f128Ty, i128Ty, "_FortranAMatmulReal16Integer16");178 testGenMatmul(179 *firBuilder, logical1Ty, logical2Ty, "_FortranAMatmulLogical1Logical2");180 testGenMatmul(181 *firBuilder, logical4Ty, logical8Ty, "_FortranAMatmulLogical4Logical8");182}183 184TEST_F(RuntimeCallTest, genPackTest) {185 auto loc = firBuilder->getUnknownLoc();186 mlir::Type seqTy =187 fir::SequenceType::get(fir::SequenceType::Shape(1, 10), i32Ty);188 mlir::Value result = fir::UndefOp::create(*firBuilder, loc, seqTy);189 mlir::Value array = fir::UndefOp::create(*firBuilder, loc, seqTy);190 mlir::Value mask = fir::UndefOp::create(*firBuilder, loc, seqTy);191 mlir::Value vector = fir::UndefOp::create(*firBuilder, loc, seqTy);192 fir::runtime::genPack(*firBuilder, loc, result, array, mask, vector);193 checkCallOpFromResultBox(result, "_FortranAPack", 4);194}195 196TEST_F(RuntimeCallTest, genReshapeTest) {197 auto loc = firBuilder->getUnknownLoc();198 mlir::Type seqTy =199 fir::SequenceType::get(fir::SequenceType::Shape(1, 10), i32Ty);200 mlir::Value result = fir::UndefOp::create(*firBuilder, loc, seqTy);201 mlir::Value source = fir::UndefOp::create(*firBuilder, loc, seqTy);202 mlir::Value shape = fir::UndefOp::create(*firBuilder, loc, seqTy);203 mlir::Value pad = fir::UndefOp::create(*firBuilder, loc, seqTy);204 mlir::Value order = fir::UndefOp::create(*firBuilder, loc, seqTy);205 fir::runtime::genReshape(*firBuilder, loc, result, source, shape, pad, order);206 checkCallOpFromResultBox(result, "_FortranAReshape", 5);207}208 209TEST_F(RuntimeCallTest, genSpreadTest) {210 auto loc = firBuilder->getUnknownLoc();211 mlir::Type seqTy =212 fir::SequenceType::get(fir::SequenceType::Shape(1, 10), i32Ty);213 mlir::Value result = fir::UndefOp::create(*firBuilder, loc, seqTy);214 mlir::Value source = fir::UndefOp::create(*firBuilder, loc, seqTy);215 mlir::Value dim = fir::UndefOp::create(*firBuilder, loc, seqTy);216 mlir::Value ncopies = fir::UndefOp::create(*firBuilder, loc, seqTy);217 fir::runtime::genSpread(*firBuilder, loc, result, source, dim, ncopies);218 checkCallOpFromResultBox(result, "_FortranASpread", 4);219}220 221TEST_F(RuntimeCallTest, genTransposeTest) {222 auto loc = firBuilder->getUnknownLoc();223 mlir::Type seqTy =224 fir::SequenceType::get(fir::SequenceType::Shape(1, 10), i32Ty);225 mlir::Value result = fir::UndefOp::create(*firBuilder, loc, seqTy);226 mlir::Value source = fir::UndefOp::create(*firBuilder, loc, seqTy);227 fir::runtime::genTranspose(*firBuilder, loc, result, source);228 checkCallOpFromResultBox(result, "_FortranATranspose", 2);229}230 231TEST_F(RuntimeCallTest, genUnpack) {232 auto loc = firBuilder->getUnknownLoc();233 mlir::Type seqTy =234 fir::SequenceType::get(fir::SequenceType::Shape(1, 10), i32Ty);235 mlir::Value result = fir::UndefOp::create(*firBuilder, loc, seqTy);236 mlir::Value vector = fir::UndefOp::create(*firBuilder, loc, seqTy);237 mlir::Value mask = fir::UndefOp::create(*firBuilder, loc, seqTy);238 mlir::Value field = fir::UndefOp::create(*firBuilder, loc, seqTy);239 fir::runtime::genUnpack(*firBuilder, loc, result, vector, mask, field);240 checkCallOpFromResultBox(result, "_FortranAUnpack", 4);241}242