Skip to content

Conversation

@tgymnich
Copy link
Member

@tgymnich tgymnich commented Aug 19, 2021

invertPointerM uses lookupM...

@tgymnich tgymnich self-assigned this Aug 19, 2021
@tgymnich tgymnich mentioned this pull request Aug 19, 2021
3 tasks
@tgymnich tgymnich marked this pull request as ready for review September 1, 2021 18:51
// analysis honeypot no longer exists
return lookupM(getNewFromOriginal(oval), BuilderM);

switch (mode) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the better solution here would be to have invertPointerM not also call lookup, but any code outside that calls invertpointerM that requires it explicitly call lookup. Thus invertpointer wouldn't need this.

@tgymnich
Copy link
Member Author

I managed to move lookupM out of invertPointerM but it now appears at call sites of invertPointerM like setPtrDiffe, addToInvertedPtrDiffe and unwrapM


switch (mode) {
case DerivativeMode::ForwardMode:
pidx = invertPointerM(dli->getOperand(0), BuilderM);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should never need a lookup since the only time this inverted phi happens is adjacent to the original value in the fwd pass.

Copy link
Member Author

@tgymnich tgymnich Sep 16, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are you sure?
Removing this leads to 7 failed integration tests:

Failed Tests (7):
  Enzyme :: Integration/ReverseMode/eigensumsq.cpp
  Enzyme :: Integration/ReverseMode/eigensumsqdyn-notmp.cpp
  Enzyme :: Integration/ReverseMode/eigensumsqdyn.cpp
  Enzyme :: Integration/ReverseMode/mixedstruct1-simplefda.c
  Enzyme :: Integration/ReverseMode/mixedstruct1-simpleps.c
  Enzyme :: Integration/ReverseMode/simpleeigen.cpp
  Enzyme :: Integration/ReverseMode/vecmax.cpp
Instruction does not dominate all uses!
  %"'ipg18" = getelementptr inbounds %"class.std::vector", %"class.std::vector"* %"'", i64 0, i32 0, i32 0, i32 0, i32 0
  %"'il_phi8_unwrap" = load double*, double** %"'ipg18", align 8, !tbaa !12

Also debugging Integration/ReverseMode/mixedstruct1-simplefda.c, I found that it's using this lookup: (GradientUtils:2739 on main)

  {
    auto ifound = invertedPointers.find(oval);
    if (ifound != invertedPointers.end()) {
      return lookupM(&*ifound->second, BuilderM);
    }
  }

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah that lookup should also be removed from invertpointer.

Can you post the full log for one of those cases? Specifically seeing how the domination errs might reveal what's going awry

Copy link
Member Author

@tgymnich tgymnich Sep 16, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FAIL: Enzyme :: Integration/ReverseMode/eigensumsqdyn.cpp (9 of 65)
******************** TEST 'Enzyme :: Integration/ReverseMode/eigensumsqdyn.cpp' FAILED ********************
Script:
--
: 'RUN: at line 1';   /usr/lib/llvm-12/bin/clang++ -mllvm -force-vector-width=1 -ffast-math -fno-unroll-loops -fno-vectorize -fno-slp-vectorize -fno-exceptions -O3 /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/eigensumsqdyn.cpp -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -S | /usr/lib/llvm-12/bin/lli -
: 'RUN: at line 2';   /usr/lib/llvm-12/bin/clang++ -fno-unroll-loops -fno-vectorize -fno-slp-vectorize -fno-exceptions -O2 /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/eigensumsqdyn.cpp -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -S | /usr/lib/llvm-12/bin/lli -
: 'RUN: at line 3';   /usr/lib/llvm-12/bin/clang++ -fno-unroll-loops -fno-vectorize -fno-slp-vectorize -fno-exceptions -O1 /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/eigensumsqdyn.cpp -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -S | /usr/lib/llvm-12/bin/lli -
: 'RUN: at line 5';   /usr/lib/llvm-12/bin/clang++ -fno-unroll-loops -fno-vectorize -fno-slp-vectorize -fno-exceptions -O1 -Xclang -disable-llvm-optzns /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/eigensumsqdyn.cpp -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -S | /usr/lib/llvm-12/bin/lli -
: 'RUN: at line 6';   /usr/lib/llvm-12/bin/clang++ -fno-unroll-loops -fno-vectorize -fno-slp-vectorize -fno-exceptions -O3 /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/eigensumsqdyn.cpp -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -enzyme-inline=1 -S | /usr/lib/llvm-12/bin/lli -
: 'RUN: at line 7';   /usr/lib/llvm-12/bin/clang++ -fno-unroll-loops -fno-vectorize -fno-slp-vectorize -fno-exceptions -O2 /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/eigensumsqdyn.cpp -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -enzyme-inline=1 -S | /usr/lib/llvm-12/bin/lli -
: 'RUN: at line 8';   /usr/lib/llvm-12/bin/clang++ -fno-unroll-loops -fno-vectorize -fno-slp-vectorize -fno-exceptions -O1 /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/eigensumsqdyn.cpp -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -enzyme-inline=1 -S | /usr/lib/llvm-12/bin/lli -
--
Exit Code: 255

Command Output (stderr):
--
freeing without malloc   %44 = load i8*, i8** %43, align 8, !tbaa !17
freeing without malloc   %41 = load i8*, i8** %40, align 8, !tbaa !12
freeing without malloc   %51 = load i8*, i8** %50, align 8, !tbaa !22
freeing without malloc   %48 = load i8*, i8** %47, align 8, !tbaa !21
freeing without malloc   %76 = select i1 %75, double* %74, double* null
freeing without malloc   %54 = select i1 %53, double* %52, double* null
freeing without malloc   %38 = load i8*, i8** %37, align 8, !tbaa !14
freeing without malloc   %44 = load i8*, i8** %43, align 8, !tbaa !17
freeing without malloc   %41 = load i8*, i8** %40, align 8, !tbaa !12
freeing without malloc   %51 = load i8*, i8** %50, align 8, !tbaa !22
freeing without malloc   %48 = load i8*, i8** %47, align 8, !tbaa !21
freeing without malloc   %76 = select i1 %75, double* %74, double* null
freeing without malloc   %54 = select i1 %53, double* %52, double* null
freeing without malloc   %38 = load i8*, i8** %37, align 8, !tbaa !14
freeing without malloc   %119 = load i8*, i8** %118, align 8, !tbaa !9
freeing without malloc   %123 = phi i8* [ %121, %115 ], [ %45, %61 ]
Instruction does not dominate all uses!
  %"'ipg67" = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %"'ipa66", i64 0, i32 0, i32 0, i32 0, i32 0, i32 0
  %"'il_phi25_unwrap" = load double*, double** %"'ipg67", align 8, !tbaa !44
; Function Attrs: noinline nounwind uwtable
define internal double @preprocess__ZL6matvecPKN5Eigen6MatrixIdLin1ELin1ELi0ELin1ELin1EEES3_(%"class.Eigen::Matrix"* noalias %0, %"class.Eigen::Matrix"* noalias %1) #4 {
  %3 = alloca %"class.Eigen::internal::redux_evaluator", align 8
  %4 = alloca %"class.Eigen::Matrix", align 8
  %5 = alloca %"class.Eigen::Product", align 8
  %6 = bitcast %"class.Eigen::Matrix"* %4 to i8*
  call void @llvm.lifetime.start.p0i8(i64 24, i8* nonnull %6) #19
  %7 = bitcast %"class.Eigen::Matrix"* %4 to i64*
  store i64 0, i64* %7, align 8
  %8 = getelementptr inbounds %"class.Eigen::Matrix", %"class.Eigen::Matrix"* %1, i64 0, i32 0, i32 0, i32 1
  %9 = load i64, i64* %8, align 8, !tbaa !36
  %10 = getelementptr inbounds %"class.Eigen::Matrix", %"class.Eigen::Matrix"* %1, i64 0, i32 0, i32 0, i32 2
  %11 = load i64, i64* %10, align 8, !tbaa !42
  %12 = icmp eq i64 %9, 0
  %13 = icmp eq i64 %11, 0
  %14 = or i1 %12, %13
  br i1 %14, label %25, label %15

15:                                               ; preds = %2
  %16 = sdiv i64 9223372036854775807, %11
  %17 = icmp slt i64 %16, %9
  br i1 %17, label %18, label %20

18:                                               ; preds = %15
  %19 = tail call noalias nonnull i8* @_Znwm(i64 -1) #20
  br label %20

20:                                               ; preds = %18, %15
  %21 = sdiv i64 9223372036854775807, %11
  %22 = icmp slt i64 %21, %9
  br i1 %22, label %23, label %25

23:                                               ; preds = %20
  %24 = tail call noalias nonnull i8* @_Znwm(i64 -1) #20
  br label %25

25:                                               ; preds = %23, %20, %2
  %26 = mul i64 %11, %9
  %27 = getelementptr inbounds %"class.Eigen::Matrix", %"class.Eigen::Matrix"* %4, i64 0, i32 0, i32 0, i32 1
  %28 = getelementptr inbounds %"class.Eigen::Matrix", %"class.Eigen::Matrix"* %4, i64 0, i32 0, i32 0, i32 2
  %29 = icmp eq i64 %26, 0
  br i1 %29, label %44, label %30

30:                                               ; preds = %25
  %31 = bitcast %"class.Eigen::Matrix"* %4 to i8**
  %32 = icmp ugt i64 %26, 2305843009213693951
  br i1 %32, label %33, label %35

33:                                               ; preds = %30
  %34 = tail call noalias nonnull i8* @_Znwm(i64 -1) #20
  br label %35

35:                                               ; preds = %33, %30
  %36 = shl i64 %26, 3
  %37 = tail call noalias i8* @malloc(i64 %36) #19
  %38 = icmp ne i64 %36, 0
  %39 = and i1 %38, false
  br i1 %39, label %40, label %42

40:                                               ; preds = %35
  %41 = tail call noalias nonnull i8* @_Znwm(i64 -1) #20
  br label %42

42:                                               ; preds = %40, %35
  store i8* %37, i8** %31, align 8, !tbaa !33
  %43 = bitcast i8* %37 to double*
  br label %44

44:                                               ; preds = %42, %25
  %45 = phi i8* [ null, %25 ], [ %37, %42 ]
  %46 = phi double* [ null, %25 ], [ %43, %42 ]
  store i64 %9, i64* %27, align 8, !tbaa !36
  store i64 %11, i64* %28, align 8, !tbaa !42
  %47 = getelementptr inbounds %"class.Eigen::Matrix", %"class.Eigen::Matrix"* %0, i64 0, i32 0, i32 0, i32 0
  %48 = load double*, double** %47, align 8, !tbaa !33
  %49 = getelementptr inbounds %"class.Eigen::Matrix", %"class.Eigen::Matrix"* %1, i64 0, i32 0, i32 0, i32 0
  %50 = load double*, double** %49, align 8, !tbaa !33
  %51 = icmp sgt i64 %26, 0
  br i1 %51, label %.preheader2, label %61

.preheader2:                                      ; preds = %44
  br label %52

52:                                               ; preds = %.preheader2, %52
  %tiv6 = phi i64 [ 0, %.preheader2 ], [ %tiv.next7, %52 ]
  %tiv.next7 = add nuw nsw i64 %tiv6, 1
  %53 = getelementptr inbounds double, double* %46, i64 %tiv6
  %54 = getelementptr inbounds double, double* %48, i64 %tiv6
  %55 = getelementptr inbounds double, double* %50, i64 %tiv6
  %56 = load double, double* %54, align 8, !tbaa !37
  %57 = load double, double* %55, align 8, !tbaa !37
  %58 = fsub fast double %56, %57
  store double %58, double* %53, align 8, !tbaa !37
  %59 = add nuw nsw i64 %tiv6, 1
  %60 = icmp eq i64 %59, %26
  br i1 %60, label %.loopexit3, label %52, !llvm.loop !43

.loopexit3:                                       ; preds = %52
  br label %61

61:                                               ; preds = %.loopexit3, %44
  %62 = bitcast %"class.Eigen::Product"* %5 to i8*
  call void @llvm.lifetime.start.p0i8(i64 16, i8* nonnull %62) #19
  %63 = getelementptr inbounds %"class.Eigen::Product", %"class.Eigen::Product"* %5, i64 0, i32 0
  store %"class.Eigen::Matrix"* %4, %"class.Eigen::Matrix"** %63, align 8
  %64 = getelementptr inbounds %"class.Eigen::Product", %"class.Eigen::Product"* %5, i64 0, i32 1
  store %"class.Eigen::Matrix"* %4, %"class.Eigen::Matrix"** %64, align 8
  %65 = bitcast %"class.Eigen::Matrix"** %64 to %"class.Eigen::PlainObjectBase"**
  br i1 %29, label %122, label %66

66:                                               ; preds = %61
  %67 = bitcast %"class.Eigen::Product"* %5 to %"class.Eigen::PlainObjectBase"**
  %68 = bitcast %"class.Eigen::internal::redux_evaluator"* %3 to i8*
  call void @llvm.lifetime.start.p0i8(i64 48, i8* nonnull %68) #19
  %69 = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %3, i64 0, i32 0, i32 0
  call void @_ZN5Eigen8internal17product_evaluatorINS_7ProductINS_6MatrixIdLin1ELin1ELi0ELin1ELin1EEES4_Li0EEELi8ENS_10DenseShapeES6_ddEC2ERKS5_(%"struct.Eigen::internal::product_evaluator"* nonnull dereferenceable(40) %69, %"class.Eigen::Product"* nonnull align 8 dereferenceable(16) %5) #19
  %70 = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %3, i64 0, i32 1
  store %"class.Eigen::Product"* %5, %"class.Eigen::Product"** %70, align 8, !tbaa !38
  %71 = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %3, i64 0, i32 0, i32 0, i32 0, i32 0, i32 0
  %72 = load double*, double** %71, align 8, !tbaa !44
  %73 = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %3, i64 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 0
  %74 = load double, double* %72, align 8, !tbaa !37
  %75 = load %"class.Eigen::PlainObjectBase"*, %"class.Eigen::PlainObjectBase"** %67, align 8, !tbaa !46
  %76 = getelementptr inbounds %"class.Eigen::PlainObjectBase", %"class.Eigen::PlainObjectBase"* %75, i64 0, i32 0, i32 1
  %77 = load i64, i64* %76, align 8, !tbaa !36
  %78 = icmp sgt i64 %77, 1
  br i1 %78, label %.preheader, label %79

.preheader:                                       ; preds = %66
  br label %107

.loopexit1:                                       ; preds = %107
  br label %79

79:                                               ; preds = %.loopexit1, %66
  %80 = phi double [ %74, %66 ], [ %112, %.loopexit1 ]
  %81 = load %"class.Eigen::PlainObjectBase"*, %"class.Eigen::PlainObjectBase"** %65, align 8, !tbaa !48
  %82 = getelementptr inbounds %"class.Eigen::PlainObjectBase", %"class.Eigen::PlainObjectBase"* %81, i64 0, i32 0, i32 2
  %83 = load i64, i64* %82, align 8, !tbaa !42
  %84 = icmp sgt i64 %83, 1
  %85 = icmp sgt i64 %77, 0
  %86 = load i64, i64* %73, align 8
  %87 = and i1 %85, %84
  br i1 %87, label %88, label %115

88:                                               ; preds = %79
  %89 = icmp sgt i64 %83, 2
  %90 = select i1 %89, i64 %83, i64 2
  br label %91

91:                                               ; preds = %104, %88
  %tiv = phi i64 [ %tiv.next, %104 ], [ 0, %88 ]
  %92 = phi double [ %101, %104 ], [ %80, %88 ]
  %93 = add i64 %tiv, 1
  %tiv.next = add nuw nsw i64 %tiv, 1
  %94 = mul nsw i64 %93, %86
  br label %95

95:                                               ; preds = %95, %91
  %96 = phi i64 [ 0, %91 ], [ %102, %95 ]
  %97 = phi double [ %92, %91 ], [ %101, %95 ]
  %98 = add nsw i64 %96, %94
  %99 = getelementptr inbounds double, double* %72, i64 %98
  %100 = load double, double* %99, align 8, !tbaa !37
  %101 = fadd fast double %100, %97
  %102 = add nuw nsw i64 %96, 1
  %103 = icmp eq i64 %102, %77
  br i1 %103, label %104, label %95, !llvm.loop !49

104:                                              ; preds = %95
  %105 = add nuw nsw i64 %93, 1
  %106 = icmp eq i64 %105, %90
  br i1 %106, label %.loopexit, label %91, !llvm.loop !50

107:                                              ; preds = %.preheader, %107
  %tiv4 = phi i64 [ 0, %.preheader ], [ %tiv.next5, %107 ]
  %108 = phi double [ %112, %107 ], [ %74, %.preheader ]
  %109 = add i64 %tiv4, 1
  %tiv.next5 = add nuw nsw i64 %tiv4, 1
  %110 = getelementptr inbounds double, double* %72, i64 %109
  %111 = load double, double* %110, align 8, !tbaa !37
  %112 = fadd fast double %111, %108
  %113 = add nuw nsw i64 %109, 1
  %114 = icmp eq i64 %113, %77
  br i1 %114, label %.loopexit1, label %107, !llvm.loop !51

.loopexit:                                        ; preds = %104
  br label %115

115:                                              ; preds = %.loopexit, %79
  %116 = phi double [ %80, %79 ], [ %101, %.loopexit ]
  %117 = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %3, i64 0, i32 0, i32 0, i32 1, i32 0
  %118 = bitcast %"class.Eigen::PlainObjectBase"* %117 to i8**
  %119 = load i8*, i8** %118, align 8, !tbaa !33
  call void @free(i8* %119) #19
  call void @llvm.lifetime.end.p0i8(i64 48, i8* nonnull %68) #19
  %120 = bitcast %"class.Eigen::Matrix"* %4 to i8**
  %121 = load i8*, i8** %120, align 8, !tbaa !33
  br label %122

122:                                              ; preds = %115, %61
  %123 = phi i8* [ %121, %115 ], [ %45, %61 ]
  %124 = phi double [ %116, %115 ], [ 0.000000e+00, %61 ]
  call void @llvm.lifetime.end.p0i8(i64 16, i8* nonnull %62) #19
  call void @free(i8* %123) #19
  call void @llvm.lifetime.end.p0i8(i64 24, i8* nonnull %6) #19
  ret double %124
}

