; LLVM IR from flashlight/flashlight :: flashlight/fl/tensor/backend/jit/eval (Evaluator)

; Unoptimized IR (clang -disable-llvm-passes):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%"class.fl::Tensor" = type { ptr, %"class.std::unique_ptr" }
%"class.std::unique_ptr" = type { %"struct.std::__uniq_ptr_data" }
%"struct.std::__uniq_ptr_data" = type { %"class.std::__uniq_ptr_impl" }
%"class.std::__uniq_ptr_impl" = type { %"class.std::tuple" }
%"class.std::tuple" = type { %"struct.std::_Tuple_impl" }
%"struct.std::_Tuple_impl" = type { %"struct.std::_Head_base.90" }
%"struct.std::_Head_base.90" = type { ptr }
%"class.fl::Evaluator" = type { ptr, %"class.std::unordered_map", %"class.std::unordered_map.8", i8, %"class.std::__cxx11::list" }
%"class.std::unordered_map" = type { %"class.std::_Hashtable" }
%"class.std::_Hashtable" = type { ptr, i64, %"struct.std::__detail::_Hash_node_base", i64, %"struct.std::__detail::_Prime_rehash_policy", ptr }
%"struct.std::__detail::_Hash_node_base" = type { ptr }
%"struct.std::__detail::_Prime_rehash_policy" = type { float, i64 }
%"class.std::unordered_map.8" = type { %"class.std::_Hashtable.9" }
%"class.std::_Hashtable.9" = type { ptr, i64, %"struct.std::__detail::_Hash_node_base", i64, %"struct.std::__detail::_Prime_rehash_policy", ptr }
%"class.std::__cxx11::list" = type { %"class.std::__cxx11::_List_base" }
%"class.std::__cxx11::_List_base" = type { %"struct.std::__cxx11::_List_base<std::function<void (std::shared_ptr<fl::Node>, std::unordered_map<std::shared_ptr<fl::Node>, float>)>, std::allocator<std::function<void (std::shared_ptr<fl::Node>, std::unordered_map<std::shared_ptr<fl::Node>, float>)>>>::_List_impl" }
%"struct.std::__cxx11::_List_base<std::function<void (std::shared_ptr<fl::Node>, std::unordered_map<std::shared_ptr<fl::Node>, float>)>, std::allocator<std::function<void (std::shared_ptr<fl::Node>, std::unordered_map<std::shared_ptr<fl::Node>, float>)>>>::_List_impl" = type { %"struct.std::__detail::_List_node_header" }
%"struct.std::__detail::_List_node_header" = type { %"struct.std::__detail::_List_node_base", i64 }
%"struct.std::__detail::_List_node_base" = type { ptr, ptr }

@.str = external hidden unnamed_addr constant [56 x i8], align 1
@_ZTISt13runtime_error = external constant ptr

declare i32 @__gxx_personality_v0(...)

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN2fl9Evaluator12evalBinaryOpENS_8BinaryOpERKNS_6TensorES4_(ptr dead_on_unwind noalias writable sret(%"class.fl::Tensor") align 8 %0, ptr noundef nonnull align 8 dereferenceable(152) %1, i32 noundef %2, ptr noundef nonnull align 8 dereferenceable(16) %3, ptr noundef nonnull align 8 dereferenceable(16) %4) #0 align 2 personality ptr @__gxx_personality_v0 {
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca i32, align 4
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca i32, align 4
  store ptr %0, ptr %6, align 8
  store ptr %1, ptr %7, align 8, !tbaa !5
  store i32 %2, ptr %8, align 4, !tbaa !9
  store ptr %3, ptr %9, align 8, !tbaa !5
  store ptr %4, ptr %10, align 8, !tbaa !5
  %13 = load ptr, ptr %7, align 8
  %14 = load i32, ptr %8, align 4, !tbaa !9
  switch i32 %14, label %183 [
    i32 0, label %15
    i32 1, label %23
    i32 2, label %31
    i32 3, label %39
    i32 4, label %47
    i32 5, label %55
    i32 6, label %63
    i32 7, label %71
    i32 8, label %79
    i32 9, label %87
    i32 11, label %95
    i32 10, label %103
    i32 12, label %111
    i32 13, label %119
    i32 14, label %127
    i32 15, label %135
    i32 16, label %143
    i32 17, label %151
    i32 18, label %159
    i32 19, label %167
    i32 20, label %175
  ]

