[flang-commits] [flang] [FLANG][Lower] WIP Support for BOZ assigning into a variable (PR #96651)

Mats Petersson via flang-commits flang-commits at lists.llvm.org
Tue Jun 25 08:11:33 PDT 2024


https://github.com/Leporacanthicus created https://github.com/llvm/llvm-project/pull/96651

Allow constructs such as

  INTEGER :: x
  x = z'2A'

to be lowered.

>From 61d330f16431906f1b39ab022922c6e2e89d6650 Mon Sep 17 00:00:00 2001
From: Mats Petersson <mats.petersson at arm.com>
Date: Tue, 25 Jun 2024 10:11:44 +0100
Subject: [PATCH] [FLANG][Lower] WIP Support for BOZ assigning into a variable

Allow constructs such as

  INTEGER :: x
  x = z'2A'

to be lowered.
---
 flang/lib/Lower/ConvertExprToHLFIR.cpp | 13 ++++++
 flang/test/Lower/boz-assign.f90        | 61 ++++++++++++++++++++++++++
 2 files changed, 74 insertions(+)
 create mode 100644 flang/test/Lower/boz-assign.f90

diff --git a/flang/lib/Lower/ConvertExprToHLFIR.cpp b/flang/lib/Lower/ConvertExprToHLFIR.cpp
index 1933f38f735b5..4740bcb54cada 100644
--- a/flang/lib/Lower/ConvertExprToHLFIR.cpp
+++ b/flang/lib/Lower/ConvertExprToHLFIR.cpp
@@ -1433,6 +1433,19 @@ class HlfirBuilder {
 private:
   hlfir::EntityWithAttributes
   gen(const Fortran::evaluate::BOZLiteralConstant &expr) {
+    mlir::Location loc = getLoc();
+    using Type =
+        Fortran::evaluate::Type<Fortran::evaluate::TypeCategory::Integer, 16>;
+    auto constant = Fortran::evaluate::Constant<Type>{
+        Fortran::evaluate::Scalar<Type>::ConvertUnsigned(std::move(expr))
+            .value};
+
+    fir::ExtendedValue exv = Fortran::lower::convertConstant(
+        converter, loc, constant, /*outlineBigConstantInReadOnlyMemory=*/true);
+    if (const auto *scalarBox = exv.getUnboxed())
+      if (fir::isa_trivial(scalarBox->getType()))
+        return hlfir::EntityWithAttributes(*scalarBox);
+
     TODO(getLoc(), "BOZ");
   }
 
diff --git a/flang/test/Lower/boz-assign.f90 b/flang/test/Lower/boz-assign.f90
new file mode 100644
index 0000000000000..8602171160375
--- /dev/null
+++ b/flang/test/Lower/boz-assign.f90
@@ -0,0 +1,61 @@
+! RUN: bbc -emit-fir -o - %s | FileCheck %s
+
+subroutine boz1
+!CHECK-LABEL: func.func @_QPboz1
+!CHECK: %[[CONST3:.*]] = arith.constant 243 : i128
+!CHECK: %[[IDX2:.*]] = arith.constant 2 : index  
+!CHECK: %[[CONST2:.*]] = arith.constant 42 : i128
+!CHECK: %[[IDX1:.*]] = arith.constant 1 : index  
+!CHECK: %[[CONST1:.*]] = arith.constant 128 : i128
+!CHECK: %[[IDX3:.*]] = arith.constant 3 : index  
+  INTEGER :: a(3)
+!CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.array<3xi32>
+!CHECK: %[[ARRAY:.*]] = fir.declare %[[ALLOCA]]({{.*}}) {{.*}} : (!fir.ref<!fir.array<3xi32>>, {{.*}}) -> !fir.ref<!fir.array<3xi32>>
+  a(1)=B'10000000'
+!CHECK: %[[CVT1:.*]] = fir.convert %[[CONST1]] : (i128) -> i32
+!CHECK: %[[ARR_IDX1:.*]] = fir.array_coor %[[ARRAY]]({{.*}}) %[[IDX1]]
+!CHECK: fir.store %[[CVT1]] to %[[ARR_IDX1]] : !fir.ref<i32>
+  a(2)=O'52'
+!CHECK: %[[CVT2:.*]] = fir.convert %[[CONST2]] : (i128) -> i32
+!CHECK: %[[ARR_IDX2:.*]] = fir.array_coor %[[ARRAY]]({{.*}}) %[[IDX2]]
+!CHECK: fir.store %[[CVT2]] to %[[ARR_IDX2]] : !fir.ref<i32>
+  a(3)=Z'F3'
+!CHECK: %[[CVT3:.*]] = fir.convert %[[CONST3]] : (i128) -> i32
+!CHECK: %[[ARR_IDX3:.*]] = fir.array_coor %[[ARRAY]]({{.*}}) %[[IDX3]]
+!CHECK: fir.store %[[CVT3]] to %[[ARR_IDX3]] : !fir.ref<i32>
+end subroutine boz1
+
+subroutine boz2
+!CHECK-LABEL: func.func @_QPboz2
+!CHECK: %[[CONST3:.*]] = arith.constant 8070450532247928832 : i128
+!CHECK: %[[IDX2:.*]] = arith.constant 2 : index  
+!CHECK: %[[CONST2:.*]] = arith.constant 68719476736  : i128
+!CHECK: %[[IDX1:.*]] = arith.constant 1 : index  
+!CHECK: %[[CONST1:.*]] = arith.constant 9223372036854775808 : i128
+!CHECK: %[[IDX3:.*]] = arith.constant 3 : index  
+  INTEGER(8) :: b(3)
+!CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.array<3xi64>
+!CHECK: %[[ARRAY:.*]] = fir.declare %[[ALLOCA]]({{.*}}) {{.*}} : (!fir.ref<!fir.array<3xi64>>, {{.*}}) -> !fir.ref<!fir.array<3xi64>>
+  b(1)=B'1000000000000000000000000000000000000000000000000000000000000000'
+!CHECK: %[[CVT1:.*]] = fir.convert %[[CONST1]] : (i128) -> i64
+!CHECK: %[[ARR_IDX1:.*]] = fir.array_coor %[[ARRAY]]({{.*}}) %[[IDX1]]
+!CHECK: fir.store %[[CVT1]] to %[[ARR_IDX1]] : !fir.ref<i64>
+  b(2)=O'01000000000000'
+!CHECK: %[[CVT2:.*]] = fir.convert %[[CONST2]] : (i128) -> i64
+!CHECK: %[[ARR_IDX2:.*]] = fir.array_coor %[[ARRAY]]({{.*}}) %[[IDX2]]
+!CHECK: fir.store %[[CVT2]] to %[[ARR_IDX2]] : !fir.ref<i64>
+  b(3)=Z'7000000000000000'
+!CHECK: %[[CVT3:.*]] = fir.convert %[[CONST3]] : (i128) -> i64
+!CHECK: %[[ARR_IDX3:.*]] = fir.array_coor %[[ARRAY]]({{.*}}) %[[IDX3]]
+!CHECK: fir.store %[[CVT3]] to %[[ARR_IDX3]] : !fir.ref<i64>
+end subroutine boz2
+
+subroutine boz3
+!CHECK-LABEL: func.func @_QPboz3
+  INTEGER(16) :: c
+!CHECK: %[[CONST:.*]] = arith.constant 158798437896437949616241483468158498679 : i128
+!CHECK: %[[ALLOCA:.*]] = fir.alloca i128
+!CHECK: %[[VAR:.*]] = fir.declare %[[ALLOCA]] {{.*}} : (!fir.ref<i128>) -> !fir.ref<i128>
+  c = Z'77777777777777777777777777777777'
+!CHECK: fir.store %[[CONST]] to %[[VAR]] : !fir.ref<i128>
+end



More information about the flang-commits mailing list