; Function Attrs: noinline nounwind uwtable
define internal void @diffe_ZL6matvecPKN5Eigen6MatrixIdLin1ELin1ELi0ELin1ELin1EEES3_(%"class.Eigen::Matrix"* noalias %0, %"class.Eigen::Matrix"* %"'", %"class.Eigen::Matrix"* noalias %1, %"class.Eigen::Matrix"* %"'1", double %differeturn) #4 {
  %"iv'ac" = alloca i64, align 8
  %"iv28'ac" = alloca i64, align 8
  %"iv30'ac" = alloca i64, align 8
  %"iv32'ac" = alloca i64, align 8
  %"'de" = alloca double, align 8
  store double 0.000000e+00, double* %"'de", align 8
  %_cache = alloca i8*, align 8
  %_cache37 = alloca i8*, align 8
  %_cache40 = alloca i8*, align 8
  %"'mi_cache" = alloca i8*, align 8
  %_cache41 = alloca i8*, align 8
  %_cache43 = alloca i8*, align 8
  %"'de55" = alloca double, align 8
  store double 0.000000e+00, double* %"'de55", align 8
  %"'de56" = alloca double, align 8
  store double 0.000000e+00, double* %"'de56", align 8
  %"'de57" = alloca double, align 8
  store double 0.000000e+00, double* %"'de57", align 8
  %"'de65" = alloca double, align 8
  store double 0.000000e+00, double* %"'de65", align 8
  %_augmented_cache = alloca { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, double*, i8*, i8*, i8*, i8*, %"class.Eigen::Matrix"*, %"class.Eigen::Matrix"*, { %"class.Eigen::DenseBase"*, %"class.Eigen::DenseBase"*, i8*, i8*, i8*, i8*, i8*, double*, double**, double**, i64, i64, i64, i1, i1, i64*, i64*, double**, double**, i64*, double**, double**, double**, double** }, { i8*, i8*, { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, { double*, i64, i64* }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double*, double*, i64, i64*, i64, i64* }*, { double*, i64, i64* }*, i64, i64, i64, double*, double* }, double*, double*, double*, { i8*, i8*, i8*, i8*, i8*, i8*, { { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i8*, i1*, i8*, i1 }, i32*, i32* }, i1, i1, i64, i64, i64, i64, i1, i1, i64, i64, i64, i64 }, i1, i1, i1, double, i64, i64, i64, double*, double*, i64, double*, i64 }, { i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i1, %"class.Eigen::Matrix"*, %"class.Eigen::Matrix"*, i64 }, align 8
  %"'de82" = alloca double, align 8
  store double 0.000000e+00, double* %"'de82", align 8
  %"'de83" = alloca double, align 8
  store double 0.000000e+00, double* %"'de83", align 8
  %"'de91" = alloca double, align 8
  store double 0.000000e+00, double* %"'de91", align 8
  %"'de92" = alloca double, align 8
  store double 0.000000e+00, double* %"'de92", align 8
  %"'de95" = alloca double, align 8
  store double 0.000000e+00, double* %"'de95", align 8
  %"'de96" = alloca double, align 8
  store double 0.000000e+00, double* %"'de96", align 8
  %"'de112" = alloca double, align 8
  store double 0.000000e+00, double* %"'de112", align 8
  %"'de113" = alloca double, align 8
  store double 0.000000e+00, double* %"'de113", align 8
  %"'de133" = alloca double, align 8
  store double 0.000000e+00, double* %"'de133", align 8
  %"'ipa66" = alloca %"class.Eigen::internal::redux_evaluator", align 8
  store %"class.Eigen::internal::redux_evaluator" zeroinitializer, %"class.Eigen::internal::redux_evaluator"* %"'ipa66", align 8
  %3 = alloca %"class.Eigen::internal::redux_evaluator", align 8
  %"'ipa" = alloca %"class.Eigen::Matrix", align 8
  store %"class.Eigen::Matrix" zeroinitializer, %"class.Eigen::Matrix"* %"'ipa", align 8
  %4 = alloca %"class.Eigen::Matrix", align 8
  %"'ipa61" = alloca %"class.Eigen::Product", align 8
  store %"class.Eigen::Product" zeroinitializer, %"class.Eigen::Product"* %"'ipa61", align 8
  %5 = alloca %"class.Eigen::Product", align 8
  %"'ipc" = bitcast %"class.Eigen::Matrix"* %"'ipa" to i64*
  %6 = bitcast %"class.Eigen::Matrix"* %4 to i64*
  store i64 0, i64* %"'ipc", align 8
  store i64 0, i64* %6, align 8
  %7 = getelementptr inbounds %"class.Eigen::Matrix", %"class.Eigen::Matrix"* %1, i64 0, i32 0, i32 0, i32 1
  %8 = load i64, i64* %7, align 8, !tbaa !36
  %9 = getelementptr inbounds %"class.Eigen::Matrix", %"class.Eigen::Matrix"* %1, i64 0, i32 0, i32 0, i32 2
  %10 = load i64, i64* %9, align 8, !tbaa !42
  %11 = icmp eq i64 %8, 0
  %12 = icmp eq i64 %10, 0
  %13 = or i1 %11, %12
  br i1 %13, label %24, label %14

14:                                               ; preds = %2
  %15 = sdiv i64 9223372036854775807, %10
  %16 = icmp slt i64 %15, %8
  br i1 %16, label %17, label %19

17:                                               ; preds = %14
  %18 = tail call noalias nonnull i8* @_Znwm(i64 -1) #19
  store i8* %18, i8** %_cache, align 8, !invariant.group !178
  br label %19

19:                                               ; preds = %17, %14
  %20 = sdiv i64 9223372036854775807, %10
  %21 = icmp slt i64 %20, %8
  br i1 %21, label %22, label %24

22:                                               ; preds = %19
  %23 = tail call noalias nonnull i8* @_Znwm(i64 -1) #19
  store i8* %23, i8** %_cache37, align 8, !invariant.group !179
  br label %24

24:                                               ; preds = %22, %19, %2
  %25 = mul i64 %10, %8
  %"'ipg51" = getelementptr inbounds %"class.Eigen::Matrix", %"class.Eigen::Matrix"* %"'ipa", i64 0, i32 0, i32 0, i32 1
  %26 = getelementptr inbounds %"class.Eigen::Matrix", %"class.Eigen::Matrix"* %4, i64 0, i32 0, i32 0, i32 1
  %"'ipg50" = getelementptr inbounds %"class.Eigen::Matrix", %"class.Eigen::Matrix"* %"'ipa", i64 0, i32 0, i32 0, i32 2
  %27 = getelementptr inbounds %"class.Eigen::Matrix", %"class.Eigen::Matrix"* %4, i64 0, i32 0, i32 0, i32 2
  %28 = icmp eq i64 %25, 0
  br i1 %28, label %43, label %29

29:                                               ; preds = %24
  %"'ipc44" = bitcast %"class.Eigen::Matrix"* %"'ipa" to i8**
  %30 = bitcast %"class.Eigen::Matrix"* %4 to i8**
  %31 = icmp ugt i64 %25, 2305843009213693951
  br i1 %31, label %32, label %34

32:                                               ; preds = %29
  %33 = tail call noalias nonnull i8* @_Znwm(i64 -1) #19
  store i8* %33, i8** %_cache40, align 8, !invariant.group !180
  br label %34

34:                                               ; preds = %32, %29
  %35 = shl i64 %25, 3
  %36 = tail call noalias i8* @malloc(i64 %35) #20
  %"'mi" = tail call noalias nonnull i8* @malloc(i64 %35) #20
  store i8* %"'mi", i8** %"'mi_cache", align 8, !invariant.group !181
  store i8* %36, i8** %_cache41, align 8, !invariant.group !182
  call void @llvm.memset.p0i8.i64(i8* nonnull %"'mi", i8 0, i64 %35, i1 false)
  %37 = icmp ne i64 %35, 0
  %38 = and i1 %37, false
  br i1 %38, label %39, label %41

39:                                               ; preds = %34
  %40 = tail call noalias nonnull i8* @_Znwm(i64 -1) #19
  store i8* %40, i8** %_cache43, align 8, !invariant.group !183
  br label %41

41:                                               ; preds = %39, %34
  store i8* %"'mi", i8** %"'ipc44", align 8
  store i8* %36, i8** %30, align 8, !tbaa !33
  %"'ipc53" = bitcast i8* %"'mi" to double*
  %42 = bitcast i8* %36 to double*
  br label %43

43:                                               ; preds = %41, %24
  %44 = phi double* [ null, %24 ], [ %"'ipc53", %41 ]
  %45 = phi double* [ null, %24 ], [ %42, %41 ]
  store i64 %8, i64* %"'ipg51", align 8
  store i64 %8, i64* %26, align 8, !tbaa !36
  store i64 %10, i64* %"'ipg50", align 8
  store i64 %10, i64* %27, align 8, !tbaa !42
  %"'ipg48" = getelementptr inbounds %"class.Eigen::Matrix", %"class.Eigen::Matrix"* %"'", i64 0, i32 0, i32 0, i32 0
  %46 = getelementptr inbounds %"class.Eigen::Matrix", %"class.Eigen::Matrix"* %0, i64 0, i32 0, i32 0, i32 0
  %"'ipl49" = load double*, double** %"'ipg48", align 8
  %47 = load double*, double** %46, align 8, !tbaa !33
  %"'ipg" = getelementptr inbounds %"class.Eigen::Matrix", %"class.Eigen::Matrix"* %"'1", i64 0, i32 0, i32 0, i32 0
  %48 = getelementptr inbounds %"class.Eigen::Matrix", %"class.Eigen::Matrix"* %1, i64 0, i32 0, i32 0, i32 0
  %"'ipl" = load double*, double** %"'ipg", align 8
  %49 = load double*, double** %48, align 8, !tbaa !33
  %50 = icmp sgt i64 %25, 0
  br i1 %50, label %.preheader2, label %60

.preheader2:                                      ; preds = %43
  %51 = add i64 %25, -1
  br label %52

52:                                               ; preds = %52, %.preheader2
  %iv = phi i64 [ %iv.next, %52 ], [ 0, %.preheader2 ]
  %iv.next = add nuw nsw i64 %iv, 1
  %"'ipg54" = getelementptr inbounds double, double* %44, i64 %iv
  %53 = getelementptr inbounds double, double* %45, i64 %iv
  %"'ipg59" = getelementptr inbounds double, double* %"'ipl49", i64 %iv
  %54 = getelementptr inbounds double, double* %47, i64 %iv
  %"'ipg58" = getelementptr inbounds double, double* %"'ipl", i64 %iv
  %55 = getelementptr inbounds double, double* %49, i64 %iv
  %56 = load double, double* %54, align 8, !tbaa !37
  %57 = load double, double* %55, align 8, !tbaa !37
  %58 = fsub fast double %56, %57
  store double %58, double* %53, align 8, !tbaa !37
  %59 = icmp eq i64 %iv.next, %25
  br i1 %59, label %.loopexit3, label %52, !llvm.loop !43

.loopexit3:                                       ; preds = %52
  br label %60

60:                                               ; preds = %.loopexit3, %43
  %"'ipg63" = getelementptr inbounds %"class.Eigen::Product", %"class.Eigen::Product"* %"'ipa61", i64 0, i32 0
  %61 = getelementptr inbounds %"class.Eigen::Product", %"class.Eigen::Product"* %5, i64 0, i32 0
  store %"class.Eigen::Matrix"* %"'ipa", %"class.Eigen::Matrix"** %"'ipg63", align 8
  store %"class.Eigen::Matrix"* %4, %"class.Eigen::Matrix"** %61, align 8
  %"'ipg62" = getelementptr inbounds %"class.Eigen::Product", %"class.Eigen::Product"* %"'ipa61", i64 0, i32 1
  %62 = getelementptr inbounds %"class.Eigen::Product", %"class.Eigen::Product"* %5, i64 0, i32 1
  store %"class.Eigen::Matrix"* %"'ipa", %"class.Eigen::Matrix"** %"'ipg62", align 8
  store %"class.Eigen::Matrix"* %4, %"class.Eigen::Matrix"** %62, align 8
  %63 = bitcast %"class.Eigen::Matrix"** %62 to %"class.Eigen::PlainObjectBase"**
  br i1 %28, label %99, label %64

64:                                               ; preds = %60
  %65 = bitcast %"class.Eigen::Product"* %5 to %"class.Eigen::PlainObjectBase"**
  %"'ipg74" = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %"'ipa66", i64 0, i32 0, i32 0
  %66 = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %3, i64 0, i32 0, i32 0
  %_augmented = call { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, double*, i8*, i8*, i8*, i8*, %"class.Eigen::Matrix"*, %"class.Eigen::Matrix"*, { %"class.Eigen::DenseBase"*, %"class.Eigen::DenseBase"*, i8*, i8*, i8*, i8*, i8*, double*, double**, double**, i64, i64, i64, i1, i1, i64*, i64*, double**, double**, i64*, double**, double**, double**, double** }, { i8*, i8*, { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, { double*, i64, i64* }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double*, double*, i64, i64*, i64, i64* }*, { double*, i64, i64* }*, i64, i64, i64, double*, double* }, double*, double*, double*, { i8*, i8*, i8*, i8*, i8*, i8*, { { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i8*, i1*, i8*, i1 }, i32*, i32* }, i1, i1, i64, i64, i64, i64, i1, i1, i64, i64, i64, i64 }, i1, i1, i1, double, i64, i64, i64, double*, double*, i64, double*, i64 }, { i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i1, %"class.Eigen::Matrix"*, %"class.Eigen::Matrix"*, i64 } @augmented__ZN5Eigen8internal17product_evaluatorINS_7ProductINS_6MatrixIdLin1ELin1ELi0ELin1ELin1EEES4_Li0EEELi8ENS_10DenseShapeES6_ddEC2ERKS5_(%"struct.Eigen::internal::product_evaluator"* %66, %"struct.Eigen::internal::product_evaluator"* %"'ipg74", %"class.Eigen::Product"* %5, %"class.Eigen::Product"* %"'ipa61")
  %"'ipg72" = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %"'ipa66", i64 0, i32 1
  %67 = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %3, i64 0, i32 1
  store %"class.Eigen::Product"* %"'ipa61", %"class.Eigen::Product"** %"'ipg72", align 8
  store { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, double*, i8*, i8*, i8*, i8*, %"class.Eigen::Matrix"*, %"class.Eigen::Matrix"*, { %"class.Eigen::DenseBase"*, %"class.Eigen::DenseBase"*, i8*, i8*, i8*, i8*, i8*, double*, double**, double**, i64, i64, i64, i1, i1, i64*, i64*, double**, double**, i64*, double**, double**, double**, double** }, { i8*, i8*, { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, { double*, i64, i64* }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double*, double*, i64, i64*, i64, i64* }*, { double*, i64, i64* }*, i64, i64, i64, double*, double* }, double*, double*, double*, { i8*, i8*, i8*, i8*, i8*, i8*, { { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i8*, i1*, i8*, i1 }, i32*, i32* }, i1, i1, i64, i64, i64, i64, i1, i1, i64, i64, i64, i64 }, i1, i1, i1, double, i64, i64, i64, double*, double*, i64, double*, i64 }, { i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i1, %"class.Eigen::Matrix"*, %"class.Eigen::Matrix"*, i64 } %_augmented, { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, double*, i8*, i8*, i8*, i8*, %"class.Eigen::Matrix"*, %"class.Eigen::Matrix"*, { %"class.Eigen::DenseBase"*, %"class.Eigen::DenseBase"*, i8*, i8*, i8*, i8*, i8*, double*, double**, double**, i64, i64, i64, i1, i1, i64*, i64*, double**, double**, i64*, double**, double**, double**, double** }, { i8*, i8*, { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, { double*, i64, i64* }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double*, double*, i64, i64*, i64, i64* }*, { double*, i64, i64* }*, i64, i64, i64, double*, double* }, double*, double*, double*, { i8*, i8*, i8*, i8*, i8*, i8*, { { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i8*, i1*, i8*, i1 }, i32*, i32* }, i1, i1, i64, i64, i64, i64, i1, i1, i64, i64, i64, i64 }, i1, i1, i1, double, i64, i64, i64, double*, double*, i64, double*, i64 }, { i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i1, %"class.Eigen::Matrix"*, %"class.Eigen::Matrix"*, i64 }* %_augmented_cache, align 8, !invariant.group !184
  store %"class.Eigen::Product"* %5, %"class.Eigen::Product"** %67, align 8, !tbaa !38
  %"'ipg67" = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %"'ipa66", i64 0, i32 0, i32 0, i32 0, i32 0, i32 0
  %"'ipl69" = load double*, double** %"'ipg67", align 8, !invariant.group !185
  %68 = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %3, i64 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 0
  %69 = load %"class.Eigen::PlainObjectBase"*, %"class.Eigen::PlainObjectBase"** %65, align 8, !tbaa !46, !invariant.group !186
  %70 = getelementptr inbounds %"class.Eigen::PlainObjectBase", %"class.Eigen::PlainObjectBase"* %69, i64 0, i32 0, i32 1
  %71 = load i64, i64* %70, align 8, !tbaa !36, !invariant.group !187
  %72 = icmp sgt i64 %71, 1
  br i1 %72, label %.preheader, label %74

.preheader:                                       ; preds = %64
  %73 = add i64 %71, -2
  br label %95

.loopexit1:                                       ; preds = %95
  br label %74

74:                                               ; preds = %.loopexit1, %64
  %75 = load %"class.Eigen::PlainObjectBase"*, %"class.Eigen::PlainObjectBase"** %63, align 8, !tbaa !48, !invariant.group !188
  %76 = getelementptr inbounds %"class.Eigen::PlainObjectBase", %"class.Eigen::PlainObjectBase"* %75, i64 0, i32 0, i32 2
  %77 = load i64, i64* %76, align 8, !tbaa !42, !invariant.group !189
  %78 = icmp sgt i64 %77, 1
  %79 = icmp sgt i64 %71, 0
  %80 = load i64, i64* %68, align 8, !invariant.group !190
  %81 = and i1 %79, %78
  br i1 %81, label %82, label %98

