Skip to content

Commit 205f9a2

Browse files
committed
Don't unnecessarily cache fmul & gep fixup
1 parent 4548f30 commit 205f9a2

39 files changed

+686
-299
lines changed

enzyme/Enzyme/EnzymeLogic.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ std::map<Instruction*, bool> compute_uncacheable_load_map(GradientUtils* gutils,
7070
std::map<Instruction*, bool> can_modref_map;
7171
for (inst_iterator I = inst_begin(*gutils->oldFunc), E = inst_end(*gutils->oldFunc); I != E; ++I) {
7272
Instruction* inst = &*I;
73-
// For each load instruction, determine if it is uncacheable.
73+
// For each load instruction, determine if it is xuncacheable.
7474
if (auto op = dyn_cast<LoadInst>(inst)) {
7575

7676
bool can_modref = false;
@@ -451,6 +451,20 @@ bool is_value_needed_in_reverse(TypeResults &TR, const GradientUtils* gutils, Va
451451
if (op->getOpcode() == Instruction::FAdd || op->getOpcode() == Instruction::FSub) {
452452
continue;
453453
}
454+
if (op->getOpcode() == Instruction::FMul) {
455+
bool needed = false;
456+
if (op->getOperand(0) == inst && !gutils->isConstantValue(gutils->getNewFromOriginal(op->getOperand(1)))) needed = true;
457+
if (op->getOperand(1) == inst && !gutils->isConstantValue(gutils->getNewFromOriginal(op->getOperand(0)))) needed = true;
458+
//llvm::errs() << "needed " << *inst << " in mul " << *op << " - needed:" << needed << "\n";
459+
if (!needed) continue;
460+
}
461+
462+
if (op->getOpcode() == Instruction::FDiv) {
463+
bool needed = false;
464+
if (op->getOperand(1) == inst && !gutils->isConstantValue(gutils->getNewFromOriginal(op->getOperand(1)))) needed = true;
465+
if (op->getOperand(1) == inst && !gutils->isConstantValue(gutils->getNewFromOriginal(op->getOperand(0)))) needed = true;
466+
if (!needed) continue;
467+
}
454468
}
455469

456470
//We don't need only the indices of a GEP to compute the adjoint of a GEP

enzyme/Enzyme/GradientUtils.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -447,29 +447,32 @@ Value* GradientUtils::invertPointerM(Value* val, IRBuilder<>& BuilderM) {
447447
invertedPointers[arg] = li;
448448
return lookupM(invertedPointers[arg], BuilderM);
449449
} else if (auto arg = dyn_cast<GetElementPtrInst>(val)) {
450-
if (arg->getParent() == &arg->getParent()->getParent()->getEntryBlock()) {
450+
//if (arg->getParent() == &arg->getParent()->getParent()->getEntryBlock()) {
451451
IRBuilder<> bb(arg);
452452
SmallVector<Value*,4> invertargs;
453453
for(auto &a: arg->indices()) {
454454
auto b = lookupM(a, bb);
455455
invertargs.push_back(b);
456456
}
457-
auto result = bb.CreateGEP(invertPointerM(arg->getPointerOperand(), bb), invertargs, arg->getName()+"'ipge");
457+
auto result = bb.CreateGEP(invertPointerM(arg->getPointerOperand(), bb), invertargs, arg->getName()+"'ipg");
458458
if (auto gep = dyn_cast<GetElementPtrInst>(result))
459459
gep->setIsInBounds(arg->isInBounds());
460460
invertedPointers[arg] = result;
461461
return lookupM(invertedPointers[arg], BuilderM);
462-
}
463-
462+
//}
463+
/*
464464
SmallVector<Value*,4> invertargs;
465465
for(auto &a: arg->indices()) {
466466
auto b = lookupM(a, BuilderM);
467467
invertargs.push_back(b);
468468
}
469-
auto result = BuilderM.CreateGEP(invertPointerM(arg->getPointerOperand(), BuilderM), invertargs, arg->getName()+"'ipg");
469+
470+
auto result = bb.CreateGEP(invertPointerM(arg->getPointerOperand(), BuilderM), invertargs, arg->getName()+"'ipg");
470471
if (auto gep = dyn_cast<GetElementPtrInst>(result))
471472
gep->setIsInBounds(arg->isInBounds());
472-
return result;
473+
invertedPointers[arg] = result;
474+
return lookupM(invertedPointers[arg], BuilderM);
475+
*/
473476
} else if (auto inst = dyn_cast<AllocaInst>(val)) {
474477
IRBuilder<> bb(inst);
475478
AllocaInst* antialloca = bb.CreateAlloca(inst->getAllocatedType(), inst->getType()->getPointerAddressSpace(), inst->getArraySize(), inst->getName()+"'ipa");

enzyme/test/Enzyme/alloctomalloc.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -465,14 +465,14 @@ attributes #9 = { cold }
465465
; CHECK-NEXT: entry:
466466
; CHECK-NEXT: %"a0'ipc" = bitcast %"class.Eigen::Matrix.6"* %"output'" to <2 x double>*
467467
; CHECK-NEXT: %a0 = bitcast %"class.Eigen::Matrix.6"* %output to <2 x double>*
468-
; CHECK-NEXT: %"Bdouble'ipge" = getelementptr inbounds %"class.Eigen::Matrix.6", %"class.Eigen::Matrix.6"* %"b'", i64 0, i32 0, i32 0, i32 0, i32 0, i64 0
468+
; CHECK-NEXT: %[[Bdoubleipge:.+]] = getelementptr inbounds %"class.Eigen::Matrix.6", %"class.Eigen::Matrix.6"* %"b'", i64 0, i32 0, i32 0, i32 0, i32 0, i64 0
469469
; CHECK-NEXT: %Bdouble = getelementptr inbounds %"class.Eigen::Matrix.6", %"class.Eigen::Matrix.6"* %b, i64 0, i32 0, i32 0, i32 0, i32 0, i64 0
470-
; CHECK-NEXT: %_augmented = call { { double, <2 x double>, double, <2 x double>, {}, {}, <2 x double>*, <2 x double>*, i8*, i8* } } @augmented_subfn(<2 x double>* %a0, <2 x double>* %"a0'ipc", %"class.Eigen::Matrix"* %W, %"class.Eigen::Matrix"* %"W'", double* %Bdouble, double* %"Bdouble'ipge") #8
470+
; CHECK-NEXT: %_augmented = call { { double, <2 x double>, double, <2 x double>, {}, {}, <2 x double>*, <2 x double>*, i8*, i8* } } @augmented_subfn(<2 x double>* %a0, <2 x double>* %"a0'ipc", %"class.Eigen::Matrix"* %W, %"class.Eigen::Matrix"* %"W'", double* %Bdouble, double* %[[Bdoubleipge]]) #8
471471
; CHECK-NEXT: %_unwrap = bitcast %"class.Eigen::Matrix.6"* %output to %"struct.Eigen::EigenBase.13"*
472472
; CHECK-NEXT: %[[ipc:.+]] = bitcast %"class.Eigen::Matrix.6"* %"output'" to %"struct.Eigen::EigenBase.13"*
473473
; CHECK-NEXT: %[[unused0:.+]] = call {} @diffecast(%"struct.Eigen::EigenBase.13"* %_unwrap, %"struct.Eigen::EigenBase.13"* %[[ipc]])
474474
; CHECK-NEXT: %[[ev:.+]] = extractvalue { { double, <2 x double>, double, <2 x double>, {}, {}, <2 x double>*, <2 x double>*, i8*, i8* } } %_augmented, 0
475-
; CHECK-NEXT: %[[unused:.+]] = call {} @diffesubfn(<2 x double>* %a0, <2 x double>* %"a0'ipc", %"class.Eigen::Matrix"* %W, %"class.Eigen::Matrix"* %"W'", double* %Bdouble, double* %"Bdouble'ipge", { double, <2 x double>, double, <2 x double>, {}, {}, <2 x double>*, <2 x double>*, i8*, i8* } %[[ev]]) #8
475+
; CHECK-NEXT: %[[unused:.+]] = call {} @diffesubfn(<2 x double>* %a0, <2 x double>* %"a0'ipc", %"class.Eigen::Matrix"* %W, %"class.Eigen::Matrix"* %"W'", double* %Bdouble, double* %[[Bdoubleipge]], { double, <2 x double>, double, <2 x double>, {}, {}, <2 x double>*, <2 x double>*, i8*, i8* } %[[ev]]) #8
476476
; CHECK-NEXT: ret {} undef
477477
; CHECK-NEXT: }
478478

enzyme/test/Enzyme/badcall.ll

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,10 @@ attributes #1 = { noinline nounwind uwtable }
4242

4343
; CHECK: define internal {{(dso_local )?}}{} @diffef(double* nocapture %x, double* %"x'")
4444
; CHECK-NEXT: entry:
45-
; CHECK-NEXT: %[[augsubf:.+]] = call { { {}, double } } @augmented_subf(double* %x, double* %"x'")
45+
; CHECK-NEXT: %[[augsubf:.+]] = call { { {} } } @augmented_subf(double* %x, double* %"x'")
4646
; CHECK-NEXT: store double 2.000000e+00, double* %x, align 8
4747
; CHECK-NEXT: store double 0.000000e+00, double* %"x'"
48-
; CHECK-NEXT: %[[subfret:.+]] = extractvalue { { {}, double } } %[[augsubf]], 0
49-
; CHECK-NEXT: %[[dsubf:.+]] = call {} @diffesubf(double* nonnull %x, double* %"x'", { {}, double } %[[subfret]])
48+
; CHECK-NEXT: %[[dsubf:.+]] = call {} @diffesubf(double* nonnull %x, double* %"x'", { {} } undef)
5049
; CHECK-NEXT: ret {} undef
5150
; CHECK-NEXT: }
5251

@@ -57,21 +56,16 @@ attributes #1 = { noinline nounwind uwtable }
5756
; CHECK-NEXT: ret { {} } undef
5857
; CHECK-NEXT: }
5958

60-
; CHECK: define internal {{(dso_local )?}}{ { {}, double } } @augmented_subf(double* nocapture %x, double* %"x'")
59+
; CHECK: define internal {{(dso_local )?}}{ { {} } } @augmented_subf(double* nocapture %x, double* %"x'")
6160
; CHECK-NEXT: entry:
62-
; CHECK-NEXT: %0 = alloca { { {}, double } }
63-
; CHECK-NEXT: %1 = getelementptr { { {}, double } }, { { {}, double } }* %0, i32 0, i32 0
64-
; CHECK-NEXT: %2 = load double, double* %x, align 8
65-
; CHECK-NEXT: %3 = getelementptr { {}, double }, { {}, double }* %1, i32 0, i32 1
66-
; CHECK-NEXT: store double %2, double* %3
67-
; CHECK-NEXT: %mul = fmul fast double %2, 2.000000e+00
61+
; CHECK-NEXT: %[[loadx:.+]] = load double, double* %x, align 8
62+
; CHECK-NEXT: %mul = fmul fast double %[[loadx]], 2.000000e+00
6863
; CHECK-NEXT: store double %mul, double* %x, align 8
6964
; CHECK-NEXT: %[[metasubf:.+]] = call { {} } @augmented_metasubf(double* %x, double* %"x'")
70-
; CHECK-NEXT: %[[ldc:.+]] = load { { {}, double } }, { { {}, double } }* %0
71-
; CHECK-NEXT: ret { { {}, double } } %[[ldc]]
65+
; CHECK-NEXT: ret { { {} } } undef
7266
; CHECK-NEXT: }
7367