15:                                               ; preds = %5
  %16 = getelementptr inbounds %"class.fl::Evaluator", ptr %13, i32 0, i32 0
  %17 = load ptr, ptr %16, align 8, !tbaa !11
  %18 = load ptr, ptr %9, align 8, !tbaa !5
  %19 = load ptr, ptr %10, align 8, !tbaa !5
  %20 = load ptr, ptr %17, align 8, !tbaa !27
  %21 = getelementptr inbounds ptr, ptr %20, i64 80
  %22 = load ptr, ptr %21, align 8
  call void %22(ptr dead_on_unwind writable sret(%"class.fl::Tensor") align 8 %0, ptr noundef nonnull align 8 dereferenceable(64) %17, ptr noundef nonnull align 8 dereferenceable(16) %18, ptr noundef nonnull align 8 dereferenceable(16) %19)
  br label %190

23:                                               ; preds = %5
  %24 = getelementptr inbounds %"class.fl::Evaluator", ptr %13, i32 0, i32 0
  %25 = load ptr, ptr %24, align 8, !tbaa !11
  %26 = load ptr, ptr %9, align 8, !tbaa !5
  %27 = load ptr, ptr %10, align 8, !tbaa !5
  %28 = load ptr, ptr %25, align 8, !tbaa !27
  %29 = getelementptr inbounds ptr, ptr %28, i64 107
  %30 = load ptr, ptr %29, align 8
  call void %30(ptr dead_on_unwind writable sret(%"class.fl::Tensor") align 8 %0, ptr noundef nonnull align 8 dereferenceable(64) %25, ptr noundef nonnull align 8 dereferenceable(16) %26, ptr noundef nonnull align 8 dereferenceable(16) %27)
  br label %190

31:                                               ; preds = %5
  %32 = getelementptr inbounds %"class.fl::Evaluator", ptr %13, i32 0, i32 0
  %33 = load ptr, ptr %32, align 8, !tbaa !11
  %34 = load ptr, ptr %9, align 8, !tbaa !5
  %35 = load ptr, ptr %10, align 8, !tbaa !5
  %36 = load ptr, ptr %33, align 8, !tbaa !27
  %37 = getelementptr inbounds ptr, ptr %36, i64 134
  %38 = load ptr, ptr %37, align 8
  call void %38(ptr dead_on_unwind writable sret(%"class.fl::Tensor") align 8 %0, ptr noundef nonnull align 8 dereferenceable(64) %33, ptr noundef nonnull align 8 dereferenceable(16) %34, ptr noundef nonnull align 8 dereferenceable(16) %35)
  br label %190

39:                                               ; preds = %5
  %40 = getelementptr inbounds %"class.fl::Evaluator", ptr %13, i32 0, i32 0
  %41 = load ptr, ptr %40, align 8, !tbaa !11
  %42 = load ptr, ptr %9, align 8, !tbaa !5
  %43 = load ptr, ptr %10, align 8, !tbaa !5
  %44 = load ptr, ptr %41, align 8, !tbaa !27
  %45 = getelementptr inbounds ptr, ptr %44, i64 161
  %46 = load ptr, ptr %45, align 8
  call void %46(ptr dead_on_unwind writable sret(%"class.fl::Tensor") align 8 %0, ptr noundef nonnull align 8 dereferenceable(64) %41, ptr noundef nonnull align 8 dereferenceable(16) %42, ptr noundef nonnull align 8 dereferenceable(16) %43)
  br label %190

47:                                               ; preds = %5
  %48 = getelementptr inbounds %"class.fl::Evaluator", ptr %13, i32 0, i32 0
  %49 = load ptr, ptr %48, align 8, !tbaa !11
  %50 = load ptr, ptr %9, align 8, !tbaa !5
  %51 = load ptr, ptr %10, align 8, !tbaa !5
  %52 = load ptr, ptr %49, align 8, !tbaa !27
  %53 = getelementptr inbounds ptr, ptr %52, i64 188
  %54 = load ptr, ptr %53, align 8
  call void %54(ptr dead_on_unwind writable sret(%"class.fl::Tensor") align 8 %0, ptr noundef nonnull align 8 dereferenceable(64) %49, ptr noundef nonnull align 8 dereferenceable(16) %50, ptr noundef nonnull align 8 dereferenceable(16) %51)
  br label %190

