Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[InlineTrans] TypeError: The stop value of a Range must be a sub-class of Node but got: Extent (similar to #2776) #2735

Open
hbrunie opened this issue Oct 3, 2024 · 2 comments
Assignees
Labels

Comments

@hbrunie
Copy link
Collaborator

hbrunie commented Oct 3, 2024

Executing this code snippet:

def test_inline_with_array_in_call_upper_ATTRIBUTE():
    code = """module dummy
    implicit none
    contains 
    subroutine callee(logc, scr_rope)
    integer, dimension(3), intent(in) :: logc
    integer, dimension(3) :: limits
    integer, parameter :: init=1
    real, dimension(logc(1):,:), intent(in) :: scr_rope
    call called(logc, limits, scr_rope(:,:))
    end subroutine callee
    
    subroutine called(logc, limits, scr_rope)
  integer, dimension(3), intent(in) :: logc
  integer, dimension(3), intent(in) :: limits
  real, dimension(logc(1):,:), intent(in) :: scr_rope
  integer :: i
  real, dimension(5) :: fstar

  fstar = 0
  do i = logc(1), limits(3), 1
     fstar(:) = scr_rope(:,i)
  enddo

end subroutine called
end module"""
    reader = FortranReader()
    psyir_tree: psyir_nodes.Node = reader.psyir_from_source(code)
    # writer = FortranWriter()
    # print(writer(psyir_tree))
    routine: Routine = psyir_tree.walk(psyir_nodes.Call)[0]
    from psyclone.psyir.transformations import InlineTrans

    trans = InlineTrans()
    trans.apply(routine)

I got an error during the Inline transformation

 test_inline_with_array_in_call_upper_ATTRIBUTE
    trans.apply(routine)
../../psyclone/psyclone/src/psyclone/psyir/transformations/inline_trans.py:184: in apply
    self._replace_formal_arg(ref, node, formal_args)
../../psyclone/psyclone/src/psyclone/psyir/transformations/inline_trans.py:331: in _replace_formal_arg
    new_ref = self._replace_formal_struc_arg(actual_arg, ref, call_node,
../../psyclone/psyclone/src/psyclone/psyir/transformations/inline_trans.py:548: in _replace_formal_struc_arg
    new_indices = self._update_actual_indices(
../../psyclone/psyclone/src/psyclone/psyir/transformations/inline_trans.py:470: in _update_actual_indices
    local_shape.upper.copy())
E   AttributeError: 'Extent' object has no attribute 'copy'
=========================================================================== short test summary info ===========================================================================
ERROR test_psyclone_limits.py - AttributeError: 'Extent' object has no attribute 'copy'

It looks like the InlineTransformation tries to copy a bound that is not possible to copy (Enum).

The inlined code should look like

```python
module dummy
    implicit none
    contains 
    subroutine callee(logc, scr_rope)
    integer, dimension(3), intent(in) :: logc
    integer, dimension(3) :: limits
    integer, parameter :: init=1
    real, dimension(logc(1):,:), intent(in) :: scr_rope 

    ! INLINED call called(logc, limits, scr_rope(:,:))
    integer :: i
    real, dimension(5) :: fstar

    fstar = 0
    do i = logc(1), limits(3), 1
       fstar(:) = scr_rope(:,i)
    enddo
    end subroutine callee
    ! subroutine called code removed for simplicity
end module
@hbrunie
Copy link
Collaborator Author

hbrunie commented Oct 3, 2024

A patch to solve this issue:

 >> cat 0001-InlineTrans-Fix-2735.patch 
From b3c54743fe930787bef936f6b0564ff1b4d4e9de Mon Sep 17 00:00:00 2001
From: Hugo Brunie <hugo.brunie@univ-grenoble-alpes.fr>
Date: Thu, 3 Oct 2024 17:34:48 +0200
Subject: [PATCH] [InlineTrans] Fix 2735

---
 .gitignore                                     |  2 ++
 .../psyir/transformations/inline_trans.py      | 18 ++++++++++++++++--
 2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/.gitignore b/.gitignore
index a5562a65a..af820da8d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,3 +25,5 @@ src/*.egg-info
 .idea
 .rtx.toml
 .venv
+venv
+.vscode
\ No newline at end of file
diff --git a/src/psyclone/psyir/transformations/inline_trans.py b/src/psyclone/psyir/transformations/inline_trans.py
index 1b8c8927f..a3941ce20 100644
--- a/src/psyclone/psyir/transformations/inline_trans.py
+++ b/src/psyclone/psyir/transformations/inline_trans.py
@@ -466,8 +466,22 @@ class InlineTrans(Transformation):
                 # less than that supplied. In general we're not going to know
                 # that so we have to be conservative.
                 if local_shape:
-                    new = Range.create(local_shape.lower.copy(),
-                                       local_shape.upper.copy())
+                    symbol = local_ref.symbol
+                    if isinstance(local_shape.upper, Reference):
+                        upper_bound =local_shape.upper.copy()
+                    else:
+                        upper_bound = IntrinsicCall.create(
+                                IntrinsicCall.Intrinsic.UBOUND,
+                                [Reference(symbol), ("dim", Literal(str(local_idx_posn+1), INTEGER_TYPE))])
+                    if isinstance(local_shape.lower, Reference):
+                        lower_bound =local_shape.lower.copy()
+                    else:
+                        lower_bound = IntrinsicCall.create(
+                                IntrinsicCall.Intrinsic.LBOUND,
+                                [Reference(symbol), ("dim", Literal(str(local_idx_posn+1), INTEGER_TYPE))])
+
+                    new = Range.create(lower_bound,
+                                       upper_bound)
                     new_indices[pos] = self._create_inlined_idx(
                         call_node, formal_args,
                         new, local_decln_start, actual_start)
-- 
2.34.1

@hbrunie hbrunie self-assigned this Oct 3, 2024
@hbrunie hbrunie added the bug label Oct 3, 2024
@hbrunie
Copy link
Collaborator Author

hbrunie commented Oct 7, 2024

With the last version of psyclone, commit dd3500065286e05756250f47ec9913f3ffd0a4e5:

The error is now:

../../psyclone/psyclone/src/psyclone/psyir/transformations/inline_trans.py:185: in apply
    self._replace_formal_arg(ref, node, formal_args)
../../psyclone/psyclone/src/psyclone/psyir/transformations/inline_trans.py:300: in _replace_formal_arg
    new_ref = self._replace_formal_struc_arg(actual_arg, ref, call_node,
../../psyclone/psyclone/src/psyclone/psyir/transformations/inline_trans.py:523: in _replace_formal_struc_arg
    new_indices = self._update_actual_indices(
../../psyclone/psyclone/src/psyclone/psyir/transformations/inline_trans.py:444: in _update_actual_indices
    new = Range.create(local_shape.lower.copy(),
../../psyclone/psyclone/src/psyclone/psyir/nodes/ranges.py:130: in create
    erange.stop = stop
../../psyclone/psyclone/src/psyclone/psyir/nodes/ranges.py:222: in stop
    self._check_valid_input(value, "stop")
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

value = <Extent.ATTRIBUTE: 2>, name = 'stop'

    @staticmethod
    def _check_valid_input(value, name):
        '''
        Perform checks that the supplied value is valid as a child of a
        Range node.
    
        :param object value: entity to check.
        :param str name: the name of the quantity for which this value has \
                         been supplied.
    
        :raises TypeError: if the supplied value is not a sub-class of Node.
        :raises TypeError: if the supplied value is a Literal but is not of \
                           INTEGER type.
        '''
        if not isinstance(value, Node):
>           raise TypeError(
                f"The {name} value of a Range must be a sub-class of "
                f"Node but got: {type(value).__name__}")
E           TypeError: The stop value of a Range must be a sub-class of Node but got: Extent

../../psyclone/psyclone/src/psyclone/psyir/nodes/ranges.py:153: TypeError

@hbrunie hbrunie changed the title Exception has occurred: AttributeError 'Extent' object has no attribute 'copy' [Ref2ArrayTrans] TypeError: The stop value of a Range must be a sub-class of Node but got: Extent Oct 7, 2024
@hbrunie hbrunie changed the title [Ref2ArrayTrans] TypeError: The stop value of a Range must be a sub-class of Node but got: Extent [InlineTrans] TypeError: The stop value of a Range must be a sub-class of Node but got: Extent Oct 7, 2024
@hbrunie hbrunie changed the title [InlineTrans] TypeError: The stop value of a Range must be a sub-class of Node but got: Extent [InlineTrans] TypeError: The stop value of a Range must be a sub-class of Node but got: Extent (similar to #2776) Oct 7, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant