Skip to content

Commit d345907

Browse files
authored
Fix call segfault (rust-lang#821)
1 parent 73cba8d commit d345907

File tree

3 files changed

+38
-2
lines changed

3 files changed

+38
-2
lines changed

enzyme/Enzyme/AdjointGenerator.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11832,6 +11832,9 @@ class AdjointGenerator
1183211832
orig->getName() + "'ac");
1183311833
assert(newip->getType() == orig->getType());
1183411834
placeholder->replaceAllUsesWith(newip);
11835+
if (placeholder == &*BuilderZ.GetInsertPoint()) {
11836+
BuilderZ.SetInsertPoint(placeholder->getNextNode());
11837+
}
1183511838
gutils->erase(placeholder);
1183611839
} else {
1183711840
newip = placeholder;

enzyme/Enzyme/GradientUtils.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2166,8 +2166,13 @@ Value *GradientUtils::cacheForReverse(IRBuilder<> &BuilderQ, Value *malloc,
21662166
if (!ignoreType && replace)
21672167
cast<Instruction>(malloc)->replaceAllUsesWith(ret);
21682168
ret->takeName(malloc);
2169-
if (replace)
2170-
erase(cast<Instruction>(malloc));
2169+
if (replace) {
2170+
auto malloci = cast<Instruction>(malloc);
2171+
if (malloci == &*BuilderQ.GetInsertPoint()) {
2172+
BuilderQ.SetInsertPoint(malloci->getNextNode());
2173+
}
2174+
erase(malloci);
2175+
}
21712176
}
21722177
return ret;
21732178
} else {
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
; RUN: %opt < %s %loadEnzyme -enzyme -enzyme-preopt=false -mem2reg -simplifycfg -S | FileCheck %s
2+
3+
declare i8* @_Znwm(i64 %s)
4+
5+
define void @ifunc(i8* %arg) {
6+
bb:
7+
%i66 = call i8* @recur(i8* %arg)
8+
ret void
9+
}
10+
11+
define i8* @recur(i8* %arg) {
12+
bb:
13+
%i = call i8* @_Znwm(i64 8)
14+
%i20 = call i8* @recur(i8* %i)
15+
%i24 = bitcast i8* %arg to i8**
16+
store i8* %i20, i8** %i24, align 8
17+
ret i8* %i
18+
}
19+
20+
declare void @_Z17__enzyme_autodiff(...)
21+
22+
define void @caller(i8* %a, i8* %b) {
23+
tail call void (...) @_Z17__enzyme_autodiff(void (i8*)* @ifunc, metadata !"enzyme_dup", i8* %a, i8* %b)
24+
ret void
25+
}
26+
27+
; Ensure this compiles without segfaulting
28+
; CHECK: define internal void @differecur(i8* %arg, i8* %"arg'")

0 commit comments

Comments
 (0)