Skip to content

Commit b12f68e

Browse files
committed
Update DATE_AND_TIME lowering after runtime upstreaming
1 parent 980dde3 commit b12f68e

File tree

7 files changed

+58
-120
lines changed

7 files changed

+58
-120
lines changed

flang/include/flang/Lower/Runtime.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ mlir::Value genCpuTime(fir::FirOpBuilder &, mlir::Location);
7777
void genDateAndTime(fir::FirOpBuilder &, mlir::Location,
7878
llvm::Optional<fir::CharBoxValue> date,
7979
llvm::Optional<fir::CharBoxValue> time,
80-
llvm::Optional<fir::CharBoxValue> zone);
80+
llvm::Optional<fir::CharBoxValue> zone, mlir::Value values);
8181

8282
void genRandomInit(fir::FirOpBuilder &, mlir::Location, mlir::Value repeatable,
8383
mlir::Value imageDistinct);

flang/lib/Lower/IntrinsicCall.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -672,7 +672,7 @@ static constexpr IntrinsicHandler handlers[]{
672672
{{{"date", asAddr},
673673
{"time", asAddr},
674674
{"zone", asAddr},
675-
{"values", asAddr}}},
675+
{"values", asBox}}},
676676
/*isElemental=*/false},
677677
{"dble", &I::genConversion},
678678
{"dim", &I::genDim},
@@ -2075,13 +2075,14 @@ void IntrinsicLibrary::genDateAndTime(llvm::ArrayRef<fir::ExtendedValue> args) {
20752075
for (auto i = 0; i < 3; ++i)
20762076
if (auto *charBox = args[i].getCharBox())
20772077
charArgs[i] = *charBox;
2078-
// TODO: build descriptor for VALUES (also update runtime)
2079-
if (fir::getBase(args[3]))
2080-
mlir::emitError(loc, "TODO: lowering of DATE_AND_TIME VALUES argument not "
2081-
"yet implemented\n");
2078+
2079+
auto values = fir::getBase(args[3]);
2080+
if (!values)
2081+
values = builder.create<fir::AbsentOp>(
2082+
loc, fir::BoxType::get(builder.getNoneType()));
20822083

20832084
Fortran::lower::genDateAndTime(builder, loc, charArgs[0], charArgs[1],
2084-
charArgs[2]);
2085+
charArgs[2], values);
20852086
}
20862087

20872088
// DIM