55:                                               ; preds = %5
  %56 = getelementptr inbounds %"class.fl::Evaluator", ptr %13, i32 0, i32 0
  %57 = load ptr, ptr %56, align 8, !tbaa !11
  %58 = load ptr, ptr %9, align 8, !tbaa !5
  %59 = load ptr, ptr %10, align 8, !tbaa !5
  %60 = load ptr, ptr %57, align 8, !tbaa !27
  %61 = getelementptr inbounds ptr, ptr %60, i64 215
  %62 = load ptr, ptr %61, align 8
  call void %62(ptr dead_on_unwind writable sret(%"class.fl::Tensor") align 8 %0, ptr noundef nonnull align 8 dereferenceable(64) %57, ptr noundef nonnull align 8 dereferenceable(16) %58, ptr noundef nonnull align 8 dereferenceable(16) %59)
  br label %190

63:                                               ; preds = %5
  %64 = getelementptr inbounds %"class.fl::Evaluator", ptr %13, i32 0, i32 0
  %65 = load ptr, ptr %64, align 8, !tbaa !11
  %66 = load ptr, ptr %9, align 8, !tbaa !5
  %67 = load ptr, ptr %10, align 8, !tbaa !5
  %68 = load ptr, ptr %65, align 8, !tbaa !27
  %69 = getelementptr inbounds ptr, ptr %68, i64 296
  %70 = load ptr, ptr %69, align 8
  call void %70(ptr dead_on_unwind writable sret(%"class.fl::Tensor") align 8 %0, ptr noundef nonnull align 8 dereferenceable(64) %65, ptr noundef nonnull align 8 dereferenceable(16) %66, ptr noundef nonnull align 8 dereferenceable(16) %67)
  br label %190

71:                                               ; preds = %5
  %72 = getelementptr inbounds %"class.fl::Evaluator", ptr %13, i32 0, i32 0
  %73 = load ptr, ptr %72, align 8, !tbaa !11
  %74 = load ptr, ptr %9, align 8, !tbaa !5
  %75 = load ptr, ptr %10, align 8, !tbaa !5
  %76 = load ptr, ptr %73, align 8, !tbaa !27
  %77 = getelementptr inbounds ptr, ptr %76, i64 323
  %78 = load ptr, ptr %77, align 8
  call void %78(ptr dead_on_unwind writable sret(%"class.fl::Tensor") align 8 %0, ptr noundef nonnull align 8 dereferenceable(64) %73, ptr noundef nonnull align 8 dereferenceable(16) %74, ptr noundef nonnull align 8 dereferenceable(16) %75)
  br label %190

79:                                               ; preds = %5
  %80 = getelementptr inbounds %"class.fl::Evaluator", ptr %13, i32 0, i32 0
  %81 = load ptr, ptr %80, align 8, !tbaa !11
  %82 = load ptr, ptr %9, align 8, !tbaa !5
  %83 = load ptr, ptr %10, align 8, !tbaa !5
  %84 = load ptr, ptr %81, align 8, !tbaa !27
  %85 = getelementptr inbounds ptr, ptr %84, i64 242
  %86 = load ptr, ptr %85, align 8
  call void %86(ptr dead_on_unwind writable sret(%"class.fl::Tensor") align 8 %0, ptr noundef nonnull align 8 dereferenceable(64) %81, ptr noundef nonnull align 8 dereferenceable(16) %82, ptr noundef nonnull align 8 dereferenceable(16) %83)
  br label %190

87:                                               ; preds = %5
  %88 = getelementptr inbounds %"class.fl::Evaluator", ptr %13, i32 0, i32 0
  %89 = load ptr, ptr %88, align 8, !tbaa !11
  %90 = load ptr, ptr %9, align 8, !tbaa !5
  %91 = load ptr, ptr %10, align 8, !tbaa !5
  %92 = load ptr, ptr %89, align 8, !tbaa !27
  %93 = getelementptr inbounds ptr, ptr %92, i64 269
  %94 = load ptr, ptr %93, align 8
  call void %94(ptr dead_on_unwind writable sret(%"class.fl::Tensor") align 8 %0, ptr noundef nonnull align 8 dereferenceable(64) %89, ptr noundef nonnull align 8 dereferenceable(16) %90, ptr noundef nonnull align 8 dereferenceable(16) %91)
  br label %190

95:                                               ; preds = %5
  %96 = getelementptr inbounds %"class.fl::Evaluator", ptr %13, i32 0, i32 0
  %97 = load ptr, ptr %96, align 8, !tbaa !11
  %98 = load ptr, ptr %9, align 8, !tbaa !5
  %99 = load ptr, ptr %10, align 8, !tbaa !5
  %100 = load ptr, ptr %97, align 8, !tbaa !27
  %101 = getelementptr inbounds ptr, ptr %100, i64 566
  %102 = load ptr, ptr %101, align 8
  call void %102(ptr dead_on_unwind writable sret(%"class.fl::Tensor") align 8 %0, ptr noundef nonnull align 8 dereferenceable(64) %97, ptr noundef nonnull align 8 dereferenceable(16) %98, ptr noundef nonnull align 8 dereferenceable(16) %99)
  br label %190