82:                                               ; preds = %74
  %83 = icmp sgt i64 %77, 2
  %84 = select i1 %83, i64 %77, i64 2
  %85 = add nsw i64 %84, -2
  %86 = add i64 %71, -1
  br label %87

87:                                               ; preds = %92, %82
  %iv28 = phi i64 [ %iv.next29, %92 ], [ 0, %82 ]
  %iv.next29 = add nuw nsw i64 %iv28, 1
  %88 = mul nsw i64 %iv.next29, %80
  br label %89

89:                                               ; preds = %89, %87
  %iv30 = phi i64 [ %iv.next31, %89 ], [ 0, %87 ]
  %iv.next31 = add nuw nsw i64 %iv30, 1
  %90 = add nsw i64 %iv30, %88
  %"'ipg97" = getelementptr inbounds double, double* %"'ipl69", i64 %90
  %91 = icmp eq i64 %iv.next31, %71
  br i1 %91, label %92, label %89, !llvm.loop !49

92:                                               ; preds = %89
  %93 = add nuw nsw i64 %iv.next29, 1
  %94 = icmp eq i64 %93, %84
  br i1 %94, label %.loopexit, label %87, !llvm.loop !50

95:                                               ; preds = %95, %.preheader
  %iv32 = phi i64 [ %iv.next33, %95 ], [ 0, %.preheader ]
  %iv.next33 = add nuw nsw i64 %iv32, 1
  %"'ipg114" = getelementptr inbounds double, double* %"'ipl69", i64 %iv.next33
  %96 = add nuw nsw i64 %iv.next33, 1
  %97 = icmp eq i64 %96, %71
  br i1 %97, label %.loopexit1, label %95, !llvm.loop !51

.loopexit:                                        ; preds = %92
  br label %98

98:                                               ; preds = %.loopexit, %74
  br label %99

99:                                               ; preds = %98, %60
  br label %invert23

invert:                                           ; preds = %invert6, %invert2
  ret void

invert2:                                          ; preds = %invert4, %invert3
  br label %invert

invert3:                                          ; preds = %invert4
  %100 = load i8*, i8** %_cache, align 8, !invariant.group !178
  tail call void @_ZdlPv(i8* %100)
  br label %invert2

invert4:                                          ; preds = %staging, %invert5
  %_unwrap = sdiv i64 9223372036854775807, %10
  %_unwrap36 = icmp slt i64 %_unwrap, %8
  br i1 %_unwrap36, label %invert3, label %invert2

invert5:                                          ; preds = %staging
  %101 = load i8*, i8** %_cache37, align 8, !invariant.group !179
  tail call void @_ZdlPv(i8* %101)
  br label %invert4

invert6:                                          ; preds = %invert12, %invert7
  %_unwrap38 = sdiv i64 9223372036854775807, %10
  %_unwrap39 = icmp slt i64 %_unwrap38, %8
  br i1 %13, label %invert, label %staging

invert7:                                          ; preds = %invert9, %invert8
  br label %invert6

invert8:                                          ; preds = %invert9
  %102 = load i8*, i8** %_cache40, align 8, !invariant.group !180
  tail call void @_ZdlPv(i8* %102)
  br label %invert7

invert9:                                          ; preds = %invert11, %invert10
  %103 = load i8*, i8** %"'mi_cache", align 8, !invariant.group !181
  tail call void @free(i8* nonnull %103)
  %104 = load i8*, i8** %_cache41, align 8, !invariant.group !182
  tail call void @free(i8* %104)
  %_unwrap42 = icmp ugt i64 %25, 2305843009213693951
  br i1 %_unwrap42, label %invert8, label %invert7

invert10:                                         ; preds = %invert11
  %105 = load i8*, i8** %_cache43, align 8, !invariant.group !183
  tail call void @_ZdlPv(i8* %105)
  br label %invert9

invert11:                                         ; preds = %invert12
  %_unwrap45 = shl i64 %25, 3
  %_unwrap46 = icmp ne i64 %_unwrap45, 0
  %_unwrap47 = and i1 %_unwrap46, false
  br i1 %_unwrap47, label %invert10, label %invert9

invert12:                                         ; preds = %invert14, %invert.preheader2
  br i1 %28, label %invert6, label %invert11

invert.preheader2:                                ; preds = %invert13
  br label %invert12

invert13:                                         ; preds = %mergeinvert13_.loopexit3, %incinvert13
  %106 = load i64, i64* %"iv'ac", align 8
  %"'ipg54_unwrap" = getelementptr inbounds double, double* %44, i64 %106
  %107 = load double, double* %"'ipg54_unwrap", align 8
  store double 0.000000e+00, double* %"'ipg54_unwrap", align 8
  %108 = load double, double* %"'de55", align 8
  %109 = fadd fast double %108, %107
  store double %109, double* %"'de55", align 8
  %110 = load double, double* %"'de55", align 8
  %111 = fneg fast double %110
  store double 0.000000e+00, double* %"'de55", align 8
  %112 = load double, double* %"'de56", align 8
  %113 = fadd fast double %112, %110
  store double %113, double* %"'de56", align 8
  %114 = load double, double* %"'de57", align 8
  %115 = fadd fast double %114, %111
  store double %115, double* %"'de57", align 8
  %116 = load double, double* %"'de57", align 8
  store double 0.000000e+00, double* %"'de57", align 8
  %117 = load i64, i64* %"iv'ac", align 8
  %"'ipg58_unwrap" = getelementptr inbounds double, double* %"'ipl", i64 %117
  %118 = load double, double* %"'ipg58_unwrap", align 8
  %119 = fadd fast double %118, %116
  store double %119, double* %"'ipg58_unwrap", align 8
  %120 = load double, double* %"'de56", align 8
  store double 0.000000e+00, double* %"'de56", align 8
  %121 = load i64, i64* %"iv'ac", align 8
  %"'ipg59_unwrap" = getelementptr inbounds double, double* %"'ipl49", i64 %121
  %122 = load double, double* %"'ipg59_unwrap", align 8
  %123 = fadd fast double %122, %120
  store double %123, double* %"'ipg59_unwrap", align 8
  %124 = load i64, i64* %"iv'ac", align 8
  %125 = icmp eq i64 %124, 0
  %126 = xor i1 %125, true
  br i1 %125, label %invert.preheader2, label %incinvert13

incinvert13:                                      ; preds = %invert13
  %127 = load i64, i64* %"iv'ac", align 8
  %128 = add nsw i64 %127, -1
  store i64 %128, i64* %"iv'ac", align 8
  br label %invert13

invert.loopexit3:                                 ; preds = %invert14
  %_unwrap60 = add i64 %25, -1
  br label %mergeinvert13_.loopexit3

mergeinvert13_.loopexit3:                         ; preds = %invert.loopexit3
  store i64 %_unwrap60, i64* %"iv'ac", align 8
  br label %invert13

invert14:                                         ; preds = %invert23, %invert15
  br i1 %50, label %invert.loopexit3, label %invert12

invert15:                                         ; preds = %invert16, %invert.preheader
  %129 = load double, double* %"'de65", align 8
  store double 0.000000e+00, double* %"'de65", align 8
  %"'il_phi25_unwrap" = load double*, double** %"'ipg67", align 8, !tbaa !44
  %130 = load double, double* %"'il_phi25_unwrap", align 8
  %131 = fadd fast double %130, %129
  store double %131, double* %"'il_phi25_unwrap", align 8
  %_unwrap73 = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %3, i64 0, i32 0, i32 0
  %"'ipg74_unwrap" = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %"'ipa66", i64 0, i32 0, i32 0
  %132 = load { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, double*, i8*, i8*, i8*, i8*, %"class.Eigen::Matrix"*, %"class.Eigen::Matrix"*, { %"class.Eigen::DenseBase"*, %"class.Eigen::DenseBase"*, i8*, i8*, i8*, i8*, i8*, double*, double**, double**, i64, i64, i64, i1, i1, i64*, i64*, double**, double**, i64*, double**, double**, double**, double** }, { i8*, i8*, { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, { double*, i64, i64* }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double*, double*, i64, i64*, i64, i64* }*, { double*, i64, i64* }*, i64, i64, i64, double*, double* }, double*, double*, double*, { i8*, i8*, i8*, i8*, i8*, i8*, { { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i8*, i1*, i8*, i1 }, i32*, i32* }, i1, i1, i64, i64, i64, i64, i1, i1, i64, i64, i64, i64 }, i1, i1, i1, double, i64, i64, i64, double*, double*, i64, double*, i64 }, { i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i1, %"class.Eigen::Matrix"*, %"class.Eigen::Matrix"*, i64 }, { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, double*, i8*, i8*, i8*, i8*, %"class.Eigen::Matrix"*, %"class.Eigen::Matrix"*, { %"class.Eigen::DenseBase"*, %"class.Eigen::DenseBase"*, i8*, i8*, i8*, i8*, i8*, double*, double**, double**, i64, i64, i64, i1, i1, i64*, i64*, double**, double**, i64*, double**, double**, double**, double** }, { i8*, i8*, { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, { double*, i64, i64* }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double*, double*, i64, i64*, i64, i64* }*, { double*, i64, i64* }*, i64, i64, i64, double*, double* }, double*, double*, double*, { i8*, i8*, i8*, i8*, i8*, i8*, { { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i8*, i1*, i8*, i1 }, i32*, i32* }, i1, i1, i64, i64, i64, i64, i1, i1, i64, i64, i64, i64 }, i1, i1, i1, double, i64, i64, i64, double*, double*, i64, double*, i64 }, { i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i1, %"class.Eigen::Matrix"*, %"class.Eigen::Matrix"*, i64 }* %_augmented_cache, align 8, !invariant.group !184
  call void @diffe_ZN5Eigen8internal17product_evaluatorINS_7ProductINS_6MatrixIdLin1ELin1ELi0ELin1ELin1EEES4_Li0EEELi8ENS_10DenseShapeES6_ddEC2ERKS5_(%"struct.Eigen::internal::product_evaluator"* %_unwrap73, %"struct.Eigen::internal::product_evaluator"* %"'ipg74_unwrap", %"class.Eigen::Product"* %5, %"class.Eigen::Product"* %"'ipa61", { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, double*, i8*, i8*, i8*, i8*, %"class.Eigen::Matrix"*, %"class.Eigen::Matrix"*, { %"class.Eigen::DenseBase"*, %"class.Eigen::DenseBase"*, i8*, i8*, i8*, i8*, i8*, double*, double**, double**, i64, i64, i64, i1, i1, i64*, i64*, double**, double**, i64*, double**, double**, double**, double** }, { i8*, i8*, { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, { double*, i64, i64* }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double*, double*, i64, i64*, i64, i64* }*, { double*, i64, i64* }*, i64, i64, i64, double*, double* }, double*, double*, double*, { i8*, i8*, i8*, i8*, i8*, i8*, { { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i8*, i1*, i8*, i1 }, i32*, i32* }, i1, i1, i64, i64, i64, i64, i1, i1, i64, i64, i64, i64 }, i1, i1, i1, double, i64, i64, i64, double*, double*, i64, double*, i64 }, { i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i1, %"class.Eigen::Matrix"*, %"class.Eigen::Matrix"*, i64 } %132)
  br label %invert14

invert.preheader:                                 ; preds = %invert21
  br label %invert15

invert.loopexit1:                                 ; preds = %invert16
  %_unwrap76 = bitcast %"class.Eigen::Product"* %5 to %"class.Eigen::PlainObjectBase"**
  %_unwrap77 = load %"class.Eigen::PlainObjectBase"*, %"class.Eigen::PlainObjectBase"** %_unwrap76, align 8, !tbaa !46, !invariant.group !186
  %_unwrap78 = getelementptr inbounds %"class.Eigen::PlainObjectBase", %"class.Eigen::PlainObjectBase"* %_unwrap77, i64 0, i32 0, i32 1
  %_unwrap79 = load i64, i64* %_unwrap78, align 8, !tbaa !36, !invariant.group !187
  %_unwrap80 = add i64 %_unwrap79, -2
  br label %mergeinvert21_.loopexit1

mergeinvert21_.loopexit1:                         ; preds = %invert.loopexit1
  store i64 %_unwrap80, i64* %"iv32'ac", align 8
  br label %invert21

invert16:                                         ; preds = %invert22, %invert17
  %133 = load double, double* %"'de82", align 8
  store double 0.000000e+00, double* %"'de82", align 8
  %_unwrap85 = bitcast %"class.Eigen::Product"* %5 to %"class.Eigen::PlainObjectBase"**
  %_unwrap86 = load %"class.Eigen::PlainObjectBase"*, %"class.Eigen::PlainObjectBase"** %_unwrap85, align 8, !tbaa !46, !invariant.group !186
  %_unwrap87 = getelementptr inbounds %"class.Eigen::PlainObjectBase", %"class.Eigen::PlainObjectBase"* %_unwrap86, i64 0, i32 0, i32 1
  %_unwrap88 = load i64, i64* %_unwrap87, align 8, !tbaa !36, !invariant.group !187
  %_unwrap89 = icmp sgt i64 %_unwrap88, 1
  %134 = xor i1 %_unwrap89, true
  %135 = select fast i1 %_unwrap89, double %133, double 0.000000e+00
  %136 = load double, double* %"'de83", align 8
  %137 = fadd fast double %136, %133
  %138 = select fast i1 %_unwrap89, double %137, double %136
  store double %138, double* %"'de83", align 8
  %139 = select fast i1 %134, double %133, double 0.000000e+00
  %140 = load double, double* %"'de65", align 8
  %141 = fadd fast double %140, %133
  %142 = select fast i1 %_unwrap89, double %140, double %141
  store double %142, double* %"'de65", align 8
  br i1 %_unwrap89, label %invert.loopexit1, label %invert15

invert17:                                         ; preds = %invert18
  br label %invert16

invert18:                                         ; preds = %invert19
  %143 = load double, double* %"'de91", align 8
  store double 0.000000e+00, double* %"'de91", align 8
  %144 = load i64, i64* %"iv28'ac", align 8
  %145 = icmp eq i64 %144, 0
  %146 = xor i1 %145, true
  %147 = select fast i1 %146, double %143, double 0.000000e+00
  %148 = load double, double* %"'de92", align 8
  %149 = fadd fast double %148, %143
  %150 = select fast i1 %145, double %148, double %149
  store double %150, double* %"'de92", align 8
  %151 = select fast i1 %145, double %143, double 0.000000e+00
  %152 = load double, double* %"'de82", align 8
  %153 = fadd fast double %152, %143
  %154 = select fast i1 %145, double %153, double %152
  store double %154, double* %"'de82", align 8
  br i1 %145, label %invert17, label %incinvert18

incinvert18:                                      ; preds = %invert18
  %155 = load i64, i64* %"iv28'ac", align 8
  %156 = add nsw i64 %155, -1
  store i64 %156, i64* %"iv28'ac", align 8
  br label %invert20

invert19:                                         ; preds = %mergeinvert19_, %incinvert19
  %157 = load double, double* %"'de92", align 8
  store double 0.000000e+00, double* %"'de92", align 8
  %158 = load double, double* %"'de95", align 8
  %159 = fadd fast double %158, %157
  store double %159, double* %"'de95", align 8
  %160 = load double, double* %"'de96", align 8
  %161 = fadd fast double %160, %157
  store double %161, double* %"'de96", align 8
  %162 = load double, double* %"'de95", align 8
  store double 0.000000e+00, double* %"'de95", align 8
  %163 = load i64, i64* %"iv30'ac", align 8
  %164 = load i64, i64* %"iv28'ac", align 8
  %"'ipg67_unwrap" = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %"'ipa66", i64 0, i32 0, i32 0, i32 0, i32 0, i32 0
  %"'ipl69_unwrap" = load double*, double** %"'ipg67_unwrap", align 8, !invariant.group !185
  %iv.next29_unwrap = add nuw nsw i64 %164, 1
  %_unwrap98 = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %3, i64 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 0
  %_unwrap99 = load i64, i64* %_unwrap98, align 8, !invariant.group !190
  %_unwrap100 = mul nsw i64 %iv.next29_unwrap, %_unwrap99
  %_unwrap101 = add nsw i64 %163, %_unwrap100
  %"'ipg97_unwrap" = getelementptr inbounds double, double* %"'ipl69_unwrap", i64 %_unwrap101
  %165 = load double, double* %"'ipg97_unwrap", align 8
  %166 = fadd fast double %165, %162
  store double %166, double* %"'ipg97_unwrap", align 8
  %167 = load double, double* %"'de96", align 8
  store double 0.000000e+00, double* %"'de96", align 8
  %168 = load i64, i64* %"iv30'ac", align 8
  %169 = icmp eq i64 %168, 0
  %170 = xor i1 %169, true
  %171 = select fast i1 %170, double %167, double 0.000000e+00
  %172 = load double, double* %"'de92", align 8
  %173 = fadd fast double %172, %167
  %174 = select fast i1 %169, double %172, double %173
  store double %174, double* %"'de92", align 8
  %175 = select fast i1 %169, double %167, double 0.000000e+00
  %176 = load double, double* %"'de91", align 8
  %177 = fadd fast double %176, %167
  %178 = select fast i1 %169, double %177, double %176
  store double %178, double* %"'de91", align 8
  br i1 %169, label %invert18, label %incinvert19

incinvert19:                                      ; preds = %invert19
  %179 = load i64, i64* %"iv30'ac", align 8
  %180 = add nsw i64 %179, -1
  store i64 %180, i64* %"iv30'ac", align 8
  br label %invert19

invert20:                                         ; preds = %mergeinvert18_.loopexit, %incinvert18
  %181 = load i64, i64* %"iv28'ac", align 8
  %_unwrap106 = bitcast %"class.Eigen::Product"* %5 to %"class.Eigen::PlainObjectBase"**
  %_unwrap107 = load %"class.Eigen::PlainObjectBase"*, %"class.Eigen::PlainObjectBase"** %_unwrap106, align 8, !tbaa !46, !invariant.group !186
  %_unwrap108 = getelementptr inbounds %"class.Eigen::PlainObjectBase", %"class.Eigen::PlainObjectBase"* %_unwrap107, i64 0, i32 0, i32 1
  %_unwrap109 = load i64, i64* %_unwrap108, align 8, !tbaa !36, !invariant.group !187
  %_unwrap110 = add i64 %_unwrap109, -1
  br label %mergeinvert19_

