I encounter an issue in ImpactX when differentiating through functions with return types of value std::unordered_map<std::string, double>.
I use those dictionary style types to return named tuples of ~20 values in certain physics (analysis) routines, usually then optimizing on a select few parameters in them. Unfortunately, I get some LLVM error that I do not (yet) know how to read (error: Enzyme: Cannot deduce type of copy call) .
Here is the full reproducer:
https://fwd.gymni.ch/DTQR3r
#include <cmath>
#include <string>
#include <unordered_map>
std::unordered_map<std::string, double>
reduced_beam_characteristics (double x, double y)
{
std::unordered_map<std::string, double> data;
data["alpha_x"] = x*x + y;
data["alpha_y"] = y*y + 2.;
return data;
}
double compute (double r)
{
double x = std::sqrt(r);
double y = std::log(r);
std::unordered_map<std::string, double> const rbc =
reduced_beam_characteristics(x, y);
return rbc.at("alpha_x");
}
double __enzyme_autodiff(void*, double);
int main()
{
double q1_k = 3.0;
// normal
double const alpha_x = compute(q1_k);
// diff (fails)
double ddx = __enzyme_autodiff((void*) compute, q1_k);
}
In file included from :2:
In file included from /usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/string:40:
/usr/lib/gcc/x86_64-linux-gnu/11/../../../../include/c++/11/bits/char_traits.h:437:33: error: Enzyme: Cannot deduce type of copy call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(7) %6, ptr noundef nonnull align 1 dereferenceable(7) @.str, i64 7, i1 false) #20, !dbg !3616
%39 = load i64, ptr %38, align 8, !dbg !3931, !tbaa !3932: {[-1]:Integer}, intvals: {}
double %0: {[-1]:Float@double}, intvals: {}
%27 = load ptr, ptr %25, align 8, !dbg !3783, !tbaa !3791: {[-1]:Pointer}, intvals: {}
call void @_ZdlPv(ptr noundef %29) #21, !dbg !3877: {}, intvals: {}
call void @_ZdlPv(ptr noundef %15) #21, !dbg !3736: {}, intvals: {}
call void @_ZdlPv(ptr noundef nonnull %25) #21, !dbg !3925: {}, intvals: {}
%28 = getelementptr inbounds i8, ptr %25, i64 8, !dbg !3798: {[-1]:Pointer, [-1,0]:Pointer}, intvals: {}
%24 = phi i64 [ 0, %22 ], [ %26, %33 ]: {[-1]:Integer}, intvals: {0,}
%2 = alloca %"class.std::unordered_map", align 8: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,0]:Pointer, [-1,0,0,0,0]:Pointer, [-1,0,0,0,0,0]:Pointer, [-1,0,0,0,0,8]:Pointer, [-1,0,0,0,0,16]:Integer, [-1,0,0,0,0,17]:Integer, [-1,0,0,0,0,18]:Integer, [-1,0,0,0,0,19]:Integer, [-1,0,0,0,0,20]:Integer, [-1,0,0,0,0,21]:Integer, [-1,0,0,0,0,22]:Integer, [-1,0,0,0,0,23]:Integer, [-1,0,0,0,0,24]:Integer, [-1,0,0,0,0,31]:Integer, [-1,0,0,0,0,40]:Float@double, [-1,0,0,0,0,48]:Integer, [-1,0,0,0,0,49]:Integer, [-1,0,0,0,0,50]:Integer, [-1,0,0,0,0,51]:Integer, [-1,0,0,0,0,52]:Integer, [-1,0,0,0,0,53]:Integer, [-1,0,0,0,0,54]:Integer, [-1,0,0,0,0,55]:Integer, [-1,0,0,0,8]:Pointer, [-1,0,0,0,8,0]:Integer, [-1,0,0,0,8,7]:Integer, [-1,0,0,0,8,16]:Float@double, [-1,0,0,0,8,24]:Integer, [-1,0,0,0,8,25]:Integer, [-1,0,0,0,8,26]:Integer, [-1,0,0,0,8,27]:Integer, [-1,0,0,0,8,28]:Integer, [-1,0,0,0,8,29]:Integer, [-1,0,0,0,8,30]:Integer, [-1,0,0,0,8,31]:Integer, [-1,0,0,0,16]:Integer, [-1,0,0,0,17]:Integer, [-1,0,0,0,18]:Integer, [-1,0,0,0,19]:Integer, [-1,0,0,0,20]:Integer, [-1,0,0,0,21]:Integer, [-1,0,0,0,22]:Integer, [-1,0,0,0,23]:Integer, [-1,0,0,0,24]:Integer, [-1,0,0,0,31]:Integer, [-1,0,0,0,40]:Float@double, [-1,0,0,0,48]:Integer, [-1,0,0,0,49]:Integer, [-1,0,0,0,50]:Integer, [-1,0,0,0,51]:Integer, [-1,0,0,0,52]:Integer, [-1,0,0,0,53]:Integer, [-1,0,0,0,54]:Integer, [-1,0,0,0,55]:Integer, [-1,0,0,8]:Pointer, [-1,0,0,8,0]:Integer, [-1,0,0,8,7]:Integer, [-1,0,0,8,16]:Float@double, [-1,0,0,8,24]:Integer, [-1,0,0,8,25]:Integer, [-1,0,0,8,26]:Integer, [-1,0,0,8,27]:Integer, [-1,0,0,8,28]:Integer, [-1,0,0,8,29]:Integer, [-1,0,0,8,30]:Integer, [-1,0,0,8,31]:Integer, [-1,0,0,16]:Integer, [-1,0,0,17]:Integer, [-1,0,0,18]:Integer, [-1,0,0,19]:Integer, [-1,0,0,20]:Integer, [-1,0,0,21]:Integer, [-1,0,0,22]:Integer, [-1,0,0,23]:Integer, [-1,0,0,24]:Integer, [-1,0,0,31]:Integer, [-1,0,0,40]:Float@double, [-1,0,0,48]:Integer, [-1,0,0,49]:Integer, [-1,0,0,50]:Integer, [-1,0,0,51]:Integer, [-1,0,0,52]:Integer, [-1,0,0,53]:Integer, [-1,0,0,54]:Integer, [-1,0,0,55]:Integer, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,16]:Pointer, [-1,16,0]:Pointer, [-1,16,0,0]:Pointer, [-1,16,0,0,0]:Pointer, [-1,16,0,0,0,0]:Pointer, [-1,16,0,0,0,8]:Pointer, [-1,16,0,0,0,16]:Integer, [-1,16,0,0,0,17]:Integer, [-1,16,0,0,0,18]:Integer, [-1,16,0,0,0,19]:Integer, [-1,16,0,0,0,20]:Integer, [-1,16,0,0,0,21]:Integer, [-1,16,0,0,0,22]:Integer, [-1,16,0,0,0,23]:Integer, [-1,16,0,0,0,24]:Integer, [-1,16,0,0,0,31]:Integer, [-1,16,0,0,0,40]:Float@double, [-1,16,0,0,0,48]:Integer, [-1,16,0,0,0,49]:Integer, [-1,16,0,0,0,50]:Integer, [-1,16,0,0,0,51]:Integer, [-1,16,0,0,0,52]:Integer, [-1,16,0,0,0,53]:Integer, [-1,16,0,0,0,54]:Integer, [-1,16,0,0,0,55]:Integer, [-1,16,0,0,8]:Pointer, [-1,16,0,0,8,0]:Integer, [-1,16,0,0,8,7]:Integer, [-1,16,0,0,8,16]:Float@double, [-1,16,0,0,8,24]:Integer, [-1,16,0,0,8,25]:Integer, [-1,16,0,0,8,26]:Integer, [-1,16,0,0,8,27]:Integer, [-1,16,0,0,8,28]:Integer, [-1,16,0,0,8,29]:Integer, [-1,16,0,0,8,30]:Integer, [-1,16,0,0,8,31]:Integer, [-1,16,0,0,16]:Integer, [-1,16,0,0,17]:Integer, [-1,16,0,0,18]:Integer, [-1,16,0,0,19]:Integer, [-1,16,0,0,20]:Integer, [-1,16,0,0,21]:Integer, [-1,16,0,0,22]:Integer, [-1,16,0,0,23]:Integer, [-1,16,0,0,24]:Integer, [-1,16,0,0,31]:Integer, [-1,16,0,0,40]:Float@double, [-1,16,0,0,48]:Integer, [-1,16,0,0,49]:Integer, [-1,16,0,0,50]:Integer, [-1,16,0,0,51]:Integer, [-1,16,0,0,52]:Integer, [-1,16,0,0,53]:Integer, [-1,16,0,0,54]:Integer, [-1,16,0,0,55]:Integer, [-1,16,0,8]:Pointer, [-1,16,0,8,0]:Integer, [-1,16,0,8,7]:Integer, [-1,16,0,8,16]:Float@double, [-1,16,0,8,24]:Integer, [-1,16,0,8,25]:Integer, [-1,16,0,8,26]:Integer, [-1,16,0,8,27]:Integer, [-1,16,0,8,28]:Integer, [-1,16,0,8,29]:Integer, [-1,16,0,8,30]:Integer, [-1,16,0,8,31]:Integer, [-1,16,0,16]:Integer, [-1,16,0,17]:Integer, [-1,16,0,18]:Integer, [-1,16,0,19]:Integer, [-1,16,0,20]:Integer, [-1,16,0,21]:Integer, [-1,16,0,22]:Integer, [-1,16,0,23]:Integer, [-1,16,0,24]:Integer, [-1,16,0,31]:Integer, [-1,16,0,40]:Float@double, [-1,16,0,48]:Integer, [-1,16,0,49]:Integer, [-1,16,0,50]:Integer, [-1,16,0,51]:Integer, [-1,16,0,52]:Integer, [-1,16,0,53]:Integer, [-1,16,0,54]:Integer, [-1,16,0,55]:Integer, [-1,16,8]:Pointer, [-1,16,8,0]:Integer, [-1,16,8,7]:Integer, [-1,16,8,16]:Float@double, [-1,16,8,24]:Integer, [-1,16,8,25]:Integer, [-1,16,8,26]:Integer, [-1,16,8,27]:Integer, [-1,16,8,28]:Integer, [-1,16,8,29]:Integer, [-1,16,8,30]:Integer, [-1,16,8,31]:Integer, [-1,16,16]:Integer, [-1,16,17]:Integer, [-1,16,18]:Integer, [-1,16,19]:Integer, [-1,16,20]:Integer, [-1,16,21]:Integer, [-1,16,22]:Integer, [-1,16,23]:Integer, [-1,16,24]:Integer, [-1,16,31]:Integer, [-1,16,40]:Float@double, [-1,16,48]:Integer, [-1,16,49]:Integer, [-1,16,50]:Integer, [-1,16,51]:Integer, [-1,16,52]:Integer, [-1,16,53]:Integer, [-1,16,54]:Integer, [-1,16,55]:Integer, [-1,24]:Integer, [-1,25]:Integer, [-1,26]:Integer, [-1,27]:Integer, [-1,28]:Integer, [-1,29]:Integer, [-1,30]:Integer, [-1,31]:Integer, [-1,32]:Float@float, [-1,40]:Integer, [-1,41]:Integer, [-1,42]:Integer, [-1,43]:Integer, [-1,44]:Integer, [-1,45]:Integer, [-1,46]:Integer, [-1,47]:Integer, [-1,48]:Pointer, [-1,48,0]:Pointer, [-1,48,0,0]:Pointer, [-1,48,0,0,0]:Pointer, [-1,48,0,0,0,0]:Pointer, [-1,48,0,0,0,8]:Pointer, [-1,48,0,0,0,16]:Integer, [-1,48,0,0,0,17]:Integer, [-1,48,0,0,0,18]:Integer, [-1,48,0,0,0,19]:Integer, [-1,48,0,0,0,20]:Integer, [-1,48,0,0,0,21]:Integer, [-1,48,0,0,0,22]:Integer, [-1,48,0,0,0,23]:Integer, [-1,48,0,0,0,24]:Integer, [-1,48,0,0,0,31]:Integer, [-1,48,0,0,0,40]:Float@double, [-1,48,0,0,0,48]:Integer, [-1,48,0,0,0,49]:Integer, [-1,48,0,0,0,50]:Integer, [-1,48,0,0,0,51]:Integer, [-1,48,0,0,0,52]:Integer, [-1,48,0,0,0,53]:Integer, [-1,48,0,0,0,54]:Integer, [-1,48,0,0,0,55]:Integer, [-1,48,0,0,8]:Pointer, [-1,48,0,0,8,0]:Integer, [-1,48,0,0,8,7]:Integer, [-1,48,0,0,8,16]:Float@double, [-1,48,0,0,8,24]:Integer, [-1,48,0,0,8,25]:Integer, [-1,48,0,0,8,26]:Integer, [-1,48,0,0,8,27]:Integer, [-1,48,0,0,8,28]:Integer, [-1,48,0,0,8,29]:Integer, [-1,48,0,0,8,30]:Integer, [-1,48,0,0,8,31]:Integer, [-1,48,0,0,16]:Integer, [-1,48,0,0,17]:Integer, [-1,48,0,0,18]:Integer, [-1,48,0,0,19]:Integer, [-1,48,0,0,20]:Integer, [-1,48,0,0,21]:Integer, [-1,48,0,0,22]:Integer, [-1,48,0,0,23]:Integer, [-1,48,0,0,24]:Integer, [-1,48,0,0,31]:Integer, [-1,48,0,0,40]:Float@double, [-1,48,0,0,48]:Integer, [-1,48,0,0,49]:Integer, [-1,48,0,0,50]:Integer, [-1,48,0,0,51]:Integer, [-1,48,0,0,52]:Integer, [-1,48,0,0,53]:Integer, [-1,48,0,0,54]:Integer, [-1,48,0,0,55]:Integer, [-1,48,0,8]:Pointer, [-1,48,0,8,0]:Integer, [-1,48,0,8,7]:Integer, [-1,48,0,8,16]:Float@double, [-1,48,0,8,24]:Integer, [-1,48,0,8,25]:Integer, [-1,48,0,8,26]:Integer, [-1,48,0,8,27]:Integer, [-1,48,0,8,28]:Integer, [-1,48,0,8,29]:Integer, [-1,48,0,8,30]:Integer, [-1,48,0,8,31]:Integer, [-1,48,0,16]:Integer, [-1,48,0,17]:Integer, [-1,48,0,18]:Integer, [-1,48,0,19]:Integer, [-1,48,0,20]:Integer, [-1,48,0,21]:Integer, [-1,48,0,22]:Integer, [-1,48,0,23]:Integer, [-1,48,0,24]:Integer, [-1,48,0,31]:Integer, [-1,48,0,40]:Float@double, [-1,48,0,48]:Integer, [-1,48,0,49]:Integer, [-1,48,0,50]:Integer, [-1,48,0,51]:Integer, [-1,48,0,52]:Integer, [-1,48,0,53]:Integer, [-1,48,0,54]:Integer, [-1,48,0,55]:Integer, [-1,48,8]:Pointer, [-1,48,8,0]:Integer, [-1,48,8,7]:Integer, [-1,48,8,16]:Float@double, [-1,48,8,24]:Integer, [-1,48,8,25]:Integer, [-1,48,8,26]:Integer, [-1,48,8,27]:Integer, [-1,48,8,28]:Integer, [-1,48,8,29]:Integer, [-1,48,8,30]:Integer, [-1,48,8,31]:Integer, [-1,48,16]:Integer, [-1,48,17]:Integer, [-1,48,18]:Integer, [-1,48,19]:Integer, [-1,48,20]:Integer, [-1,48,21]:Integer, [-1,48,22]:Integer, [-1,48,23]:Integer, [-1,48,24]:Integer, [-1,48,31]:Integer, [-1,48,40]:Float@double, [-1,48,48]:Integer, [-1,48,49]:Integer, [-1,48,50]:Integer, [-1,48,51]:Integer, [-1,48,52]:Integer, [-1,48,53]:Integer, [-1,48,54]:Integer, [-1,48,55]:Integer}, intvals: {}
%3 = alloca %"class.std::__cxx11::basic_string", align 8: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,7]:Integer, [-1,8]:Integer, [-1,9]:Integer, [-1,10]:Integer, [-1,11]:Integer, [-1,12]:Integer, [-1,13]:Integer, [-1,14]:Integer, [-1,15]:Integer, [-1,23]:Integer}, intvals: {}
%14 = load double, ptr %13, align 8, !dbg !3674, !tbaa !3675: {[-1]:Float@double}, intvals: {}
%15 = load ptr, ptr %3, align 8, !dbg !3696, !tbaa !3697: {[-1]:Pointer, [-1,7]:Integer}, intvals: {}
%20 = load ptr, ptr %19, align 8, !dbg !3766, !tbaa !3767: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,0]:Pointer, [-1,0,0,0,0]:Pointer, [-1,0,0,0,8]:Pointer, [-1,0,0,0,16]:Integer, [-1,0,0,0,17]:Integer, [-1,0,0,0,18]:Integer, [-1,0,0,0,19]:Integer, [-1,0,0,0,20]:Integer, [-1,0,0,0,21]:Integer, [-1,0,0,0,22]:Integer, [-1,0,0,0,23]:Integer, [-1,0,0,0,24]:Integer, [-1,0,0,0,31]:Integer, [-1,0,0,0,40]:Float@double, [-1,0,0,0,48]:Integer, [-1,0,0,0,49]:Integer, [-1,0,0,0,50]:Integer, [-1,0,0,0,51]:Integer, [-1,0,0,0,52]:Integer, [-1,0,0,0,53]:Integer, [-1,0,0,0,54]:Integer, [-1,0,0,0,55]:Integer, [-1,0,0,8]:Pointer, [-1,0,0,8,0]:Integer, [-1,0,0,8,7]:Integer, [-1,0,0,8,16]:Float@double, [-1,0,0,8,24]:Integer, [-1,0,0,8,25]:Integer, [-1,0,0,8,26]:Integer, [-1,0,0,8,27]:Integer, [-1,0,0,8,28]:Integer, [-1,0,0,8,29]:Integer, [-1,0,0,8,30]:Integer, [-1,0,0,8,31]:Integer, [-1,0,0,16]:Integer, [-1,0,0,17]:Integer, [-1,0,0,18]:Integer, [-1,0,0,19]:Integer, [-1,0,0,20]:Integer, [-1,0,0,21]:Integer, [-1,0,0,22]:Integer, [-1,0,0,23]:Integer, [-1,0,0,24]:Integer, [-1,0,0,31]:Integer, [-1,0,0,40]:Float@double, [-1,0,0,48]:Integer, [-1,0,0,49]:Integer, [-1,0,0,50]:Integer, [-1,0,0,51]:Integer, [-1,0,0,52]:Integer, [-1,0,0,53]:Integer, [-1,0,0,54]:Integer, [-1,0,0,55]:Integer, [-1,0,8]:Pointer, [-1,0,8,0]:Integer, [-1,0,8,7]:Integer, [-1,0,8,16]:Float@double, [-1,0,8,24]:Integer, [-1,0,8,25]:Integer, [-1,0,8,26]:Integer, [-1,0,8,27]:Integer, [-1,0,8,28]:Integer, [-1,0,8,29]:Integer, [-1,0,8,30]:Integer, [-1,0,8,31]:Integer, [-1,0,16]:Integer, [-1,0,17]:Integer, [-1,0,18]:Integer, [-1,0,19]:Integer, [-1,0,20]:Integer, [-1,0,21]:Integer, [-1,0,22]:Integer, [-1,0,23]:Integer, [-1,0,24]:Integer, [-1,0,31]:Integer, [-1,0,40]:Float@double, [-1,0,48]:Integer, [-1,0,49]:Integer, [-1,0,50]:Integer, [-1,0,51]:Integer, [-1,0,52]:Integer, [-1,0,53]:Integer, [-1,0,54]:Integer, [-1,0,55]:Integer, [-1,8]:Pointer, [-1,8,0]:Integer, [-1,8,7]:Integer, [-1,8,16]:Float@double, [-1,8,24]:Integer, [-1,8,25]:Integer, [-1,8,26]:Integer, [-1,8,27]:Integer, [-1,8,28]:Integer, [-1,8,29]:Integer, [-1,8,30]:Integer, [-1,8,31]:Integer, [-1,16]:Integer, [-1,17]:Integer, [-1,18]:Integer, [-1,19]:Integer, [-1,20]:Integer, [-1,21]:Integer, [-1,22]:Integer, [-1,23]:Integer, [-1,24]:Integer, [-1,31]:Integer, [-1,40]:Float@double, [-1,48]:Integer, [-1,49]:Integer, [-1,50]:Integer, [-1,51]:Integer, [-1,52]:Integer, [-1,53]:Integer, [-1,54]:Integer, [-1,55]:Integer}, intvals: {}
%40 = shl i64 %39, 3, !dbg !3933: {[-1]:Integer}, intvals: {}
%16 = icmp eq ptr %15, %6, !dbg !3703: {[-1]:Integer}, intvals: {}
call void @_ZdlPv(ptr noundef %41) #21, !dbg !4037: {}, intvals: {}
%26 = add nuw nsw i64 %24, 1, !dbg !3783: {[-1]:Integer}, intvals: {1,}
%29 = load ptr, ptr %28, align 8, !dbg !3861, !tbaa !3697: {[-1]:Pointer}, intvals: {}
%21 = icmp eq ptr %20, null, !dbg !3781: {[-1]:Integer}, intvals: {}
%25 = phi ptr [ %27, %33 ], [ %20, %22 ]: {[-1]:Pointer, [-1,0]:Pointer, [-1,8]:Pointer}, intvals: {}
%9 = call ptr @_ZNKSt10_HashtableINSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEESt4pairIKS5_dESaIS8_ENSt8__detail10_Select1stESt8equal_toIS5_ESt4hashIS5_ENSA_18_Mod_range_hashingENSA_20_Default_ranged_hashENSA_20_Prime_rehash_policyENSA_17_Hashtable_traitsILb1ELb0ELb1EEEE4findERS7_(ptr noundef nonnull align 8 dereferenceable(56) %2, ptr noundef nonnull align 8 dereferenceable(32) %3) #20, !dbg !3668: {[-1]:Pointer, [-1,40]:Float@double}, intvals: {}
%42 = getelementptr inbounds %"class.std::_Hashtable", ptr %2, i64 0, i32 5, !dbg !3956: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,0]:Pointer, [-1,0,0,0,0]:Pointer, [-1,0,0,0,0,0]:Pointer, [-1,0,0,0,0,8]:Pointer, [-1,0,0,0,0,16]:Integer, [-1,0,0,0,0,17]:Integer, [-1,0,0,0,0,18]:Integer, [-1,0,0,0,0,19]:Integer, [-1,0,0,0,0,20]:Integer, [-1,0,0,0,0,21]:Integer, [-1,0,0,0,0,22]:Integer, [-1,0,0,0,0,23]:Integer, [-1,0,0,0,0,24]:Integer, [-1,0,0,0,0,31]:Integer, [-1,0,0,0,0,40]:Float@double, [-1,0,0,0,0,48]:Integer, [-1,0,0,0,0,49]:Integer, [-1,0,0,0,0,50]:Integer, [-1,0,0,0,0,51]:Integer, [-1,0,0,0,0,52]:Integer, [-1,0,0,0,0,53]:Integer, [-1,0,0,0,0,54]:Integer, [-1,0,0,0,0,55]:Integer, [-1,0,0,0,8]:Pointer, [-1,0,0,0,8,0]:Integer, [-1,0,0,0,8,7]:Integer, [-1,0,0,0,8,16]:Float@double, [-1,0,0,0,8,24]:Integer, [-1,0,0,0,8,25]:Integer, [-1,0,0,0,8,26]:Integer, [-1,0,0,0,8,27]:Integer, [-1,0,0,0,8,28]:Integer, [-1,0,0,0,8,29]:Integer, [-1,0,0,0,8,30]:Integer, [-1,0,0,0,8,31]:Integer, [-1,0,0,0,16]:Integer, [-1,0,0,0,17]:Integer, [-1,0,0,0,18]:Integer, [-1,0,0,0,19]:Integer, [-1,0,0,0,20]:Integer, [-1,0,0,0,21]:Integer, [-1,0,0,0,22]:Integer, [-1,0,0,0,23]:Integer, [-1,0,0,0,24]:Integer, [-1,0,0,0,31]:Integer, [-1,0,0,0,40]:Float@double, [-1,0,0,0,48]:Integer, [-1,0,0,0,49]:Integer, [-1,0,0,0,50]:Integer, [-1,0,0,0,51]:Integer, [-1,0,0,0,52]:Integer, [-1,0,0,0,53]:Integer, [-1,0,0,0,54]:Integer, [-1,0,0,0,55]:Integer, [-1,0,0,8]:Pointer, [-1,0,0,8,0]:Integer, [-1,0,0,8,7]:Integer, [-1,0,0,8,16]:Float@double, [-1,0,0,8,24]:Integer, [-1,0,0,8,25]:Integer, [-1,0,0,8,26]:Integer, [-1,0,0,8,27]:Integer, [-1,0,0,8,28]:Integer, [-1,0,0,8,29]:Integer, [-1,0,0,8,30]:Integer, [-1,0,0,8,31]:Integer, [-1,0,0,16]:Integer, [-1,0,0,17]:Integer, [-1,0,0,18]:Integer, [-1,0,0,19]:Integer, [-1,0,0,20]:Integer, [-1,0,0,21]:Integer, [-1,0,0,22]:Integer, [-1,0,0,23]:Integer, [-1,0,0,24]:Integer, [-1,0,0,31]:Integer, [-1,0,0,40]:Float@double, [-1,0,0,48]:Integer, [-1,0,0,49]:Integer, [-1,0,0,50]:Integer, [-1,0,0,51]:Integer, [-1,0,0,52]:Integer, [-1,0,0,53]:Integer, [-1,0,0,54]:Integer, [-1,0,0,55]:Integer, [-1,0,8]:Pointer, [-1,0,8,0]:Integer, [-1,0,8,7]:Integer, [-1,0,8,16]:Float@double, [-1,0,8,24]:Integer, [-1,0,8,25]:Integer, [-1,0,8,26]:Integer, [-1,0,8,27]:Integer, [-1,0,8,28]:Integer, [-1,0,8,29]:Integer, [-1,0,8,30]:Integer, [-1,0,8,31]:Integer, [-1,0,16]:Integer, [-1,0,17]:Integer, [-1,0,18]:Integer, [-1,0,19]:Integer, [-1,0,20]:Integer, [-1,0,21]:Integer, [-1,0,22]:Integer, [-1,0,23]:Integer, [-1,0,24]:Integer, [-1,0,31]:Integer, [-1,0,40]:Float@double, [-1,0,48]:Integer, [-1,0,49]:Integer, [-1,0,50]:Integer, [-1,0,51]:Integer, [-1,0,52]:Integer, [-1,0,53]:Integer, [-1,0,54]:Integer, [-1,0,55]:Integer}, intvals: {}
%43 = icmp eq ptr %42, %41, !dbg !3957: {[-1]:Integer}, intvals: {}
%41 = load ptr, ptr %2, align 8, !dbg !3941, !tbaa !3930: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,0]:Pointer, [-1,0,0,0,0]:Pointer, [-1,0,0,0,8]:Pointer, [-1,0,0,0,16]:Integer, [-1,0,0,0,17]:Integer, [-1,0,0,0,18]:Integer, [-1,0,0,0,19]:Integer, [-1,0,0,0,20]:Integer, [-1,0,0,0,21]:Integer, [-1,0,0,0,22]:Integer, [-1,0,0,0,23]:Integer, [-1,0,0,0,24]:Integer, [-1,0,0,0,31]:Integer, [-1,0,0,0,40]:Float@double, [-1,0,0,0,48]:Integer, [-1,0,0,0,49]:Integer, [-1,0,0,0,50]:Integer, [-1,0,0,0,51]:Integer, [-1,0,0,0,52]:Integer, [-1,0,0,0,53]:Integer, [-1,0,0,0,54]:Integer, [-1,0,0,0,55]:Integer, [-1,0,0,8]:Pointer, [-1,0,0,8,0]:Integer, [-1,0,0,8,7]:Integer, [-1,0,0,8,16]:Float@double, [-1,0,0,8,24]:Integer, [-1,0,0,8,25]:Integer, [-1,0,0,8,26]:Integer, [-1,0,0,8,27]:Integer, [-1,0,0,8,28]:Integer, [-1,0,0,8,29]:Integer, [-1,0,0,8,30]:Integer, [-1,0,0,8,31]:Integer, [-1,0,0,16]:Integer, [-1,0,0,17]:Integer, [-1,0,0,18]:Integer, [-1,0,0,19]:Integer, [-1,0,0,20]:Integer, [-1,0,0,21]:Integer, [-1,0,0,22]:Integer, [-1,0,0,23]:Integer, [-1,0,0,24]:Integer, [-1,0,0,31]:Integer, [-1,0,0,40]:Float@double, [-1,0,0,48]:Integer, [-1,0,0,49]:Integer, [-1,0,0,50]:Integer, [-1,0,0,51]:Integer, [-1,0,0,52]:Integer, [-1,0,0,53]:Integer, [-1,0,0,54]:Integer, [-1,0,0,55]:Integer, [-1,0,8]:Pointer, [-1,0,8,0]:Integer, [-1,0,8,7]:Integer, [-1,0,8,16]:Float@double, [-1,0,8,24]:Integer, [-1,0,8,25]:Integer, [-1,0,8,26]:Integer, [-1,0,8,27]:Integer, [-1,0,8,28]:Integer, [-1,0,8,29]:Integer, [-1,0,8,30]:Integer, [-1,0,8,31]:Integer, [-1,0,16]:Integer, [-1,0,17]:Integer, [-1,0,18]:Integer, [-1,0,19]:Integer, [-1,0,20]:Integer, [-1,0,21]:Integer, [-1,0,22]:Integer, [-1,0,23]:Integer, [-1,0,24]:Integer, [-1,0,31]:Integer, [-1,0,40]:Float@double, [-1,0,48]:Integer, [-1,0,49]:Integer, [-1,0,50]:Integer, [-1,0,51]:Integer, [-1,0,52]:Integer, [-1,0,53]:Integer, [-1,0,54]:Integer, [-1,0,55]:Integer}, intvals: {}
%37 = load ptr, ptr %2, align 8, !dbg !3929, !tbaa !3930: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,0]:Pointer, [-1,0,0,0,0]:Pointer, [-1,0,0,0,8]:Pointer, [-1,0,0,0,16]:Integer, [-1,0,0,0,17]:Integer, [-1,0,0,0,18]:Integer, [-1,0,0,0,19]:Integer, [-1,0,0,0,20]:Integer, [-1,0,0,0,21]:Integer, [-1,0,0,0,22]:Integer, [-1,0,0,0,23]:Integer, [-1,0,0,0,24]:Integer, [-1,0,0,0,31]:Integer, [-1,0,0,0,40]:Float@double, [-1,0,0,0,48]:Integer, [-1,0,0,0,49]:Integer, [-1,0,0,0,50]:Integer, [-1,0,0,0,51]:Integer, [-1,0,0,0,52]:Integer, [-1,0,0,0,53]:Integer, [-1,0,0,0,54]:Integer, [-1,0,0,0,55]:Integer, [-1,0,0,8]:Pointer, [-1,0,0,8,0]:Integer, [-1,0,0,8,7]:Integer, [-1,0,0,8,16]:Float@double, [-1,0,0,8,24]:Integer, [-1,0,0,8,25]:Integer, [-1,0,0,8,26]:Integer, [-1,0,0,8,27]:Integer, [-1,0,0,8,28]:Integer, [-1,0,0,8,29]:Integer, [-1,0,0,8,30]:Integer, [-1,0,0,8,31]:Integer, [-1,0,0,16]:Integer, [-1,0,0,17]:Integer, [-1,0,0,18]:Integer, [-1,0,0,19]:Integer, [-1,0,0,20]:Integer, [-1,0,0,21]:Integer, [-1,0,0,22]:Integer, [-1,0,0,23]:Integer, [-1,0,0,24]:Integer, [-1,0,0,31]:Integer, [-1,0,0,40]:Float@double, [-1,0,0,48]:Integer, [-1,0,0,49]:Integer, [-1,0,0,50]:Integer, [-1,0,0,51]:Integer, [-1,0,0,52]:Integer, [-1,0,0,53]:Integer, [-1,0,0,54]:Integer, [-1,0,0,55]:Integer, [-1,0,8]:Pointer, [-1,0,8,0]:Integer, [-1,0,8,7]:Integer, [-1,0,8,16]:Float@double, [-1,0,8,24]:Integer, [-1,0,8,25]:Integer, [-1,0,8,26]:Integer, [-1,0,8,27]:Integer, [-1,0,8,28]:Integer, [-1,0,8,29]:Integer, [-1,0,8,30]:Integer, [-1,0,8,31]:Integer, [-1,0,16]:Integer, [-1,0,17]:Integer, [-1,0,18]:Integer, [-1,0,19]:Integer, [-1,0,20]:Integer, [-1,0,21]:Integer, [-1,0,22]:Integer, [-1,0,23]:Integer, [-1,0,24]:Integer, [-1,0,31]:Integer, [-1,0,40]:Float@double, [-1,0,48]:Integer, [-1,0,49]:Integer, [-1,0,50]:Integer, [-1,0,51]:Integer, [-1,0,52]:Integer, [-1,0,53]:Integer, [-1,0,54]:Integer, [-1,0,55]:Integer}, intvals: {}
%31 = icmp eq ptr %29, %30, !dbg !3865: {[-1]:Integer}, intvals: {}
%34 = icmp eq ptr %27, null, !dbg !3781: {[-1]:Integer}, intvals: {}
i8 95: {[-1]:Integer}, intvals: {95,}
%30 = getelementptr inbounds i8, ptr %25, i64 24, !dbg !3864: {[-1]:Pointer}, intvals: {}
i64 3: {[-1]:Integer}, intvals: {3,}
i8 97: {[-1]:Integer}, intvals: {97,}
ptr null: {[-1]:Pointer, [-1,-1]:Anything}, intvals: {0,}
i64 0: {[-1]:Anything}, intvals: {0,}
i64 1: {[-1]:Integer}, intvals: {1,}
%38 = getelementptr inbounds %"class.std::_Hashtable", ptr %2, i64 0, i32 1, !dbg !3931: {[-1]:Pointer, [-1,0]:Integer, [-1,1]:Integer, [-1,2]:Integer, [-1,3]:Integer, [-1,4]:Integer, [-1,5]:Integer, [-1,6]:Integer, [-1,7]:Integer}, intvals: {}
%7 = getelementptr inbounds %"class.std::__cxx11::basic_string", ptr %3, i64 0, i32 1, !dbg !3636: {[-1]:Pointer, [-1,0]:Integer, [-1,1]:Integer, [-1,2]:Integer, [-1,3]:Integer, [-1,4]:Integer, [-1,5]:Integer, [-1,6]:Integer, [-1,7]:Integer}, intvals: {}
%10 = icmp eq ptr %9, null, !dbg !3669: {[-1]:Integer}, intvals: {}
[8 x i8] c"alpha_x\00": {[-1]:Anything}, intvals: {}
@.str = private unnamed_addr constant [8 x i8] c"alpha_x\00", align 1, !dbg !0: {[-1]:Pointer, [-1,-1]:Anything}, intvals: {}
%13 = getelementptr inbounds i8, ptr %9, i64 40, !dbg !3673: {[-1]:Pointer, [-1,0]:Float@double}, intvals: {}
%6 = getelementptr inbounds %"class.std::__cxx11::basic_string", ptr %3, i64 0, i32 2, !dbg !3559: {[-1]:Pointer, [-1,7]:Integer}, intvals: {}
i8 112: {[-1]:Integer}, intvals: {112,}
i8 0: {[-1]:Integer}, intvals: {0,}
i8 104: {[-1]:Integer}, intvals: {104,}
%8 = getelementptr inbounds i8, ptr %3, i64 23, !dbg !3643: {[-1]:Pointer, [-1,0]:Integer}, intvals: {}
call void @_Z28reduced_beam_characteristicsB5cxx11dd(ptr nonnull sret(%"class.std::unordered_map") align 8 %2, double noundef %4, double noundef %5) #20, !dbg !3537: {}, intvals: {}
%5 = tail call double @log(double noundef %0) #21, !dbg !3534: {[-1]:Float@double}, intvals: {}
%19 = getelementptr inbounds %"class.std::_Hashtable", ptr %2, i64 0, i32 2, !dbg !3765: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,0]:Pointer, [-1,0,0,0]:Pointer, [-1,0,0,0,0]:Pointer, [-1,0,0,0,0,0]:Pointer, [-1,0,0,0,0,8]:Pointer, [-1,0,0,0,0,16]:Integer, [-1,0,0,0,0,17]:Integer, [-1,0,0,0,0,18]:Integer, [-1,0,0,0,0,19]:Integer, [-1,0,0,0,0,20]:Integer, [-1,0,0,0,0,21]:Integer, [-1,0,0,0,0,22]:Integer, [-1,0,0,0,0,23]:Integer, [-1,0,0,0,0,24]:Integer, [-1,0,0,0,0,31]:Integer, [-1,0,0,0,0,40]:Float@double, [-1,0,0,0,0,48]:Integer, [-1,0,0,0,0,49]:Integer, [-1,0,0,0,0,50]:Integer, [-1,0,0,0,0,51]:Integer, [-1,0,0,0,0,52]:Integer, [-1,0,0,0,0,53]:Integer, [-1,0,0,0,0,54]:Integer, [-1,0,0,0,0,55]:Integer, [-1,0,0,0,8]:Pointer, [-1,0,0,0,8,0]:Integer, [-1,0,0,0,8,7]:Integer, [-1,0,0,0,8,16]:Float@double, [-1,0,0,0,8,24]:Integer, [-1,0,0,0,8,25]:Integer, [-1,0,0,0,8,26]:Integer, [-1,0,0,0,8,27]:Integer, [-1,0,0,0,8,28]:Integer, [-1,0,0,0,8,29]:Integer, [-1,0,0,0,8,30]:Integer, [-1,0,0,0,8,31]:Integer, [-1,0,0,0,16]:Integer, [-1,0,0,0,17]:Integer, [-1,0,0,0,18]:Integer, [-1,0,0,0,19]:Integer, [-1,0,0,0,20]:Integer, [-1,0,0,0,21]:Integer, [-1,0,0,0,22]:Integer, [-1,0,0,0,23]:Integer, [-1,0,0,0,24]:Integer, [-1,0,0,0,31]:Integer, [-1,0,0,0,40]:Float@double, [-1,0,0,0,48]:Integer, [-1,0,0,0,49]:Integer, [-1,0,0,0,50]:Integer, [-1,0,0,0,51]:Integer, [-1,0,0,0,52]:Integer, [-1,0,0,0,53]:Integer, [-1,0,0,0,54]:Integer, [-1,0,0,0,55]:Integer, [-1,0,0,8]:Pointer, [-1,0,0,8,0]:Integer, [-1,0,0,8,7]:Integer, [-1,0,0,8,16]:Float@double, [-1,0,0,8,24]:Integer, [-1,0,0,8,25]:Integer, [-1,0,0,8,26]:Integer, [-1,0,0,8,27]:Integer, [-1,0,0,8,28]:Integer, [-1,0,0,8,29]:Integer, [-1,0,0,8,30]:Integer, [-1,0,0,8,31]:Integer, [-1,0,0,16]:Integer, [-1,0,0,17]:Integer, [-1,0,0,18]:Integer, [-1,0,0,19]:Integer, [-1,0,0,20]:Integer, [-1,0,0,21]:Integer, [-1,0,0,22]:Integer, [-1,0,0,23]:Integer, [-1,0,0,24]:Integer, [-1,0,0,31]:Integer, [-1,0,0,40]:Float@double, [-1,0,0,48]:Integer, [-1,0,0,49]:Integer, [-1,0,0,50]:Integer, [-1,0,0,51]:Integer, [-1,0,0,52]:Integer, [-1,0,0,53]:Integer, [-1,0,0,54]:Integer, [-1,0,0,55]:Integer, [-1,0,8]:Pointer, [-1,0,8,0]:Integer, [-1,0,8,7]:Integer, [-1,0,8,16]:Float@double, [-1,0,8,24]:Integer, [-1,0,8,25]:Integer, [-1,0,8,26]:Integer, [-1,0,8,27]:Integer, [-1,0,8,28]:Integer, [-1,0,8,29]:Integer, [-1,0,8,30]:Integer, [-1,0,8,31]:Integer, [-1,0,16]:Integer, [-1,0,17]:Integer, [-1,0,18]:Integer, [-1,0,19]:Integer, [-1,0,20]:Integer, [-1,0,21]:Integer, [-1,0,22]:Integer, [-1,0,23]:Integer, [-1,0,24]:Integer, [-1,0,31]:Integer, [-1,0,40]:Float@double, [-1,0,48]:Integer, [-1,0,49]:Integer, [-1,0,50]:Integer, [-1,0,51]:Integer, [-1,0,52]:Integer, [-1,0,53]:Integer, [-1,0,54]:Integer, [-1,0,55]:Integer}, intvals: {}
i8 108: {[-1]:Integer}, intvals: {108,}
i64 7: {[-1]:Integer}, intvals: {7,}
i8 120: {[-1]:Integer}, intvals: {120,}
%4 = tail call double @sqrt(double noundef %0) #21, !dbg !3533: {[-1]:Float@double}, intvals: {}
return static_cast(__builtin_memcpy(__s1, __s2, __n));
^
freeing without malloc %50 = load ptr, ptr %0, align 8, !dbg !3703, !tbaa !3709
freeing without malloc %16 = load ptr, ptr %4, align 8, !dbg !3713, !tbaa !3714
freeing without malloc %25 = load ptr, ptr %5, align 8, !dbg !3797, !tbaa !3714
freeing without malloc %50 = load ptr, ptr %0, align 8, !dbg !3703, !tbaa !3709
freeing without malloc %16 = load ptr, ptr %4, align 8, !dbg !3713, !tbaa !3714
freeing without malloc %25 = load ptr, ptr %5, align 8, !dbg !3797, !tbaa !3714
freeing without malloc %15 = load ptr, ptr %3, align 8, !dbg !3696, !tbaa !3697
freeing without malloc %29 = load ptr, ptr %28, align 8, !dbg !3861, !tbaa !3697
freeing without malloc %25 = phi ptr [ %27, %33 ], [ %20, %22 ]
freeing without malloc %41 = load ptr, ptr %2, align 8, !dbg !3941, !tbaa !3930
1 error generated.
Compiler returned: 1
Tried Alternative 1
I also tried rewriting to explicit:
double val = rbc.at("alpha_x");
return val;
which also fails to build.
Tried Alternative 2
I can rewrite to return a simpler data structure (e.g., a double) from reduced_beam_characteristics, but that does not work well for my needs here.
Tried Alternative 3
Adding -mllvm -enzyme-loose-types to my command line makes it compile, but likely to wrong code as it emits:
freeing without malloc %50 = load ptr, ptr %0, align 8, !dbg !3703, !tbaa !3709
freeing without malloc %16 = load ptr, ptr %4, align 8, !dbg !3713, !tbaa !3714
freeing without malloc %25 = load ptr, ptr %5, align 8, !dbg !3797, !tbaa !3714
freeing without malloc %50 = load ptr, ptr %0, align 8, !dbg !3703, !tbaa !3709
freeing without malloc %16 = load ptr, ptr %4, align 8, !dbg !3713, !tbaa !3714
freeing without malloc %25 = load ptr, ptr %5, align 8, !dbg !3797, !tbaa !3714
freeing without malloc %15 = load ptr, ptr %3, align 8, !dbg !3696, !tbaa !3697
freeing without malloc %29 = load ptr, ptr %28, align 8, !dbg !3861, !tbaa !3697
freeing without malloc %25 = phi ptr [ %27, %33 ], [ %20, %22 ]
freeing without malloc %41 = load ptr, ptr %2, align 8, !dbg !3941, !tbaa !3930
ASM generation compiler returned: 0
freeing without malloc %50 = load ptr, ptr %0, align 8, !dbg !3703, !tbaa !3709
freeing without malloc %16 = load ptr, ptr %4, align 8, !dbg !3713, !tbaa !3714
freeing without malloc %25 = load ptr, ptr %5, align 8, !dbg !3797, !tbaa !3714
freeing without malloc %50 = load ptr, ptr %0, align 8, !dbg !3703, !tbaa !3709
freeing without malloc %16 = load ptr, ptr %4, align 8, !dbg !3713, !tbaa !3714
freeing without malloc %25 = load ptr, ptr %5, align 8, !dbg !3797, !tbaa !3714
freeing without malloc %15 = load ptr, ptr %3, align 8, !dbg !3696, !tbaa !3697
freeing without malloc %29 = load ptr, ptr %28, align 8, !dbg !3861, !tbaa !3697
freeing without malloc %25 = phi ptr [ %27, %33 ], [ %20, %22 ]
freeing without malloc %41 = load ptr, ptr %2, align 8, !dbg !3941, !tbaa !3930
Execution build compiler returned: 0
Program returned: 0
Jul 01
'25 02:07
ax3l
Rewriting the code to: https://fwd.gymni.ch/ycY4kq
double compute (double r)
{
double x = std::sqrt(r);
double y = std::log(r);
std::unordered_map<std::string, double> rbc =
reduced_beam_characteristics(x, y);
return rbc["alpha_x"];
}
compiles but also with the warnings:
freeing without malloc %50 = load ptr, ptr %0, align 8, !dbg !3660, !tbaa !3666
freeing without malloc %50 = load ptr, ptr %0, align 8, !dbg !3660, !tbaa !3666
freeing without malloc %16 = load ptr, ptr %4, align 8, !dbg !3670, !tbaa !3671
freeing without malloc %25 = load ptr, ptr %5, align 8, !dbg !3754, !tbaa !3671
freeing without malloc %16 = load ptr, ptr %4, align 8, !dbg !3670, !tbaa !3671
freeing without malloc %25 = load ptr, ptr %5, align 8, !dbg !3754, !tbaa !3671
freeing without malloc %11 = load ptr, ptr %3, align 8, !dbg !3639, !tbaa !3640
freeing without malloc %25 = load ptr, ptr %24, align 8, !dbg !3803, !tbaa !3640
freeing without malloc %21 = phi ptr [ %23, %29 ], [ %16, %18 ]
freeing without malloc %37 = load ptr, ptr %2, align 8, !dbg !3883, !tbaa !3872
ASM generation compiler returned: 0
freeing without malloc %50 = load ptr, ptr %0, align 8, !dbg !3660, !tbaa !3666
freeing without malloc %50 = load ptr, ptr %0, align 8, !dbg !3660, !tbaa !3666
freeing without malloc %16 = load ptr, ptr %4, align 8, !dbg !3670, !tbaa !3671
freeing without malloc %25 = load ptr, ptr %5, align 8, !dbg !3754, !tbaa !3671
freeing without malloc %16 = load ptr, ptr %4, align 8, !dbg !3670, !tbaa !3671
freeing without malloc %25 = load ptr, ptr %5, align 8, !dbg !3754, !tbaa !3671
freeing without malloc %11 = load ptr, ptr %3, align 8, !dbg !3639, !tbaa !3640
freeing without malloc %25 = load ptr, ptr %24, align 8, !dbg !3803, !tbaa !3640
freeing without malloc %21 = phi ptr [ %23, %29 ], [ %16, %18 ]
freeing without malloc %37 = load ptr, ptr %2, align 8, !dbg !3883, !tbaa !3872
Execution build compiler returned: 0
Program returned: 0
That make me think there is a bug here.
Jul 01
'25 23:07
ax3l
the warning is that we may need to look more closely to ensure no memory leaks, but it looks fine to me (asking the explorer to also run): https://fwd.gymni.ch/ccSuqY
That's great! Yes that leak could be very noisy in our code.
Added a unit test in #2376 for development.
Jul 07
'25 18:07
ax3l