103:                                              ; preds = %5
  %104 = getelementptr inbounds %"class.fl::Evaluator", ptr %13, i32 0, i32 0
  %105 = load ptr, ptr %104, align 8, !tbaa !11
  %106 = load ptr, ptr %9, align 8, !tbaa !5
  %107 = load ptr, ptr %10, align 8, !tbaa !5
  %108 = load ptr, ptr %105, align 8, !tbaa !27
  %109 = getelementptr inbounds ptr, ptr %108, i64 569
  %110 = load ptr, ptr %109, align 8
  call void %110(ptr dead_on_unwind writable sret(%"class.fl::Tensor") align 8 %0, ptr noundef nonnull align 8 dereferenceable(64) %105, ptr noundef nonnull align 8 dereferenceable(16) %106, ptr noundef nonnull align 8 dereferenceable(16) %107)
  br label %190

111:                                              ; preds = %5
  %112 = getelementptr inbounds %"class.fl::Evaluator", ptr %13, i32 0, i32 0
  %113 = load ptr, ptr %112, align 8, !tbaa !11
  %114 = load ptr, ptr %9, align 8, !tbaa !5
  %115 = load ptr, ptr %10, align 8, !tbaa !5
  %116 = load ptr, ptr %113, align 8, !tbaa !27
  %117 = getelementptr inbounds ptr, ptr %116, i64 572
  %118 = load ptr, ptr %117, align 8
  call void %118(ptr dead_on_unwind writable sret(%"class.fl::Tensor") align 8 %0, ptr noundef nonnull align 8 dereferenceable(64) %113, ptr noundef nonnull align 8 dereferenceable(16) %114, ptr noundef nonnull align 8 dereferenceable(16) %115)
  br label %190

119:                                              ; preds = %5
  %120 = getelementptr inbounds %"class.fl::Evaluator", ptr %13, i32 0, i32 0
  %121 = load ptr, ptr %120, align 8, !tbaa !11
  %122 = load ptr, ptr %9, align 8, !tbaa !5
  %123 = load ptr, ptr %10, align 8, !tbaa !5
  %124 = load ptr, ptr %121, align 8, !tbaa !27
  %125 = getelementptr inbounds ptr, ptr %124, i64 404
  %126 = load ptr, ptr %125, align 8
  call void %126(ptr dead_on_unwind writable sret(%"class.fl::Tensor") align 8 %0, ptr noundef nonnull align 8 dereferenceable(64) %121, ptr noundef nonnull align 8 dereferenceable(16) %122, ptr noundef nonnull align 8 dereferenceable(16) %123)
  br label %190

127:                                              ; preds = %5
  %128 = getelementptr inbounds %"class.fl::Evaluator", ptr %13, i32 0, i32 0
  %129 = load ptr, ptr %128, align 8, !tbaa !11
  %130 = load ptr, ptr %9, align 8, !tbaa !5
  %131 = load ptr, ptr %10, align 8, !tbaa !5
  %132 = load ptr, ptr %129, align 8, !tbaa !27
  %133 = getelementptr inbounds ptr, ptr %132, i64 377
  %134 = load ptr, ptr %133, align 8
  call void %134(ptr dead_on_unwind writable sret(%"class.fl::Tensor") align 8 %0, ptr noundef nonnull align 8 dereferenceable(64) %129, ptr noundef nonnull align 8 dereferenceable(16) %130, ptr noundef nonnull align 8 dereferenceable(16) %131)
  br label %190

135:                                              ; preds = %5
  %136 = getelementptr inbounds %"class.fl::Evaluator", ptr %13, i32 0, i32 0
  %137 = load ptr, ptr %136, align 8, !tbaa !11
  %138 = load ptr, ptr %9, align 8, !tbaa !5
  %139 = load ptr, ptr %10, align 8, !tbaa !5
  %140 = load ptr, ptr %137, align 8, !tbaa !27
  %141 = getelementptr inbounds ptr, ptr %140, i64 350
  %142 = load ptr, ptr %141, align 8
  call void %142(ptr dead_on_unwind writable sret(%"class.fl::Tensor") align 8 %0, ptr noundef nonnull align 8 dereferenceable(64) %137, ptr noundef nonnull align 8 dereferenceable(16) %138, ptr noundef nonnull align 8 dereferenceable(16) %139)
  br label %190

