// RUN: %eopt --enzyme-wrap="infn=main outfn= retTys=enzyme_active argTys=enzyme_active mode=ReverseModeCombined" --canonicalize --remove-unnecessary-enzyme-ops --enzyme-simplify-math %s | FileCheck %s
module {
func.func @square(%arg0: f32) -> f32 {
%0 = arith.mulf %arg0, %arg0 : f32
return %0 : f32
}
func.func @inactive(%arg0: f32, %arg1: i32) -> (f32, i32) {
%0 = arith.constant 42.0 : f32
%1 = arith.constant 42 : i32
return %0, %1 : f32, i32
}
func.func @main(%arg0: f32) -> f32 {
%0 = func.call @square(%arg0) : (f32) -> f32
%1 = arith.constant 10 : i32
%2:2 = func.call @inactive(%arg0, %1) : (f32, i32) -> (f32, i32)
%3 = arith.addf %0, %2#0 : f32
return %3 : f32
}
}
// CHECK: func.func @main(%arg0: f32, %arg1: f32) -> f32 {
// CHECK-NEXT: %c10_i32 = arith.constant 10 : i32
// CHECK-NEXT: %0 = call @square(%arg0) : (f32) -> f32
// CHECK-NEXT: %1:2 = call @inactive(%arg0, %c10_i32) : (f32, i32) -> (f32, i32)
// CHECK-NEXT: %2 = call @diffeinactive(%arg0, %c10_i32, %arg1) : (f32, i32, f32) -> f32
// CHECK-NEXT: %3 = call @diffesquare(%arg0, %arg1) : (f32, f32) -> f32
// CHECK-NEXT: %4 = arith.addf %2, %3 : f32
// CHECK-NEXT: return %4 : f32
// CHECK-NEXT: }
// CHECK: func.func private @diffeinactive(%arg0: f32, %arg1: i32, %arg2: f32) -> f32 {
// CHECK-NEXT: %cst = arith.constant 0.000000e+00 : f32
// CHECK-NEXT: return %cst : f32
// CHECK-NEXT: }
// CHECK: func.func private @diffesquare(%arg0: f32, %arg1: f32) -> f32 {
// CHECK-NEXT: %0 = arith.mulf %arg1, %arg0 : f32
// CHECK-NEXT: %1 = arith.mulf %arg1, %arg0 : f32
// CHECK-NEXT: %2 = arith.addf %0, %1 : f32
// CHECK-NEXT: return %2 : f32
// CHECK-NEXT: }