EnzymeAD / Enzyme

High-performance automatic differentiation of LLVM and MLIR.
https://enzyme.mit.edu
Other
1.27k stars 108 forks source link

TA fails with Performed illegal updateAnalysis #1068

Open tgymnich opened 1 year ago

tgymnich commented 1 year ago
Log

```llvm %3 = getelementptr inbounds %"class.std::map", %"class.std::map"* %0, i64 0, i32 0, i32 0, i32 0, i32 0, i32 0: {[-1]:Pointer, [-1,16]:Pointer, [-1,16,32]:Pointer, [-1,40]:Pointer}, intvals: {} %49 = getelementptr inbounds %"class.std::map", %"class.std::map"* %0, i64 0, i32 0, i32 0, i32 0, i32 0, i32 0: {[-1]:Pointer}, intvals: {} %62 = getelementptr inbounds %"class.std::map", %"class.std::map"* %0, i64 0, i32 0, i32 0, i32 0, i32 0, i32 0: {[-1]:Pointer, [-1,40]:Integer, [-1,41]:Integer, [-1,42]:Integer, [-1,43]:Integer, [-1,44]:Integer, [-1,45]:Integer, [-1,46]:Integer, [-1,47]:Integer}, intvals: {} %"struct.std::_Rb_tree_node"* null: {[-1]:Pointer, [-1,-1]:Anything}, intvals: {0,} %"struct.std::_Rb_tree_node_base"* null: {[-1]:Pointer, [-1,-1]:Anything}, intvals: {0,} i32 0: {[-1]:Anything}, intvals: {0,} i64 0: {[-1]:Anything}, intvals: {0,} i64 1: {[-1]:Integer}, intvals: {1,} double 0.000000e+00: {[-1]:Anything}, intvals: {} %"class.std::map"* %0: {[-1]:Pointer, [-1,16]:Pointer, [-1,16,32]:Pointer, [-1,40]:Integer, [-1,41]:Integer, [-1,42]:Integer, [-1,43]:Integer, [-1,44]:Integer, [-1,45]:Integer, [-1,46]:Integer, [-1,47]:Integer}, intvals: {} i8** %1: {[-1]:Pointer, [-1,-1]:Pointer}, intvals: {} %12 = phi %"struct.std::_Rb_tree_node"* [ %24, %11 ], [ %6, %2 ]: {[-1]:Pointer, [-1,16]:Pointer, [-1,24]:Pointer, [-1,32]:Pointer}, intvals: {} %13 = phi %"struct.std::_Rb_tree_node_base"* [ %21, %11 ], [ %8, %2 ]: {[-1]:Pointer, [-1,32]:Pointer}, intvals: {} %27 = phi %"struct.std::_Rb_tree_node_base"* [ %8, %2 ], [ %21, %11 ]: {[-1]:Pointer, [-1,32]:Pointer, [-1,40]:Float@double}, intvals: {} %60 = phi i1 [ true, %48 ], [ true, %46 ], [ %58, %53 ]: {[-1]:Integer}, intvals: {-1,} %71 = phi %"struct.std::_Rb_tree_node_base"* [ %27, %29 ], [ %43, %69 ], [ %61, %59 ]: {[-1]:Pointer, [-1,40]:Float@double}, intvals: {} %5 = bitcast i8* %4 to %"struct.std::_Rb_tree_node"**: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,16]:Pointer, [-1,0,24]:Pointer, [-1,0,32]:Pointer}, intvals: {} %6 = load %"struct.std::_Rb_tree_node"*, %"struct.std::_Rb_tree_node"** %5, align 8, !tbaa !3: {[-1]:Pointer, [-1,16]:Pointer, [-1,24]:Pointer, [-1,32]:Pointer}, intvals: {} %8 = bitcast i8* %7 to %"struct.std::_Rb_tree_node_base"*: {[-1]:Pointer, [-1,8]:Pointer, [-1,32]:Pointer}, intvals: {} %9 = load i8*, i8** %1, align 8: {[-1]:Pointer}, intvals: {} %15 = bitcast %"struct.__gnu_cxx::__aligned_membuf"* %14 to i8**: {[-1]:Pointer, [-1,0]:Pointer}, intvals: {} %16 = load i8*, i8** %15, align 8, !tbaa !11: {[-1]:Pointer}, intvals: {} %23 = bitcast %"struct.std::_Rb_tree_node_base"** %22 to %"struct.std::_Rb_tree_node"**: {[-1]:Pointer, [-1,0]:Pointer}, intvals: {} %24 = load %"struct.std::_Rb_tree_node"*, %"struct.std::_Rb_tree_node"** %23, align 8, !tbaa !11: {[-1]:Pointer}, intvals: {} %31 = bitcast %"struct.std::_Rb_tree_node_base"* %30 to i8**: {[-1]:Pointer, [-1,0]:Pointer}, intvals: {} %32 = load i8*, i8** %31, align 8, !tbaa !15: {[-1]:Pointer}, intvals: {} %38 = bitcast i8* %37 to i8**: {[-1]:Pointer, [-1,0]:Pointer, [-1,8]:Float@double}, intvals: {} %39 = load i8*, i8** %1, align 8, !tbaa !11: {[-1]:Pointer}, intvals: {} %41 = bitcast i8* %40 to double*: {[-1]:Pointer, [-1,0]:Float@double}, intvals: {} %51 = bitcast i8* %50 to %"struct.std::_Rb_tree_node_base"*: {[-1]:Pointer}, intvals: {} %54 = load i8*, i8** %38, align 8, !tbaa !11: {[-1]:Pointer}, intvals: {} %56 = bitcast %"struct.std::_Rb_tree_node_base"* %55 to i8**: {[-1]:Pointer, [-1,0]:Pointer}, intvals: {} %57 = load i8*, i8** %56, align 8, !tbaa !11: {[-1]:Pointer}, intvals: {} %61 = bitcast i8* %36 to %"struct.std::_Rb_tree_node_base"*: {[-1]:Pointer, [-1,32]:Pointer, [-1,40]:Float@double}, intvals: {} %64 = bitcast i8* %63 to %"struct.std::_Rb_tree_node_base"*: {[-1]:Pointer}, intvals: {} %66 = bitcast i8* %65 to i64*: {[-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: {} %67 = load i64, i64* %66, align 8, !tbaa !19: {[-1]:Integer}, intvals: {} %73 = bitcast %"struct.std::_Rb_tree_node_base"** %72 to double*: {[-1]:Pointer, [-1,0]:Float@double}, intvals: {} %17 = icmp ult i8* %16, %9: {[-1]:Integer}, intvals: {} %10 = icmp eq %"struct.std::_Rb_tree_node"* %6, null: {[-1]:Integer}, intvals: {} %25 = icmp eq %"struct.std::_Rb_tree_node"* %24, null: {[-1]:Integer}, intvals: {} %28 = icmp eq %"struct.std::_Rb_tree_node_base"* %27, %8: {[-1]:Integer}, intvals: {} %33 = icmp ult i8* %9, %32: {[-1]:Integer}, intvals: {} %43 = extractvalue { %"struct.std::_Rb_tree_node_base"*, %"struct.std::_Rb_tree_node_base"* } %42, 0: {[-1]:Pointer, [-1,40]:Float@double}, intvals: {} %44 = extractvalue { %"struct.std::_Rb_tree_node_base"*, %"struct.std::_Rb_tree_node_base"* } %42, 1: {[-1]:Pointer, [-1,32]:Pointer}, intvals: {} %45 = icmp eq %"struct.std::_Rb_tree_node_base"* %44, null: {[-1]:Integer}, intvals: {} %47 = icmp eq %"struct.std::_Rb_tree_node_base"* %43, null: {[-1]:Integer}, intvals: {} %52 = icmp eq %"struct.std::_Rb_tree_node_base"* %44, %51: {[-1]:Integer}, intvals: {} %58 = icmp ult i8* %54, %57: {[-1]:Integer}, intvals: {} %68 = add i64 %67, 1: {[-1]:Integer}, intvals: {} %7 = getelementptr inbounds i8, i8* %3, i64 8: {[-1]:Pointer, [-1,8]:Pointer, [-1,8,32]:Pointer, [-1,32]:Pointer}, intvals: {} %4 = getelementptr inbounds i8, i8* %3, i64 16: {[-1]:Pointer, [-1,0]:Pointer, [-1,0,32]:Pointer}, intvals: {} %30 = getelementptr inbounds %"struct.std::_Rb_tree_node_base", %"struct.std::_Rb_tree_node_base"* %27, i64 1: {[-1]:Pointer, [-1,0]:Pointer}, intvals: {} %36 = call noalias nonnull i8* @_Znwm(i64 48) #12: {[-1]:Pointer, [-1,32]:Pointer, [-1,40]:Float@double}, intvals: {} %37 = getelementptr inbounds i8, i8* %36, i64 32: {[-1]:Pointer, [-1,0]:Pointer, [-1,8]:Float@double}, intvals: {} %40 = getelementptr inbounds i8, i8* %36, i64 40: {[-1]:Pointer, [-1,0]:Float@double}, intvals: {} %50 = getelementptr inbounds i8, i8* %49, i64 8: {[-1]:Pointer}, intvals: {} %55 = getelementptr inbounds %"struct.std::_Rb_tree_node_base", %"struct.std::_Rb_tree_node_base"* %44, i64 1: {[-1]:Pointer, [-1,0]:Pointer}, intvals: {} %63 = getelementptr inbounds i8, i8* %62, i64 8: {[-1]:Pointer, [-1,32]:Integer, [-1,33]:Integer, [-1,34]:Integer, [-1,35]:Integer, [-1,36]:Integer, [-1,37]:Integer, [-1,38]:Integer, [-1,39]:Integer}, intvals: {} %65 = getelementptr inbounds i8, i8* %62, i64 40: {[-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: {} %21 = select i1 %17, %"struct.std::_Rb_tree_node_base"* %13, %"struct.std::_Rb_tree_node_base"* %19: {[-1]:Pointer, [-1,32]:Pointer}, intvals: {} %22 = select i1 %17, %"struct.std::_Rb_tree_node_base"** %18, %"struct.std::_Rb_tree_node_base"** %20: {[-1]:Pointer, [-1,0]:Pointer}, intvals: {} %14 = getelementptr inbounds %"struct.std::_Rb_tree_node", %"struct.std::_Rb_tree_node"* %12, i64 0, i32 1: {[-1]:Pointer, [-1,0]:Pointer}, intvals: {} %19 = getelementptr %"struct.std::_Rb_tree_node", %"struct.std::_Rb_tree_node"* %12, i64 0, i32 0: {[-1]:Pointer, [-1,16]:Pointer, [-1,24]:Pointer, [-1,32]:Pointer}, intvals: {} %35 = getelementptr inbounds %"class.std::map", %"class.std::map"* %0, i64 0, i32 0: {[-1]:Pointer, [-1,16]:Pointer}, intvals: {} %72 = getelementptr inbounds %"struct.std::_Rb_tree_node_base", %"struct.std::_Rb_tree_node_base"* %71, i64 1, i32 1: {[-1]:Pointer, [-1,0]:Float@double}, intvals: {} %18 = getelementptr inbounds %"struct.std::_Rb_tree_node", %"struct.std::_Rb_tree_node"* %12, i64 0, i32 0, i32 3: {[-1]:Pointer, [-1,0]:Pointer}, intvals: {} %20 = getelementptr inbounds %"struct.std::_Rb_tree_node", %"struct.std::_Rb_tree_node"* %12, i64 0, i32 0, i32 2: {[-1]:Pointer, [-1,0]:Pointer}, intvals: {} %42 = call { %"struct.std::_Rb_tree_node_base"*, %"struct.std::_Rb_tree_node_base"* } @_ZNSt8_Rb_treeIPKcSt4pairIKS1_dESt10_Select1stIS4_ESt4lessIS1_ESaIS4_EE29_M_get_insert_hint_unique_posESt23_Rb_tree_const_iteratorIS4_ERS3_(%"class.std::_Rb_tree"* nonnull align 8 dereferenceable(48) %35, %"struct.std::_Rb_tree_node_base"* %27, i8** nonnull align 8 dereferenceable(8) %38) #13: {[0]:Pointer, [0,40]:Float@double, [8]:Pointer, [8,32]:Pointer}, intvals: {} Illegal updateAnalysis prev:{[-1]:Pointer, [-1,16]:Pointer, [-1,40]:Integer, [-1,41]:Integer, [-1,42]:Integer, [-1,43]:Integer, [-1,44]:Integer, [-1,45]:Integer, [-1,46]:Integer, [-1,47]:Integer} new: {[-1]:Pointer, [-1,16]:Pointer, [-1,16,32]:Pointer, [-1,40]:Pointer} val: %"class.std::map"* %0 origin= %3 = getelementptr inbounds %"class.std::map", %"class.std::map"* %0, i64 0, i32 0, i32 0, i32 0, i32 0, i32 0 Assertion failed: (0 && "Performed illegal updateAnalysis"), function updateAnalysis, file TypeAnalysis.cpp, line 705. ```

https://fwd.gymni.ch/w56agH

tgymnich commented 1 year ago

-enzyme-strict-aliasing=false fixes the issue

wsmoses commented 9 months ago

This should at least make a better error message (aka not crash): https://github.com/EnzymeAD/Enzyme/pull/1590