143:                                              ; preds = %5
  %144 = getelementptr inbounds %"class.fl::Evaluator", ptr %13, i32 0, i32 0
  %145 = load ptr, ptr %144, align 8, !tbaa !11
  %146 = load ptr, ptr %9, align 8, !tbaa !5
  %147 = load ptr, ptr %10, align 8, !tbaa !5
  %148 = load ptr, ptr %145, align 8, !tbaa !27
  %149 = getelementptr inbounds ptr, ptr %148, i64 512
  %150 = load ptr, ptr %149, align 8
  call void %150(ptr dead_on_unwind writable sret(%"class.fl::Tensor") align 8 %0, ptr noundef nonnull align 8 dereferenceable(64) %145, ptr noundef nonnull align 8 dereferenceable(16) %146, ptr noundef nonnull align 8 dereferenceable(16) %147)
  br label %190

151:                                              ; preds = %5
  %152 = getelementptr inbounds %"class.fl::Evaluator", ptr %13, i32 0, i32 0
  %153 = load ptr, ptr %152, align 8, !tbaa !11
  %154 = load ptr, ptr %9, align 8, !tbaa !5
  %155 = load ptr, ptr %10, align 8, !tbaa !5
  %156 = load ptr, ptr %153, align 8, !tbaa !27
  %157 = getelementptr inbounds ptr, ptr %156, i64 539
  %158 = load ptr, ptr %157, align 8
  call void %158(ptr dead_on_unwind writable sret(%"class.fl::Tensor") align 8 %0, ptr noundef nonnull align 8 dereferenceable(64) %153, ptr noundef nonnull align 8 dereferenceable(16) %154, ptr noundef nonnull align 8 dereferenceable(16) %155)
  br label %190

159:                                              ; preds = %5
  %160 = getelementptr inbounds %"class.fl::Evaluator", ptr %13, i32 0, i32 0
  %161 = load ptr, ptr %160, align 8, !tbaa !11
  %162 = load ptr, ptr %9, align 8, !tbaa !5
  %163 = load ptr, ptr %10, align 8, !tbaa !5
  %164 = load ptr, ptr %161, align 8, !tbaa !27
  %165 = getelementptr inbounds ptr, ptr %164, i64 431
  %166 = load ptr, ptr %165, align 8
  call void %166(ptr dead_on_unwind writable sret(%"class.fl::Tensor") align 8 %0, ptr noundef nonnull align 8 dereferenceable(64) %161, ptr noundef nonnull align 8 dereferenceable(16) %162, ptr noundef nonnull align 8 dereferenceable(16) %163)
  br label %190

167:                                              ; preds = %5
  %168 = getelementptr inbounds %"class.fl::Evaluator", ptr %13, i32 0, i32 0
  %169 = load ptr, ptr %168, align 8, !tbaa !11
  %170 = load ptr, ptr %9, align 8, !tbaa !5
  %171 = load ptr, ptr %10, align 8, !tbaa !5
  %172 = load ptr, ptr %169, align 8, !tbaa !27
  %173 = getelementptr inbounds ptr, ptr %172, i64 458
  %174 = load ptr, ptr %173, align 8
  call void %174(ptr dead_on_unwind writable sret(%"class.fl::Tensor") align 8 %0, ptr noundef nonnull align 8 dereferenceable(64) %169, ptr noundef nonnull align 8 dereferenceable(16) %170, ptr noundef nonnull align 8 dereferenceable(16) %171)
  br label %190

175:                                              ; preds = %5
  %176 = getelementptr inbounds %"class.fl::Evaluator", ptr %13, i32 0, i32 0
  %177 = load ptr, ptr %176, align 8, !tbaa !11
  %178 = load ptr, ptr %9, align 8, !tbaa !5
  %179 = load ptr, ptr %10, align 8, !tbaa !5
  %180 = load ptr, ptr %177, align 8, !tbaa !27
  %181 = getelementptr inbounds ptr, ptr %180, i64 485
  %182 = load ptr, ptr %181, align 8
  call void %182(ptr dead_on_unwind writable sret(%"class.fl::Tensor") align 8 %0, ptr noundef nonnull align 8 dereferenceable(64) %177, ptr noundef nonnull align 8 dereferenceable(16) %178, ptr noundef nonnull align 8 dereferenceable(16) %179)
  br label %190