74-
; CHECK: define internal {{(dso_local )?}}{} @diffesubf(double* nocapture %x, double* %"x'", { {}, double } %tapeArg)
68+
; CHECK: define internal {{(dso_local )?}}{} @diffesubf(double* nocapture %x, double* %"x'", { {} } %tapeArg)
7569
; CHECK-NEXT: entry:
7670
; CHECK-NEXT: %0 = call {} @diffemetasubf(double* %x, double* %"x'", {} undef)
7771
; CHECK-NEXT: %1 = load double, double* %"x'"

enzyme/test/Enzyme/badcall2.ll

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,10 @@ declare dso_local double @__enzyme_autodiff(i8*, double*, double*) local_unnamed
5050

5151
; CHECK: define internal {{(dso_local )?}}{} @diffef(double* nocapture %x, double* %"x'")
5252
; CHECK-NEXT: entry:
53-
; CHECK-NEXT: %[[augsubf:.+]] = call { { {}, {}, double } } @augmented_subf(double* %x, double* %"x'")
53+
; CHECK-NEXT: %[[augsubf:.+]] = call { { {}, {} } } @augmented_subf(double* %x, double* %"x'")
5454
; CHECK-NEXT: store double 2.000000e+00, double* %x, align 8
5555
; CHECK-NEXT: store double 0.000000e+00, double* %"x'", align 8
56-
; CHECK-NEXT: %[[subfret:.+]] = extractvalue { { {}, {}, double } } %[[augsubf]], 0
57-
; CHECK-NEXT: %[[df:.+]] = call {} @diffesubf(double* nonnull %x, double* %"x'", { {}, {}, double } %[[subfret]])
56+
; CHECK-NEXT: %[[df:.+]] = call {} @diffesubf(double* nonnull %x, double* %"x'", { {}, {} } undef)
5857
; CHECK-NEXT: ret {} undef
5958
; CHECK-NEXT: }
6059

