[flang-commits] [flang] 89af7de - [flang] Lower power to HLFIR
Jean Perier via flang-commits
flang-commits at lists.llvm.org
Thu Dec 1 08:50:36 PST 2022
Author: Jean Perier
Date: 2022-12-01T17:49:36+01:00
New Revision: 89af7de9de10fd82629351b5a82cee849ecceba8
URL: https://github.com/llvm/llvm-project/commit/89af7de9de10fd82629351b5a82cee849ecceba8
DIFF: https://github.com/llvm/llvm-project/commit/89af7de9de10fd82629351b5a82cee849ecceba8.diff
LOG: [flang] Lower power to HLFIR
Differential Revision: https://reviews.llvm.org/D139117
Added:
Modified:
flang/lib/Lower/ConvertExprToHLFIR.cpp
flang/test/Lower/HLFIR/binary-ops.f90
Removed:
################################################################################
diff --git a/flang/lib/Lower/ConvertExprToHLFIR.cpp b/flang/lib/Lower/ConvertExprToHLFIR.cpp
index d4c6f5358aff..a8860f639f60 100644
--- a/flang/lib/Lower/ConvertExprToHLFIR.cpp
+++ b/flang/lib/Lower/ConvertExprToHLFIR.cpp
@@ -17,6 +17,7 @@
#include "flang/Lower/ConvertCall.h"
#include "flang/Lower/ConvertConstant.h"
#include "flang/Lower/ConvertType.h"
+#include "flang/Lower/IntrinsicCall.h"
#include "flang/Lower/StatementContext.h"
#include "flang/Lower/SymbolMap.h"
#include "flang/Optimizer/Builder/Todo.h"
@@ -284,6 +285,31 @@ GENBIN(Divide, Integer, mlir::arith::DivSIOp)
GENBIN(Divide, Real, mlir::arith::DivFOp)
GENBIN(Divide, Complex, fir::DivcOp)
+template <Fortran::common::TypeCategory TC, int KIND>
+struct BinaryOp<Fortran::evaluate::Power<Fortran::evaluate::Type<TC, KIND>>> {
+ static hlfir::EntityWithAttributes gen(mlir::Location loc,
+ fir::FirOpBuilder &builder,
+ hlfir::Entity lhs, hlfir::Entity rhs) {
+ mlir::Type ty = Fortran::lower::getFIRType(builder.getContext(), TC, KIND,
+ /*params=*/llvm::None);
+ return hlfir::EntityWithAttributes{
+ Fortran::lower::genPow(builder, loc, ty, lhs, rhs)};
+ }
+};
+
+template <Fortran::common::TypeCategory TC, int KIND>
+struct BinaryOp<
+ Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<TC, KIND>>> {
+ static hlfir::EntityWithAttributes gen(mlir::Location loc,
+ fir::FirOpBuilder &builder,
+ hlfir::Entity lhs, hlfir::Entity rhs) {
+ mlir::Type ty = Fortran::lower::getFIRType(builder.getContext(), TC, KIND,
+ /*params=*/llvm::None);
+ return hlfir::EntityWithAttributes{
+ Fortran::lower::genPow(builder, loc, ty, lhs, rhs)};
+ }
+};
+
/// Lower Expr to HLFIR.
class HlfirBuilder {
public:
diff --git a/flang/test/Lower/HLFIR/binary-ops.f90 b/flang/test/Lower/HLFIR/binary-ops.f90
index 79c9ef6a3144..0c3abbc554a0 100644
--- a/flang/test/Lower/HLFIR/binary-ops.f90
+++ b/flang/test/Lower/HLFIR/binary-ops.f90
@@ -132,3 +132,64 @@ subroutine complex_div(x, y, z)
! CHECK: %[[VAL_6:.*]] = fir.load %[[VAL_4]]#0 : !fir.ref<!fir.complex<4>>
! CHECK: %[[VAL_7:.*]] = fir.load %[[VAL_5]]#0 : !fir.ref<!fir.complex<4>>
! CHECK: %[[VAL_8:.*]] = fir.divc %[[VAL_6]], %[[VAL_7]] : !fir.complex<4>
+
+
+subroutine int_power(x, y, z)
+ integer :: x, y, z
+ x = y**z
+end subroutine
+! CHECK-LABEL: func.func @_QPint_power(
+! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %{{.*}}y"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
+! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare %{{.*}}z"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
+! CHECK: %[[VAL_6:.*]] = fir.load %[[VAL_4]]#0 : !fir.ref<i32>
+! CHECK: %[[VAL_7:.*]] = fir.load %[[VAL_5]]#0 : !fir.ref<i32>
+! CHECK: %[[VAL_8:.*]] = math.ipowi %[[VAL_6]], %[[VAL_7]] : i32
+
+subroutine real_power(x, y, z)
+ real :: x, y, z
+ x = y**z
+end subroutine
+! CHECK-LABEL: func.func @_QPreal_power(
+! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %{{.*}}y"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
+! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare %{{.*}}z"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
+! CHECK: %[[VAL_6:.*]] = fir.load %[[VAL_4]]#0 : !fir.ref<f32>
+! CHECK: %[[VAL_7:.*]] = fir.load %[[VAL_5]]#0 : !fir.ref<f32>
+! CHECK: %[[VAL_8:.*]] = math.powf %[[VAL_6]], %[[VAL_7]] fastmath<contract> : f32
+
+subroutine complex_power(x, y, z)
+ complex :: x, y, z
+ x = y**z
+end subroutine
+! CHECK-LABEL: func.func @_QPcomplex_power(
+! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %{{.*}}y"} : (!fir.ref<!fir.complex<4>>) -> (!fir.ref<!fir.complex<4>>, !fir.ref<!fir.complex<4>>)
+! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare %{{.*}}z"} : (!fir.ref<!fir.complex<4>>) -> (!fir.ref<!fir.complex<4>>, !fir.ref<!fir.complex<4>>)
+! CHECK: %[[VAL_6:.*]] = fir.load %[[VAL_4]]#0 : !fir.ref<!fir.complex<4>>
+! CHECK: %[[VAL_7:.*]] = fir.load %[[VAL_5]]#0 : !fir.ref<!fir.complex<4>>
+! CHECK: %[[VAL_8:.*]] = fir.convert %[[VAL_6]] : (!fir.complex<4>) -> complex<f32>
+! CHECK: %[[VAL_9:.*]] = fir.convert %[[VAL_7]] : (!fir.complex<4>) -> complex<f32>
+! CHECK: %[[VAL_10:.*]] = complex.pow %[[VAL_8]], %[[VAL_9]] : complex<f32>
+! CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_10]] : (complex<f32>) -> !fir.complex<4>
+
+subroutine real_to_int_power(x, y, z)
+ real :: x, y
+ integer :: z
+ x = y**z
+end subroutine
+! CHECK-LABEL: func.func @_QPreal_to_int_power(
+! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %{{.*}}y"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
+! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare %{{.*}}z"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
+! CHECK: %[[VAL_6:.*]] = fir.load %[[VAL_4]]#0 : !fir.ref<f32>
+! CHECK: %[[VAL_7:.*]] = fir.load %[[VAL_5]]#0 : !fir.ref<i32>
+! CHECK: %[[VAL_8:.*]] = fir.call @llvm.powi.f32.i32(%[[VAL_6]], %[[VAL_7]]) fastmath<contract> : (f32, i32) -> f32
+
+subroutine complex_to_int_power(x, y, z)
+ complex :: x, y
+ integer :: z
+ x = y**z
+end subroutine
+! CHECK-LABEL: func.func @_QPcomplex_to_int_power(
+! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %{{.*}}y"} : (!fir.ref<!fir.complex<4>>) -> (!fir.ref<!fir.complex<4>>, !fir.ref<!fir.complex<4>>)
+! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare %{{.*}}z"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
+! CHECK: %[[VAL_6:.*]] = fir.load %[[VAL_4]]#0 : !fir.ref<!fir.complex<4>>
+! CHECK: %[[VAL_7:.*]] = fir.load %[[VAL_5]]#0 : !fir.ref<i32>
+! CHECK: %[[VAL_8:.*]] = fir.call @_FortranAcpowi(%[[VAL_6]], %[[VAL_7]]) fastmath<contract> : (!fir.complex<4>, i32) -> !fir.complex<4>
More information about the flang-commits
mailing list