183:                                              ; preds = %5
  %184 = call ptr @__cxa_allocate_exception(i64 16) #3
  invoke void @_ZNSt13runtime_errorC1EPKc(ptr noundef nonnull align 8 dereferenceable(16) %184, ptr noundef @.str)
          to label %185 unwind label %186

185:                                              ; preds = %183
  call void @__cxa_throw(ptr %184, ptr @_ZTISt13runtime_error, ptr @_ZNSt13runtime_errorD1Ev) #4
  unreachable

186:                                              ; preds = %183
  %187 = landingpad { ptr, i32 }
          cleanup
  %188 = extractvalue { ptr, i32 } %187, 0
  store ptr %188, ptr %11, align 8
  %189 = extractvalue { ptr, i32 } %187, 1
  store i32 %189, ptr %12, align 4
  call void @__cxa_free_exception(ptr %184) #3
  br label %191

190:                                              ; preds = %175, %167, %159, %151, %143, %135, %127, %119, %111, %103, %95, %87, %79, %71, %63, %55, %47, %39, %31, %23, %15
  ret void

191:                                              ; preds = %186
  %192 = load ptr, ptr %11, align 8
  %193 = load i32, ptr %12, align 4
  %194 = insertvalue { ptr, i32 } poison, ptr %192, 0
  %195 = insertvalue { ptr, i32 } %194, i32 %193, 1
  resume { ptr, i32 } %195
}

declare ptr @__cxa_allocate_exception(i64)

declare void @_ZNSt13runtime_errorC1EPKc(ptr noundef nonnull align 8 dereferenceable(16), ptr noundef) unnamed_addr #1

declare void @__cxa_free_exception(ptr)

; Function Attrs: nounwind
declare void @_ZNSt13runtime_errorD1Ev(ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #2

declare void @__cxa_throw(ptr, ptr, ptr)

attributes #0 = { mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nounwind }
attributes #4 = { noreturn }

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"_ZTSN2fl8BinaryOpE", !7, i64 0}
!11 = !{!12, !6, i64 0}
!12 = !{!"_ZTSN2fl9EvaluatorE", !6, i64 0, !13, i64 8, !19, i64 64, !21, i64 120, !22, i64 128}
!13 = !{!"_ZTSSt13unordered_mapISt10shared_ptrIN2fl4NodeEEjSt4hashIS3_ESt8equal_toIS3_ESaISt4pairIKS3_jEEE", !14, i64 0}
!14 = !{!"_ZTSSt10_HashtableISt10shared_ptrIN2fl4NodeEESt4pairIKS3_jESaIS6_ENSt8__detail10_Select1stESt8equal_toIS3_ESt4hashIS3_ENS8_18_Mod_range_hashingENS8_20_Default_ranged_hashENS8_20_Prime_rehash_policyENS8_17_Hashtable_traitsILb0ELb0ELb1EEEE", !6, i64 0, !15, i64 8, !16, i64 16, !15, i64 24, !17, i64 32, !6, i64 48}
!15 = !{!"long", !7, i64 0}
!16 = !{!"_ZTSNSt8__detail15_Hash_node_baseE", !6, i64 0}
!17 = !{!"_ZTSNSt8__detail20_Prime_rehash_policyE", !18, i64 0, !15, i64 8}
!18 = !{!"float", !7, i64 0}
!19 = !{!"_ZTSSt13unordered_mapISt10shared_ptrIN2fl4NodeEEfSt4hashIS3_ESt8equal_toIS3_ESaISt4pairIKS3_fEEE", !20, i64 0}
!20 = !{!"_ZTSSt10_HashtableISt10shared_ptrIN2fl4NodeEESt4pairIKS3_fESaIS6_ENSt8__detail10_Select1stESt8equal_toIS3_ESt4hashIS3_ENS8_18_Mod_range_hashingENS8_20_Default_ranged_hashENS8_20_Prime_rehash_policyENS8_17_Hashtable_traitsILb0ELb0ELb1EEEE", !6, i64 0, !15, i64 8, !16, i64 16, !15, i64 24, !17, i64 32, !6, i64 48}
!21 = !{!"bool", !7, i64 0}
!22 = !{!"_ZTSNSt7__cxx114listISt8functionIFvSt10shared_ptrIN2fl4NodeEESt13unordered_mapIS5_fSt4hashIS5_ESt8equal_toIS5_ESaISt4pairIKS5_fEEEEESaISH_EEE", !23, i64 0}
!23 = !{!"_ZTSNSt7__cxx1110_List_baseISt8functionIFvSt10shared_ptrIN2fl4NodeEESt13unordered_mapIS5_fSt4hashIS5_ESt8equal_toIS5_ESaISt4pairIKS5_fEEEEESaISH_EEE", !24, i64 0}
!24 = !{!"_ZTSNSt7__cxx1110_List_baseISt8functionIFvSt10shared_ptrIN2fl4NodeEESt13unordered_mapIS5_fSt4hashIS5_ESt8equal_toIS5_ESaISt4pairIKS5_fEEEEESaISH_EE10_List_implE", !25, i64 0}
!25 = !{!"_ZTSNSt8__detail17_List_node_headerE", !26, i64 0, !15, i64 16}
!26 = !{!"_ZTSNSt8__detail15_List_node_baseE", !6, i64 0, !6, i64 8}
!27 = !{!28, !28, i64 0}
!28 = !{!"vtable pointer", !8, i64 0}