mergeinvert19_:                                   ; preds = %invert20
  store i64 %_unwrap110, i64* %"iv30'ac", align 8
  br label %invert19

invert21:                                         ; preds = %incinvert21, %mergeinvert21_.loopexit1
  %182 = load double, double* %"'de83", align 8
  store double 0.000000e+00, double* %"'de83", align 8
  %183 = load double, double* %"'de112", align 8
  %184 = fadd fast double %183, %182
  store double %184, double* %"'de112", align 8
  %185 = load double, double* %"'de113", align 8
  %186 = fadd fast double %185, %182
  store double %186, double* %"'de113", align 8
  %187 = load double, double* %"'de112", align 8
  store double 0.000000e+00, double* %"'de112", align 8
  %188 = load i64, i64* %"iv32'ac", align 8
  %"'ipg67_unwrap115" = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %"'ipa66", i64 0, i32 0, i32 0, i32 0, i32 0, i32 0
  %"'ipl69_unwrap116" = load double*, double** %"'ipg67_unwrap115", align 8, !invariant.group !185
  %iv.next33_unwrap = add nuw nsw i64 %188, 1
  %"'ipg114_unwrap" = getelementptr inbounds double, double* %"'ipl69_unwrap116", i64 %iv.next33_unwrap
  %189 = load double, double* %"'ipg114_unwrap", align 8
  %190 = fadd fast double %189, %187
  store double %190, double* %"'ipg114_unwrap", align 8
  %191 = load double, double* %"'de113", align 8
  store double 0.000000e+00, double* %"'de113", align 8
  %192 = load i64, i64* %"iv32'ac", align 8
  %193 = icmp eq i64 %192, 0
  %194 = xor i1 %193, true
  %195 = select fast i1 %193, double %191, double 0.000000e+00
  %196 = load double, double* %"'de65", align 8
  %197 = fadd fast double %196, %191
  %198 = select fast i1 %193, double %197, double %196
  store double %198, double* %"'de65", align 8
  %199 = select fast i1 %194, double %191, double 0.000000e+00
  %200 = load double, double* %"'de83", align 8
  %201 = fadd fast double %200, %191
  %202 = select fast i1 %193, double %200, double %201
  store double %202, double* %"'de83", align 8
  br i1 %193, label %invert.preheader, label %incinvert21

incinvert21:                                      ; preds = %invert21
  %203 = load i64, i64* %"iv32'ac", align 8
  %204 = add nsw i64 %203, -1
  store i64 %204, i64* %"iv32'ac", align 8
  br label %invert21

invert.loopexit:                                  ; preds = %invert22
  %_unwrap121 = load %"class.Eigen::PlainObjectBase"*, %"class.Eigen::PlainObjectBase"** %63, align 8, !tbaa !48, !invariant.group !188
  %_unwrap122 = getelementptr inbounds %"class.Eigen::PlainObjectBase", %"class.Eigen::PlainObjectBase"* %_unwrap121, i64 0, i32 0, i32 2
  %_unwrap123 = load i64, i64* %_unwrap122, align 8, !tbaa !42, !invariant.group !189
  %_unwrap124 = icmp sgt i64 %_unwrap123, 2
  %_unwrap125 = select i1 %_unwrap124, i64 %_unwrap123, i64 2
  %_unwrap126 = add nsw i64 %_unwrap125, -2
  br label %mergeinvert18_.loopexit

mergeinvert18_.loopexit:                          ; preds = %invert.loopexit
  store i64 %_unwrap126, i64* %"iv28'ac", align 8
  br label %invert20

invert22:                                         ; preds = %invert23
  %205 = load double, double* %"'de133", align 8
  store double 0.000000e+00, double* %"'de133", align 8
  %_unwrap135 = bitcast %"class.Eigen::Product"* %5 to %"class.Eigen::PlainObjectBase"**
  %_unwrap136 = load %"class.Eigen::PlainObjectBase"*, %"class.Eigen::PlainObjectBase"** %_unwrap135, align 8, !tbaa !46, !invariant.group !186
  %_unwrap137 = getelementptr inbounds %"class.Eigen::PlainObjectBase", %"class.Eigen::PlainObjectBase"* %_unwrap136, i64 0, i32 0, i32 1
  %_unwrap138 = load i64, i64* %_unwrap137, align 8, !tbaa !36, !invariant.group !187
  %_unwrap139 = icmp sgt i64 %_unwrap138, 0
  %_unwrap140 = load %"class.Eigen::PlainObjectBase"*, %"class.Eigen::PlainObjectBase"** %63, align 8, !tbaa !48, !invariant.group !188
  %_unwrap141 = getelementptr inbounds %"class.Eigen::PlainObjectBase", %"class.Eigen::PlainObjectBase"* %_unwrap140, i64 0, i32 0, i32 2
  %_unwrap142 = load i64, i64* %_unwrap141, align 8, !tbaa !42, !invariant.group !189
  %_unwrap143 = icmp sgt i64 %_unwrap142, 1
  %_unwrap144 = and i1 %_unwrap139, %_unwrap143
  %206 = xor i1 %_unwrap144, true
  %207 = select fast i1 %_unwrap144, double %205, double 0.000000e+00
  %208 = load double, double* %"'de92", align 8
  %209 = fadd fast double %208, %205
  %210 = select fast i1 %_unwrap144, double %209, double %208
  store double %210, double* %"'de92", align 8
  %211 = select fast i1 %206, double %205, double 0.000000e+00
  %212 = load double, double* %"'de82", align 8
  %213 = fadd fast double %212, %205
  %214 = select fast i1 %_unwrap144, double %212, double %213
  store double %214, double* %"'de82", align 8
  br i1 %_unwrap144, label %invert.loopexit, label %invert16

invert23:                                         ; preds = %99
  store double %differeturn, double* %"'de", align 8
  %215 = load double, double* %"'de", align 8
  store double 0.000000e+00, double* %"'de", align 8
  %216 = xor i1 %28, true
  %217 = select fast i1 %216, double %215, double 0.000000e+00
  %218 = load double, double* %"'de133", align 8
  %219 = fadd fast double %218, %215
  %220 = select fast i1 %28, double %218, double %219
  store double %220, double* %"'de133", align 8
  br i1 %28, label %invert14, label %invert22

staging:                                          ; preds = %invert6
  br i1 %_unwrap39, label %invert5, label %invert4
}

LLVM ERROR: function failed verification (4)
PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash backtrace.
Stack dump:
0.      Program arguments: /usr/lib/llvm-12/bin/opt - -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -S
1.      Running pass 'Enzyme Pass' on module '<stdin>'.
 #0 0x00007f085e1d49a3 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/usr/lib/llvm-12/lib/libLLVM-12.so.1+0xbda9a3)
 #1 0x00007f085e1d2cc0 llvm::sys::RunSignalHandlers() (/usr/lib/llvm-12/lib/libLLVM-12.so.1+0xbd8cc0)
 #2 0x00007f085e1d500f (/usr/lib/llvm-12/lib/libLLVM-12.so.1+0xbdb00f)
 #3 0x00007f085d5e73c0 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x153c0)
 #4 0x00007f085d0da18b raise (/lib/x86_64-linux-gnu/libc.so.6+0x4618b)
 #5 0x00007f085d0b9859 abort (/lib/x86_64-linux-gnu/libc.so.6+0x25859)
 #6 0x00007f085e12fc09 (/usr/lib/llvm-12/lib/libLLVM-12.so.1+0xb35c09)
 #7 0x00007f085e12fa26 (/usr/lib/llvm-12/lib/libLLVM-12.so.1+0xb35a26)
 #8 0x00007f085ad88a2a EnzymeLogic::CreatePrimalAndGradient(llvm::Function*, DIFFE_TYPE, std::vector<DIFFE_TYPE, std::allocator<DIFFE_TYPE> > const&, llvm::TargetLibraryInfo&, TypeAnalysis&, bool, bool, DerivativeMode, llvm::Type*, FnTypeInfo const&, std::map<llvm::Argument*, bool, std::less<llvm::Argument*>, std::allocator<std::pair<llvm::Argument* const, bool> > >, AugmentedReturn const*, bool, bool, bool) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x58aa2a)
 #9 0x00007f085ad57ddf (anonymous namespace)::Enzyme::HandleAutoDiff(llvm::CallInst*, llvm::TargetLibraryInfo&, bool, DerivativeMode) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x559ddf)
#10 0x00007f085ad5c593 (anonymous namespace)::Enzyme::lowerEnzymeCalls(llvm::Function&, bool, bool&, std::set<llvm::Function*, std::less<llvm::Function*>, std::allocator<llvm::Function*> >&) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x55e593)
#11 0x00007f085ad5e6d6 (anonymous namespace)::Enzyme::runOnModule(llvm::Module&) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x5606d6)
#12 0x00007f085e2fc4ff llvm::legacy::PassManagerImpl::run(llvm::Module&) (/usr/lib/llvm-12/lib/libLLVM-12.so.1+0xd024ff)
#13 0x0000000000431dfb main (/usr/lib/llvm-12/bin/opt+0x431dfb)
#14 0x00007f085d0bb0b3 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b3)
#15 0x000000000041e68e _start (/usr/lib/llvm-12/bin/opt+0x41e68e)
/usr/lib/llvm-12/bin/lli: error: 'main' function not found in module.

--

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

********************
FAIL: Enzyme :: Integration/ReverseMode/eigensumsqdyn-notmp.cpp (11 of 65)
******************** TEST 'Enzyme :: Integration/ReverseMode/eigensumsqdyn-notmp.cpp' FAILED ********************
Script:
--
: 'RUN: at line 1';   /usr/lib/llvm-12/bin/clang++ -mllvm -force-vector-width=1 -ffast-math -fno-unroll-loops -fno-vectorize -fno-slp-vectorize -fno-exceptions -O3 /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/eigensumsqdyn-notmp.cpp -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -S | /usr/lib/llvm-12/bin/lli -
: 'RUN: at line 2';   /usr/lib/llvm-12/bin/clang++ -fno-unroll-loops -fno-vectorize -fno-slp-vectorize -fno-exceptions -O2 /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/eigensumsqdyn-notmp.cpp -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -S | /usr/lib/llvm-12/bin/lli -
: 'RUN: at line 3';   /usr/lib/llvm-12/bin/clang++ -fno-unroll-loops -fno-vectorize -fno-slp-vectorize -fno-exceptions -O1 /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/eigensumsqdyn-notmp.cpp -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -S | /usr/lib/llvm-12/bin/lli -
: 'RUN: at line 5';   /usr/lib/llvm-12/bin/clang++ -fno-unroll-loops -fno-vectorize -fno-slp-vectorize -fno-exceptions -O1 -Xclang -disable-llvm-optzns /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/eigensumsqdyn-notmp.cpp -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -S | /usr/lib/llvm-12/bin/lli -
: 'RUN: at line 6';   /usr/lib/llvm-12/bin/clang++ -fno-unroll-loops -fno-vectorize -fno-slp-vectorize -fno-exceptions -O3 /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/eigensumsqdyn-notmp.cpp -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -enzyme-inline=1 -S | /usr/lib/llvm-12/bin/lli -
: 'RUN: at line 7';   /usr/lib/llvm-12/bin/clang++ -fno-unroll-loops -fno-vectorize -fno-slp-vectorize -fno-exceptions -O2 /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/eigensumsqdyn-notmp.cpp -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -enzyme-inline=1 -S | /usr/lib/llvm-12/bin/lli -
: 'RUN: at line 8';   /usr/lib/llvm-12/bin/clang++ -fno-unroll-loops -fno-vectorize -fno-slp-vectorize -fno-exceptions -O1 /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/eigensumsqdyn-notmp.cpp -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -enzyme-inline=1 -S | /usr/lib/llvm-12/bin/lli -
--
Exit Code: 255

Command Output (stderr):
--
freeing without malloc   %45 = load i8*, i8** %44, align 8, !tbaa !17
freeing without malloc   %44 = load i8*, i8** %43, align 8, !tbaa !8
freeing without malloc   %44 = load i8*, i8** %43, align 8, !tbaa !8
freeing without malloc   %66 = load i8*, i8** %65, align 8, !tbaa !3
freeing without malloc   %156 = load i8*, i8** %155, align 8, !tbaa !3
freeing without malloc   %154 = load i8*, i8** %153, align 8, !tbaa !3
freeing without malloc   %79 = load i8*, i8** %78, align 8, !tbaa !23
freeing without malloc   %77 = load i8*, i8** %76, align 8, !tbaa !23
freeing without malloc   %75 = load i8*, i8** %74, align 8, !tbaa !25
freeing without malloc   %72 = load i8*, i8** %71, align 8, !tbaa !24
freeing without malloc   %76 = select i1 %75, double* %74, double* null
freeing without malloc   %54 = select i1 %53, double* %52, double* null
freeing without malloc   %45 = load i8*, i8** %44, align 8, !tbaa !12
freeing without malloc   %44 = load i8*, i8** %43, align 8, !tbaa !8
freeing without malloc   %38 = load i8*, i8** %37, align 8, !tbaa !14
freeing without malloc   %45 = load i8*, i8** %44, align 8, !tbaa !17
freeing without malloc   %44 = load i8*, i8** %43, align 8, !tbaa !8
freeing without malloc   %44 = load i8*, i8** %43, align 8, !tbaa !8
freeing without malloc   %66 = load i8*, i8** %65, align 8, !tbaa !3
freeing without malloc   %156 = load i8*, i8** %155, align 8, !tbaa !3
freeing without malloc   %154 = load i8*, i8** %153, align 8, !tbaa !3
freeing without malloc   %79 = load i8*, i8** %78, align 8, !tbaa !23
freeing without malloc   %77 = load i8*, i8** %76, align 8, !tbaa !23
freeing without malloc   %75 = load i8*, i8** %74, align 8, !tbaa !25
freeing without malloc   %72 = load i8*, i8** %71, align 8, !tbaa !24
freeing without malloc   %76 = select i1 %75, double* %74, double* null
freeing without malloc   %54 = select i1 %53, double* %52, double* null
freeing without malloc   %45 = load i8*, i8** %44, align 8, !tbaa !12
freeing without malloc   %44 = load i8*, i8** %43, align 8, !tbaa !8
freeing without malloc   %38 = load i8*, i8** %37, align 8, !tbaa !14
freeing without malloc   %70 = load i8*, i8** %69, align 8, !tbaa !23
Instruction does not dominate all uses!
  %"'ipg23" = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %"'ipa22", i64 0, i32 0, i32 0, i32 0, i32 0, i32 0
  %"'il_phi_unwrap" = load double*, double** %"'ipg23", align 8, !tbaa !43
; Function Attrs: noinline nounwind uwtable
define internal double @preprocess__ZL6matvecPKN5Eigen6MatrixIdLin1ELin1ELi0ELin1ELin1EEES3_(%"class.Eigen::Matrix"* noalias %0, %"class.Eigen::Matrix"* noalias %1) #4 {
  %3 = alloca %"class.Eigen::internal::redux_evaluator", align 8
  %4 = alloca %"class.Eigen::Product", align 8
  %5 = bitcast %"class.Eigen::Product"* %4 to i8*
  call void @llvm.lifetime.start.p0i8(i64 48, i8* nonnull %5) #19
  %6 = getelementptr inbounds %"class.Eigen::Product", %"class.Eigen::Product"* %4, i64 0, i32 0, i32 0
  store %"class.Eigen::Matrix"* %0, %"class.Eigen::Matrix"** %6, align 8
  %7 = getelementptr inbounds %"class.Eigen::Product", %"class.Eigen::Product"* %4, i64 0, i32 0, i32 1
  store %"class.Eigen::Matrix"* %1, %"class.Eigen::Matrix"** %7, align 8
  %8 = getelementptr inbounds %"class.Eigen::Product", %"class.Eigen::Product"* %4, i64 0, i32 1, i32 0
  store %"class.Eigen::Matrix"* %0, %"class.Eigen::Matrix"** %8, align 8
  %9 = getelementptr inbounds %"class.Eigen::Product", %"class.Eigen::Product"* %4, i64 0, i32 1, i32 1
  store %"class.Eigen::Matrix"* %1, %"class.Eigen::Matrix"** %9, align 8
  %10 = getelementptr inbounds %"class.Eigen::Matrix", %"class.Eigen::Matrix"* %1, i64 0, i32 0, i32 0, i32 1
  %11 = load i64, i64* %10, align 8, !tbaa !36
  %12 = bitcast %"class.Eigen::Matrix"** %9 to %"class.Eigen::PlainObjectBase"**
  %13 = getelementptr inbounds %"class.Eigen::Matrix", %"class.Eigen::Matrix"* %1, i64 0, i32 0, i32 0, i32 2
  %14 = load i64, i64* %13, align 8, !tbaa !42
  %15 = mul nsw i64 %14, %11
  %16 = icmp eq i64 %15, 0
  br i1 %16, label %71, label %17

17:                                               ; preds = %2
  %18 = bitcast %"class.Eigen::Matrix"** %7 to %"class.Eigen::PlainObjectBase"**
  %19 = bitcast %"class.Eigen::internal::redux_evaluator"* %3 to i8*
  call void @llvm.lifetime.start.p0i8(i64 48, i8* nonnull %19) #19
  %20 = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %3, i64 0, i32 0, i32 0
  call void @_ZN5Eigen8internal17product_evaluatorINS_7ProductINS_13CwiseBinaryOpINS0_20scalar_difference_opIddEEKNS_6MatrixIdLin1ELin1ELi0ELin1ELin1EEES8_EES9_Li0EEELi8ENS_10DenseShapeESB_ddEC2ERKSA_(%"struct.Eigen::internal::product_evaluator"* nonnull dereferenceable(40) %20, %"class.Eigen::Product"* nonnull align 8 dereferenceable(48) %4) #19
  %21 = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %3, i64 0, i32 1
  store %"class.Eigen::Product"* %4, %"class.Eigen::Product"** %21, align 8, !tbaa !38
  %22 = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %3, i64 0, i32 0, i32 0, i32 0, i32 0, i32 0
  %23 = load double*, double** %22, align 8, !tbaa !43
  %24 = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %3, i64 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 0
  %25 = load double, double* %23, align 8, !tbaa !37
  %26 = load %"class.Eigen::PlainObjectBase"*, %"class.Eigen::PlainObjectBase"** %18, align 8, !tbaa !45
  %27 = getelementptr inbounds %"class.Eigen::PlainObjectBase", %"class.Eigen::PlainObjectBase"* %26, i64 0, i32 0, i32 1
  %28 = load i64, i64* %27, align 8, !tbaa !36
  %29 = icmp sgt i64 %28, 1
  br i1 %29, label %.preheader, label %30