@@ -72,23 +71,18 @@ declare dso_local double @__enzyme_autodiff(i8*, double*, double*) local_unnamed
7271
; CHECK-NEXT: ret { {} } undef
7372
; CHECK-NEXT: }
7473

75-
; CHECK: define internal {{(dso_local )?}}{ { {}, {}, double } } @augmented_subf(double* nocapture %x, double* %"x'")
74+
; CHECK: define internal {{(dso_local )?}}{ { {}, {} } } @augmented_subf(double* nocapture %x, double* %"x'")
7675
; CHECK-NEXT: entry:
77-
; CHECK-NEXT: %0 = alloca { { {}, {}, double } }
78-
; CHECK-NEXT: %1 = getelementptr { { {}, {}, double } }, { { {}, {}, double } }* %0, i32 0, i32 0
79-
; CHECK-NEXT: %2 = load double, double* %x, align 8
80-
; CHECK-NEXT: %3 = getelementptr { {}, {}, double }, { {}, {}, double }* %1, i32 0, i32 2
81-
; CHECK-NEXT: store double %2, double* %3
82-
; CHECK-NEXT: %mul = fmul fast double %2, 2.000000e+00
76+
; CHECK-NEXT: %[[loadx:.+]] = load double, double* %x, align 8
77+
; CHECK-NEXT: %mul = fmul fast double %[[loadx]], 2.000000e+00
8378
; CHECK-NEXT: store double %mul, double* %x, align 8
8479
; CHECK-NEXT: %[[augmetasubf:.+]] = call { {} } @augmented_metasubf(double* %x, double* %"x'")
8580
; CHECK-NEXT: %[[augothermetasubf:.+]] = call { {} } @augmented_othermetasubf(double* %x, double* %"x'")
86-
; CHECK-NEXT: %[[ret:.+]] = load { { {}, {}, double } }, { { {}, {}, double } }* %0
87-
; CHECK-NEXT: ret { { {}, {}, double } } %[[ret]]
81+
; CHECK-NEXT: ret { { {}, {} } } undef
8882
; CHECK-NEXT: }
8983

