23 Commits

Author SHA1 Message Date
Valentin Clement
4143d3ebd2
[flang] Unlimited polymoprhic allocated as character
Allocation of unlimited polymorphic allocatable with
character intrinsic type is now done through
`PointerNullifyCharacter` or `AllocatableInitCharacter` so the length
is correctly set.

Reviewed By: jeanPerier

Differential Revision: https://reviews.llvm.org/D143580
2023-02-08 16:31:48 +01:00
Valentin Clement
696ad1394e
[flang] Use rank from the allocate object when allocate with mold
The rank from the allocate object might be different from the rank
from the mold expression. Use the rank from the allocate object
when applying to mold so the bounds can be set correctly.

Reviewed By: jeanPerier

Differential Revision: https://reviews.llvm.org/D143078
2023-02-02 10:23:53 +01:00
Valentin Clement
16bd0fe56c
[flang] Use fir.type_desc and delay type desc address resolution
Makes use of fir.type_desc in order to delay the type desc address
resolution. The lowering inserts fir.type_desc operation instead of fir.addr_of
operation pointing to the fir.global type descriptor. The fir.type_desc
operation is then lowered in code gen to an address of operation in the LLVM
dialect. At this stage, the type descriptor is generated in all cases.

Reviewed By: vdonaldson

Differential Revision: https://reviews.llvm.org/D142920
2023-01-31 20:11:35 +01:00
Valentin Clement
94d89aaaa2
[flang] Allocate polymorphic with SOURCE= using ApplyMold
Source allocation is similar to mold allocation + assignment. Use
ApplyMold runtime entry point for polymorphic source allocation.
It could be generalized for other source allocation.

Reviewed By: jeanPerier, PeteSteinfeld

Differential Revision: https://reviews.llvm.org/D141996
2023-01-18 18:52:04 +01:00
Valentin Clement
5cc3879e11
[flang] Support allocate with source for polymorphic entities
Apply the source type spec to the descriptor for
polyrmophic entities.

Reviewed By: PeteSteinfeld

Differential Revision: https://reviews.llvm.org/D141822
2023-01-17 16:12:46 +01:00
Valentin Clement
2cd2b6a7b5
[flang] Lower allocation with MOLD
Lower allocate statement with MOLD= to calls to the Fortran
runtime. PointerApplyMold and AllocatableApplyMold are called
depending on the object to be allocated.

Reviewed By: jeanPerier, PeteSteinfeld

Differential Revision: https://reviews.llvm.org/D141843
2023-01-17 15:51:33 +01:00
Valentin Clement
0b19ac8300
[flang] Update createTempMutableBox to support polymorphic entities
When creating temporary from a polymorphic entity, its dynamic type
information must be carried over to the temporary.
This patch updates createTempMutableBox to support passing a source_box
from which the information will be carried over.
This is tested on the spread intrinsic and follow-up patches will updates
other temporary creation where needed.

Reviewed By: jeanPerier, PeteSteinfeld

Differential Revision: https://reviews.llvm.org/D141667
2023-01-16 09:36:59 +01:00
Valentin Clement
9f1bb307da
[flang] Carry the whole polymorphic box in PolymorphicValue
Until now, only the address of the type descriptor was hold in
a PolymorphicValue. In some cases, the element size and the
type code are also needed when creating new polymorphic
descriptors from an element of a polymorphic entity.

This patch updates PolymorphicValue to carry the source
descriptor from which the element is extracted. The source
descriptor is then used when emboxing the element to a new
polymorphic descriptor.

This simplify the code done in D141274 and will be used
when creating polymorphic temporary as well.

Reviewed By: jeanPerier, PeteSteinfeld

Differential Revision: https://reviews.llvm.org/D141609
2023-01-12 18:00:16 +01:00
Valentin Clement
01e8e50ce3
[flang] Restore declared type when deallocating polymorphic entities
As mentioned in section 7.3.2.3 note 7, The dynamic type of an unallocated
allocatable object or a disassociated pointer is the same as its declared type.

This patch adds two function to the runtime:
- `PointerDeallocatePolymorphic`
- `AllocatableDeallocatePolymorphic`

These two functions take a DerivedTypeDesc pointer of the declared type.
The lowering is updated accordingly to call these functions for polymorphic
and unlimited polyrmophic entities. For unlimited polymorphic entities, the
dynamic type is set to nullptr when the entity is on an unallocated or
disassociated state.

Reviewed By: PeteSteinfeld, klausler

Differential Revision: https://reviews.llvm.org/D141519
2023-01-12 11:12:30 +01:00
Valentin Clement
b2b680a5ab
[flang] Unlimited polymoprhic allocation with intrinsic type spec
An unlimited polymoprhic entity can be allocated with a derived type
spec or an intrinsic type spec. This patch add the generation of the
runtime function call when the allocation is done with an intrinsic
type spec.

Reviewed By: jeanPerier

Differential Revision: https://reviews.llvm.org/D140207
2022-12-16 21:20:28 +01:00
Valentin Clement
a6924c6d74
[flang] Use input type when emboxing/reboxing polymorphic entities
When emboxing an entity to a polymorphic box, use the input type to
compute the type code and element size as the box type is too generic.
When reboxing a polymorphic box, get this information from the input
box.

Reviewed By: jeanPerier