.preheader:                                       ; preds = %17
  br label %58

.loopexit1:                                       ; preds = %58
  br label %30

30:                                               ; preds = %.loopexit1, %17
  %31 = phi double [ %25, %17 ], [ %63, %.loopexit1 ]
  %32 = load %"class.Eigen::PlainObjectBase"*, %"class.Eigen::PlainObjectBase"** %12, align 8, !tbaa !45
  %33 = getelementptr inbounds %"class.Eigen::PlainObjectBase", %"class.Eigen::PlainObjectBase"* %32, i64 0, i32 0, i32 2
  %34 = load i64, i64* %33, align 8, !tbaa !42
  %35 = icmp sgt i64 %34, 1
  %36 = icmp sgt i64 %28, 0
  %37 = load i64, i64* %24, align 8
  %38 = and i1 %36, %35
  br i1 %38, label %39, label %66

39:                                               ; preds = %30
  %40 = icmp sgt i64 %34, 2
  %41 = select i1 %40, i64 %34, i64 2
  br label %42

42:                                               ; preds = %55, %39
  %tiv = phi i64 [ %tiv.next, %55 ], [ 0, %39 ]
  %43 = phi double [ %52, %55 ], [ %31, %39 ]
  %44 = add i64 %tiv, 1
  %tiv.next = add nuw nsw i64 %tiv, 1
  %45 = mul nsw i64 %44, %37
  br label %46

46:                                               ; preds = %46, %42
  %47 = phi i64 [ 0, %42 ], [ %53, %46 ]
  %48 = phi double [ %43, %42 ], [ %52, %46 ]
  %49 = add nsw i64 %47, %45
  %50 = getelementptr inbounds double, double* %23, i64 %49
  %51 = load double, double* %50, align 8, !tbaa !37
  %52 = fadd fast double %51, %48
  %53 = add nuw nsw i64 %47, 1
  %54 = icmp eq i64 %53, %28
  br i1 %54, label %55, label %46, !llvm.loop !48

55:                                               ; preds = %46
  %56 = add nuw nsw i64 %44, 1
  %57 = icmp eq i64 %56, %41
  br i1 %57, label %.loopexit, label %42, !llvm.loop !49

58:                                               ; preds = %.preheader, %58
  %tiv2 = phi i64 [ 0, %.preheader ], [ %tiv.next3, %58 ]
  %59 = phi double [ %63, %58 ], [ %25, %.preheader ]
  %60 = add i64 %tiv2, 1
  %tiv.next3 = add nuw nsw i64 %tiv2, 1
  %61 = getelementptr inbounds double, double* %23, i64 %60
  %62 = load double, double* %61, align 8, !tbaa !37
  %63 = fadd fast double %62, %59
  %64 = add nuw nsw i64 %60, 1
  %65 = icmp eq i64 %64, %28
  br i1 %65, label %.loopexit1, label %58, !llvm.loop !50

.loopexit:                                        ; preds = %55
  br label %66

66:                                               ; preds = %.loopexit, %30
  %67 = phi double [ %31, %30 ], [ %52, %.loopexit ]
  %68 = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %3, i64 0, i32 0, i32 0, i32 1, i32 0
  %69 = bitcast %"class.Eigen::PlainObjectBase"* %68 to i8**
  %70 = load i8*, i8** %69, align 8, !tbaa !33
  call void @free(i8* %70) #19
  call void @llvm.lifetime.end.p0i8(i64 48, i8* nonnull %19) #19
  br label %71

71:                                               ; preds = %66, %2
  %72 = phi double [ %67, %66 ], [ 0.000000e+00, %2 ]
  call void @llvm.lifetime.end.p0i8(i64 48, i8* nonnull %5) #19
  ret double %72
}

; Function Attrs: noinline nounwind uwtable
define internal void @diffe_ZL6matvecPKN5Eigen6MatrixIdLin1ELin1ELi0ELin1ELin1EEES3_(%"class.Eigen::Matrix"* noalias %0, %"class.Eigen::Matrix"* %"'", %"class.Eigen::Matrix"* noalias %1, %"class.Eigen::Matrix"* %"'1", double %differeturn) #4 {
  %"iv'ac" = alloca i64, align 8
  %"iv13'ac" = alloca i64, align 8
  %"iv15'ac" = alloca i64, align 8
  %"'de" = alloca double, align 8
  store double 0.000000e+00, double* %"'de", align 8
  %"'de21" = alloca double, align 8
  store double 0.000000e+00, double* %"'de21", align 8
  %_augmented_cache = alloca { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, double*, i8*, i8*, i8*, i8*, { double*, double*, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, double**, double**, i64, i64, i64, i1, i1, i64*, i64*, double**, double**, i64*, double**, double**, double**, double** }, { i8*, i8*, i8*, i8*, i8*, i8*, { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, { double*, i64, i64* }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double*, double*, i64, i64*, i64, i64* }*, { double*, i64, i64* }*, i64, i64, i64, double*, double* }, double*, double*, double*, { i8*, i8*, i8*, i8*, i8*, i8*, { { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i8*, i1*, i8*, i1 }, i32*, i32* }, i1, i1, i64, i64, i64, i64, i1, i1, i64, i64, i64, i64 }, { i8*, i8*, i8*, i8*, i8*, i8*, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i64, i64, i1 }, { i8*, i8*, i8*, i8*, i8*, i8*, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i64, i64, i1 }, i1, i1, i1, double, i64, i64, i64, double*, i64, double*, i64, double*, i64 }, { i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i1, i64 }, align 8
  %"'de36" = alloca double, align 8
  store double 0.000000e+00, double* %"'de36", align 8
  %"'de37" = alloca double, align 8
  store double 0.000000e+00, double* %"'de37", align 8
  %"'de45" = alloca double, align 8
  store double 0.000000e+00, double* %"'de45", align 8
  %"'de46" = alloca double, align 8
  store double 0.000000e+00, double* %"'de46", align 8
  %"'de49" = alloca double, align 8
  store double 0.000000e+00, double* %"'de49", align 8
  %"'de50" = alloca double, align 8
  store double 0.000000e+00, double* %"'de50", align 8
  %"'de66" = alloca double, align 8
  store double 0.000000e+00, double* %"'de66", align 8
  %"'de67" = alloca double, align 8
  store double 0.000000e+00, double* %"'de67", align 8
  %"'de85" = alloca double, align 8
  store double 0.000000e+00, double* %"'de85", align 8
  %"'ipa22" = alloca %"class.Eigen::internal::redux_evaluator", align 8
  store %"class.Eigen::internal::redux_evaluator" zeroinitializer, %"class.Eigen::internal::redux_evaluator"* %"'ipa22", align 8
  %3 = alloca %"class.Eigen::internal::redux_evaluator", align 8
  %"'ipa" = alloca %"class.Eigen::Product", align 8
  store %"class.Eigen::Product" zeroinitializer, %"class.Eigen::Product"* %"'ipa", align 8
  %4 = alloca %"class.Eigen::Product", align 8
  %"'ipg20" = getelementptr inbounds %"class.Eigen::Product", %"class.Eigen::Product"* %"'ipa", i64 0, i32 0, i32 0
  %5 = getelementptr inbounds %"class.Eigen::Product", %"class.Eigen::Product"* %4, i64 0, i32 0, i32 0
  store %"class.Eigen::Matrix"* %"'", %"class.Eigen::Matrix"** %"'ipg20", align 8
  store %"class.Eigen::Matrix"* %0, %"class.Eigen::Matrix"** %5, align 8
  %"'ipg19" = getelementptr inbounds %"class.Eigen::Product", %"class.Eigen::Product"* %"'ipa", i64 0, i32 0, i32 1
  %6 = getelementptr inbounds %"class.Eigen::Product", %"class.Eigen::Product"* %4, i64 0, i32 0, i32 1
  store %"class.Eigen::Matrix"* %"'1", %"class.Eigen::Matrix"** %"'ipg19", align 8
  store %"class.Eigen::Matrix"* %1, %"class.Eigen::Matrix"** %6, align 8
  %"'ipg18" = getelementptr inbounds %"class.Eigen::Product", %"class.Eigen::Product"* %"'ipa", i64 0, i32 1, i32 0
  %7 = getelementptr inbounds %"class.Eigen::Product", %"class.Eigen::Product"* %4, i64 0, i32 1, i32 0
  store %"class.Eigen::Matrix"* %"'", %"class.Eigen::Matrix"** %"'ipg18", align 8
  store %"class.Eigen::Matrix"* %0, %"class.Eigen::Matrix"** %7, align 8
  %"'ipg" = getelementptr inbounds %"class.Eigen::Product", %"class.Eigen::Product"* %"'ipa", i64 0, i32 1, i32 1
  %8 = getelementptr inbounds %"class.Eigen::Product", %"class.Eigen::Product"* %4, i64 0, i32 1, i32 1
  store %"class.Eigen::Matrix"* %"'1", %"class.Eigen::Matrix"** %"'ipg", align 8
  store %"class.Eigen::Matrix"* %1, %"class.Eigen::Matrix"** %8, align 8
  %9 = getelementptr inbounds %"class.Eigen::Matrix", %"class.Eigen::Matrix"* %1, i64 0, i32 0, i32 0, i32 1
  %10 = load i64, i64* %9, align 8, !tbaa !36
  %11 = bitcast %"class.Eigen::Matrix"** %8 to %"class.Eigen::PlainObjectBase"**
  %12 = getelementptr inbounds %"class.Eigen::Matrix", %"class.Eigen::Matrix"* %1, i64 0, i32 0, i32 0, i32 2
  %13 = load i64, i64* %12, align 8, !tbaa !42
  %14 = mul nsw i64 %13, %10
  %15 = icmp eq i64 %14, 0
  br i1 %15, label %51, label %16

16:                                               ; preds = %2
  %17 = bitcast %"class.Eigen::Matrix"** %6 to %"class.Eigen::PlainObjectBase"**
  %"'ipg28" = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %"'ipa22", i64 0, i32 0, i32 0
  %18 = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %3, i64 0, i32 0, i32 0
  %_augmented = call { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, double*, i8*, i8*, i8*, i8*, { double*, double*, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, double**, double**, i64, i64, i64, i1, i1, i64*, i64*, double**, double**, i64*, double**, double**, double**, double** }, { i8*, i8*, i8*, i8*, i8*, i8*, { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, { double*, i64, i64* }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double*, double*, i64, i64*, i64, i64* }*, { double*, i64, i64* }*, i64, i64, i64, double*, double* }, double*, double*, double*, { i8*, i8*, i8*, i8*, i8*, i8*, { { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i8*, i1*, i8*, i1 }, i32*, i32* }, i1, i1, i64, i64, i64, i64, i1, i1, i64, i64, i64, i64 }, { i8*, i8*, i8*, i8*, i8*, i8*, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i64, i64, i1 }, { i8*, i8*, i8*, i8*, i8*, i8*, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i64, i64, i1 }, i1, i1, i1, double, i64, i64, i64, double*, i64, double*, i64, double*, i64 }, { i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i1, i64 } @augmented__ZN5Eigen8internal17product_evaluatorINS_7ProductINS_13CwiseBinaryOpINS0_20scalar_difference_opIddEEKNS_6MatrixIdLin1ELin1ELi0ELin1ELin1EEES8_EES9_Li0EEELi8ENS_10DenseShapeESB_ddEC2ERKSA_(%"struct.Eigen::internal::product_evaluator"* %18, %"struct.Eigen::internal::product_evaluator"* %"'ipg28", %"class.Eigen::Product"* %4, %"class.Eigen::Product"* %"'ipa")
  %"'ipg27" = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %"'ipa22", i64 0, i32 1
  %19 = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %3, i64 0, i32 1
  store %"class.Eigen::Product"* %"'ipa", %"class.Eigen::Product"** %"'ipg27", align 8
  store { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, double*, i8*, i8*, i8*, i8*, { double*, double*, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, double**, double**, i64, i64, i64, i1, i1, i64*, i64*, double**, double**, i64*, double**, double**, double**, double** }, { i8*, i8*, i8*, i8*, i8*, i8*, { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, { double*, i64, i64* }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double*, double*, i64, i64*, i64, i64* }*, { double*, i64, i64* }*, i64, i64, i64, double*, double* }, double*, double*, double*, { i8*, i8*, i8*, i8*, i8*, i8*, { { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i8*, i1*, i8*, i1 }, i32*, i32* }, i1, i1, i64, i64, i64, i64, i1, i1, i64, i64, i64, i64 }, { i8*, i8*, i8*, i8*, i8*, i8*, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i64, i64, i1 }, { i8*, i8*, i8*, i8*, i8*, i8*, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i64, i64, i1 }, i1, i1, i1, double, i64, i64, i64, double*, i64, double*, i64, double*, i64 }, { i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i1, i64 } %_augmented, { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, double*, i8*, i8*, i8*, i8*, { double*, double*, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, double**, double**, i64, i64, i64, i1, i1, i64*, i64*, double**, double**, i64*, double**, double**, double**, double** }, { i8*, i8*, i8*, i8*, i8*, i8*, { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, { double*, i64, i64* }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double*, double*, i64, i64*, i64, i64* }*, { double*, i64, i64* }*, i64, i64, i64, double*, double* }, double*, double*, double*, { i8*, i8*, i8*, i8*, i8*, i8*, { { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i8*, i1*, i8*, i1 }, i32*, i32* }, i1, i1, i64, i64, i64, i64, i1, i1, i64, i64, i64, i64 }, { i8*, i8*, i8*, i8*, i8*, i8*, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i64, i64, i1 }, { i8*, i8*, i8*, i8*, i8*, i8*, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i64, i64, i1 }, i1, i1, i1, double, i64, i64, i64, double*, i64, double*, i64, double*, i64 }, { i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i1, i64 }* %_augmented_cache, align 8, !invariant.group !180
  store %"class.Eigen::Product"* %4, %"class.Eigen::Product"** %19, align 8, !tbaa !38
  %"'ipg23" = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %"'ipa22", i64 0, i32 0, i32 0, i32 0, i32 0, i32 0
  %"'ipl" = load double*, double** %"'ipg23", align 8, !invariant.group !181
  %20 = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %3, i64 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 0
  %21 = load %"class.Eigen::PlainObjectBase"*, %"class.Eigen::PlainObjectBase"** %17, align 8, !tbaa !45, !invariant.group !182
  %22 = getelementptr inbounds %"class.Eigen::PlainObjectBase", %"class.Eigen::PlainObjectBase"* %21, i64 0, i32 0, i32 1
  %23 = load i64, i64* %22, align 8, !tbaa !36, !invariant.group !183
  %24 = icmp sgt i64 %23, 1
  br i1 %24, label %.preheader, label %26

.preheader:                                       ; preds = %16
  %25 = add i64 %23, -2
  br label %47

.loopexit1:                                       ; preds = %47
  br label %26

26:                                               ; preds = %.loopexit1, %16
  %27 = load %"class.Eigen::PlainObjectBase"*, %"class.Eigen::PlainObjectBase"** %11, align 8, !tbaa !45, !invariant.group !184
  %28 = getelementptr inbounds %"class.Eigen::PlainObjectBase", %"class.Eigen::PlainObjectBase"* %27, i64 0, i32 0, i32 2
  %29 = load i64, i64* %28, align 8, !tbaa !42, !invariant.group !185
  %30 = icmp sgt i64 %29, 1
  %31 = icmp sgt i64 %23, 0
  %32 = load i64, i64* %20, align 8, !invariant.group !186
  %33 = and i1 %31, %30
  br i1 %33, label %34, label %50

34:                                               ; preds = %26
  %35 = icmp sgt i64 %29, 2
  %36 = select i1 %35, i64 %29, i64 2
  %37 = add nsw i64 %36, -2
  %38 = add i64 %23, -1
  br label %39

39:                                               ; preds = %44, %34
  %iv = phi i64 [ %iv.next, %44 ], [ 0, %34 ]
  %iv.next = add nuw nsw i64 %iv, 1
  %40 = mul nsw i64 %iv.next, %32
  br label %41

41:                                               ; preds = %41, %39
  %iv13 = phi i64 [ %iv.next14, %41 ], [ 0, %39 ]
  %iv.next14 = add nuw nsw i64 %iv13, 1
  %42 = add nsw i64 %iv13, %40
  %"'ipg51" = getelementptr inbounds double, double* %"'ipl", i64 %42
  %43 = icmp eq i64 %iv.next14, %23
  br i1 %43, label %44, label %41, !llvm.loop !48

44:                                               ; preds = %41
  %45 = add nuw nsw i64 %iv.next, 1
  %46 = icmp eq i64 %45, %36
  br i1 %46, label %.loopexit, label %39, !llvm.loop !49

47:                                               ; preds = %47, %.preheader
  %iv15 = phi i64 [ %iv.next16, %47 ], [ 0, %.preheader ]
  %iv.next16 = add nuw nsw i64 %iv15, 1
  %"'ipg68" = getelementptr inbounds double, double* %"'ipl", i64 %iv.next16
  %48 = add nuw nsw i64 %iv.next16, 1
  %49 = icmp eq i64 %48, %23
  br i1 %49, label %.loopexit1, label %47, !llvm.loop !50

.loopexit:                                        ; preds = %44
  br label %50

50:                                               ; preds = %.loopexit, %26
  br label %51

51:                                               ; preds = %50, %2
  br label %invert10

invert:                                           ; preds = %invert10, %invert2
  ret void