9084

91-
; CHECK: define internal {{(dso_local )?}}{} @diffesubf(double* nocapture %x, double* %"x'", { {}, {}, double } %tapeArg)
85+
; CHECK: define internal {{(dso_local )?}}{} @diffesubf(double* nocapture %x, double* %"x'", { {}, {} } %tapeArg)
9286
; CHECK-NEXT: entry:
9387
; CHECK-NEXT: %0 = call {} @diffeothermetasubf(double* %x, double* %"x'", {} undef)
9488
; CHECK-NEXT: %1 = call {} @diffemetasubf(double* %x, double* %"x'", {} undef)

enzyme/test/Enzyme/badcall3.ll

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,10 @@ declare dso_local double @__enzyme_autodiff(i8*, double*, double*) local_unnamed
5050

5151
; CHECK: define internal {{(dso_local )?}}{} @diffef(double* nocapture %x, double* %"x'")
5252
; CHECK-NEXT: entry:
53-
; CHECK-NEXT: %[[augsubf:.+]] = call { { {}, {}, double } } @augmented_subf(double* %x, double* %"x'")
53+
; CHECK-NEXT: %[[augsubf:.+]] = call { { {}, {} } } @augmented_subf(double* %x, double* %"x'")
5454
; CHECK-NEXT: store double 2.000000e+00, double* %x, align 8
5555
; CHECK-NEXT: store double 0.000000e+00, double* %"x'", align 8
56-
; CHECK-NEXT: %[[augret:.+]] = extractvalue { { {}, {}, double } } %[[augsubf]], 0
57-
; CHECK-NEXT: %[[dsubf:.+]] = call {} @diffesubf(double* nonnull %x, double* %"x'", { {}, {}, double } %[[augret:.+]])
56+
; CHECK-NEXT: %[[dsubf:.+]] = call {} @diffesubf(double* nonnull %x, double* %"x'", { {}, {} } undef)
5857
; CHECK-NEXT: ret {} undef
5958
; CHECK-NEXT: }
6059