; Optimized IR (opt -passes='default<O3>'):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%"class.fl::Tensor" = type { ptr, %"class.std::unique_ptr" }
%"class.std::unique_ptr" = type { %"struct.std::__uniq_ptr_data" }
%"struct.std::__uniq_ptr_data" = type { %"class.std::__uniq_ptr_impl" }
%"class.std::__uniq_ptr_impl" = type { %"class.std::tuple" }
%"class.std::tuple" = type { %"struct.std::_Tuple_impl" }
%"struct.std::_Tuple_impl" = type { %"struct.std::_Head_base.90" }
%"struct.std::_Head_base.90" = type { ptr }

@.str = external hidden unnamed_addr constant [56 x i8], align 1
@_ZTISt13runtime_error = external constant ptr
@switch.table._ZN2fl9Evaluator12evalBinaryOpENS_8BinaryOpERKNS_6TensorES4_ = private unnamed_addr constant [21 x i64] [i64 640, i64 856, i64 1072, i64 1288, i64 1504, i64 1720, i64 2368, i64 2584, i64 1936, i64 2152, i64 4552, i64 4528, i64 4576, i64 3232, i64 3016, i64 2800, i64 4096, i64 4312, i64 3448, i64 3664, i64 3880], align 8

declare i32 @__gxx_personality_v0(...)

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN2fl9Evaluator12evalBinaryOpENS_8BinaryOpERKNS_6TensorES4_(ptr dead_on_unwind noalias writable sret(%"class.fl::Tensor") align 8 %0, ptr nocapture noundef nonnull readonly align 8 dereferenceable(152) %1, i32 noundef %2, ptr noundef nonnull align 8 dereferenceable(16) %3, ptr noundef nonnull align 8 dereferenceable(16) %4) local_unnamed_addr #0 align 2 personality ptr @__gxx_personality_v0 {
  %6 = icmp ult i32 %2, 21
  br i1 %6, label %switch.lookup, label %7

7:                                                ; preds = %5
  %8 = tail call ptr @__cxa_allocate_exception(i64 16) #3
  invoke void @_ZNSt13runtime_errorC1EPKc(ptr noundef nonnull align 8 dereferenceable(16) %8, ptr noundef nonnull @.str)
          to label %9 unwind label %10

9:                                                ; preds = %7
  tail call void @__cxa_throw(ptr nonnull %8, ptr nonnull @_ZTISt13runtime_error, ptr nonnull @_ZNSt13runtime_errorD1Ev) #4
  unreachable

10:                                               ; preds = %7
  %11 = landingpad { ptr, i32 }
          cleanup
  tail call void @__cxa_free_exception(ptr %8) #3
  resume { ptr, i32 } %11

switch.lookup:                                    ; preds = %5
  %12 = zext nneg i32 %2 to i64
  %switch.gep = getelementptr inbounds [21 x i64], ptr @switch.table._ZN2fl9Evaluator12evalBinaryOpENS_8BinaryOpERKNS_6TensorES4_, i64 0, i64 %12
  %switch.load = load i64, ptr %switch.gep, align 8
  %13 = load ptr, ptr %1, align 8, !tbaa !5
  %14 = load ptr, ptr %13, align 8, !tbaa !24
  %15 = getelementptr inbounds i8, ptr %14, i64 %switch.load
  %16 = load ptr, ptr %15, align 8
  tail call void %16(ptr dead_on_unwind writable sret(%"class.fl::Tensor") align 8 %0, ptr noundef nonnull align 8 dereferenceable(64) %13, ptr noundef nonnull align 8 dereferenceable(16) %3, ptr noundef nonnull align 8 dereferenceable(16) %4)
  ret void
}