invert2:                                          ; preds = %invert3, %invert.preheader
  %52 = load double, double* %"'de21", align 8
  store double 0.000000e+00, double* %"'de21", align 8
  %"'il_phi_unwrap" = load double*, double** %"'ipg23", align 8, !tbaa !43
  %53 = load double, double* %"'il_phi_unwrap", align 8
  %54 = fadd fast double %53, %52
  store double %54, double* %"'il_phi_unwrap", align 8
  %_unwrap = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %3, i64 0, i32 0, i32 0
  %"'ipg28_unwrap" = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %"'ipa22", i64 0, i32 0, i32 0
  %55 = load { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, double*, i8*, i8*, i8*, i8*, { double*, double*, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, double**, double**, i64, i64, i64, i1, i1, i64*, i64*, double**, double**, i64*, double**, double**, double**, double** }, { i8*, i8*, i8*, i8*, i8*, i8*, { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, { double*, i64, i64* }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double*, double*, i64, i64*, i64, i64* }*, { double*, i64, i64* }*, i64, i64, i64, double*, double* }, double*, double*, double*, { i8*, i8*, i8*, i8*, i8*, i8*, { { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i8*, i1*, i8*, i1 }, i32*, i32* }, i1, i1, i64, i64, i64, i64, i1, i1, i64, i64, i64, i64 }, { i8*, i8*, i8*, i8*, i8*, i8*, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i64, i64, i1 }, { i8*, i8*, i8*, i8*, i8*, i8*, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i64, i64, i1 }, i1, i1, i1, double, i64, i64, i64, double*, i64, double*, i64, double*, i64 }, { i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i1, i64 }, { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, double*, i8*, i8*, i8*, i8*, { double*, double*, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, double**, double**, i64, i64, i64, i1, i1, i64*, i64*, double**, double**, i64*, double**, double**, double**, double** }, { i8*, i8*, i8*, i8*, i8*, i8*, { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, { double*, i64, i64* }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double*, double*, i64, i64*, i64, i64* }*, { double*, i64, i64* }*, i64, i64, i64, double*, double* }, double*, double*, double*, { i8*, i8*, i8*, i8*, i8*, i8*, { { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i8*, i1*, i8*, i1 }, i32*, i32* }, i1, i1, i64, i64, i64, i64, i1, i1, i64, i64, i64, i64 }, { i8*, i8*, i8*, i8*, i8*, i8*, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i64, i64, i1 }, { i8*, i8*, i8*, i8*, i8*, i8*, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i64, i64, i1 }, i1, i1, i1, double, i64, i64, i64, double*, i64, double*, i64, double*, i64 }, { i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i1, i64 }* %_augmented_cache, align 8, !invariant.group !180
  call void @diffe_ZN5Eigen8internal17product_evaluatorINS_7ProductINS_13CwiseBinaryOpINS0_20scalar_difference_opIddEEKNS_6MatrixIdLin1ELin1ELi0ELin1ELin1EEES8_EES9_Li0EEELi8ENS_10DenseShapeESB_ddEC2ERKSA_(%"struct.Eigen::internal::product_evaluator"* %_unwrap, %"struct.Eigen::internal::product_evaluator"* %"'ipg28_unwrap", %"class.Eigen::Product"* %4, %"class.Eigen::Product"* %"'ipa", { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, double*, i8*, i8*, i8*, i8*, { double*, double*, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, double**, double**, i64, i64, i64, i1, i1, i64*, i64*, double**, double**, i64*, double**, double**, double**, double** }, { i8*, i8*, i8*, i8*, i8*, i8*, { i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, i8*, double*, i8*, i8*, i8*, i8*, { double*, i64, i64* }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double**, double**, double**, i64*, double*, double*, double*, double**, double**, double**, double**, <8 x double>*, <8 x double>*, i64*, double**, double**, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, double*, <4 x double>*, <4 x double>*, double**, double**, double*, <4 x double>*, i64*, double*, double*, double*, double**, double** }*, { double*, double*, i64, i64*, i64, i64* }*, { double*, i64, i64* }*, i64, i64, i64, double*, double* }, double*, double*, double*, { i8*, i8*, i8*, i8*, i8*, i8*, { { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i32, i32, i32, i32 }, { i8*, i1*, i8*, i1 }, i32*, i32* }, i1, i1, i64, i64, i64, i64, i1, i1, i64, i64, i64, i64 }, { i8*, i8*, i8*, i8*, i8*, i8*, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i64, i64, i1 }, { i8*, i8*, i8*, i8*, i8*, i8*, { double*, %"class.Eigen::Matrix"*, double*, %"class.Eigen::Matrix"*, i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i64, i64, i1 }, i1, i1, i1, double, i64, i64, i64, double*, i64, double*, i64, double*, i64 }, { i8*, i8*, i8*, i8*, i8*, double*, i64, i64, i64, i1, i1 }, i64, i64, i1, i64 } %55)
  br label %invert

invert.preheader:                                 ; preds = %invert8
  br label %invert2

invert.loopexit1:                                 ; preds = %invert3
  %_unwrap30 = bitcast %"class.Eigen::Matrix"** %6 to %"class.Eigen::PlainObjectBase"**
  %_unwrap31 = load %"class.Eigen::PlainObjectBase"*, %"class.Eigen::PlainObjectBase"** %_unwrap30, align 8, !tbaa !45, !invariant.group !182
  %_unwrap32 = getelementptr inbounds %"class.Eigen::PlainObjectBase", %"class.Eigen::PlainObjectBase"* %_unwrap31, i64 0, i32 0, i32 1
  %_unwrap33 = load i64, i64* %_unwrap32, align 8, !tbaa !36, !invariant.group !183
  %_unwrap34 = add i64 %_unwrap33, -2
  br label %mergeinvert8_.loopexit1

mergeinvert8_.loopexit1:                          ; preds = %invert.loopexit1
  store i64 %_unwrap34, i64* %"iv15'ac", align 8
  br label %invert8

invert3:                                          ; preds = %invert9, %invert4
  %56 = load double, double* %"'de36", align 8
  store double 0.000000e+00, double* %"'de36", align 8
  %_unwrap39 = bitcast %"class.Eigen::Matrix"** %6 to %"class.Eigen::PlainObjectBase"**
  %_unwrap40 = load %"class.Eigen::PlainObjectBase"*, %"class.Eigen::PlainObjectBase"** %_unwrap39, align 8, !tbaa !45, !invariant.group !182
  %_unwrap41 = getelementptr inbounds %"class.Eigen::PlainObjectBase", %"class.Eigen::PlainObjectBase"* %_unwrap40, i64 0, i32 0, i32 1
  %_unwrap42 = load i64, i64* %_unwrap41, align 8, !tbaa !36, !invariant.group !183
  %_unwrap43 = icmp sgt i64 %_unwrap42, 1
  %57 = xor i1 %_unwrap43, true
  %58 = select fast i1 %_unwrap43, double %56, double 0.000000e+00
  %59 = load double, double* %"'de37", align 8
  %60 = fadd fast double %59, %56
  %61 = select fast i1 %_unwrap43, double %60, double %59
  store double %61, double* %"'de37", align 8
  %62 = select fast i1 %57, double %56, double 0.000000e+00
  %63 = load double, double* %"'de21", align 8
  %64 = fadd fast double %63, %56
  %65 = select fast i1 %_unwrap43, double %63, double %64
  store double %65, double* %"'de21", align 8
  br i1 %_unwrap43, label %invert.loopexit1, label %invert2

invert4:                                          ; preds = %invert5
  br label %invert3

invert5:                                          ; preds = %invert6
  %66 = load double, double* %"'de45", align 8
  store double 0.000000e+00, double* %"'de45", align 8
  %67 = load i64, i64* %"iv'ac", align 8
  %68 = icmp eq i64 %67, 0
  %69 = xor i1 %68, true
  %70 = select fast i1 %69, double %66, double 0.000000e+00
  %71 = load double, double* %"'de46", align 8
  %72 = fadd fast double %71, %66
  %73 = select fast i1 %68, double %71, double %72
  store double %73, double* %"'de46", align 8
  %74 = select fast i1 %68, double %66, double 0.000000e+00
  %75 = load double, double* %"'de36", align 8
  %76 = fadd fast double %75, %66
  %77 = select fast i1 %68, double %76, double %75
  store double %77, double* %"'de36", align 8
  br i1 %68, label %invert4, label %incinvert5

incinvert5:                                       ; preds = %invert5
  %78 = load i64, i64* %"iv'ac", align 8
  %79 = add nsw i64 %78, -1
  store i64 %79, i64* %"iv'ac", align 8
  br label %invert7

invert6:                                          ; preds = %mergeinvert6_, %incinvert6
  %80 = load double, double* %"'de46", align 8
  store double 0.000000e+00, double* %"'de46", align 8
  %81 = load double, double* %"'de49", align 8
  %82 = fadd fast double %81, %80
  store double %82, double* %"'de49", align 8
  %83 = load double, double* %"'de50", align 8
  %84 = fadd fast double %83, %80
  store double %84, double* %"'de50", align 8
  %85 = load double, double* %"'de49", align 8
  store double 0.000000e+00, double* %"'de49", align 8
  %86 = load i64, i64* %"iv13'ac", align 8
  %87 = load i64, i64* %"iv'ac", align 8
  %"'ipg23_unwrap" = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %"'ipa22", i64 0, i32 0, i32 0, i32 0, i32 0, i32 0
  %"'ipl_unwrap" = load double*, double** %"'ipg23_unwrap", align 8, !invariant.group !181
  %iv.next_unwrap = add nuw nsw i64 %87, 1
  %_unwrap52 = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %3, i64 0, i32 0, i32 0, i32 0, i32 0, i32 1, i32 0
  %_unwrap53 = load i64, i64* %_unwrap52, align 8, !invariant.group !186
  %_unwrap54 = mul nsw i64 %iv.next_unwrap, %_unwrap53
  %_unwrap55 = add nsw i64 %86, %_unwrap54
  %"'ipg51_unwrap" = getelementptr inbounds double, double* %"'ipl_unwrap", i64 %_unwrap55
  %88 = load double, double* %"'ipg51_unwrap", align 8
  %89 = fadd fast double %88, %85
  store double %89, double* %"'ipg51_unwrap", align 8
  %90 = load double, double* %"'de50", align 8
  store double 0.000000e+00, double* %"'de50", align 8
  %91 = load i64, i64* %"iv13'ac", align 8
  %92 = icmp eq i64 %91, 0
  %93 = xor i1 %92, true
  %94 = select fast i1 %93, double %90, double 0.000000e+00
  %95 = load double, double* %"'de46", align 8
  %96 = fadd fast double %95, %90
  %97 = select fast i1 %92, double %95, double %96
  store double %97, double* %"'de46", align 8
  %98 = select fast i1 %92, double %90, double 0.000000e+00
  %99 = load double, double* %"'de45", align 8
  %100 = fadd fast double %99, %90
  %101 = select fast i1 %92, double %100, double %99
  store double %101, double* %"'de45", align 8
  br i1 %92, label %invert5, label %incinvert6

incinvert6:                                       ; preds = %invert6
  %102 = load i64, i64* %"iv13'ac", align 8
  %103 = add nsw i64 %102, -1
  store i64 %103, i64* %"iv13'ac", align 8
  br label %invert6

invert7:                                          ; preds = %mergeinvert5_.loopexit, %incinvert5
  %104 = load i64, i64* %"iv'ac", align 8
  %_unwrap60 = bitcast %"class.Eigen::Matrix"** %6 to %"class.Eigen::PlainObjectBase"**
  %_unwrap61 = load %"class.Eigen::PlainObjectBase"*, %"class.Eigen::PlainObjectBase"** %_unwrap60, align 8, !tbaa !45, !invariant.group !182
  %_unwrap62 = getelementptr inbounds %"class.Eigen::PlainObjectBase", %"class.Eigen::PlainObjectBase"* %_unwrap61, i64 0, i32 0, i32 1
  %_unwrap63 = load i64, i64* %_unwrap62, align 8, !tbaa !36, !invariant.group !183
  %_unwrap64 = add i64 %_unwrap63, -1
  br label %mergeinvert6_

mergeinvert6_:                                    ; preds = %invert7
  store i64 %_unwrap64, i64* %"iv13'ac", align 8
  br label %invert6

invert8:                                          ; preds = %incinvert8, %mergeinvert8_.loopexit1
  %105 = load double, double* %"'de37", align 8
  store double 0.000000e+00, double* %"'de37", align 8
  %106 = load double, double* %"'de66", align 8
  %107 = fadd fast double %106, %105
  store double %107, double* %"'de66", align 8
  %108 = load double, double* %"'de67", align 8
  %109 = fadd fast double %108, %105
  store double %109, double* %"'de67", align 8
  %110 = load double, double* %"'de66", align 8
  store double 0.000000e+00, double* %"'de66", align 8
  %111 = load i64, i64* %"iv15'ac", align 8
  %"'ipg23_unwrap69" = getelementptr inbounds %"class.Eigen::internal::redux_evaluator", %"class.Eigen::internal::redux_evaluator"* %"'ipa22", i64 0, i32 0, i32 0, i32 0, i32 0, i32 0
  %"'ipl_unwrap70" = load double*, double** %"'ipg23_unwrap69", align 8, !invariant.group !181
  %iv.next16_unwrap = add nuw nsw i64 %111, 1
  %"'ipg68_unwrap" = getelementptr inbounds double, double* %"'ipl_unwrap70", i64 %iv.next16_unwrap
  %112 = load double, double* %"'ipg68_unwrap", align 8
  %113 = fadd fast double %112, %110
  store double %113, double* %"'ipg68_unwrap", align 8
  %114 = load double, double* %"'de67", align 8
  store double 0.000000e+00, double* %"'de67", align 8
  %115 = load i64, i64* %"iv15'ac", align 8
  %116 = icmp eq i64 %115, 0
  %117 = xor i1 %116, true
  %118 = select fast i1 %116, double %114, double 0.000000e+00
  %119 = load double, double* %"'de21", align 8
  %120 = fadd fast double %119, %114
  %121 = select fast i1 %116, double %120, double %119
  store double %121, double* %"'de21", align 8
  %122 = select fast i1 %117, double %114, double 0.000000e+00
  %123 = load double, double* %"'de37", align 8
  %124 = fadd fast double %123, %114
  %125 = select fast i1 %116, double %123, double %124
  store double %125, double* %"'de37", align 8
  br i1 %116, label %invert.preheader, label %incinvert8

incinvert8:                                       ; preds = %invert8
  %126 = load i64, i64* %"iv15'ac", align 8
  %127 = add nsw i64 %126, -1
  store i64 %127, i64* %"iv15'ac", align 8
  br label %invert8

invert.loopexit:                                  ; preds = %invert9
  %_unwrap75 = load %"class.Eigen::PlainObjectBase"*, %"class.Eigen::PlainObjectBase"** %11, align 8, !tbaa !45, !invariant.group !184
  %_unwrap76 = getelementptr inbounds %"class.Eigen::PlainObjectBase", %"class.Eigen::PlainObjectBase"* %_unwrap75, i64 0, i32 0, i32 2
  %_unwrap77 = load i64, i64* %_unwrap76, align 8, !tbaa !42, !invariant.group !185
  %_unwrap78 = icmp sgt i64 %_unwrap77, 2
  %_unwrap79 = select i1 %_unwrap78, i64 %_unwrap77, i64 2
  %_unwrap80 = add nsw i64 %_unwrap79, -2
  br label %mergeinvert5_.loopexit

mergeinvert5_.loopexit:                           ; preds = %invert.loopexit
  store i64 %_unwrap80, i64* %"iv'ac", align 8
  br label %invert7

invert9:                                          ; preds = %invert10
  %128 = load double, double* %"'de85", align 8
  store double 0.000000e+00, double* %"'de85", align 8
  %_unwrap87 = bitcast %"class.Eigen::Matrix"** %6 to %"class.Eigen::PlainObjectBase"**
  %_unwrap88 = load %"class.Eigen::PlainObjectBase"*, %"class.Eigen::PlainObjectBase"** %_unwrap87, align 8, !tbaa !45, !invariant.group !182
  %_unwrap89 = getelementptr inbounds %"class.Eigen::PlainObjectBase", %"class.Eigen::PlainObjectBase"* %_unwrap88, i64 0, i32 0, i32 1
  %_unwrap90 = load i64, i64* %_unwrap89, align 8, !tbaa !36, !invariant.group !183
  %_unwrap91 = icmp sgt i64 %_unwrap90, 0
  %_unwrap92 = load %"class.Eigen::PlainObjectBase"*, %"class.Eigen::PlainObjectBase"** %11, align 8, !tbaa !45, !invariant.group !184
  %_unwrap93 = getelementptr inbounds %"class.Eigen::PlainObjectBase", %"class.Eigen::PlainObjectBase"* %_unwrap92, i64 0, i32 0, i32 2
  %_unwrap94 = load i64, i64* %_unwrap93, align 8, !tbaa !42, !invariant.group !185
  %_unwrap95 = icmp sgt i64 %_unwrap94, 1
  %_unwrap96 = and i1 %_unwrap91, %_unwrap95
  %129 = xor i1 %_unwrap96, true
  %130 = select fast i1 %_unwrap96, double %128, double 0.000000e+00
  %131 = load double, double* %"'de46", align 8
  %132 = fadd fast double %131, %128
  %133 = select fast i1 %_unwrap96, double %132, double %131
  store double %133, double* %"'de46", align 8
  %134 = select fast i1 %129, double %128, double 0.000000e+00
  %135 = load double, double* %"'de36", align 8
  %136 = fadd fast double %135, %128
  %137 = select fast i1 %_unwrap96, double %135, double %136
  store double %137, double* %"'de36", align 8
  br i1 %_unwrap96, label %invert.loopexit, label %invert3

invert10:                                         ; preds = %51
  store double %differeturn, double* %"'de", align 8
  %138 = load double, double* %"'de", align 8
  store double 0.000000e+00, double* %"'de", align 8
  %139 = xor i1 %15, true
  %140 = select fast i1 %139, double %138, double 0.000000e+00
  %141 = load double, double* %"'de85", align 8
  %142 = fadd fast double %141, %138
  %143 = select fast i1 %15, double %141, double %142
  store double %143, double* %"'de85", align 8
  br i1 %15, label %invert, label %invert9
}

