; RUN: if [ %llvmver -lt 16 ]; then %opt < %s %loadEnzyme -print-activity-analysis -activity-analysis-func=_Z10reduce_maxPdi -o /dev/null | FileCheck %s; fi
; RUN: %opt < %s %newLoadEnzyme -passes="print-activity-analysis" -activity-analysis-func=_Z10reduce_maxPdi -S | FileCheck %s

source_filename = "multivecmax.cpp"

@.str.1 = private unnamed_addr constant [21 x i8] c"d_reduce_max(%i)=%f\0A\00", align 1

; Function Attrs: nounwind uwtable
define linkonce_odr dso_local double* @_ZNSt16allocator_traitsISaIdEE8allocateERS0_m(i64 %__n) {
entry:
  %mul = shl i64 %__n, 3
  %call5 = call i8* @_Znwm(i64 %mul)
  %aa1 = bitcast i8* %call5 to double*
  ret double* %aa1
}

; Function Attrs: nounwind
define dso_local double @_Z10reduce_maxPdi(double %v) {
entry:
  %call6.i.i = call double* @_ZNSt16allocator_traitsISaIdEE8allocateERS0_m(i64 1)
  store double %v, double* %call6.i.i, align 8
  %res = load double, double* %call6.i.i, align 8
  ret double %res
}

declare dso_local double @_Z17__enzyme_autodiffPvPdS0_i(...)

define dso_local i32 @main() {
entry:
  %r = call double (...) @_Z17__enzyme_autodiffPvPdS0_i(i8* bitcast (double (double)* @_Z10reduce_maxPdi to i8*), double 1.000000e+00)
  ; THIS SHOULD PRINT 1.0
  %call4 = call i32 (i8*, ...) @printf(i8* nonnull dereferenceable(1) getelementptr inbounds ([21 x i8], [21 x i8]* @.str.1, i64 0, i64 0), i32 0, double %r)
  ret i32 0
}

declare dso_local i32 @printf(i8* nocapture readonly, ...)

declare dso_local noalias nonnull i8* @_Znwm(i64)

; CHECK: double %v: icv:0
; CHECK-NEXT: entry
; CHECK-NEXT:   %call6.i.i = call double* @_ZNSt16allocator_traitsISaIdEE8allocateERS0_m(i64 1): icv:0 ici:1
; CHECK-NEXT:   store double %v, double* %call6.i.i, align 8: icv:1 ici:0
; CHECK-NEXT:   %res = load double, double* %call6.i.i, align 8: icv:0 ici:0
; CHECK-NEXT:   ret double %res: icv:1 ici:1