@@ -72,23 +71,18 @@ declare dso_local double @__enzyme_autodiff(i8*, double*, double*) local_unnamed
7271
; CHECK-NEXT: ret { {} } undef
7372
; CHECK-NEXT: }
7473

75-
; CHECK: define internal {{(dso_local )?}}{ { {}, {}, double } } @augmented_subf(double* nocapture %x, double* %"x'")
74+
; CHECK: define internal {{(dso_local )?}}{ { {}, {} } } @augmented_subf(double* nocapture %x, double* %"x'")
7675
; CHECK-NEXT: entry:
77-
; CHECK-NEXT: %0 = alloca { { {}, {}, double } }
78-
; CHECK-NEXT: %1 = getelementptr { { {}, {}, double } }, { { {}, {}, double } }* %0, i32 0, i32 0
79-
; CHECK-NEXT: %2 = load double, double* %x, align 8
80-
; CHECK-NEXT: %3 = getelementptr { {}, {}, double }, { {}, {}, double }* %1, i32 0, i32 2
81-
; CHECK-NEXT: store double %2, double* %3
82-
; CHECK-NEXT: %mul = fmul fast double %2, 2.000000e+00
76+
; CHECK-NEXT: %[[xload:.+]] = load double, double* %x, align 8
77+
; CHECK-NEXT: %mul = fmul fast double %[[xload]], 2.000000e+00
8378
; CHECK-NEXT: store double %mul, double* %x, align 8
8479
; CHECK-NEXT: %[[metasubf:.+]] = call { {} } @augmented_metasubf(double* %x, double* %"x'")
8580
; CHECK-NEXT: %[[othermetasubf:.+]] = call { {} } @augmented_othermetasubf(double* %x, double* %"x'")
86-
; CHECK-NEXT: %[[ret:.+]] = load { { {}, {}, double } }, { { {}, {}, double } }* %0
87-
; CHECK-NEXT: ret { { {}, {}, double } } %[[ret]]
81+
; CHECK-NEXT: ret { { {}, {} } } undef
8882
; CHECK-NEXT: }
8983

9084

91-
; CHECK: define internal {{(dso_local )?}}{} @diffesubf(double* nocapture %x, double* %"x'", { {}, {}, double } %tapeArg)
85+
; CHECK: define internal {{(dso_local )?}}{} @diffesubf(double* nocapture %x, double* %"x'", { {}, {} } %tapeArg)
9286
; CHECK-NEXT: entry:
9387
; CHECK-NEXT: %0 = call {} @diffeothermetasubf(double* %x, double* %"x'", {} undef)
9488
; CHECK-NEXT: %1 = call {} @diffemetasubf(double* %x, double* %"x'", {} undef)

enzyme/test/Enzyme/badcall4.ll

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,19 +51,19 @@ declare dso_local double @__enzyme_autodiff(i8*, double*, double*) local_unnamed
5151