LLVM ERROR: function failed verification (4)
PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash backtrace.
Stack dump:
0.      Program arguments: /usr/lib/llvm-12/bin/opt - -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -S
1.      Running pass 'Enzyme Pass' on module '<stdin>'.
 #0 0x00007fef5f57b9a3 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/usr/lib/llvm-12/lib/libLLVM-12.so.1+0xbda9a3)
 #1 0x00007fef5f579cc0 llvm::sys::RunSignalHandlers() (/usr/lib/llvm-12/lib/libLLVM-12.so.1+0xbd8cc0)
 #2 0x00007fef5f57c00f (/usr/lib/llvm-12/lib/libLLVM-12.so.1+0xbdb00f)
 #3 0x00007fef5e98e3c0 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x153c0)
 #4 0x00007fef5e48118b raise (/lib/x86_64-linux-gnu/libc.so.6+0x4618b)
 #5 0x00007fef5e460859 abort (/lib/x86_64-linux-gnu/libc.so.6+0x25859)
 #6 0x00007fef5f4d6c09 (/usr/lib/llvm-12/lib/libLLVM-12.so.1+0xb35c09)
 #7 0x00007fef5f4d6a26 (/usr/lib/llvm-12/lib/libLLVM-12.so.1+0xb35a26)
 #8 0x00007fef5c12fa2a EnzymeLogic::CreatePrimalAndGradient(llvm::Function*, DIFFE_TYPE, std::vector<DIFFE_TYPE, std::allocator<DIFFE_TYPE> > const&, llvm::TargetLibraryInfo&, TypeAnalysis&, bool, bool, DerivativeMode, llvm::Type*, FnTypeInfo const&, std::map<llvm::Argument*, bool, std::less<llvm::Argument*>, std::allocator<std::pair<llvm::Argument* const, bool> > >, AugmentedReturn const*, bool, bool, bool) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x58aa2a)
 #9 0x00007fef5c0feddf (anonymous namespace)::Enzyme::HandleAutoDiff(llvm::CallInst*, llvm::TargetLibraryInfo&, bool, DerivativeMode) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x559ddf)
#10 0x00007fef5c103593 (anonymous namespace)::Enzyme::lowerEnzymeCalls(llvm::Function&, bool, bool&, std::set<llvm::Function*, std::less<llvm::Function*>, std::allocator<llvm::Function*> >&) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x55e593)
#11 0x00007fef5c1056d6 (anonymous namespace)::Enzyme::runOnModule(llvm::Module&) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x5606d6)
#12 0x00007fef5f6a34ff llvm::legacy::PassManagerImpl::run(llvm::Module&) (/usr/lib/llvm-12/lib/libLLVM-12.so.1+0xd024ff)
#13 0x0000000000431dfb main (/usr/lib/llvm-12/bin/opt+0x431dfb)
#14 0x00007fef5e4620b3 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b3)
#15 0x000000000041e68e _start (/usr/lib/llvm-12/bin/opt+0x41e68e)
/usr/lib/llvm-12/bin/lli: error: 'main' function not found in module.

--

********************
FAIL: Enzyme :: Integration/ReverseMode/mixedstruct1-simplefda.c (19 of 65)
******************** TEST 'Enzyme :: Integration/ReverseMode/mixedstruct1-simplefda.c' FAILED ********************
Script:
--
: 'RUN: at line 1';   /usr/lib/llvm-12/bin/clang -std=c11 -O1 -disable-llvm-passes /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/mixedstruct1-simplefda.c -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -S | /usr/lib/llvm-12/bin/lli -
: 'RUN: at line 2';   /usr/lib/llvm-12/bin/clang -std=c11 -O1 /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/mixedstruct1-simplefda.c -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -S | /usr/lib/llvm-12/bin/lli -
: 'RUN: at line 3';   /usr/lib/llvm-12/bin/clang -std=c11 -O2 /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/mixedstruct1-simplefda.c -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -S | /usr/lib/llvm-12/bin/lli -
: 'RUN: at line 4';   /usr/lib/llvm-12/bin/clang -std=c11 -O3 /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/mixedstruct1-simplefda.c -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -S | /usr/lib/llvm-12/bin/lli -
: 'RUN: at line 5';   /usr/lib/llvm-12/bin/clang -std=c11 -O1 -disable-llvm-passes /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/mixedstruct1-simplefda.c -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -enzyme-inline=1 -S | /usr/lib/llvm-12/bin/lli -
: 'RUN: at line 6';   /usr/lib/llvm-12/bin/clang -std=c11 -O1 /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/mixedstruct1-simplefda.c -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -enzyme-inline=1 -S | /usr/lib/llvm-12/bin/lli -
: 'RUN: at line 7';   /usr/lib/llvm-12/bin/clang -std=c11 -O2 /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/mixedstruct1-simplefda.c -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -enzyme-inline=1 -S | /usr/lib/llvm-12/bin/lli -
: 'RUN: at line 8';   /usr/lib/llvm-12/bin/clang -std=c11 -O3 /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/mixedstruct1-simplefda.c -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -enzyme-inline=1 -S | /usr/lib/llvm-12/bin/lli -
--
Exit Code: 255

Command Output (stderr):
--
clang: warning: argument unused during compilation: '-disable-llvm-passes' [-Wunused-command-line-argument]
/workspaces/Enzyme/enzyme/test/Integration/ReverseMode/mixedstruct1-simplefda.c:46:38: warning: format specifies type 'int' but the argument has type 'long long' [-Wformat]
    printf("inner considering %d\n", frame->R_start);
                              ~~     ^~~~~~~~~~~~~~
                              %lld
/workspaces/Enzyme/enzyme/test/Integration/ReverseMode/mixedstruct1-simplefda.c:54:32: warning: format specifies type 'int' but the argument has type 'long long' [-Wformat]
    printf("considering %d\n", frame->R_start);
                        ~~     ^~~~~~~~~~~~~~
                        %lld
2 warnings generated.
Instruction does not dominate all uses!
  %"'ipg25" = getelementptr inbounds %struct.WINDOW_FRAME, %struct.WINDOW_FRAME* %"'", i64 0, i32 2
  %"'il_phi5_unwrap" = load float*, float** %"'ipg25", align 8, !tbaa !9
; Function Attrs: nounwind uwtable
define dso_local float @preprocess_tile_multiply(%struct.WINDOW_FRAME* nocapture readonly %0) local_unnamed_addr #0 {
  %2 = getelementptr inbounds %struct.WINDOW_FRAME, %struct.WINDOW_FRAME* %0, i64 0, i32 1
  %3 = load i64, i64* %2, align 8, !tbaa !2
  %4 = getelementptr inbounds %struct.WINDOW_FRAME, %struct.WINDOW_FRAME* %0, i64 0, i32 0
  %5 = load i64, i64* %4, align 8, !tbaa !8
  %6 = sub nsw i64 %3, %5
  %7 = icmp sgt i64 %6, 1
  br i1 %7, label %8, label %26

8:                                                ; preds = %1
  %9 = call noalias dereferenceable_or_null(24) i8* @malloc(i64 24) #8
  %10 = bitcast i8* %9 to %struct.WINDOW_FRAME*
  %11 = getelementptr inbounds %struct.WINDOW_FRAME, %struct.WINDOW_FRAME* %0, i64 0, i32 2
  %12 = load float*, float** %11, align 8, !tbaa !9
  %13 = getelementptr inbounds i8, i8* %9, i64 16
  %14 = bitcast i8* %13 to float**
  store float* %12, float** %14, align 8, !tbaa !9
  %15 = add nsw i64 %5, 1
  %16 = bitcast i8* %9 to i64*
  store i64 %15, i64* %16, align 8, !tbaa !8
  %17 = getelementptr inbounds i8, i8* %9, i64 8
  %18 = bitcast i8* %17 to i64*
  store i64 %3, i64* %18, align 8, !tbaa !2
  %19 = call i32 (i8*, ...) @printf(i8* nonnull dereferenceable(1) getelementptr inbounds ([22 x i8], [22 x i8]* @.str, i64 0, i64 0), i64 %5)
  %20 = load float*, float** %11, align 8, !tbaa !9
  %21 = load i64, i64* %4, align 8, !tbaa !8
  %22 = getelementptr inbounds float, float* %20, i64 %21
  %23 = load float, float* %22, align 4, !tbaa !10
  %24 = call float @tile_multiply(%struct.WINDOW_FRAME* %10)
  call void @free(i8* %9) #8
  %25 = fadd float %23, %24
  br label %34

26:                                               ; preds = %1
  %27 = call i32 (i8*, ...) @printf(i8* nonnull dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.1, i64 0, i64 0), i64 %5)
  %28 = getelementptr inbounds %struct.WINDOW_FRAME, %struct.WINDOW_FRAME* %0, i64 0, i32 2
  %29 = load float*, float** %28, align 8, !tbaa !9
  %30 = load i64, i64* %4, align 8, !tbaa !8
  %31 = getelementptr inbounds float, float* %29, i64 %30
  %32 = load float, float* %31, align 4, !tbaa !10
  %33 = fadd float %32, 0.000000e+00
  br label %34

34:                                               ; preds = %26, %8
  %35 = phi float [ %25, %8 ], [ %33, %26 ]
  ret float %35
}

; Function Attrs: nounwind uwtable
define internal void @diffetile_multiply(%struct.WINDOW_FRAME* nocapture readonly %0, %struct.WINDOW_FRAME* nocapture %"'", float %differeturn) local_unnamed_addr #0 {
  %"'de" = alloca float, align 4
  store float 0.000000e+00, float* %"'de", align 4
  %"'de6" = alloca float, align 4
  store float 0.000000e+00, float* %"'de6", align 4
  %"'de7" = alloca float, align 4
  store float 0.000000e+00, float* %"'de7", align 4
  %"'de8" = alloca float, align 4
  store float 0.000000e+00, float* %"'de8", align 4
  %_cache = alloca i8*, align 8
  %"'mi_cache" = alloca i8*, align 8
  %"'il_phi4_cache" = alloca float*, align 8
  %_cache10 = alloca i64, align 8
  %"'de22" = alloca float, align 4
  store float 0.000000e+00, float* %"'de22", align 4
  %"'de23" = alloca float, align 4
  store float 0.000000e+00, float* %"'de23", align 4
  %2 = getelementptr inbounds %struct.WINDOW_FRAME, %struct.WINDOW_FRAME* %0, i64 0, i32 1
  %3 = load i64, i64* %2, align 8, !tbaa !2
  %4 = getelementptr inbounds %struct.WINDOW_FRAME, %struct.WINDOW_FRAME* %0, i64 0, i32 0
  %5 = load i64, i64* %4, align 8, !tbaa !8
  %6 = sub nsw i64 %3, %5
  %7 = icmp sgt i64 %6, 1
  br i1 %7, label %8, label %21

8:                                                ; preds = %1
  %9 = call noalias nonnull dereferenceable(24) dereferenceable_or_null(24) i8* @malloc(i64 24) #8
  %"'mi" = call noalias nonnull dereferenceable(24) dereferenceable_or_null(24) i8* @malloc(i64 24) #8
  call void @llvm.memset.p0i8.i64(i8* nonnull dereferenceable(24) dereferenceable_or_null(24) %"'mi", i8 0, i64 24, i1 false)
  %"'ipc" = bitcast i8* %"'mi" to %struct.WINDOW_FRAME*
  %10 = bitcast i8* %9 to %struct.WINDOW_FRAME*
  %"'ipg13" = getelementptr inbounds %struct.WINDOW_FRAME, %struct.WINDOW_FRAME* %"'", i64 0, i32 2
  %11 = getelementptr inbounds %struct.WINDOW_FRAME, %struct.WINDOW_FRAME* %0, i64 0, i32 2
  %"'ipl20" = load float*, float** %"'ipg13", align 8
  %12 = load float*, float** %11, align 8, !tbaa !9
  %"'ipg18" = getelementptr inbounds i8, i8* %"'mi", i64 16
  %13 = getelementptr inbounds i8, i8* %9, i64 16
  %"'ipc19" = bitcast i8* %"'ipg18" to float**
  %14 = bitcast i8* %13 to float**
  store float* %"'ipl20", float** %"'ipc19", align 8
  store float* %12, float** %14, align 8, !tbaa !9
  store i8* %"'mi", i8** %"'mi_cache", align 8, !invariant.group !17
  store i8* %9, i8** %_cache, align 8, !invariant.group !18
  %15 = add nsw i64 %5, 1
  %"'ipc17" = bitcast i8* %"'mi" to i64*
  %16 = bitcast i8* %9 to i64*
  store i64 %15, i64* %"'ipc17", align 8
  store i64 %15, i64* %16, align 8, !tbaa !8
  %"'ipg15" = getelementptr inbounds i8, i8* %"'mi", i64 8
  %17 = getelementptr inbounds i8, i8* %9, i64 8
  %"'ipc16" = bitcast i8* %"'ipg15" to i64*
  %18 = bitcast i8* %17 to i64*
  store i64 %3, i64* %"'ipc16", align 8
  store i64 %3, i64* %18, align 8, !tbaa !2
  %19 = call i32 (i8*, ...) @printf(i8* nonnull dereferenceable(1) getelementptr inbounds ([22 x i8], [22 x i8]* @.str, i64 0, i64 0), i64 %5)
  %"'ipl" = load float*, float** %"'ipg13", align 8
  store float* %"'ipl", float** %"'il_phi4_cache", align 8, !invariant.group !19
  %20 = load i64, i64* %4, align 8, !tbaa !8
  store i64 %20, i64* %_cache10, align 8, !invariant.group !20
  %"'ipg" = getelementptr inbounds float, float* %"'ipl", i64 %20
  br label %24

21:                                               ; preds = %1
  %22 = call i32 (i8*, ...) @printf(i8* nonnull dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.1, i64 0, i64 0), i64 %5)
  %"'ipg25" = getelementptr inbounds %struct.WINDOW_FRAME, %struct.WINDOW_FRAME* %"'", i64 0, i32 2
  %"'ipl29" = load float*, float** %"'ipg25", align 8
  %23 = load i64, i64* %4, align 8, !tbaa !8, !invariant.group !21
  %"'ipg24" = getelementptr inbounds float, float* %"'ipl29", i64 %23
  br label %24

24:                                               ; preds = %21, %8
  br label %invert3

invert:                                           ; preds = %invert2, %invert1
  ret void

invert1:                                          ; preds = %invert3
  %25 = load float, float* %"'de6", align 4
  store float 0.000000e+00, float* %"'de6", align 4
  %26 = load float, float* %"'de7", align 4
  %27 = fadd fast float %26, %25
  store float %27, float* %"'de7", align 4
  %28 = load float, float* %"'de8", align 4
  %29 = fadd fast float %28, %25
  store float %29, float* %"'de8", align 4
  %30 = load i8*, i8** %_cache, align 8, !invariant.group !18
  %_unwrap = bitcast i8* %30 to %struct.WINDOW_FRAME*
  %31 = load i8*, i8** %"'mi_cache", align 8, !invariant.group !17
  %"'ipc_unwrap" = bitcast i8* %31 to %struct.WINDOW_FRAME*
  %32 = load float, float* %"'de8", align 4
  call void @diffetile_multiply(%struct.WINDOW_FRAME* %_unwrap, %struct.WINDOW_FRAME* %"'ipc_unwrap", float %32)
  store float 0.000000e+00, float* %"'de8", align 4
  %33 = load float, float* %"'de7", align 4
  store float 0.000000e+00, float* %"'de7", align 4
  %34 = load float*, float** %"'il_phi4_cache", align 8, !invariant.group !19
  %35 = load i64, i64* %_cache10, align 8, !invariant.group !20
  %"'ipg_unwrap" = getelementptr inbounds float, float* %34, i64 %35
  %36 = load float, float* %"'ipg_unwrap", align 4
  %37 = fadd fast float %36, %33
  store float %37, float* %"'ipg_unwrap", align 4
  %38 = load i8*, i8** %"'mi_cache", align 8, !invariant.group !17
  tail call void @free(i8* nonnull %38)
  tail call void @free(i8* %30)
  br label %invert

invert2:                                          ; preds = %invert3
  %39 = load float, float* %"'de22", align 4
  store float 0.000000e+00, float* %"'de22", align 4
  %40 = load float, float* %"'de23", align 4
  %41 = fadd fast float %40, %39
  store float %41, float* %"'de23", align 4
  %42 = load float, float* %"'de23", align 4
  store float 0.000000e+00, float* %"'de23", align 4
  %"'il_phi5_unwrap" = load float*, float** %"'ipg25", align 8, !tbaa !9
  %_unwrap26 = load i64, i64* %4, align 8, !tbaa !8, !invariant.group !21
  %"'ipg24_unwrap" = getelementptr inbounds float, float* %"'il_phi5_unwrap", i64 %_unwrap26
  %43 = load float, float* %"'ipg24_unwrap", align 4
  %44 = fadd fast float %43, %42
  store float %44, float* %"'ipg24_unwrap", align 4
  br label %invert

invert3:                                          ; preds = %24
  store float %differeturn, float* %"'de", align 4
  %45 = load float, float* %"'de", align 4
  store float 0.000000e+00, float* %"'de", align 4
  %46 = xor i1 %7, true
  %47 = select fast i1 %46, float %45, float 0.000000e+00
  %48 = load float, float* %"'de22", align 4
  %49 = fadd fast float %48, %45
  %50 = select fast i1 %7, float %48, float %49
  store float %50, float* %"'de22", align 4
  %51 = select fast i1 %7, float %45, float 0.000000e+00
  %52 = load float, float* %"'de6", align 4
  %53 = fadd fast float %52, %45
  %54 = select fast i1 %7, float %53, float %52
  store float %54, float* %"'de6", align 4
  br i1 %7, label %invert1, label %invert2
}

LLVM ERROR: function failed verification (4)
PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash backtrace.
Stack dump:
0.      Program arguments: /usr/lib/llvm-12/bin/opt - -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -S
1.      Running pass 'Enzyme Pass' on module '<stdin>'.
 #0 0x00007f2f2a2149a3 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/usr/lib/llvm-12/lib/libLLVM-12.so.1+0xbda9a3)
 #1 0x00007f2f2a212cc0 llvm::sys::RunSignalHandlers() (/usr/lib/llvm-12/lib/libLLVM-12.so.1+0xbd8cc0)
 #2 0x00007f2f2a21500f (/usr/lib/llvm-12/lib/libLLVM-12.so.1+0xbdb00f)
 #3 0x00007f2f296273c0 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x153c0)
 #4 0x00007f2f2911a18b raise (/lib/x86_64-linux-gnu/libc.so.6+0x4618b)
 #5 0x00007f2f290f9859 abort (/lib/x86_64-linux-gnu/libc.so.6+0x25859)
 #6 0x00007f2f2a16fc09 (/usr/lib/llvm-12/lib/libLLVM-12.so.1+0xb35c09)
 #7 0x00007f2f2a16fa26 (/usr/lib/llvm-12/lib/libLLVM-12.so.1+0xb35a26)
 #8 0x00007f2f26dc8a2a EnzymeLogic::CreatePrimalAndGradient(llvm::Function*, DIFFE_TYPE, std::vector<DIFFE_TYPE, std::allocator<DIFFE_TYPE> > const&, llvm::TargetLibraryInfo&, TypeAnalysis&, bool, bool, DerivativeMode, llvm::Type*, FnTypeInfo const&, std::map<llvm::Argument*, bool, std::less<llvm::Argument*>, std::allocator<std::pair<llvm::Argument* const, bool> > >, AugmentedReturn const*, bool, bool, bool) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x58aa2a)
 #9 0x00007f2f26e4a44a AdjointGenerator<AugmentedReturn const*>::visitCallInst(llvm::CallInst&) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x60c44a)
