(root)/
gcc-13.2.0/
gcc/
testsuite/
gfortran.dg/
gomp/
assume-4.f90
! { dg-do compile }
! { dg-options "-fopenmp -O2 -fdump-tree-original -fdump-tree-optimized" }
! { dg-final { scan-tree-dump-times ".ASSUME \\(i_lower_bound \\(\\) < i\\);" 1 "original" } }
! { dg-final { scan-tree-dump-times ".ASSUME \\(TARGET_EXPR <D.\[0-9\]+, D.\[0-9\]+ = j_upper_bound \\(\\);" 1 "original" } }
! { dg-final { scan-tree-dump-times "__builtin_free" 1 "original" } }

! { dg-final { scan-tree-dump-not "i_lower_bound" "optimized" } }
! { dg-final { scan-tree-dump-not "j_upper_bound" "optimized" } }
! { dg-final { scan-tree-dump-not "__builtin_free" "optimized" } }

! Note: Currently, the assumption does not help with optimization in either variant.


integer function f(i)
  implicit none
  integer, value :: i

  !$omp assume holds(i > i_lower_bound ())
  block
    if (i > 4) then
      f = 42
    else
      f = -1
    end if
  end block
contains
  function i_lower_bound ()
    integer :: i_lower_bound
    i_lower_bound = 5
  end function
end

integer function g(j)
  implicit none
  integer, value :: j

  !$omp assume holds(j < j_upper_bound ())
  block
    if (j < 10) then
      g = 42
    else
      g = -1
    end if
  end block
contains
  function j_upper_bound ()
    integer, allocatable :: j_upper_bound
    j_upper_bound = 10
  end function
end