| ! 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 |