[flang-commits] [flang] [flang][cuda] Avoid temporary when RHS is a logical constant (PR #99078)
Valentin Clement バレンタイン クレメン via flang-commits
flang-commits at lists.llvm.org
Tue Jul 16 11:44:34 PDT 2024
https://github.com/clementval created https://github.com/llvm/llvm-project/pull/99078
Enhance the detection of constant on the RHS for logical cases.
>From 9f93ced3bdc85a834d2293585457a6a9e9db9a60 Mon Sep 17 00:00:00 2001
From: Valentin Clement <clementval at gmail.com>
Date: Tue, 16 Jul 2024 11:42:45 -0700
Subject: [PATCH] [flang][cuda] Avoid temporary when RHS is a logical constant
---
flang/lib/Lower/Bridge.cpp | 8 ++++++--
flang/test/Lower/CUDA/cuda-data-transfer.cuf | 9 +++++++++
2 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp
index 77e038dac13ff..a4043744c6386 100644
--- a/flang/lib/Lower/Bridge.cpp
+++ b/flang/lib/Lower/Bridge.cpp
@@ -4230,9 +4230,13 @@ class FirConverter : public Fortran::lower::AbstractConverter {
auto transferKindAttr = cuf::DataTransferKindAttr::get(
builder.getContext(), cuf::DataTransferKind::HostDevice);
if (!rhs.isVariable()) {
+ mlir::Value base = rhs;
+ if (auto convertOp =
+ mlir::dyn_cast<fir::ConvertOp>(rhs.getDefiningOp()))
+ base = convertOp.getValue();
// Special case if the rhs is a constant.
- if (matchPattern(rhs.getDefiningOp(), mlir::m_Constant())) {
- builder.create<cuf::DataTransferOp>(loc, rhs, lhsVal,
+ if (matchPattern(base.getDefiningOp(), mlir::m_Constant())) {
+ builder.create<cuf::DataTransferOp>(loc, base, lhsVal,
transferKindAttr);
} else {
auto associate = hlfir::genAssociateExpr(
diff --git a/flang/test/Lower/CUDA/cuda-data-transfer.cuf b/flang/test/Lower/CUDA/cuda-data-transfer.cuf
index 1383b73ea44d6..d657f819dfbf1 100644
--- a/flang/test/Lower/CUDA/cuda-data-transfer.cuf
+++ b/flang/test/Lower/CUDA/cuda-data-transfer.cuf
@@ -265,3 +265,12 @@ end subroutine
! CHECK: %[[TEMP:.*]] = fir.allocmem !fir.array<?xi32>, %14#1 {bindc_name = ".tmp", uniq_name = ""}
! CHECK: cuf.data_transfer
! CHECK: fir.freemem %[[TEMP]] : !fir.heap<!fir.array<?xi32>>
+
+subroutine sub14()
+ logical(4), device :: log(10)
+ log = .true.
+end subroutine
+
+! CHECK-LABEL: func.func @_QPsub14()
+! CHECK: %[[TRUE:.*]] = arith.constant true
+! CHECK: cuf.data_transfer %[[TRUE]] to %{{.*}}#0 {transfer_kind = #cuf.cuda_transfer<host_device>} : i1, !fir.ref<!fir.array<10x!fir.logical<4>>>
More information about the flang-commits
mailing list