Skip to content

Commit f5dd9f0

Browse files
authored
other rb_tree mangleing (rust-lang#764)
* other mangleing * adjust TypeAnalysis to Rb_tree update * add wip test * update test and ActivityAnalysis * fixing older llvm tests * fix llvm-10 and older * fix llvm-8 and older
1 parent f9c7b63 commit f5dd9f0

File tree

4 files changed

+48
-2
lines changed

4 files changed

+48
-2
lines changed

enzyme/Enzyme/ActivityAnalysis.cpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,12 @@ const std::map<std::string, size_t> MPIInactiveCommAllocators = {
187187
// Instructions which themselves are inactive
188188
// the returned value, however, may still be active
189189
const std::set<std::string> KnownInactiveFunctionInsts = {
190-
"__dynamic_cast", "_ZSt18_Rb_tree_decrementPSt18_Rb_tree_node_base",
191-
"_ZSt18_Rb_tree_incrementPSt18_Rb_tree_node_base", "jl_ptr_to_array",
190+
"__dynamic_cast",
191+
"_ZSt18_Rb_tree_decrementPKSt18_Rb_tree_node_base",
192+
"_ZSt18_Rb_tree_incrementPKSt18_Rb_tree_node_base",
193+
"_ZSt18_Rb_tree_decrementPSt18_Rb_tree_node_base",
194+
"_ZSt18_Rb_tree_incrementPSt18_Rb_tree_node_base",
195+
"jl_ptr_to_array",
192196
"jl_ptr_to_array_1d"};
193197

194198
const std::set<std::string> KnownInactiveFunctions = {

enzyme/Enzyme/AdjointGenerator.h

+2
Original file line numberDiff line numberDiff line change
@@ -9012,6 +9012,8 @@ class AdjointGenerator
90129012
// if constant instruction and readonly (thus must be pointer return)
90139013
// and shadow return recomputable from shadow arguments.
90149014
if (funcName == "__dynamic_cast" ||
9015+
funcName == "_ZSt18_Rb_tree_decrementPKSt18_Rb_tree_node_base" ||
9016+
funcName == "_ZSt18_Rb_tree_incrementPKSt18_Rb_tree_node_base" ||
90159017
funcName == "_ZSt18_Rb_tree_decrementPSt18_Rb_tree_node_base" ||
90169018
funcName == "_ZSt18_Rb_tree_incrementPSt18_Rb_tree_node_base" ||
90179019
funcName == "jl_ptr_to_array" || funcName == "jl_ptr_to_array_1d") {

enzyme/Enzyme/TypeAnalysis/TypeAnalysis.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -3717,6 +3717,8 @@ void TypeAnalyzer::visitCallInst(CallInst &call) {
37173717
return;
37183718
}
37193719
if (funcName == "__dynamic_cast" ||
3720+
funcName == "_ZSt18_Rb_tree_decrementPKSt18_Rb_tree_node_base" ||
3721+
funcName == "_ZSt18_Rb_tree_incrementPKSt18_Rb_tree_node_base" ||
37203722
funcName == "_ZSt18_Rb_tree_decrementPSt18_Rb_tree_node_base" ||
37213723
funcName == "_ZSt18_Rb_tree_incrementPSt18_Rb_tree_node_base") {
37223724
updateAnalysis(&call, TypeTree(BaseType::Pointer).Only(-1), &call);
+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
; RUN: %opt < %s %loadEnzyme -enzyme -enzyme-preopt=false -mem2reg -instsimplify -adce -correlated-propagation -simplifycfg -S | FileCheck %s
2+
3+
; ModuleID = 'ld-temp.o'
4+
source_filename = "ld-temp.o"
5+
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
6+
target triple = "x86_64-unknown-linux-gnu"
7+
8+
%"struct.std::_Rb_tree_node_base" = type { i32, %"struct.std::_Rb_tree_node_base"*, %"struct.std::_Rb_tree_node_base"*, %"struct.std::_Rb_tree_node_base"* }
9+
10+
@enzyme_dup = external dso_local local_unnamed_addr global i32, align 4
11+
@enzyme_const = external dso_local local_unnamed_addr global i32, align 4
12+
13+
declare dso_local i32 @_Z17__enzyme_autodiff(...)
14+
15+
; Function Attrs: mustprogress nofree nounwind readonly willreturn
16+
declare dso_local %"struct.std::_Rb_tree_node_base"* @_ZSt18_Rb_tree_incrementPKSt18_Rb_tree_node_base(%"struct.std::_Rb_tree_node_base"*) local_unnamed_addr
17+
18+
; Function Attrs: mustprogress nofree nounwind readonly willreturn
19+
declare dso_local %"struct.std::_Rb_tree_node_base"* @_ZSt18_Rb_tree_decrementPKSt18_Rb_tree_node_base(%"struct.std::_Rb_tree_node_base"*) local_unnamed_addr
20+
21+
define dso_local i32 @callable(%"struct.std::_Rb_tree_node_base"* %i0) {
22+
%i1 = call %"struct.std::_Rb_tree_node_base"* @_ZSt18_Rb_tree_incrementPKSt18_Rb_tree_node_base(%"struct.std::_Rb_tree_node_base"* %i0)
23+
%i2 = call %"struct.std::_Rb_tree_node_base"* @_ZSt18_Rb_tree_decrementPKSt18_Rb_tree_node_base(%"struct.std::_Rb_tree_node_base"* %i1)
24+
ret i32 0
25+
}
26+
27+
define dso_local i32 @main(%"struct.std::_Rb_tree_node_base"* %i0, %"struct.std::_Rb_tree_node_base"* %shaddow) {
28+
%id = load i32, i32* @enzyme_dup, align 4
29+
%i1 = call i32 (...) @_Z17__enzyme_autodiff(i8* bitcast (i32 (%"struct.std::_Rb_tree_node_base"*)* @callable to i8*), i32 %id, %"struct.std::_Rb_tree_node_base"* nonnull align 8 dereferenceable(24) %i0, %"struct.std::_Rb_tree_node_base"* nonnull align 8 dereferenceable(24) %shaddow)
30+
ret i32 0
31+
}
32+
33+
; CHECK: define internal void @diffecallable(%"struct.std::_Rb_tree_node_base"* %i0, %"struct.std::_Rb_tree_node_base"* %"i0'")
34+
; CHECK-NEXT: invert:
35+
; CHECK-NEXT: %i1 = call %"struct.std::_Rb_tree_node_base"* @_ZSt18_Rb_tree_incrementPKSt18_Rb_tree_node_base(%"struct.std::_Rb_tree_node_base"* %i0)
36+
; CHECK-NEXT: %i2 = call %"struct.std::_Rb_tree_node_base"* @_ZSt18_Rb_tree_decrementPKSt18_Rb_tree_node_base(%"struct.std::_Rb_tree_node_base"* %i1)
37+
; CHECK-NEXT: ret void
38+
; CHECK-NEXT: }

0 commit comments

Comments
 (0)