Differential Revision: https://reviews.llvm.org/D139916
2022-12-13 09:44:25 +01:00
Tom Eccles
4cc9437a7e [flang] Set default to -ffpcontract=fast
Following RFC at
https://discourse.llvm.org/t/rfc-ffp-contract-default-value/66301

This adds the `fastmath<contract>` attribute to `fir.call` and some
floating point arithmetic operations (hence the many test changes).
Instead of testing for this specific attribute, I am using a regular
expression to match any attributes.
2022-11-17 15:49:51 +00:00
Valentin Clement
2f323e0497
[flang] Fix for polymoprhic pointer component
Fix path that generates MutableBox for
pointer component.

Reviewed By: PeteSteinfeld

Differential Revision: https://reviews.llvm.org/D137270
2022-11-02 20:46:30 +01:00
Valentin Clement
880b37f175
[flang] Handle pointer assignment with polymorphic entities
This patch forces pointer and allocatable polymorphic entities to be
tracked as descriptor. It also enables the pointer assignment between
polymorphic entities. Pointer association between a non-polymorphic
pointer and a polyrmophic target might require some more work as
per 10.2.2.3 point 1.

Reviewed By: PeteSteinfeld

Differential Revision: https://reviews.llvm.org/D137150
2022-11-01 21:46:32 +01:00
Valentin Clement
2406ba1563
[flang] Fix code generation for polymorphic deallocation
This patch fix issues found during call to deallocate.
fir.class can be handled the same way as fir.box in fir.store operation
code generation. In MutableBox::createNewFirBox, the fir.class is
also already a boxed entity.

Reviewed By: PeteSteinfeld

Differential Revision: https://reviews.llvm.org/D137079
2022-10-31 16:34:06 +01:00
Valentin Clement
079b18a7cd
[flang][NFC] Deallocation of polymorphoc entities are done with the runtime call
The runtime function `AllocatableDeallocate/PointerDeallocate` is reponsible to
deallocate and finalize it. This patch just adds tests to make sure the correct
runtime function is called.

Reviewed By: PeteSteinfeld

Differential Revision: https://reviews.llvm.org/D137068
2022-10-31 14:52:28 +01:00
Valentin Clement
21b825738b
[flang] Carry polymoprhic dynamic type when using coordinate_of polymoprhic array
Dynamic type of a polymorphic array element was retrieved by finding the
coordinate operation and use the base array. This patch remove this hack and use
the newly PolymorphicValue to carray the dynamic type together with the element.
The patch also rearrange some tests in the `allocatable-polymorphic.f90`.

Depends on D136824

Reviewed By: PeteSteinfeld

Differential Revision: https://reviews.llvm.org/D136857
2022-10-28 08:31:35 +02:00
Valentin Clement
ea1e767a06
[flang] Carry dynamic type when emboxing polymorphic pointer
In order to be passed as passed-object in the dynamic dispatch, the
polymorphic pointer entity are emboxed. In this process, the dynamic
type must be preserve and pass to fir.embox as the tdesc operand. This
patch introduce a new ExtendedValue that allow to carry over the
dynamic type when the value is unboxed.

Depends on D136820

Reviewed By: PeteSteinfeld

Differential Revision: https://reviews.llvm.org/D136824
2022-10-27 20:57:09 +02:00
Valentin Clement
06fcd149d1
[flang] Lower allocate for polymorphic pointer
Lowering of allocate statement for polymoprhic pointers is a bit
different than for allocatables. A call to `PointerNullifyDerived`
runtime function is done instead of `AllocatableInitDerived`.

Reviewed By: PeteSteinfeld

Differential Revision: https://reviews.llvm.org/D136820
2022-10-27 20:56:06 +02:00
Valentin Clement
2e97898656
[flang] Use tdesc on fir.embox in code generation
For polymoprhic entities, the type descriptor is dynamic. The tdesc
operand on fir.embox is meant to propagate the dynamic type when
embox a polymorphic entity.
This patch makes use of this operand in code generation and update
the created descriptor accordingly.

Reviewed By: jeanPerier

Differential Revision: https://reviews.llvm.org/D136748
2022-10-26 14:17:00 +02:00
Valentin Clement
016fbc40a5
[flang] Carry dynamic type in fir.rebox code generation
Load the pointer of the dynamic type descriptor from the
original box and update the destination descriptor with this pointer.

Reviewed By: PeteSteinfeld

Differential Revision: https://reviews.llvm.org/D136618
2022-10-24 20:43:41 +02:00
Valentin Clement
dfcc0a70cc
[flang] Handle fir.class pointer and allocatable in fir.dispatch code gen
fir.dispatch code generation was not handling fir.class pointer and
allocatable types. Update the code generation part to rertieve correctly the
the type info from those types.

Depends on D136426

Reviewed By: jeanPerier

Differential Revision: https://reviews.llvm.org/D136429
2022-10-21 14:35:26 +02:00
Valentin Clement
6c3c81b983
[flang] Lower and code gen for allocate on polymorphic entities
When allocating a polymorphic entity, its type descriptor can come
from the declared type or can be provided in the allocate statement.
This patch adds lowering for allocate on polymorphic by calling
the `AllocatableInitDerived` runtime function with the correct
type descriptor. Some adaptation are made in the code generation
to accept fir.class where it is appropriate.

Reviewed By: jeanPerier

Differential Revision: https://reviews.llvm.org/D136426
2022-10-21 14:34:03 +02:00