Skip to content

Commit 6b9b85b

Browse files
committed
[flang] Use APInt to lower 128 bits integer constants
Lowering was truncating 128 bits integer to 64 bits. This patch makes use of APInt to lower 128 bits integer correctly. ``` program bug print *, 170141183460469231731687303715884105727_16 end ! Before patch: 18446744073709551615 ! With patch: 170141183460469231731687303715884105727 ``` Reviewed By: vdonaldson Differential Revision: https://reviews.llvm.org/D133206
1 parent c55bf52 commit 6b9b85b

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

flang/lib/Lower/ConvertExpr.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1451,6 +1451,14 @@ class ScalarExprLowering {
14511451
const Fortran::evaluate::Scalar<Fortran::evaluate::Type<TC, KIND>>
14521452
&value) {
14531453
if constexpr (TC == Fortran::common::TypeCategory::Integer) {
1454+
if (KIND == 16) {
1455+
mlir::Type ty =
1456+
converter.genType(Fortran::common::TypeCategory::Integer, KIND);
1457+
auto bigInt =
1458+
llvm::APInt(ty.getIntOrFloatBitWidth(), value.SignedDecimal(), 10);
1459+
return builder.create<mlir::arith::ConstantOp>(
1460+
getLoc(), ty, mlir::IntegerAttr::get(ty, bigInt));
1461+
}
14541462
return genIntegerConstant<KIND>(builder.getContext(), value.ToInt64());
14551463
} else if constexpr (TC == Fortran::common::TypeCategory::Logical) {
14561464
return genBoolConstant(value.IsTrue());
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
! Test correct lowering of 128 bit integer parameters.
2+
! RUN: bbc -emit-fir %s -o - | FileCheck %s
3+
4+
program i128
5+
integer(16), parameter :: maxi64 = 9223372036854775807_16
6+
integer(16), parameter :: mini64 = -9223372036854775808_16
7+
integer(16), parameter :: maxi128 = 170141183460469231731687303715884105727_16
8+
integer(16), parameter :: mini128 = -170141183460469231731687303715884105728_16
9+
integer(16), parameter :: x = 9223372036854775808_16
10+
integer(16), parameter :: y = -9223372036854775809_16
11+
integer(16), parameter :: z = 0_16
12+
print*,x
13+
print*,y
14+
end
15+
16+
! CHECK-LABEL: func.func @_QQmain() {
17+
! CHECK-COUNT-2: %{{.*}} = fir.call @_FortranAioOutputInteger128(%{{.*}}, %{{.*}}) : (!fir.ref<i8>, i128) -> i1
18+
19+
20+
! CHECK-LABEL: fir.global internal @_QFECmaxi128 constant : i128 {
21+
! CHECK-NEXT: %{{.*}} = arith.constant 170141183460469231731687303715884105727 : i128
22+
23+
! CHECK-LABEL: fir.global internal @_QFECmaxi64 constant : i128 {
24+
! CHECK-NEXT: %{{.*}} = arith.constant 9223372036854775807 : i128
25+
26+
! CHECK-LABEL: fir.global internal @_QFECmini128 constant : i128 {
27+
! CHECK-NEXT: %{{.*}} = arith.constant -170141183460469231731687303715884105728 : i128
28+
29+
! CHECK-LABEL: fir.global internal @_QFECmini64 constant : i128 {
30+
! CHECK-NEXT: %{{.*}} = arith.constant -9223372036854775808 : i128
31+
32+
! CHECK-LABEL: fir.global internal @_QFECx constant : i128 {
33+
! CHECK-NEXT: %{{.*}} = arith.constant 9223372036854775808 : i128
34+
35+
! CHECK-LABEL: fir.global internal @_QFECy constant : i128 {
36+
! CHECK-NEXT: %{{.*}} = arith.constant -9223372036854775809 : i128
37+
38+
! CHECK-LABEL: fir.global internal @_QFECz constant : i128 {
39+
! CHECK-NEXT: %{{.*}} = arith.constant 0 : i128

0 commit comments

Comments
 (0)