-
Notifications
You must be signed in to change notification settings - Fork 145
Move Assertions #306
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Move Assertions #306
Conversation
1ba72bc to
d578d00
Compare
enzyme/Enzyme/GradientUtils.cpp
Outdated
| // analysis honeypot no longer exists | ||
| return lookupM(getNewFromOriginal(oval), BuilderM); | ||
|
|
||
| switch (mode) { |
There was a problem hiding this comment.
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.
f97e663 to
864fd54
Compare
|
I managed to move |
|
|
||
| switch (mode) { | ||
| case DerivativeMode::ForwardMode: | ||
| pidx = invertPointerM(dli->getOperand(0), BuilderM); |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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);
}
}
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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.
--
There was a problem hiding this comment.
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.
--
There was a problem hiding this comment.
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.
--
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
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); |
There was a problem hiding this comment.
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?
There was a problem hiding this comment.
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: |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done
This reverts commit 864fd54.
b03a851 to
85c522d
Compare
invertPointerMuseslookupM...