Skip to content

Commit 8ebc98c

Browse files
authored
[flang] Update IEEE_SUPPORT_FLAG implementation (#134937)
Optional argument X in an IEEE_SUPPORT_FLAG(FLAG, X) call may be an array.
1 parent 9a762bb commit 8ebc98c

File tree

2 files changed

+68
-2
lines changed

2 files changed

+68
-2
lines changed

flang/lib/Optimizer/Builder/IntrinsicCall.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5968,8 +5968,10 @@ IntrinsicLibrary::genIeeeSupportFlag(mlir::Type resultType,
59685968
bool mayBeSupported = false;
59695969
if (mlir::Value arg1 = getBase(args[1])) {
59705970
mlir::Type arg1Ty = arg1.getType();
5971-
if (fir::ReferenceType refTy = mlir::dyn_cast<fir::ReferenceType>(arg1Ty))
5972-
arg1Ty = refTy.getEleTy();
5971+
if (auto eleTy = fir::dyn_cast_ptrOrBoxEleTy(arg1.getType()))
5972+
arg1Ty = eleTy;
5973+
if (auto seqTy = mlir::dyn_cast<fir::SequenceType>(arg1Ty))
5974+
arg1Ty = seqTy.getEleTy();
59735975
switch (mlir::dyn_cast<mlir::FloatType>(arg1Ty).getWidth()) {
59745976
case 16:
59755977
mayBeSupported = arg1Ty.isBF16(); // kind=3

flang/test/Lower/Intrinsics/ieee_flag.f90

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,5 +505,69 @@
505505
! CHECK: %[[V_302:[0-9]+]] = fir.call @_FortranAioBeginExternalListOutput
506506
print*, 'all[T]: ', v_all
507507

508+
call s1(ieee_overflow, x)
509+
508510
stop
509511
end
512+
513+
! CHECK-LABEL: c.func @_QPs1
514+
515+
subroutine s1(flag, x)
516+
use ieee_arithmetic, only: ieee_flag_type, ieee_support_flag
517+
! CHECK: %[[V_1:[0-9]+]] = fir.declare %arg0 dummy_scope %{{.*}} {uniq_name = "_QFs1Eflag"}
518+
type(ieee_flag_type) :: flag
519+
real, intent(in) :: x(100,20,10)
520+
real :: y
521+
print*
522+
523+
! CHECK: %[[V_16:[0-9]+]] = fir.coordinate_of %[[V_1]], _QM__fortran_builtinsT__builtin_ieee_flag_type.flag
524+
! CHECK: %[[V_17:[0-9]+]] = fir.load %[[V_16]] : !fir.ref<i8>
525+
! CHECK: %[[V_18:[0-9]+]] = arith.andi %[[V_17]], %c61{{.*}} : i8
526+
! CHECK: %[[V_19:[0-9]+]] = arith.cmpi ne, %[[V_18]], %c0{{.*}} : i8
527+
! CHECK: %[[V_20:[0-9]+]] = fir.if %[[V_19]] -> (i1) {
528+
! CHECK: fir.result %true{{[_0-9]*}} : i1
529+
! CHECK: } else {
530+
! CHECK: fir.result %false{{[_0-9]*}} : i1
531+
! CHECK: }
532+
! CHECK: %[[V_21:[0-9]+]] = fir.call @_FortranAioOutputLogical(%{{[0-9]+}}, %[[V_20]]) fastmath<contract> : (!fir.ref<i8>, i1) -> i1
533+
! CHECK: %[[V_22:[0-9]+]] = fir.load %[[V_16]] : !fir.ref<i8>
534+
! CHECK: %[[V_23:[0-9]+]] = arith.andi %[[V_22]], %c61{{.*}} : i8
535+
! CHECK: %[[V_24:[0-9]+]] = arith.cmpi ne, %[[V_23]], %c0{{.*}} : i8
536+
! CHECK: %[[V_25:[0-9]+]] = fir.if %[[V_24]] -> (i1) {
537+
! CHECK: fir.result %true{{[_0-9]*}} : i1
538+
! CHECK: } else {
539+
! CHECK: %[[V_38:[0-9]+]] = arith.cmpi eq, %[[V_22]], %c2{{.*}} : i8
540+
! CHECK: %[[V_39:[0-9]+]] = fir.convert %[[V_22]] : (i8) -> i32
541+
! CHECK: %[[V_40:[0-9]+]] = fir.call @_FortranASupportHalting(%[[V_39]]) fastmath<contract> : (i32) -> i1
542+
! CHECK: %[[V_41:[0-9]+]] = arith.andi %[[V_38]], %[[V_40]] : i1
543+
! CHECK: fir.result %[[V_41]] : i1
544+
! CHECK: }
545+
! CHECK: %[[V_26:[0-9]+]] = fir.call @_FortranAioOutputLogical(%{{[0-9]+}}, %[[V_25]]) fastmath<contract> : (!fir.ref<i8>, i1) -> i1
546+
! CHECK: %[[V_27:[0-9]+]] = fir.load %[[V_16]] : !fir.ref<i8>
547+
! CHECK: %[[V_28:[0-9]+]] = arith.andi %[[V_27]], %c61{{.*}} : i8
548+
! CHECK: %[[V_29:[0-9]+]] = arith.cmpi ne, %[[V_28]], %c0{{.*}} : i8
549+
! CHECK: %[[V_30:[0-9]+]] = fir.if %[[V_29]] -> (i1) {
550+
! CHECK: fir.result %true{{[_0-9]*}} : i1
551+
! CHECK: } else {
552+
! CHECK: %[[V_38:[0-9]+]] = arith.cmpi eq, %[[V_27]], %c2{{.*}} : i8
553+
! CHECK: %[[V_39:[0-9]+]] = fir.convert %[[V_27]] : (i8) -> i32
554+
! CHECK: %[[V_40:[0-9]+]] = fir.call @_FortranASupportHalting(%[[V_39]]) fastmath<contract> : (i32) -> i1
555+
! CHECK: %[[V_41:[0-9]+]] = arith.andi %[[V_38]], %[[V_40]] : i1
556+
! CHECK: fir.result %[[V_41]] : i1
557+
! CHECK: }
558+
! CHECK: %[[V_31:[0-9]+]] = fir.call @_FortranAioOutputLogical(%{{[0-9]+}}, %[[V_30]]) fastmath<contract> : (!fir.ref<i8>, i1) -> i1
559+
! CHECK: %[[V_32:[0-9]+]] = fir.load %[[V_16]] : !fir.ref<i8>
560+
! CHECK: %[[V_33:[0-9]+]] = arith.andi %[[V_32]], %c61{{.*}} : i8
561+
! CHECK: %[[V_34:[0-9]+]] = arith.cmpi ne, %[[V_33]], %c0{{.*}} : i8
562+
! CHECK: %[[V_35:[0-9]+]] = fir.if %[[V_34]] -> (i1) {
563+
! CHECK: fir.result %true{{[_0-9]*}} : i1
564+
! CHECK: } else {
565+
! CHECK: %[[V_38:[0-9]+]] = arith.cmpi eq, %[[V_32]], %c2{{.*}} : i8
566+
! CHECK: %[[V_39:[0-9]+]] = fir.convert %[[V_32]] : (i8) -> i32
567+
! CHECK: %[[V_40:[0-9]+]] = fir.call @_FortranASupportHalting(%[[V_39]]) fastmath<contract> : (i32) -> i1
568+
! CHECK: %[[V_41:[0-9]+]] = arith.andi %[[V_38]], %[[V_40]] : i1
569+
! CHECK: fir.result %[[V_41]] : i1
570+
! CHECK: }
571+
! CHECK: %[[V_36:[0-9]+]] = fir.call @_FortranAioOutputLogical(%{{[0-9]+}}, %[[V_35]]) fastmath<contract> : (!fir.ref<i8>, i1) -> i1
572+
print*, '[T T T T]:', ieee_support_flag(flag), ieee_support_flag(flag, x), ieee_support_flag(flag, x(3:7,13,4:9)), ieee_support_flag(flag, y)
573+
end

0 commit comments

Comments
 (0)