5252
; CHECK: define internal {{(dso_local )?}}{} @diffef(double* nocapture %x, double* %"x'")
5353
; CHECK-NEXT: entry:
54-
; CHECK-NEXT: %[[augsubf:.+]] = call { { {}, i1, {}, i1, double } } @augmented_subf(double* %x, double* %"x'")
54+
; CHECK-NEXT: %[[augsubf:.+]] = call { { {}, i1, {}, i1 } } @augmented_subf(double* %x, double* %"x'")
5555
; CHECK-NEXT: store double 2.000000e+00, double* %x, align 8
5656
; CHECK-NEXT: store double 0.000000e+00, double* %"x'", align 8
57-
; CHECK-NEXT: %[[augcache:.+]] = extractvalue { { {}, i1, {}, i1, double } } %[[augsubf]], 0
58-
; CHECK-NEXT: %[[dsubf:.+]] = call {} @diffesubf(double* nonnull %x, double* %"x'", { {}, i1, {}, i1, double } %[[augcache]])
57+
; CHECK-NEXT: %[[augcache:.+]] = extractvalue { { {}, i1, {}, i1 } } %[[augsubf]], 0
58+
; CHECK-NEXT: %[[dsubf:.+]] = call {} @diffesubf(double* nonnull %x, double* %"x'", { {}, i1, {}, i1 } %[[augcache]])
5959
; CHECK-NEXT: ret {} undef
6060
; CHECK-NEXT: }
6161

6262
; CHECK: define internal {{(dso_local )?}}{ {}, i1 } @augmented_othermetasubf(double* nocapture %x, double* %"x'")
6363

6464
; CHECK: define internal {{(dso_local )?}}{ {}, i1 } @augmented_metasubf(double* nocapture %x, double* %"x'")
6565

66-
; CHECK: define internal {{(dso_local )?}}{ { {}, i1, {}, i1, double } } @augmented_subf(double* nocapture %x, double* %"x'")
66+
; CHECK: define internal {{(dso_local )?}}{ { {}, i1, {}, i1 } } @augmented_subf(double* nocapture %x, double* %"x'")
6767
; CHECK-NEXT: entry:
6868
; CHECK-NEXT: %[[loadx:.+]] = load double, double* %x, align 8
6969
; CHECK-NEXT: %mul = fmul fast double %0, 2.000000e+00
@@ -72,13 +72,12 @@ declare dso_local double @__enzyme_autodiff(i8*, double*, double*) local_unnamed
7272
; CHECK-NEXT: %[[metasubfret:.+]] = extractvalue { {}, i1 } %[[metasubf]], 1
7373
; CHECK-NEXT: %[[othermetasubf:.+]] = call { {}, i1 } @augmented_othermetasubf(double* %x, double* %"x'")
7474
; CHECK-NEXT: %[[msf:.+]] = extractvalue { {}, i1 } %[[othermetasubf:.+]], 1
75-
; CHECK-NEXT: %.fca.0.1.insert = insertvalue { { {}, i1, {}, i1, double } } undef, i1 %[[msf]], 0, 1
76-
; CHECK-NEXT: %.fca.0.3.insert = insertvalue { { {}, i1, {}, i1, double } } %.fca.0.1.insert, i1 %[[metasubfret]], 0, 3
77-
; CHECK-NEXT: %.fca.0.4.insert = insertvalue { { {}, i1, {}, i1, double } } %.fca.0.3.insert, double %[[loadx]], 0, 4
78-
; CHECK-NEXT: ret { { {}, i1, {}, i1, double } } %.fca.0.4.insert
75+
; CHECK-NEXT: %.fca.0.1.insert = insertvalue { { {}, i1, {}, i1 } } undef, i1 %[[msf]], 0, 1
76+
; CHECK-NEXT: %.fca.0.3.insert = insertvalue { { {}, i1, {}, i1 } } %.fca.0.1.insert, i1 %[[metasubfret]], 0, 3
77+
; CHECK-NEXT: ret { { {}, i1, {}, i1 } } %.fca.0.3.insert
7978
; CHECK-NEXT: }
8079

81-
; CHECK: define internal {{(dso_local )?}}{} @diffesubf(double* nocapture %x, double* %"x'", { {}, i1, {}, i1, double } %tapeArg)
80+
; CHECK: define internal {{(dso_local )?}}{} @diffesubf(double* nocapture %x, double* %"x'", { {}, i1, {}, i1 } %tapeArg)
8281
; CHECK-NEXT: entry:
8382
; CHECK-NEXT: %0 = call {} @diffeothermetasubf(double* %x, double* %"x'", {} undef)
8483
; CHECK-NEXT: %1 = call {} @diffemetasubf(double* %x, double* %"x'", {} undef)

0 commit comments

Comments
 (0)