flang/lib/Lower/Runtime.cpp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
#include "flang/Lower/Runtime.h"
1010
#include "../../runtime/misc-intrinsic.h"
11-
#include "../runtime/clock.h"
1211
#include "../runtime/pointer.h"
1312
#include "../runtime/random.h"
1413
#include "../runtime/stop.h"
@@ -211,9 +210,11 @@ void Fortran::lower::genDateAndTime(fir::FirOpBuilder &builder,
211210
mlir::Location loc,
212211
llvm::Optional<fir::CharBoxValue> date,
213212
llvm::Optional<fir::CharBoxValue> time,
214-
llvm::Optional<fir::CharBoxValue> zone) {
213+
llvm::Optional<fir::CharBoxValue> zone,
214+
mlir::Value values) {
215215
auto callee =
216216
fir::runtime::getRuntimeFunc<mkRTKey(DateAndTime)>(loc, builder);
217+
auto funcTy = callee.getType();
217218
mlir::Type idxTy = builder.getIndexType();
218219
mlir::Value zero;
219220
auto splitArg = [&](llvm::Optional<fir::CharBoxValue> arg,
@@ -238,12 +239,14 @@ void Fortran::lower::genDateAndTime(fir::FirOpBuilder &builder,
238239
mlir::Value zoneLen;
239240
splitArg(zone, zoneBuffer, zoneLen);
240241

241-
llvm::SmallVector<mlir::Value> args{dateBuffer, timeBuffer, zoneBuffer,
242-
dateLen, timeLen, zoneLen};
243-
llvm::SmallVector<mlir::Value> operands;
244-
for (auto [fst, snd] : llvm::zip(args, callee.getType().getInputs()))
245-
operands.emplace_back(builder.createConvert(loc, snd, fst));
246-
builder.create<fir::CallOp>(loc, callee, operands);
242+
auto sourceFile = fir::factory::locationToFilename(builder, loc);
243+
auto sourceLine =
244+
fir::factory::locationToLineNo(builder, loc, funcTy.getInput(7));
245+
246+
auto args = fir::runtime::createArguments(
247+
builder, loc, funcTy, dateBuffer, dateLen, timeBuffer, timeLen,
248+
zoneBuffer, zoneLen, sourceFile, sourceLine, values);
249+
builder.create<fir::CallOp>(loc, callee, args);
247250
}
248251

249252
void Fortran::lower::genRandomInit(fir::FirOpBuilder &builder,

flang/runtime/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ add_flang_library(FortranRuntime PARTIAL_SOURCES_INTENDED
2929
allocatable.cpp
3030
assign.cpp
3131
buffer.cpp
32-
clock.cpp
3332
complex-reduction.c
3433
copy.cpp
3534
character.cpp

flang/runtime/clock.cpp

Lines changed: 0 additions & 71 deletions
This file was deleted.

flang/runtime/clock.h

Lines changed: 0 additions & 33 deletions
This file was deleted.
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
! RUN: bbc -emit-fir %s -o - | FileCheck %s
2+
3+
! CHECK-LABEL: func @_QPdate_and_time_test(
4+
! CHECK-SAME: %[[date:[^:]+]]: !fir.boxchar<1>,
5+
! CHECK-SAME: %[[time:[^:]+]]: !fir.boxchar<1>,
6+
! CHECK-SAME: %[[zone:.*]]: !fir.boxchar<1>,
7+
! CHECK-SAME: %[[values:.*]]: !fir.box<!fir.array<?xi64>>) {
8+
subroutine date_and_time_test(date, time, zone, values)
9+
character(*) :: date, time, zone
10+
integer(8) :: values(:)
11+
! CHECK: %[[dateUnbox:.*]]:2 = fir.unboxchar %[[date]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)
12+
! CHECK: %[[timeUnbox:.*]]:2 = fir.unboxchar %[[time]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)
13+
! CHECK: %[[zoneUnbox:.*]]:2 = fir.unboxchar %[[zone]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)
14+
! CHECK: %[[dateBuffer:.*]] = fir.convert %[[dateUnbox]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8>
15+
! CHECK: %[[dateLen:.*]] = fir.convert %[[dateUnbox]]#1 : (index) -> i64
16+
! CHECK: %[[timeBuffer:.*]] = fir.convert %[[timeUnbox]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8>
17+
! CHECK: %[[timeLen:.*]] = fir.convert %[[timeUnbox]]#1 : (index) -> i64
18+
! CHECK: %[[zoneBuffer:.*]] = fir.convert %[[zoneUnbox]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8>
19+
! CHECK: %[[zoneLen:.*]] = fir.convert %[[zoneUnbox]]#1 : (index) -> i64
20+
! CHECK: %[[valuesCast:.*]] = fir.convert %[[values]] : (!fir.box<!fir.array<?xi64>>) -> !fir.box<none>
21+
! CHECK: fir.call @_FortranADateAndTime(%[[dateBuffer]], %[[dateLen]], %[[timeBuffer]], %[[timeLen]], %[[zoneBuffer]], %[[zoneLen]], %{{.*}}, %{{.*}}, %[[valuesCast]]) : (!fir.ref<i8>, i64, !fir.ref<i8>, i64, !fir.ref<i8>, i64, !fir.ref<i8>, i32, !fir.box<none>) -> none
22+
call date_and_time(date, time, zone, values)
23+
end subroutine
24+
25+
! CHECK-LABEL: func @_QPdate_and_time_test2(
26+
! CHECK-SAME: %[[date:.*]]: !fir.boxchar<1>)
27+
subroutine date_and_time_test2(date)
28+
character(*) :: date
29+
! CHECK: %[[dateUnbox:.*]]:2 = fir.unboxchar %[[date]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)
30+
! CHECK: %[[values:.*]] = fir.absent !fir.box<none>
31+
! CHECK: %[[dateBuffer:.*]] = fir.convert %[[dateUnbox]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8>
32+
! CHECK: %[[dateLen:.*]] = fir.convert %[[dateUnbox]]#1 : (index) -> i64
33+
! CHECK: %[[timeBuffer:.*]] = fir.convert %c0{{.*}} : (index) -> !fir.ref<i8>
34+
! CHECK: %[[timeLen:.*]] = fir.convert %c0{{.*}} : (index) -> i64
35+
! CHECK: %[[zoneBuffer:.*]] = fir.convert %c0{{.*}} : (index) -> !fir.ref<i8>
36+
! CHECK: %[[zoneLen:.*]] = fir.convert %c0{{.*}} : (index) -> i64
37+
! CHECK: fir.call @_FortranADateAndTime(%[[dateBuffer]], %[[dateLen]], %[[timeBuffer]], %[[timeLen]], %[[zoneBuffer]], %[[zoneLen]], %{{.*}}, %{{.*}}, %[[values]]) : (!fir.ref<i8>, i64, !fir.ref<i8>, i64, !fir.ref<i8>, i64, !fir.ref<i8>, i32, !fir.box<none>) -> none
38+
call date_and_time(date)
39+
end subroutine

0 commit comments

Comments
 (0)