! RUN: bbc -emit-hlfir %s -o - | %python %S/gen_mod_ref_test.py | \ ! RUN: fir-opt -pass-pipeline='builtin.module(func.func(test-fir-alias-analysis-modref))' \ ! RUN: --mlir-disable-threading -o /dev/null 2>&1 | FileCheck %s ! Test fir.call modref when arguments are passed to the call. This focus ! on the possibility of "direct" effects (taken via the arguments, and not ! via some indirect access via global states). subroutine test_simple() implicit none real :: test_var_x, test_var_y call test_effect_external(test_var_x) end subroutine ! CHECK-LABEL: Testing : "_QPtest_simple" ! CHECK: test_effect_external -> test_var_x#0: ModRef ! CHECK: test_effect_external -> test_var_y#0: NoModRef subroutine test_equivalence() implicit none real :: test_var_x, test_var_y equivalence(test_var_x, test_var_y) call test_effect_external(test_var_x) end subroutine ! CHECK-LABEL: Testing : "_QPtest_equivalence" ! CHECK: test_effect_external -> test_var_x#0: ModRef ! CHECK: test_effect_external -> test_var_y#0: ModRef subroutine test_pointer() implicit none real, target :: test_var_x, test_var_y real, pointer :: p p => test_var_x call test_effect_external(p) end subroutine ! CHECK-LABEL: Testing : "_QPtest_pointer" ! CHECK: test_effect_external -> test_var_x#0: ModRef ! TODO: test_var_y should be NoModRef, the alias analysis is currently very ! conservative whenever pointer/allocatable descriptors are involved (mostly ! because it needs to make sure it is dealing descriptors for POINTER/ALLOCATABLE ! from the Fortran source and that it can apply language rules). ! CHECK: test_effect_external -> test_var_y#0: ModRef subroutine test_array_1(test_var_x) implicit none real :: test_var_x(:), test_var_y call test_effect_external(test_var_x(10)) end subroutine ! CHECK-LABEL: Testing : "_QPtest_array_1" ! CHECK: test_effect_external -> test_var_x#0: ModRef ! CHECK: test_effect_external -> test_var_y#0: NoModRef subroutine test_array_copy_in(test_var_x) implicit none real :: test_var_x(:), test_var_y call test_effect_external_2(test_var_x) end subroutine ! CHECK-LABEL: Testing : "_QPtest_array_copy_in" ! CHECK: test_effect_external_2 -> test_var_x#0: ModRef ! TODO: copy-in/out is currently badly understood by alias analysis, this ! causes the modref analysis to think the argument may alias with anyting. ! test_var_y should obviously be considered NoMoRef in the call. ! CHECK: test_effect_external_2 -> test_var_y#0: ModRef