declare ptr @__cxa_allocate_exception(i64) local_unnamed_addr

declare void @_ZNSt13runtime_errorC1EPKc(ptr noundef nonnull align 8 dereferenceable(16), ptr noundef) unnamed_addr #1

declare void @__cxa_free_exception(ptr) local_unnamed_addr

; Function Attrs: nounwind
declare void @_ZNSt13runtime_errorD1Ev(ptr noundef nonnull align 8 dereferenceable(16)) unnamed_addr #2

declare void @__cxa_throw(ptr, ptr, ptr) local_unnamed_addr

attributes #0 = { mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nounwind }
attributes #4 = { noreturn }

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 0}
!6 = !{!"_ZTSN2fl9EvaluatorE", !7, i64 0, !10, i64 8, !16, i64 64, !18, i64 120, !19, i64 128}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C++ TBAA"}
!10 = !{!"_ZTSSt13unordered_mapISt10shared_ptrIN2fl4NodeEEjSt4hashIS3_ESt8equal_toIS3_ESaISt4pairIKS3_jEEE", !11, i64 0}
!11 = !{!"_ZTSSt10_HashtableISt10shared_ptrIN2fl4NodeEESt4pairIKS3_jESaIS6_ENSt8__detail10_Select1stESt8equal_toIS3_ESt4hashIS3_ENS8_18_Mod_range_hashingENS8_20_Default_ranged_hashENS8_20_Prime_rehash_policyENS8_17_Hashtable_traitsILb0ELb0ELb1EEEE", !7, i64 0, !12, i64 8, !13, i64 16, !12, i64 24, !14, i64 32, !7, i64 48}
!12 = !{!"long", !8, i64 0}
!13 = !{!"_ZTSNSt8__detail15_Hash_node_baseE", !7, i64 0}
!14 = !{!"_ZTSNSt8__detail20_Prime_rehash_policyE", !15, i64 0, !12, i64 8}
!15 = !{!"float", !8, i64 0}
!16 = !{!"_ZTSSt13unordered_mapISt10shared_ptrIN2fl4NodeEEfSt4hashIS3_ESt8equal_toIS3_ESaISt4pairIKS3_fEEE", !17, i64 0}
!17 = !{!"_ZTSSt10_HashtableISt10shared_ptrIN2fl4NodeEESt4pairIKS3_fESaIS6_ENSt8__detail10_Select1stESt8equal_toIS3_ESt4hashIS3_ENS8_18_Mod_range_hashingENS8_20_Default_ranged_hashENS8_20_Prime_rehash_policyENS8_17_Hashtable_traitsILb0ELb0ELb1EEEE", !7, i64 0, !12, i64 8, !13, i64 16, !12, i64 24, !14, i64 32, !7, i64 48}
!18 = !{!"bool", !8, i64 0}
!19 = !{!"_ZTSNSt7__cxx114listISt8functionIFvSt10shared_ptrIN2fl4NodeEESt13unordered_mapIS5_fSt4hashIS5_ESt8equal_toIS5_ESaISt4pairIKS5_fEEEEESaISH_EEE", !20, i64 0}
!20 = !{!"_ZTSNSt7__cxx1110_List_baseISt8functionIFvSt10shared_ptrIN2fl4NodeEESt13unordered_mapIS5_fSt4hashIS5_ESt8equal_toIS5_ESaISt4pairIKS5_fEEEEESaISH_EEE", !21, i64 0}
!21 = !{!"_ZTSNSt7__cxx1110_List_baseISt8functionIFvSt10shared_ptrIN2fl4NodeEESt13unordered_mapIS5_fSt4hashIS5_ESt8equal_toIS5_ESaISt4pairIKS5_fEEEEESaISH_EE10_List_implE", !22, i64 0}
!22 = !{!"_ZTSNSt8__detail17_List_node_headerE", !23, i64 0, !12, i64 16}
!23 = !{!"_ZTSNSt8__detail15_List_node_baseE", !7, i64 0, !7, i64 8}
!24 = !{!25, !25, i64 0}
!25 = !{!"vtable pointer", !9, i64 0}


; Effective O3 passes: EarlyCSEPass,GlobalOptPass,InstCombinePass,PostOrderFunctionAttrsPass,SROAPass,SimplifyCFGPass,TailCallElimPass