Skip to content

autodiff fails when differentiating two identical functions #139471

Closed
@ZuseZ4

Description

@ZuseZ4

I tried this code:

#![feature(autodiff)]

    use std::autodiff::autodiff;

    #[autodiff(d_square, Reverse, Duplicated, Active)]
    fn square(x: &f64) -> f64 {
        x * x
    }

    #[autodiff(d_square2, Reverse, Duplicated, Active)]
    fn square2(x: &f64) -> f64 {
        x * x
    }

fn main() {
    let x = 3.0;
    let mut dx = 1.0;
    d_square(&x, &mut dx, 1.0);
    d_square2(&x, &mut dx, 1.0);
}

I expected to see this happen: d_square and d_square2 should both compute the derivative of x*x, thus 2.0 * x. However, LLVM (or something earlier?) recognizes that square and square2 are identical, and fuses them (ReplaceAllUsesWith, or RAUW for LLVM). autodiff then is missing a (source) function to differentiate, giving the following error. This is often happening in our test cases, where we just test the same dummy functions in a lot of different configurations.

Instead, this happened:

error: failed to prepare autodiff: src: _ZN2ad7square217h920417192f1e5f52E, target: _ZN2ad9d_square217he1a6ffbcf6ea74f2E, could not find source function

Meta

rustc --version --verbose:

build from source
Backtrace

<backtrace>

Tracking:

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-bugCategory: This is a bug.F-autodiff`#![feature(autodiff)]`

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions