blob: 66a51fe5467a59253a162235eb6139f8fc7d8924 [file] [log] [blame] [edit]
! RUN: if [ %llvmver -ge 13 ]; then ifx -flto -O0 -c %s -o /dev/stdout | %opt %loadEnzyme -enzyme -o %t && ifx -flto -O0 %t -o %t1 && %t1 | FileCheck %s; fi
! RUN: if [ %llvmver -ge 13 ]; then ifx -flto -O1 -c %s -o /dev/stdout | %opt %loadEnzyme -enzyme -o %t && ifx -flto -O1 %t -o %t1 && %t1 | FileCheck %s; fi
! RUN: if [ %llvmver -ge 13 ]; then ifx -flto -O2 -c %s -o /dev/stdout | %opt %loadEnzyme -enzyme -o %t && ifx -flto -O2 %t -o %t1 && %t1 | FileCheck %s; fi
! RUN: if [ %llvmver -ge 13 ]; then ifx -flto -O3 -c %s -o /dev/stdout | %opt %loadEnzyme -enzyme -o %t && ifx -flto -O3 %t -o %t1 && %t1 | FileCheck %s; fi
module AD
implicit none
interface
subroutine selectFirst__enzyme_fwddiff(fnc, x, dx, y, dy)
interface
subroutine fnc_decal(a, z)
real, allocatable, intent(in) :: a(:)
real, intent(inout) :: z
end subroutine
end interface
procedure(fnc_decal) :: fnc
real, allocatable, intent(in) :: x(:)
real, allocatable, intent(inout) :: dx(:)
real, intent(inout) :: y
real, intent(inout) :: dy
end subroutine
end interface
contains
subroutine selectFirst(x, y)
real, allocatable, intent(in) :: x(:)
real, intent(inout) :: y
y = x(1)
end subroutine
end module
program app
use AD
implicit none
real, allocatable :: x(:), dx(:)
real :: y, dy
allocate(x(3))
allocate(dx(3))
x = [2,3,4]
dx = [1,0,0]
y = 0
dy = 0
call selectFirst__enzyme_fwddiff(selectFirst, x, dx, y, dy)
print *, int(y)
print *, int(dx(1))
print *, int(dx(2))
print *, int(dx(3))
print *, int(dy)
end program
! CHECK: 2
! CHECK-NEXT: 1
! CHECK-NEXT: 0
! CHECK-NEXT: 0
! CHECK-NEXT: 1