#10 0x00007f2f26e35014 llvm::InstVisitor<AdjointGenerator<AugmentedReturn const*>, void>::delegateCallInst(llvm::CallInst&) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x5f7014)
#11 0x00007f2f26e0bdad llvm::InstVisitor<AdjointGenerator<AugmentedReturn const*>, void>::visitCall(llvm::CallInst&) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x5cddad)
#12 0x00007f2f26df929f llvm::InstVisitor<AdjointGenerator<AugmentedReturn const*>, void>::visit(llvm::Instruction&) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x5bb29f)
#13 0x00007f2f26deada7 llvm::InstVisitor<AdjointGenerator<AugmentedReturn const*>, void>::visit(llvm::Instruction*) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x5acda7)
#14 0x00007f2f26dc62ed EnzymeLogic::CreatePrimalAndGradient(llvm::Function*, DIFFE_TYPE, std::vector<DIFFE_TYPE, std::allocator<DIFFE_TYPE> > const&, llvm::TargetLibraryInfo&, TypeAnalysis&, bool, bool, DerivativeMode, llvm::Type*, FnTypeInfo const&, std::map<llvm::Argument*, bool, std::less<llvm::Argument*>, std::allocator<std::pair<llvm::Argument* const, bool> > >, AugmentedReturn const*, bool, bool, bool) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x5882ed)
#15 0x00007f2f26d97ddf (anonymous namespace)::Enzyme::HandleAutoDiff(llvm::CallInst*, llvm::TargetLibraryInfo&, bool, DerivativeMode) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x559ddf)
#16 0x00007f2f26d9c593 (anonymous namespace)::Enzyme::lowerEnzymeCalls(llvm::Function&, bool, bool&, std::set<llvm::Function*, std::less<llvm::Function*>, std::allocator<llvm::Function*> >&) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x55e593)
#17 0x00007f2f26d9e6d6 (anonymous namespace)::Enzyme::runOnModule(llvm::Module&) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x5606d6)
#18 0x00007f2f2a33c4ff llvm::legacy::PassManagerImpl::run(llvm::Module&) (/usr/lib/llvm-12/lib/libLLVM-12.so.1+0xd024ff)
#19 0x0000000000431dfb main (/usr/lib/llvm-12/bin/opt+0x431dfb)
#20 0x00007f2f290fb0b3 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b3)
#21 0x000000000041e68e _start (/usr/lib/llvm-12/bin/opt+0x41e68e)
/usr/lib/llvm-12/bin/lli: error: 'main' function not found in module.

--

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

********************
FAIL: Enzyme :: Integration/ReverseMode/mixedstruct1-simpleps.c (20 of 65)
******************** TEST 'Enzyme :: Integration/ReverseMode/mixedstruct1-simpleps.c' FAILED ********************
Script:
--
: 'RUN: at line 1';   /usr/lib/llvm-12/bin/clang -std=c11 -O1 -disable-llvm-passes /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/mixedstruct1-simpleps.c -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -S | /usr/lib/llvm-12/bin/lli -
: 'RUN: at line 2';   /usr/lib/llvm-12/bin/clang -std=c11 -O1 /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/mixedstruct1-simpleps.c -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -S | /usr/lib/llvm-12/bin/lli -
: 'RUN: at line 3';   /usr/lib/llvm-12/bin/clang -std=c11 -O2 /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/mixedstruct1-simpleps.c -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -S | /usr/lib/llvm-12/bin/lli -
: 'RUN: at line 4';   /usr/lib/llvm-12/bin/clang -std=c11 -O3 /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/mixedstruct1-simpleps.c -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -S | /usr/lib/llvm-12/bin/lli -
: 'RUN: at line 5';   /usr/lib/llvm-12/bin/clang -std=c11 -O1 -disable-llvm-passes /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/mixedstruct1-simpleps.c -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -enzyme-inline=1 -S | /usr/lib/llvm-12/bin/lli -
: 'RUN: at line 6';   /usr/lib/llvm-12/bin/clang -std=c11 -O1 /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/mixedstruct1-simpleps.c -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -enzyme-inline=1 -S | /usr/lib/llvm-12/bin/lli -
: 'RUN: at line 7';   /usr/lib/llvm-12/bin/clang -std=c11 -O2 /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/mixedstruct1-simpleps.c -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -enzyme-inline=1 -S | /usr/lib/llvm-12/bin/lli -
: 'RUN: at line 8';   /usr/lib/llvm-12/bin/clang -std=c11 -O3 /workspaces/Enzyme/enzyme/test/Integration/ReverseMode/mixedstruct1-simpleps.c -S -emit-llvm -o - | /usr/lib/llvm-12/bin/opt -  -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -enzyme-inline=1 -S | /usr/lib/llvm-12/bin/lli -
--
Exit Code: 255

Command Output (stderr):
--
clang: warning: argument unused during compilation: '-disable-llvm-passes' [-Wunused-command-line-argument]
Instruction does not dominate all uses!
  %"'ipg10" = getelementptr inbounds %struct.WINDOW_FRAME, %struct.WINDOW_FRAME* %"'", i64 0, i32 1
  %"'il_phi_unwrap" = load float*, float** %"'ipg10", align 8, !tbaa !8
; Function Attrs: nounwind uwtable
define dso_local float @preprocess_tile_multiply(%struct.WINDOW_FRAME* noalias nocapture readonly %0) local_unnamed_addr #0 {
  %2 = getelementptr inbounds %struct.WINDOW_FRAME, %struct.WINDOW_FRAME* %0, i64 0, i32 0
  %3 = load i64, i64* %2, align 8, !tbaa !2
  %4 = icmp slt i64 %3, 8
  br i1 %4, label %5, label %18

5:                                                ; preds = %1
  %6 = getelementptr inbounds %struct.WINDOW_FRAME, %struct.WINDOW_FRAME* %0, i64 0, i32 1
  %7 = load float*, float** %6, align 8, !tbaa !8
  %8 = getelementptr inbounds float, float* %7, i64 %3
  %9 = load float, float* %8, align 4, !tbaa !9
  %10 = call noalias dereferenceable_or_null(16) i8* @malloc(i64 16) #8
  %11 = bitcast i8* %10 to %struct.WINDOW_FRAME*
  %12 = getelementptr inbounds i8, i8* %10, i64 8
  %13 = bitcast i8* %12 to float**
  store float* %7, float** %13, align 8, !tbaa !8
  %14 = add nsw i64 %3, 1
  %15 = bitcast i8* %10 to i64*
  store i64 %14, i64* %15, align 8, !tbaa !2
  %16 = call float @tile_multiply(%struct.WINDOW_FRAME* %11)
  call void @free(i8* %10) #8
  %17 = fadd float %9, %16
  br label %18

18:                                               ; preds = %5, %1
  %19 = phi float [ %17, %5 ], [ 0.000000e+00, %1 ]
  ret float %19
}

; Function Attrs: nounwind uwtable
define internal void @diffetile_multiply(%struct.WINDOW_FRAME* noalias nocapture readonly %0, %struct.WINDOW_FRAME* nocapture %"'", float %differeturn) local_unnamed_addr #0 {
  %"'de" = alloca float, align 4
  store float 0.000000e+00, float* %"'de", align 4
  %"'de3" = alloca float, align 4
  store float 0.000000e+00, float* %"'de3", align 4
  %"'de4" = alloca float, align 4
  store float 0.000000e+00, float* %"'de4", align 4
  %"'de5" = alloca float, align 4
  store float 0.000000e+00, float* %"'de5", align 4
  %_cache = alloca i8*, align 8
  %"'mi_cache" = alloca i8*, align 8
  %2 = getelementptr inbounds %struct.WINDOW_FRAME, %struct.WINDOW_FRAME* %0, i64 0, i32 0
  %3 = load i64, i64* %2, align 8, !tbaa !2
  %4 = icmp slt i64 %3, 8
  br i1 %4, label %5, label %14

5:                                                ; preds = %1
  %"'ipg10" = getelementptr inbounds %struct.WINDOW_FRAME, %struct.WINDOW_FRAME* %"'", i64 0, i32 1
  %6 = getelementptr inbounds %struct.WINDOW_FRAME, %struct.WINDOW_FRAME* %0, i64 0, i32 1
  %"'ipl" = load float*, float** %"'ipg10", align 8
  %7 = load float*, float** %6, align 8, !tbaa !8
  %"'ipg9" = getelementptr inbounds float, float* %"'ipl", i64 %3
  %8 = call noalias nonnull dereferenceable(16) dereferenceable_or_null(16) i8* @malloc(i64 16) #8
  %"'mi" = call noalias nonnull dereferenceable(16) dereferenceable_or_null(16) i8* @malloc(i64 16) #8
  call void @llvm.memset.p0i8.i64(i8* nonnull dereferenceable(16) dereferenceable_or_null(16) %"'mi", i8 0, i64 16, i1 false)
  %"'ipc" = bitcast i8* %"'mi" to %struct.WINDOW_FRAME*
  %9 = bitcast i8* %8 to %struct.WINDOW_FRAME*
  %"'ipg" = getelementptr inbounds i8, i8* %"'mi", i64 8
  %10 = getelementptr inbounds i8, i8* %8, i64 8
  %"'ipc8" = bitcast i8* %"'ipg" to float**
  %11 = bitcast i8* %10 to float**
  store float* %"'ipl", float** %"'ipc8", align 8
  store float* %7, float** %11, align 8, !tbaa !8
  store i8* %"'mi", i8** %"'mi_cache", align 8, !invariant.group !16
  store i8* %8, i8** %_cache, align 8, !invariant.group !17
  %12 = add nsw i64 %3, 1
  %"'ipc7" = bitcast i8* %"'mi" to i64*
  %13 = bitcast i8* %8 to i64*
  store i64 %12, i64* %"'ipc7", align 8
  store i64 %12, i64* %13, align 8, !tbaa !2
  br label %14

14:                                               ; preds = %5, %1
  br label %invert2

invert:                                           ; preds = %invert2, %invert1
  ret void

invert1:                                          ; preds = %invert2
  %15 = load float, float* %"'de3", align 4
  store float 0.000000e+00, float* %"'de3", align 4
  %16 = load float, float* %"'de4", align 4
  %17 = fadd fast float %16, %15
  store float %17, float* %"'de4", align 4
  %18 = load float, float* %"'de5", align 4
  %19 = fadd fast float %18, %15
  store float %19, float* %"'de5", align 4
  %20 = load i8*, i8** %_cache, align 8, !invariant.group !17
  %_unwrap = bitcast i8* %20 to %struct.WINDOW_FRAME*
  %21 = load i8*, i8** %"'mi_cache", align 8, !invariant.group !16
  %"'ipc_unwrap" = bitcast i8* %21 to %struct.WINDOW_FRAME*
  %22 = load float, float* %"'de5", align 4
  call void @diffetile_multiply(%struct.WINDOW_FRAME* %_unwrap, %struct.WINDOW_FRAME* %"'ipc_unwrap", float %22)
  store float 0.000000e+00, float* %"'de5", align 4
  %23 = load i8*, i8** %"'mi_cache", align 8, !invariant.group !16
  tail call void @free(i8* nonnull %23)
  tail call void @free(i8* %20)
  %24 = load float, float* %"'de4", align 4
  store float 0.000000e+00, float* %"'de4", align 4
  %"'il_phi_unwrap" = load float*, float** %"'ipg10", align 8, !tbaa !8
  %"'ipg9_unwrap" = getelementptr inbounds float, float* %"'il_phi_unwrap", i64 %3
  %25 = load float, float* %"'ipg9_unwrap", align 4
  %26 = fadd fast float %25, %24
  store float %26, float* %"'ipg9_unwrap", align 4
  br label %invert

invert2:                                          ; preds = %14
  store float %differeturn, float* %"'de", align 4
  %27 = load float, float* %"'de", align 4
  store float 0.000000e+00, float* %"'de", align 4
  %28 = select fast i1 %4, float %27, float 0.000000e+00
  %29 = load float, float* %"'de3", align 4
  %30 = fadd fast float %29, %27
  %31 = select fast i1 %4, float %30, float %29
  store float %31, float* %"'de3", align 4
  br i1 %4, label %invert1, label %invert
}

LLVM ERROR: function failed verification (4)
PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash backtrace.
Stack dump:
0.      Program arguments: /usr/lib/llvm-12/bin/opt - -load=/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so -enzyme -S
1.      Running pass 'Enzyme Pass' on module '<stdin>'.
 #0 0x00007f2662a7c9a3 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/usr/lib/llvm-12/lib/libLLVM-12.so.1+0xbda9a3)
 #1 0x00007f2662a7acc0 llvm::sys::RunSignalHandlers() (/usr/lib/llvm-12/lib/libLLVM-12.so.1+0xbd8cc0)
 #2 0x00007f2662a7d00f (/usr/lib/llvm-12/lib/libLLVM-12.so.1+0xbdb00f)
 #3 0x00007f2661e8f3c0 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x153c0)
 #4 0x00007f266198218b raise (/lib/x86_64-linux-gnu/libc.so.6+0x4618b)
 #5 0x00007f2661961859 abort (/lib/x86_64-linux-gnu/libc.so.6+0x25859)
 #6 0x00007f26629d7c09 (/usr/lib/llvm-12/lib/libLLVM-12.so.1+0xb35c09)
 #7 0x00007f26629d7a26 (/usr/lib/llvm-12/lib/libLLVM-12.so.1+0xb35a26)
 #8 0x00007f265f630a2a EnzymeLogic::CreatePrimalAndGradient(llvm::Function*, DIFFE_TYPE, std::vector<DIFFE_TYPE, std::allocator<DIFFE_TYPE> > const&, llvm::TargetLibraryInfo&, TypeAnalysis&, bool, bool, DerivativeMode, llvm::Type*, FnTypeInfo const&, std::map<llvm::Argument*, bool, std::less<llvm::Argument*>, std::allocator<std::pair<llvm::Argument* const, bool> > >, AugmentedReturn const*, bool, bool, bool) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x58aa2a)
 #9 0x00007f265f6b244a AdjointGenerator<AugmentedReturn const*>::visitCallInst(llvm::CallInst&) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x60c44a)
#10 0x00007f265f69d014 llvm::InstVisitor<AdjointGenerator<AugmentedReturn const*>, void>::delegateCallInst(llvm::CallInst&) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x5f7014)
#11 0x00007f265f673dad llvm::InstVisitor<AdjointGenerator<AugmentedReturn const*>, void>::visitCall(llvm::CallInst&) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x5cddad)
#12 0x00007f265f66129f llvm::InstVisitor<AdjointGenerator<AugmentedReturn const*>, void>::visit(llvm::Instruction&) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x5bb29f)
#13 0x00007f265f652da7 llvm::InstVisitor<AdjointGenerator<AugmentedReturn const*>, void>::visit(llvm::Instruction*) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x5acda7)
#14 0x00007f265f62e2ed EnzymeLogic::CreatePrimalAndGradient(llvm::Function*, DIFFE_TYPE, std::vector<DIFFE_TYPE, std::allocator<DIFFE_TYPE> > const&, llvm::TargetLibraryInfo&, TypeAnalysis&, bool, bool, DerivativeMode, llvm::Type*, FnTypeInfo const&, std::map<llvm::Argument*, bool, std::less<llvm::Argument*>, std::allocator<std::pair<llvm::Argument* const, bool> > >, AugmentedReturn const*, bool, bool, bool) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x5882ed)
#15 0x00007f265f5ffddf (anonymous namespace)::Enzyme::HandleAutoDiff(llvm::CallInst*, llvm::TargetLibraryInfo&, bool, DerivativeMode) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x559ddf)
#16 0x00007f265f604593 (anonymous namespace)::Enzyme::lowerEnzymeCalls(llvm::Function&, bool, bool&, std::set<llvm::Function*, std::less<llvm::Function*>, std::allocator<llvm::Function*> >&) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x55e593)
#17 0x00007f265f6066d6 (anonymous namespace)::Enzyme::runOnModule(llvm::Module&) (/workspaces/Enzyme/enzyme/build/Enzyme/LLVMEnzyme-12.so+0x5606d6)
#18 0x00007f2662ba44ff llvm::legacy::PassManagerImpl::run(llvm::Module&) (/usr/lib/llvm-12/lib/libLLVM-12.so.1+0xd024ff)
#19 0x0000000000431dfb main (/usr/lib/llvm-12/bin/opt+0x431dfb)
#20 0x00007f26619630b3 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b3)
#21 0x000000000041e68e _start (/usr/lib/llvm-12/bin/opt+0x41e68e)
/usr/lib/llvm-12/bin/lli: error: 'main' function not found in module.

--

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah I see, yeah this should just be changed to check if the insertion point is in a reverse block and only then lookup.

Copy link
Member Author

@tgymnich tgymnich Sep 16, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

if (auto arg = dyn_cast<Argument>(ptr)) {
assert(arg->getParent() == oldFunc);
}
ptr = invertPointerM(ptr, BuilderM);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you change this to instead check if BuilderM is a forward pass block or not to choose whether to do the lookup?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

case DerivativeMode::ForwardMode:
ptr = invertPointerM(origptr, BuilderM);
break;
case DerivativeMode::ReverseModePrimal:
Copy link
Member

@wsmoses wsmoses Sep 14, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add an assert for reverse mode primal since this method should never be called in that case.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

@tgymnich tgymnich merged commit 51988b0 into main Sep 19, 2021
@tgymnich tgymnich deleted the move-assertions branch September 20, 2021 21:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants