//@ compile-flags: -Zautodiff=Enable -C opt-level=3 -Clto=fat //@ no-prefer-dynamic //@ needs-enzyme #![feature(autodiff)] use std::autodiff::autodiff; #[autodiff(d_square, Reverse, Duplicated, Active)] #[no_mangle] fn square(x: &f64) -> f64 { x * x } // CHECK:define internal fastcc double @diffesquare(double %x.0.val, ptr nocapture align 8 %"x'" // CHECK-NEXT:invertstart: // CHECK-NEXT: %_0 = fmul double %x.0.val, %x.0.val // CHECK-NEXT: %0 = fadd fast double %x.0.val, %x.0.val // CHECK-NEXT: %1 = load double, ptr %"x'", align 8 // CHECK-NEXT: %2 = fadd fast double %1, %0 // CHECK-NEXT: store double %2, ptr %"x'", align 8 // CHECK-NEXT: ret double %_0 // CHECK-NEXT:} fn main() { let x = 3.0; let output = square(&x); assert_eq!(9.0, output); let mut df_dx = 0.0; let output_ = d_square(&x, &mut df_dx, 1.0); assert_eq!(output, output_); assert_eq!(6.0, df_dx); }