; LLVM IR from microsoft/Multiverso :: Applications/WordEmbedding/src (wordembedding)

; 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.wordembedding::WordEmbedding" = type { float, i64, ptr, ptr, ptr, ptr, %"class.std::unordered_set", %"class.std::unordered_set", i32, ptr }
%"class.std::unordered_set" = 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 }
%"struct.wordembedding::Option" = type <{ ptr, ptr, ptr, ptr, ptr, i8, i8, i8, i8, i8, i8, [2 x i8], float, [4 x i8], i64, i32, i32, i32, i32, i32, i32, i64, i64, float, [4 x i8] }>
%"struct.std::pair" = type { i32, i32 }

@.str.1 = external hidden unnamed_addr constant [103 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [22 x i8], align 1
@__PRETTY_FUNCTION__._ZN13wordembedding13WordEmbedding11TrainSampleERSt6vectorIiSaIiEERS1_ISt4pairIiiESaIS6_EEPvSA_ = external hidden unnamed_addr constant [119 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [63 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [27 x i8], align 1

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #0

; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #0

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN13wordembedding13WordEmbedding11TrainSampleERSt6vectorIiSaIiEERS1_ISt4pairIiiESaIS6_EEPvSA_(ptr noundef nonnull align 8 dereferenceable(176) %0, ptr noundef nonnull align 8 dereferenceable(24) %1, ptr noundef nonnull align 8 dereferenceable(24) %2, ptr noundef %3, ptr noundef %4) #1 align 2 {
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca i32, align 4
  %14 = alloca ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca i32, align 4
  %17 = alloca i32, align 4
  %18 = alloca ptr, align 8
  %19 = alloca ptr, align 8
  %20 = alloca ptr, align 8
  %21 = alloca i32, align 4
  %22 = alloca i32, align 4
  %23 = alloca i32, align 4
  %24 = alloca ptr, align 8
  %25 = alloca ptr, align 8
  %26 = alloca i32, align 4
  store ptr %0, ptr %6, align 8, !tbaa !5
  store ptr %1, ptr %7, align 8, !tbaa !5
  store ptr %2, ptr %8, align 8, !tbaa !5
  store ptr %3, ptr %9, align 8, !tbaa !5
  store ptr %4, ptr %10, align 8, !tbaa !5
  %27 = load ptr, ptr %6, align 8
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #7
  %28 = load ptr, ptr %9, align 8, !tbaa !5
  store ptr %28, ptr %11, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #7
  %29 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %29, ptr %12, align 8, !tbaa !5
  %30 = load ptr, ptr %11, align 8, !tbaa !5
  %31 = icmp ne ptr %30, null
  br i1 %31, label %32, label %33

32:                                               ; preds = %5
  br label %35

33:                                               ; preds = %5
  call void @__assert_fail(ptr noundef @.str.3, ptr noundef @.str.1, i32 noundef 125, ptr noundef @__PRETTY_FUNCTION__._ZN13wordembedding13WordEmbedding11TrainSampleERSt6vectorIiSaIiEERS1_ISt4pairIiiESaIS6_EEPvSA_) #8
  unreachable

34:                                               ; No predecessors!
  br label %35

35:                                               ; preds = %34, %32
  %36 = load ptr, ptr %12, align 8, !tbaa !5
  %37 = icmp ne ptr %36, null
  br i1 %37, label %38, label %39

38:                                               ; preds = %35
  br label %41

39:                                               ; preds = %35
  call void @__assert_fail(ptr noundef @.str.4, ptr noundef @.str.1, i32 noundef 126, ptr noundef @__PRETTY_FUNCTION__._ZN13wordembedding13WordEmbedding11TrainSampleERSt6vectorIiSaIiEERS1_ISt4pairIiiESaIS6_EEPvSA_) #8
  unreachable

40:                                               ; No predecessors!
  br label %41

41:                                               ; preds = %40, %38
  %42 = load ptr, ptr %11, align 8, !tbaa !5
  %43 = getelementptr inbounds %"class.wordembedding::WordEmbedding", ptr %27, i32 0, i32 2
  %44 = load ptr, ptr %43, align 8, !tbaa !9
  %45 = getelementptr inbounds %"struct.wordembedding::Option", ptr %44, i32 0, i32 15
  %46 = load i32, ptr %45, align 8, !tbaa !18
  %47 = sext i32 %46 to i64
  %48 = mul i64 %47, 4
  call void @llvm.memset.p0.i64(ptr align 4 %42, i8 0, i64 %48, i1 false)
  %49 = load ptr, ptr %12, align 8, !tbaa !5
  %50 = getelementptr inbounds %"class.wordembedding::WordEmbedding", ptr %27, i32 0, i32 2
  %51 = load ptr, ptr %50, align 8, !tbaa !9
  %52 = getelementptr inbounds %"struct.wordembedding::Option", ptr %51, i32 0, i32 15
  %53 = load i32, ptr %52, align 8, !tbaa !18
  %54 = sext i32 %53 to i64
  %55 = mul i64 %54, 4
  call void @llvm.memset.p0.i64(ptr align 4 %49, i8 0, i64 %55, i1 false)
  %56 = load ptr, ptr %7, align 8, !tbaa !5
  %57 = load ptr, ptr %11, align 8, !tbaa !5
  call void @_ZN13wordembedding13WordEmbedding11FeedForwardERSt6vectorIiSaIiEEPf(ptr noundef nonnull align 8 dereferenceable(176) %27, ptr noundef nonnull align 8 dereferenceable(24) %56, ptr noundef %57)
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #7
  store i32 0, ptr %13, align 4, !tbaa !21
  br label %58

58:                                               ; preds = %85, %41
  %59 = load i32, ptr %13, align 4, !tbaa !21
  %60 = sext i32 %59 to i64
  %61 = load ptr, ptr %8, align 8, !tbaa !5
  %62 = call noundef i64 @_ZNKSt6vectorISt4pairIiiESaIS1_EE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %61) #7
  %63 = icmp ult i64 %60, %62
  br i1 %63, label %65, label %64

64:                                               ; preds = %58
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #7
  br label %88

65:                                               ; preds = %58
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #7
  %66 = load ptr, ptr %8, align 8, !tbaa !5
  %67 = load i32, ptr %13, align 4, !tbaa !21
  %68 = sext i32 %67 to i64
  %69 = call noundef nonnull align 4 dereferenceable(8) ptr @_ZNSt6vectorISt4pairIiiESaIS1_EEixEm(ptr noundef nonnull align 8 dereferenceable(24) %66, i64 noundef %68) #7
  %70 = getelementptr inbounds %"struct.std::pair", ptr %69, i32 0, i32 0
  store ptr %70, ptr %14, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #7
  %71 = load ptr, ptr %8, align 8, !tbaa !5
  %72 = load i32, ptr %13, align 4, !tbaa !21
  %73 = sext i32 %72 to i64
  %74 = call noundef nonnull align 4 dereferenceable(8) ptr @_ZNSt6vectorISt4pairIiiESaIS1_EEixEm(ptr noundef nonnull align 8 dereferenceable(24) %71, i64 noundef %73) #7
  %75 = getelementptr inbounds %"struct.std::pair", ptr %74, i32 0, i32 1
  store ptr %75, ptr %15, align 8, !tbaa !5
  %76 = load ptr, ptr %15, align 8, !tbaa !5
  %77 = load i32, ptr %76, align 4, !tbaa !21
  %78 = load ptr, ptr %14, align 8, !tbaa !5
  %79 = load i32, ptr %78, align 4, !tbaa !21
  %80 = load ptr, ptr %14, align 8, !tbaa !5
  %81 = load i32, ptr %80, align 4, !tbaa !21
  %82 = call noundef ptr @_ZN13wordembedding13WordEmbedding11GetWeightEOEi(ptr noundef nonnull align 8 dereferenceable(176) %27, i32 noundef %81)
  %83 = load ptr, ptr %11, align 8, !tbaa !5
  %84 = load ptr, ptr %12, align 8, !tbaa !5
  call void @_ZN13wordembedding13WordEmbedding13BPOutputLayerEiiPfS1_S1_(ptr noundef nonnull align 8 dereferenceable(176) %27, i32 noundef %77, i32 noundef %79, ptr noundef %82, ptr noundef %83, ptr noundef %84)
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #7
  br label %85

85:                                               ; preds = %65
  %86 = load i32, ptr %13, align 4, !tbaa !21
  %87 = add nsw i32 %86, 1
  store i32 %87, ptr %13, align 4, !tbaa !21
  br label %58, !llvm.loop !22

88:                                               ; preds = %64
  %89 = getelementptr inbounds %"class.wordembedding::WordEmbedding", ptr %27, i32 0, i32 2
  %90 = load ptr, ptr %89, align 8, !tbaa !9
  %91 = getelementptr inbounds %"struct.wordembedding::Option", ptr %90, i32 0, i32 9
  %92 = load i8, ptr %91, align 4, !tbaa !24, !range !25, !noundef !26
  %93 = trunc i8 %92 to i1
  br i1 %93, label %94, label %193

94:                                               ; preds = %88
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #7
  store i32 0, ptr %16, align 4, !tbaa !21
  br label %95

95:                                               ; preds = %189, %94
  %96 = load i32, ptr %16, align 4, !tbaa !21
  %97 = sext i32 %96 to i64
  %98 = load ptr, ptr %7, align 8, !tbaa !5
  %99 = call noundef i64 @_ZNKSt6vectorIiSaIiEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %98) #7
  %100 = icmp ult i64 %97, %99
  br i1 %100, label %102, label %101

101:                                              ; preds = %95
  store i32 5, ptr %17, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #7
  br label %192

102:                                              ; preds = %95
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #7
  %103 = load ptr, ptr %7, align 8, !tbaa !5
  %104 = load i32, ptr %16, align 4, !tbaa !21
  %105 = sext i32 %104 to i64
  %106 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNSt6vectorIiSaIiEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %103, i64 noundef %105) #7
  store ptr %106, ptr %18, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #7
  %107 = load ptr, ptr %18, align 8, !tbaa !5
  %108 = load i32, ptr %107, align 4, !tbaa !21
  %109 = call noundef ptr @_ZN13wordembedding13WordEmbedding11GetWeightIEEi(ptr noundef nonnull align 8 dereferenceable(176) %27, i32 noundef %108)
  store ptr %109, ptr %19, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #7
  %110 = load ptr, ptr %18, align 8, !tbaa !5
  %111 = load i32, ptr %110, align 4, !tbaa !21
  %112 = call noundef ptr @_ZN13wordembedding13WordEmbedding17GetSumGradient2IEEi(ptr noundef nonnull align 8 dereferenceable(176) %27, i32 noundef %111)
  store ptr %112, ptr %20, align 8, !tbaa !5
  %113 = load ptr, ptr %19, align 8, !tbaa !5
  %114 = icmp ne ptr %113, null
  br i1 %114, label %115, label %118

115:                                              ; preds = %102
  %116 = load ptr, ptr %20, align 8, !tbaa !5
  %117 = icmp ne ptr %116, null
  br label %118

118:                                              ; preds = %115, %102
  %119 = phi i1 [ false, %102 ], [ %117, %115 ]
  br i1 %119, label %120, label %121

120:                                              ; preds = %118
  br label %123

121:                                              ; preds = %118
  call void @__assert_fail(ptr noundef @.str.5, ptr noundef @.str.1, i32 noundef 145, ptr noundef @__PRETTY_FUNCTION__._ZN13wordembedding13WordEmbedding11TrainSampleERSt6vectorIiSaIiEERS1_ISt4pairIiiESaIS6_EEPvSA_) #8
  unreachable

122:                                              ; No predecessors!
  br label %123

123:                                              ; preds = %122, %120
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #7
  store i32 0, ptr %21, align 4, !tbaa !21
  br label %124

124:                                              ; preds = %185, %123
  %125 = load i32, ptr %21, align 4, !tbaa !21
  %126 = getelementptr inbounds %"class.wordembedding::WordEmbedding", ptr %27, i32 0, i32 2
  %127 = load ptr, ptr %126, align 8, !tbaa !9
  %128 = getelementptr inbounds %"struct.wordembedding::Option", ptr %127, i32 0, i32 15
  %129 = load i32, ptr %128, align 8, !tbaa !18
  %130 = icmp slt i32 %125, %129
  br i1 %130, label %132, label %131

131:                                              ; preds = %124
  store i32 8, ptr %17, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #7
  br label %188

132:                                              ; preds = %124
  %133 = load ptr, ptr %12, align 8, !tbaa !5
  %134 = load i32, ptr %21, align 4, !tbaa !21
  %135 = sext i32 %134 to i64
  %136 = getelementptr inbounds float, ptr %133, i64 %135
  %137 = load float, ptr %136, align 4, !tbaa !27
  %138 = load ptr, ptr %12, align 8, !tbaa !5
  %139 = load i32, ptr %21, align 4, !tbaa !21
  %140 = sext i32 %139 to i64
  %141 = getelementptr inbounds float, ptr %138, i64 %140
  %142 = load float, ptr %141, align 4, !tbaa !27
  %143 = load ptr, ptr %20, align 8, !tbaa !5
  %144 = load i32, ptr %21, align 4, !tbaa !21
  %145 = sext i32 %144 to i64
  %146 = getelementptr inbounds float, ptr %143, i64 %145
  %147 = load float, ptr %146, align 4, !tbaa !27
  %148 = call float @llvm.fmuladd.f32(float %137, float %142, float %147)
  store float %148, ptr %146, align 4, !tbaa !27
  %149 = load ptr, ptr %20, align 8, !tbaa !5
  %150 = load i32, ptr %21, align 4, !tbaa !21
  %151 = sext i32 %150 to i64
  %152 = getelementptr inbounds float, ptr %149, i64 %151
  %153 = load float, ptr %152, align 4, !tbaa !27
  %154 = fpext float %153 to double
  %155 = fcmp ogt double %154, 1.000000e-10
  br i1 %155, label %156, label %184

156:                                              ; preds = %132
  %157 = load ptr, ptr %12, align 8, !tbaa !5
  %158 = load i32, ptr %21, align 4, !tbaa !21
  %159 = sext i32 %158 to i64
  %160 = getelementptr inbounds float, ptr %157, i64 %159
  %161 = load float, ptr %160, align 4, !tbaa !27
  %162 = getelementptr inbounds %"class.wordembedding::WordEmbedding", ptr %27, i32 0, i32 2
  %163 = load ptr, ptr %162, align 8, !tbaa !9
  %164 = getelementptr inbounds %"struct.wordembedding::Option", ptr %163, i32 0, i32 23
  %165 = load float, ptr %164, align 8, !tbaa !28
  %166 = fmul float %161, %165
  %167 = fpext float %166 to double
  %168 = load ptr, ptr %20, align 8, !tbaa !5
  %169 = load i32, ptr %21, align 4, !tbaa !21
  %170 = sext i32 %169 to i64
  %171 = getelementptr inbounds float, ptr %168, i64 %170
  %172 = load float, ptr %171, align 4, !tbaa !27
  %173 = fpext float %172 to double
  %174 = call double @sqrt(double noundef %173) #7
  %175 = fdiv double %167, %174
  %176 = load ptr, ptr %19, align 8, !tbaa !5
  %177 = load i32, ptr %21, align 4, !tbaa !21
  %178 = sext i32 %177 to i64
  %179 = getelementptr inbounds float, ptr %176, i64 %178
  %180 = load float, ptr %179, align 4, !tbaa !27
  %181 = fpext float %180 to double
  %182 = fadd double %181, %175
  %183 = fptrunc double %182 to float
  store float %183, ptr %179, align 4, !tbaa !27
  br label %184

184:                                              ; preds = %156, %132
  br label %185

185:                                              ; preds = %184
  %186 = load i32, ptr %21, align 4, !tbaa !21
  %187 = add nsw i32 %186, 1
  store i32 %187, ptr %21, align 4, !tbaa !21
  br label %124, !llvm.loop !29

188:                                              ; preds = %131
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #7
  br label %189

189:                                              ; preds = %188
  %190 = load i32, ptr %16, align 4, !tbaa !21
  %191 = add nsw i32 %190, 1
  store i32 %191, ptr %16, align 4, !tbaa !21
  br label %95, !llvm.loop !30

192:                                              ; preds = %101
  br label %264

193:                                              ; preds = %88
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #7
  store i32 0, ptr %22, align 4, !tbaa !21
  br label %194

194:                                              ; preds = %211, %193
  %195 = load i32, ptr %22, align 4, !tbaa !21
  %196 = getelementptr inbounds %"class.wordembedding::WordEmbedding", ptr %27, i32 0, i32 2
  %197 = load ptr, ptr %196, align 8, !tbaa !9
  %198 = getelementptr inbounds %"struct.wordembedding::Option", ptr %197, i32 0, i32 15
  %199 = load i32, ptr %198, align 8, !tbaa !18
  %200 = icmp slt i32 %195, %199
  br i1 %200, label %202, label %201

201:                                              ; preds = %194
  store i32 11, ptr %17, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #7
  br label %214

202:                                              ; preds = %194
  %203 = getelementptr inbounds %"class.wordembedding::WordEmbedding", ptr %27, i32 0, i32 0
  %204 = load float, ptr %203, align 8, !tbaa !31
  %205 = load ptr, ptr %12, align 8, !tbaa !5
  %206 = load i32, ptr %22, align 4, !tbaa !21
  %207 = sext i32 %206 to i64
  %208 = getelementptr inbounds float, ptr %205, i64 %207
  %209 = load float, ptr %208, align 4, !tbaa !27
  %210 = fmul float %209, %204
  store float %210, ptr %208, align 4, !tbaa !27
  br label %211

211:                                              ; preds = %202
  %212 = load i32, ptr %22, align 4, !tbaa !21
  %213 = add nsw i32 %212, 1
  store i32 %213, ptr %22, align 4, !tbaa !21
  br label %194, !llvm.loop !32

214:                                              ; preds = %201
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #7
  store i32 0, ptr %23, align 4, !tbaa !21
  br label %215

215:                                              ; preds = %260, %214
  %216 = load i32, ptr %23, align 4, !tbaa !21
  %217 = sext i32 %216 to i64
  %218 = load ptr, ptr %7, align 8, !tbaa !5
  %219 = call noundef i64 @_ZNKSt6vectorIiSaIiEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %218) #7
  %220 = icmp ult i64 %217, %219
  br i1 %220, label %222, label %221

221:                                              ; preds = %215
  store i32 14, ptr %17, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #7
  br label %263

222:                                              ; preds = %215
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #7
  %223 = load ptr, ptr %7, align 8, !tbaa !5
  %224 = load i32, ptr %23, align 4, !tbaa !21
  %225 = sext i32 %224 to i64
  %226 = call noundef nonnull align 4 dereferenceable(4) ptr @_ZNSt6vectorIiSaIiEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %223, i64 noundef %225) #7
  store ptr %226, ptr %24, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #7
  %227 = load ptr, ptr %24, align 8, !tbaa !5
  %228 = load i32, ptr %227, align 4, !tbaa !21
  %229 = call noundef ptr @_ZN13wordembedding13WordEmbedding11GetWeightIEEi(ptr noundef nonnull align 8 dereferenceable(176) %27, i32 noundef %228)
  store ptr %229, ptr %25, align 8, !tbaa !5
  %230 = load ptr, ptr %25, align 8, !tbaa !5
  %231 = icmp ne ptr %230, null
  br i1 %231, label %232, label %233

232:                                              ; preds = %222
  br label %235

233:                                              ; preds = %222
  call void @__assert_fail(ptr noundef @.str.6, ptr noundef @.str.1, i32 noundef 161, ptr noundef @__PRETTY_FUNCTION__._ZN13wordembedding13WordEmbedding11TrainSampleERSt6vectorIiSaIiEERS1_ISt4pairIiiESaIS6_EEPvSA_) #8
  unreachable

234:                                              ; No predecessors!
  br label %235

235:                                              ; preds = %234, %232
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #7
  store i32 0, ptr %26, align 4, !tbaa !21
  br label %236

236:                                              ; preds = %256, %235
  %237 = load i32, ptr %26, align 4, !tbaa !21
  %238 = getelementptr inbounds %"class.wordembedding::WordEmbedding", ptr %27, i32 0, i32 2
  %239 = load ptr, ptr %238, align 8, !tbaa !9
  %240 = getelementptr inbounds %"struct.wordembedding::Option", ptr %239, i32 0, i32 15
  %241 = load i32, ptr %240, align 8, !tbaa !18
  %242 = icmp slt i32 %237, %241
  br i1 %242, label %244, label %243

243:                                              ; preds = %236
  store i32 17, ptr %17, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #7
  br label %259

244:                                              ; preds = %236
  %245 = load ptr, ptr %12, align 8, !tbaa !5
  %246 = load i32, ptr %26, align 4, !tbaa !21
  %247 = sext i32 %246 to i64
  %248 = getelementptr inbounds float, ptr %245, i64 %247
  %249 = load float, ptr %248, align 4, !tbaa !27
  %250 = load ptr, ptr %25, align 8, !tbaa !5
  %251 = load i32, ptr %26, align 4, !tbaa !21
  %252 = sext i32 %251 to i64
  %253 = getelementptr inbounds float, ptr %250, i64 %252
  %254 = load float, ptr %253, align 4, !tbaa !27
  %255 = fadd float %254, %249
  store float %255, ptr %253, align 4, !tbaa !27
  br label %256

256:                                              ; preds = %244
  %257 = load i32, ptr %26, align 4, !tbaa !21
  %258 = add nsw i32 %257, 1
  store i32 %258, ptr %26, align 4, !tbaa !21
  br label %236, !llvm.loop !33

259:                                              ; preds = %243
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #7
  br label %260

260:                                              ; preds = %259
  %261 = load i32, ptr %23, align 4, !tbaa !21
  %262 = add nsw i32 %261, 1
  store i32 %262, ptr %23, align 4, !tbaa !21
  br label %215, !llvm.loop !34

263:                                              ; preds = %221
  br label %264

264:                                              ; preds = %263, %192
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #7
  ret void
}

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN13wordembedding13WordEmbedding11FeedForwardERSt6vectorIiSaIiEEPf(ptr noundef nonnull align 8 dereferenceable(176), ptr noundef nonnull align 8 dereferenceable(24), ptr noundef) #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i64 @_ZNKSt6vectorIiSaIiEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24)) #2 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZNSt6vectorIiSaIiEEixEm(ptr noundef nonnull align 8 dereferenceable(24), i64 noundef) #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef ptr @_ZN13wordembedding13WordEmbedding11GetWeightIEEi(ptr noundef nonnull align 8 dereferenceable(176), i32 noundef) #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN13wordembedding13WordEmbedding13BPOutputLayerEiiPfS1_S1_(ptr noundef nonnull align 8 dereferenceable(176), i32 noundef, i32 noundef, ptr noundef, ptr noundef, ptr noundef) #1 align 2

; Function Attrs: noreturn nounwind
declare void @__assert_fail(ptr noundef, ptr noundef, i32 noundef, ptr noundef) #3

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare float @llvm.fmuladd.f32(float, float, float) #4

; Function Attrs: nounwind
declare double @sqrt(double noundef) #5

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #6

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i64 @_ZNKSt6vectorISt4pairIiiESaIS1_EE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24)) #2 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(8) ptr @_ZNSt6vectorISt4pairIiiESaIS1_EEixEm(ptr noundef nonnull align 8 dereferenceable(24), i64 noundef) #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef ptr @_ZN13wordembedding13WordEmbedding11GetWeightEOEi(ptr noundef nonnull align 8 dereferenceable(176), i32 noundef) #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef ptr @_ZN13wordembedding13WordEmbedding17GetSumGradient2IEEi(ptr noundef nonnull align 8 dereferenceable(176), i32 noundef) #1 align 2

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { 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 #2 = { mustprogress nounwind 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 #3 = { noreturn 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 #4 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #5 = { 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 #6 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #7 = { nounwind }
attributes #8 = { noreturn nounwind }

!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, !6, i64 16}
!10 = !{!"_ZTSN13wordembedding13WordEmbeddingE", !11, i64 0, !12, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !13, i64 48, !13, i64 104, !17, i64 160, !6, i64 168}
!11 = !{!"float", !7, i64 0}
!12 = !{!"long", !7, i64 0}
!13 = !{!"_ZTSSt13unordered_setIiSt4hashIiESt8equal_toIiESaIiEE", !14, i64 0}
!14 = !{!"_ZTSSt10_HashtableIiiSaIiENSt8__detail9_IdentityESt8equal_toIiESt4hashIiENS1_18_Mod_range_hashingENS1_20_Default_ranged_hashENS1_20_Prime_rehash_policyENS1_17_Hashtable_traitsILb0ELb1ELb1EEEE", !6, i64 0, !12, i64 8, !15, i64 16, !12, i64 24, !16, i64 32, !6, i64 48}
!15 = !{!"_ZTSNSt8__detail15_Hash_node_baseE", !6, i64 0}
!16 = !{!"_ZTSNSt8__detail20_Prime_rehash_policyE", !11, i64 0, !12, i64 8}
!17 = !{!"int", !7, i64 0}
!18 = !{!19, !17, i64 64}
!19 = !{!"_ZTSN13wordembedding6OptionE", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !20, i64 40, !20, i64 41, !20, i64 42, !20, i64 43, !20, i64 44, !20, i64 45, !11, i64 48, !12, i64 56, !17, i64 64, !17, i64 68, !17, i64 72, !17, i64 76, !17, i64 80, !17, i64 84, !12, i64 88, !12, i64 96, !11, i64 104}
!20 = !{!"bool", !7, i64 0}
!21 = !{!17, !17, i64 0}
!22 = distinct !{!22, !23}
!23 = !{!"llvm.loop.mustprogress"}
!24 = !{!19, !20, i64 44}
!25 = !{i8 0, i8 2}
!26 = !{}
!27 = !{!11, !11, i64 0}
!28 = !{!19, !11, i64 104}
!29 = distinct !{!29, !23}
!30 = distinct !{!30, !23}
!31 = !{!10, !11, i64 0}
!32 = distinct !{!32, !23}
!33 = distinct !{!33, !23}
!34 = distinct !{!34, !23}


; 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"

@.str.1 = external hidden unnamed_addr constant [103 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [22 x i8], align 1
@__PRETTY_FUNCTION__._ZN13wordembedding13WordEmbedding11TrainSampleERSt6vectorIiSaIiEERS1_ISt4pairIiiESaIS6_EEPvSA_ = external hidden unnamed_addr constant [119 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.5 = external hidden unnamed_addr constant [63 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [27 x i8], align 1

; Function Attrs: mustprogress uwtable
define dso_local void @_ZN13wordembedding13WordEmbedding11TrainSampleERSt6vectorIiSaIiEERS1_ISt4pairIiiESaIS6_EEPvSA_(ptr noundef nonnull align 8 dereferenceable(176) %0, ptr noundef nonnull align 8 dereferenceable(24) %1, ptr noundef nonnull align 8 dereferenceable(24) %2, ptr noundef %3, ptr noundef %4) local_unnamed_addr #0 align 2 {
  %.not = icmp eq ptr %3, null
  br i1 %.not, label %6, label %7

6:                                                ; preds = %5
  tail call void @__assert_fail(ptr noundef nonnull @.str.3, ptr noundef nonnull @.str.1, i32 noundef 125, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN13wordembedding13WordEmbedding11TrainSampleERSt6vectorIiSaIiEERS1_ISt4pairIiiESaIS6_EEPvSA_) #6
  unreachable

7:                                                ; preds = %5
  %.not76 = icmp eq ptr %4, null
  br i1 %.not76, label %8, label %9

8:                                                ; preds = %7
  tail call void @__assert_fail(ptr noundef nonnull @.str.4, ptr noundef nonnull @.str.1, i32 noundef 126, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN13wordembedding13WordEmbedding11TrainSampleERSt6vectorIiSaIiEERS1_ISt4pairIiiESaIS6_EEPvSA_) #6
  unreachable

9:                                                ; preds = %7
  %10 = getelementptr inbounds i8, ptr %0, i64 16
  %11 = load ptr, ptr %10, align 8, !tbaa !5
  %12 = getelementptr inbounds i8, ptr %11, i64 64
  %13 = load i32, ptr %12, align 8, !tbaa !17
  %14 = sext i32 %13 to i64
  %15 = shl nsw i64 %14, 2
  tail call void @llvm.memset.p0.i64(ptr nonnull align 4 %3, i8 0, i64 %15, i1 false)
  %16 = load ptr, ptr %10, align 8, !tbaa !5
  %17 = getelementptr inbounds i8, ptr %16, i64 64
  %18 = load i32, ptr %17, align 8, !tbaa !17
  %19 = sext i32 %18 to i64
  %20 = shl nsw i64 %19, 2
  tail call void @llvm.memset.p0.i64(ptr nonnull align 4 %4, i8 0, i64 %20, i1 false)
  tail call void @_ZN13wordembedding13WordEmbedding11FeedForwardERSt6vectorIiSaIiEEPf(ptr noundef nonnull align 8 dereferenceable(176) %0, ptr noundef nonnull align 8 dereferenceable(24) %1, ptr noundef nonnull %3)
  %21 = tail call noundef i64 @_ZNKSt6vectorISt4pairIiiESaIS1_EE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %2) #7
  %.not96 = icmp eq i64 %21, 0
  br i1 %.not96, label %._crit_edge, label %.lr.ph

._crit_edge:                                      ; preds = %.lr.ph, %9
  %22 = load ptr, ptr %10, align 8, !tbaa !5
  %23 = getelementptr inbounds i8, ptr %22, i64 44
  %24 = load i8, ptr %23, align 4, !tbaa !20, !range !21, !noundef !22
  %25 = trunc nuw i8 %24 to i1
  br i1 %25, label %.preheader78, label %.preheader82

.preheader82:                                     ; preds = %._crit_edge
  %26 = getelementptr inbounds i8, ptr %22, i64 64
  %27 = load i32, ptr %26, align 8, !tbaa !17
  %28 = icmp sgt i32 %27, 0
  br i1 %28, label %.lr.ph85.preheader, label %.preheader80

.lr.ph85.preheader:                               ; preds = %.preheader82
  %wide.trip.count = zext nneg i32 %27 to i64
  %min.iters.check = icmp ult i32 %27, 8
  br i1 %min.iters.check, label %.lr.ph85.preheader147, label %vector.memcheck

.lr.ph85.preheader147:                            ; preds = %middle.block, %vector.memcheck, %.lr.ph85.preheader
  %indvars.iv101.ph = phi i64 [ 0, %vector.memcheck ], [ 0, %.lr.ph85.preheader ], [ %n.vec, %middle.block ]
  %xtraiter = and i64 %wide.trip.count, 3
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.lr.ph85.prol.loopexit, label %.lr.ph85.prol

.lr.ph85.prol:                                    ; preds = %.lr.ph85.preheader147, %.lr.ph85.prol
  %indvars.iv101.prol = phi i64 [ %indvars.iv.next102.prol, %.lr.ph85.prol ], [ %indvars.iv101.ph, %.lr.ph85.preheader147 ]
  %prol.iter = phi i64 [ %prol.iter.next, %.lr.ph85.prol ], [ 0, %.lr.ph85.preheader147 ]
  %29 = load float, ptr %0, align 8, !tbaa !23
  %30 = getelementptr inbounds float, ptr %4, i64 %indvars.iv101.prol
  %31 = load float, ptr %30, align 4, !tbaa !24
  %32 = fmul float %29, %31
  store float %32, ptr %30, align 4, !tbaa !24
  %indvars.iv.next102.prol = add nuw nsw i64 %indvars.iv101.prol, 1
  %prol.iter.next = add i64 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i64 %prol.iter.next, %xtraiter
  br i1 %prol.iter.cmp.not, label %.lr.ph85.prol.loopexit, label %.lr.ph85.prol, !llvm.loop !25

.lr.ph85.prol.loopexit:                           ; preds = %.lr.ph85.prol, %.lr.ph85.preheader147
  %indvars.iv101.unr = phi i64 [ %indvars.iv101.ph, %.lr.ph85.preheader147 ], [ %indvars.iv.next102.prol, %.lr.ph85.prol ]
  %33 = sub nsw i64 %indvars.iv101.ph, %wide.trip.count
  %34 = icmp ugt i64 %33, -4
  br i1 %34, label %.preheader80, label %.lr.ph85.preheader147.new

.lr.ph85.preheader147.new:                        ; preds = %.lr.ph85.prol.loopexit
  %invariant.gep = getelementptr i8, ptr %4, i64 4
  %invariant.gep151 = getelementptr i8, ptr %4, i64 8
  %invariant.gep153 = getelementptr i8, ptr %4, i64 12
  br label %.lr.ph85

vector.memcheck:                                  ; preds = %.lr.ph85.preheader
  %35 = shl nuw nsw i64 %wide.trip.count, 2
  %scevgep = getelementptr i8, ptr %4, i64 %35
  %scevgep120 = getelementptr inbounds i8, ptr %0, i64 4
  %bound0 = icmp ugt ptr %scevgep120, %4
  %bound1 = icmp ugt ptr %scevgep, %0
  %found.conflict = and i1 %bound0, %bound1
  br i1 %found.conflict, label %.lr.ph85.preheader147, label %vector.ph

vector.ph:                                        ; preds = %vector.memcheck
  %n.vec = and i64 %wide.trip.count, 2147483640
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %36 = load <4 x float>, ptr %0, align 8
  %broadcast.splat123 = shufflevector <4 x float> %36, <4 x float> poison, <4 x i32> zeroinitializer
  %37 = getelementptr inbounds float, ptr %4, i64 %index
  %38 = getelementptr inbounds i8, ptr %37, i64 16
  %wide.load = load <4 x float>, ptr %37, align 4, !tbaa !24, !alias.scope !27, !noalias !30
  %wide.load121 = load <4 x float>, ptr %38, align 4, !tbaa !24, !alias.scope !27, !noalias !30
  %39 = fmul <4 x float> %broadcast.splat123, %wide.load
  %40 = fmul <4 x float> %broadcast.splat123, %wide.load121
  store <4 x float> %39, ptr %37, align 4, !tbaa !24, !alias.scope !27, !noalias !30
  store <4 x float> %40, ptr %38, align 4, !tbaa !24, !alias.scope !27, !noalias !30
  %index.next = add nuw i64 %index, 8
  %41 = icmp eq i64 %index.next, %n.vec
  br i1 %41, label %middle.block, label %vector.body, !llvm.loop !32

middle.block:                                     ; preds = %vector.body
  %cmp.n = icmp eq i64 %n.vec, %wide.trip.count
  br i1 %cmp.n, label %.preheader80, label %.lr.ph85.preheader147

.preheader78:                                     ; preds = %._crit_edge
  %42 = tail call noundef i64 @_ZNKSt6vectorIiSaIiEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %1) #7
  %.not98 = icmp eq i64 %42, 0
  br i1 %.not98, label %.loopexit, label %.lr.ph95

.lr.ph:                                           ; preds = %9, %.lr.ph
  %indvars.iv = phi i64 [ %indvars.iv.next, %.lr.ph ], [ 0, %9 ]
  %43 = tail call noundef nonnull align 4 dereferenceable(8) ptr @_ZNSt6vectorISt4pairIiiESaIS1_EEixEm(ptr noundef nonnull align 8 dereferenceable(24) %2, i64 noundef %indvars.iv) #7
  %44 = tail call noundef nonnull align 4 dereferenceable(8) ptr @_ZNSt6vectorISt4pairIiiESaIS1_EEixEm(ptr noundef nonnull align 8 dereferenceable(24) %2, i64 noundef %indvars.iv) #7
  %45 = getelementptr inbounds i8, ptr %44, i64 4
  %46 = load i32, ptr %45, align 4, !tbaa !36
  %47 = load i32, ptr %43, align 4, !tbaa !36
  %48 = tail call noundef ptr @_ZN13wordembedding13WordEmbedding11GetWeightEOEi(ptr noundef nonnull align 8 dereferenceable(176) %0, i32 noundef %47)
  tail call void @_ZN13wordembedding13WordEmbedding13BPOutputLayerEiiPfS1_S1_(ptr noundef nonnull align 8 dereferenceable(176) %0, i32 noundef %46, i32 noundef %47, ptr noundef %48, ptr noundef nonnull %3, ptr noundef nonnull %4)
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %49 = tail call noundef i64 @_ZNKSt6vectorISt4pairIiiESaIS1_EE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %2) #7
  %50 = icmp ugt i64 %49, %indvars.iv.next
  br i1 %50, label %.lr.ph, label %._crit_edge, !llvm.loop !37

.lr.ph95:                                         ; preds = %.preheader78, %._crit_edge93
  %indvars.iv115 = phi i64 [ %indvars.iv.next116, %._crit_edge93 ], [ 0, %.preheader78 ]
  %51 = tail call noundef nonnull align 4 dereferenceable(4) ptr @_ZNSt6vectorIiSaIiEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %1, i64 noundef %indvars.iv115) #7
  %52 = load i32, ptr %51, align 4, !tbaa !36
  %53 = tail call noundef ptr @_ZN13wordembedding13WordEmbedding11GetWeightIEEi(ptr noundef nonnull align 8 dereferenceable(176) %0, i32 noundef %52)
  %54 = load i32, ptr %51, align 4, !tbaa !36
  %55 = tail call noundef ptr @_ZN13wordembedding13WordEmbedding17GetSumGradient2IEEi(ptr noundef nonnull align 8 dereferenceable(176) %0, i32 noundef %54)
  %56 = icmp ne ptr %53, null
  %57 = icmp ne ptr %55, null
  %58 = and i1 %56, %57
  br i1 %58, label %.preheader, label %63

.preheader:                                       ; preds = %.lr.ph95
  %59 = load ptr, ptr %10, align 8, !tbaa !5
  %60 = getelementptr inbounds i8, ptr %59, i64 64
  %61 = load i32, ptr %60, align 8, !tbaa !17
  %62 = icmp sgt i32 %61, 0
  br i1 %62, label %.lr.ph92, label %._crit_edge93

63:                                               ; preds = %.lr.ph95
  tail call void @__assert_fail(ptr noundef nonnull @.str.5, ptr noundef nonnull @.str.1, i32 noundef 145, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN13wordembedding13WordEmbedding11TrainSampleERSt6vectorIiSaIiEERS1_ISt4pairIiiESaIS6_EEPvSA_) #6
  unreachable

._crit_edge93:                                    ; preds = %87, %.preheader
  %indvars.iv.next116 = add nuw nsw i64 %indvars.iv115, 1
  %64 = tail call noundef i64 @_ZNKSt6vectorIiSaIiEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %1) #7
  %65 = icmp ugt i64 %64, %indvars.iv.next116
  br i1 %65, label %.lr.ph95, label %.loopexit, !llvm.loop !38

.lr.ph92:                                         ; preds = %.preheader, %87
  %66 = phi ptr [ %88, %87 ], [ %59, %.preheader ]
  %indvars.iv112 = phi i64 [ %indvars.iv.next113, %87 ], [ 0, %.preheader ]
  %67 = getelementptr inbounds float, ptr %4, i64 %indvars.iv112
  %68 = load float, ptr %67, align 4, !tbaa !24
  %69 = getelementptr inbounds float, ptr %55, i64 %indvars.iv112
  %70 = load float, ptr %69, align 4, !tbaa !24
  %71 = tail call float @llvm.fmuladd.f32(float %68, float %68, float %70)
  store float %71, ptr %69, align 4, !tbaa !24
  %72 = fpext float %71 to double
  %73 = fcmp ogt double %72, 1.000000e-10
  br i1 %73, label %74, label %87

74:                                               ; preds = %.lr.ph92
  %75 = load float, ptr %67, align 4, !tbaa !24
  %76 = getelementptr inbounds i8, ptr %66, i64 104
  %77 = load float, ptr %76, align 8, !tbaa !39
  %78 = fmul float %75, %77
  %79 = fpext float %78 to double
  %80 = tail call double @sqrt(double noundef %72) #7
  %81 = fdiv double %79, %80
  %82 = getelementptr inbounds float, ptr %53, i64 %indvars.iv112
  %83 = load float, ptr %82, align 4, !tbaa !24
  %84 = fpext float %83 to double
  %85 = fadd double %81, %84
  %86 = fptrunc double %85 to float
  store float %86, ptr %82, align 4, !tbaa !24
  %.pre = load ptr, ptr %10, align 8, !tbaa !5
  br label %87

87:                                               ; preds = %.lr.ph92, %74
  %88 = phi ptr [ %66, %.lr.ph92 ], [ %.pre, %74 ]
  %indvars.iv.next113 = add nuw nsw i64 %indvars.iv112, 1
  %89 = getelementptr inbounds i8, ptr %88, i64 64
  %90 = load i32, ptr %89, align 8, !tbaa !17
  %91 = sext i32 %90 to i64
  %92 = icmp slt i64 %indvars.iv.next113, %91
  br i1 %92, label %.lr.ph92, label %._crit_edge93, !llvm.loop !40

.preheader80:                                     ; preds = %.lr.ph85.prol.loopexit, %.lr.ph85, %middle.block, %.preheader82
  %93 = tail call noundef i64 @_ZNKSt6vectorIiSaIiEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %1) #7
  %.not97 = icmp eq i64 %93, 0
  br i1 %.not97, label %.loopexit, label %.lr.ph90

.lr.ph85:                                         ; preds = %.lr.ph85, %.lr.ph85.preheader147.new
  %indvars.iv101 = phi i64 [ %indvars.iv101.unr, %.lr.ph85.preheader147.new ], [ %indvars.iv.next102.3, %.lr.ph85 ]
  %94 = load float, ptr %0, align 8, !tbaa !23
  %95 = getelementptr inbounds float, ptr %4, i64 %indvars.iv101
  %96 = load float, ptr %95, align 4, !tbaa !24
  %97 = fmul float %94, %96
  store float %97, ptr %95, align 4, !tbaa !24
  %98 = load float, ptr %0, align 8, !tbaa !23
  %gep = getelementptr float, ptr %invariant.gep, i64 %indvars.iv101
  %99 = load float, ptr %gep, align 4, !tbaa !24
  %100 = fmul float %98, %99
  store float %100, ptr %gep, align 4, !tbaa !24
  %101 = load float, ptr %0, align 8, !tbaa !23
  %gep152 = getelementptr float, ptr %invariant.gep151, i64 %indvars.iv101
  %102 = load float, ptr %gep152, align 4, !tbaa !24
  %103 = fmul float %101, %102
  store float %103, ptr %gep152, align 4, !tbaa !24
  %104 = load float, ptr %0, align 8, !tbaa !23
  %gep154 = getelementptr float, ptr %invariant.gep153, i64 %indvars.iv101
  %105 = load float, ptr %gep154, align 4, !tbaa !24
  %106 = fmul float %104, %105
  store float %106, ptr %gep154, align 4, !tbaa !24
  %indvars.iv.next102.3 = add nuw nsw i64 %indvars.iv101, 4
  %exitcond.not.3 = icmp eq i64 %indvars.iv.next102.3, %wide.trip.count
  br i1 %exitcond.not.3, label %.preheader80, label %.lr.ph85, !llvm.loop !41

.lr.ph90:                                         ; preds = %.preheader80, %._crit_edge88
  %indvars.iv109 = phi i64 [ %indvars.iv.next110, %._crit_edge88 ], [ 0, %.preheader80 ]
  %107 = tail call noundef nonnull align 4 dereferenceable(4) ptr @_ZNSt6vectorIiSaIiEEixEm(ptr noundef nonnull align 8 dereferenceable(24) %1, i64 noundef %indvars.iv109) #7
  %108 = load i32, ptr %107, align 4, !tbaa !36
  %109 = tail call noundef ptr @_ZN13wordembedding13WordEmbedding11GetWeightIEEi(ptr noundef nonnull align 8 dereferenceable(176) %0, i32 noundef %108)
  %.not77 = icmp eq ptr %109, null
  br i1 %.not77, label %129, label %.preheader79

.preheader79:                                     ; preds = %.lr.ph90
  %110 = load ptr, ptr %10, align 8, !tbaa !5
  %111 = getelementptr inbounds i8, ptr %110, i64 64
  %112 = load i32, ptr %111, align 8, !tbaa !17
  %113 = icmp sgt i32 %112, 0
  br i1 %113, label %.lr.ph87.preheader, label %._crit_edge88

.lr.ph87.preheader:                               ; preds = %.preheader79
  %wide.trip.count107 = zext nneg i32 %112 to i64
  %min.iters.check132 = icmp ult i32 %112, 8
  br i1 %min.iters.check132, label %.lr.ph87.preheader145, label %vector.memcheck124

.lr.ph87.preheader145:                            ; preds = %middle.block130, %vector.memcheck124, %.lr.ph87.preheader
  %indvars.iv104.ph = phi i64 [ 0, %vector.memcheck124 ], [ 0, %.lr.ph87.preheader ], [ %n.vec135, %middle.block130 ]
  %xtraiter148 = and i64 %wide.trip.count107, 3
  %lcmp.mod149.not = icmp eq i64 %xtraiter148, 0
  br i1 %lcmp.mod149.not, label %.lr.ph87.prol.loopexit, label %.lr.ph87.prol

.lr.ph87.prol:                                    ; preds = %.lr.ph87.preheader145, %.lr.ph87.prol
  %indvars.iv104.prol = phi i64 [ %indvars.iv.next105.prol, %.lr.ph87.prol ], [ %indvars.iv104.ph, %.lr.ph87.preheader145 ]
  %prol.iter150 = phi i64 [ %prol.iter150.next, %.lr.ph87.prol ], [ 0, %.lr.ph87.preheader145 ]
  %114 = getelementptr inbounds float, ptr %4, i64 %indvars.iv104.prol
  %115 = load float, ptr %114, align 4, !tbaa !24
  %116 = getelementptr inbounds float, ptr %109, i64 %indvars.iv104.prol
  %117 = load float, ptr %116, align 4, !tbaa !24
  %118 = fadd float %115, %117
  store float %118, ptr %116, align 4, !tbaa !24
  %indvars.iv.next105.prol = add nuw nsw i64 %indvars.iv104.prol, 1
  %prol.iter150.next = add i64 %prol.iter150, 1
  %prol.iter150.cmp.not = icmp eq i64 %prol.iter150.next, %xtraiter148
  br i1 %prol.iter150.cmp.not, label %.lr.ph87.prol.loopexit, label %.lr.ph87.prol, !llvm.loop !42

.lr.ph87.prol.loopexit:                           ; preds = %.lr.ph87.prol, %.lr.ph87.preheader145
  %indvars.iv104.unr = phi i64 [ %indvars.iv104.ph, %.lr.ph87.preheader145 ], [ %indvars.iv.next105.prol, %.lr.ph87.prol ]
  %119 = sub nsw i64 %indvars.iv104.ph, %wide.trip.count107
  %120 = icmp ugt i64 %119, -4
  br i1 %120, label %._crit_edge88, label %.lr.ph87

vector.memcheck124:                               ; preds = %.lr.ph87.preheader
  %121 = shl nuw nsw i64 %wide.trip.count107, 2
  %scevgep125 = getelementptr i8, ptr %109, i64 %121
  %scevgep126 = getelementptr i8, ptr %4, i64 %121
  %bound0127 = icmp ult ptr %109, %scevgep126
  %bound1128 = icmp ugt ptr %scevgep125, %4
  %found.conflict129 = and i1 %bound0127, %bound1128
  br i1 %found.conflict129, label %.lr.ph87.preheader145, label %vector.ph133

vector.ph133:                                     ; preds = %vector.memcheck124
  %n.vec135 = and i64 %wide.trip.count107, 2147483640
  br label %vector.body137

vector.body137:                                   ; preds = %vector.body137, %vector.ph133
  %index138 = phi i64 [ 0, %vector.ph133 ], [ %index.next143, %vector.body137 ]
  %122 = getelementptr inbounds float, ptr %4, i64 %index138
  %123 = getelementptr inbounds i8, ptr %122, i64 16
  %wide.load139 = load <4 x float>, ptr %122, align 4, !tbaa !24, !alias.scope !43
  %wide.load140 = load <4 x float>, ptr %123, align 4, !tbaa !24, !alias.scope !43
  %124 = getelementptr inbounds float, ptr %109, i64 %index138
  %125 = getelementptr inbounds i8, ptr %124, i64 16
  %wide.load141 = load <4 x float>, ptr %124, align 4, !tbaa !24, !alias.scope !46, !noalias !43
  %wide.load142 = load <4 x float>, ptr %125, align 4, !tbaa !24, !alias.scope !46, !noalias !43
  %126 = fadd <4 x float> %wide.load139, %wide.load141
  %127 = fadd <4 x float> %wide.load140, %wide.load142
  store <4 x float> %126, ptr %124, align 4, !tbaa !24, !alias.scope !46, !noalias !43
  store <4 x float> %127, ptr %125, align 4, !tbaa !24, !alias.scope !46, !noalias !43
  %index.next143 = add nuw i64 %index138, 8
  %128 = icmp eq i64 %index.next143, %n.vec135
  br i1 %128, label %middle.block130, label %vector.body137, !llvm.loop !48

middle.block130:                                  ; preds = %vector.body137
  %cmp.n144 = icmp eq i64 %n.vec135, %wide.trip.count107
  br i1 %cmp.n144, label %._crit_edge88, label %.lr.ph87.preheader145

129:                                              ; preds = %.lr.ph90
  tail call void @__assert_fail(ptr noundef nonnull @.str.6, ptr noundef nonnull @.str.1, i32 noundef 161, ptr noundef nonnull @__PRETTY_FUNCTION__._ZN13wordembedding13WordEmbedding11TrainSampleERSt6vectorIiSaIiEERS1_ISt4pairIiiESaIS6_EEPvSA_) #6
  unreachable

._crit_edge88:                                    ; preds = %.lr.ph87.prol.loopexit, %.lr.ph87, %middle.block130, %.preheader79
  %indvars.iv.next110 = add nuw nsw i64 %indvars.iv109, 1
  %130 = tail call noundef i64 @_ZNKSt6vectorIiSaIiEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24) %1) #7
  %131 = icmp ugt i64 %130, %indvars.iv.next110
  br i1 %131, label %.lr.ph90, label %.loopexit, !llvm.loop !49

.lr.ph87:                                         ; preds = %.lr.ph87.prol.loopexit, %.lr.ph87
  %indvars.iv104 = phi i64 [ %indvars.iv.next105.3, %.lr.ph87 ], [ %indvars.iv104.unr, %.lr.ph87.prol.loopexit ]
  %132 = getelementptr inbounds float, ptr %4, i64 %indvars.iv104
  %133 = load float, ptr %132, align 4, !tbaa !24
  %134 = getelementptr inbounds float, ptr %109, i64 %indvars.iv104
  %135 = load float, ptr %134, align 4, !tbaa !24
  %136 = fadd float %133, %135
  store float %136, ptr %134, align 4, !tbaa !24
  %indvars.iv.next105 = add nuw nsw i64 %indvars.iv104, 1
  %137 = getelementptr inbounds float, ptr %4, i64 %indvars.iv.next105
  %138 = load float, ptr %137, align 4, !tbaa !24
  %139 = getelementptr inbounds float, ptr %109, i64 %indvars.iv.next105
  %140 = load float, ptr %139, align 4, !tbaa !24
  %141 = fadd float %138, %140
  store float %141, ptr %139, align 4, !tbaa !24
  %indvars.iv.next105.1 = add nuw nsw i64 %indvars.iv104, 2
  %142 = getelementptr inbounds float, ptr %4, i64 %indvars.iv.next105.1
  %143 = load float, ptr %142, align 4, !tbaa !24
  %144 = getelementptr inbounds float, ptr %109, i64 %indvars.iv.next105.1
  %145 = load float, ptr %144, align 4, !tbaa !24
  %146 = fadd float %143, %145
  store float %146, ptr %144, align 4, !tbaa !24
  %indvars.iv.next105.2 = add nuw nsw i64 %indvars.iv104, 3
  %147 = getelementptr inbounds float, ptr %4, i64 %indvars.iv.next105.2
  %148 = load float, ptr %147, align 4, !tbaa !24
  %149 = getelementptr inbounds float, ptr %109, i64 %indvars.iv.next105.2
  %150 = load float, ptr %149, align 4, !tbaa !24
  %151 = fadd float %148, %150
  store float %151, ptr %149, align 4, !tbaa !24
  %indvars.iv.next105.3 = add nuw nsw i64 %indvars.iv104, 4
  %exitcond108.not.3 = icmp eq i64 %indvars.iv.next105.3, %wide.trip.count107
  br i1 %exitcond108.not.3, label %._crit_edge88, label %.lr.ph87, !llvm.loop !50

.loopexit:                                        ; preds = %._crit_edge88, %._crit_edge93, %.preheader80, %.preheader78
  ret void
}

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN13wordembedding13WordEmbedding11FeedForwardERSt6vectorIiSaIiEEPf(ptr noundef nonnull align 8 dereferenceable(176), ptr noundef nonnull align 8 dereferenceable(24), ptr noundef) local_unnamed_addr #0 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i64 @_ZNKSt6vectorIiSaIiEE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24)) local_unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(4) ptr @_ZNSt6vectorIiSaIiEEixEm(ptr noundef nonnull align 8 dereferenceable(24), i64 noundef) local_unnamed_addr #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef ptr @_ZN13wordembedding13WordEmbedding11GetWeightIEEi(ptr noundef nonnull align 8 dereferenceable(176), i32 noundef) local_unnamed_addr #0 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN13wordembedding13WordEmbedding13BPOutputLayerEiiPfS1_S1_(ptr noundef nonnull align 8 dereferenceable(176), i32 noundef, i32 noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #0 align 2

; Function Attrs: noreturn nounwind
declare void @__assert_fail(ptr noundef, ptr noundef, i32 noundef, ptr noundef) local_unnamed_addr #2

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare float @llvm.fmuladd.f32(float, float, float) #3

; Function Attrs: mustprogress nofree nounwind willreturn memory(write)
declare double @sqrt(double noundef) local_unnamed_addr #4

; Function Attrs: mustprogress nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #5

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i64 @_ZNKSt6vectorISt4pairIiiESaIS1_EE4sizeEv(ptr noundef nonnull align 8 dereferenceable(24)) local_unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef nonnull align 4 dereferenceable(8) ptr @_ZNSt6vectorISt4pairIiiESaIS1_EEixEm(ptr noundef nonnull align 8 dereferenceable(24), i64 noundef) local_unnamed_addr #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef ptr @_ZN13wordembedding13WordEmbedding11GetWeightEOEi(ptr noundef nonnull align 8 dereferenceable(176), i32 noundef) local_unnamed_addr #0 align 2

; Function Attrs: mustprogress uwtable
declare dso_local noundef ptr @_ZN13wordembedding13WordEmbedding17GetSumGradient2IEEi(ptr noundef nonnull align 8 dereferenceable(176), i32 noundef) local_unnamed_addr #0 align 2

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 = { mustprogress nounwind 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 #2 = { noreturn 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 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #4 = { mustprogress nofree nounwind willreturn memory(write) "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 #5 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #6 = { noreturn nounwind }
attributes #7 = { nounwind }

!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, !11, i64 16}
!6 = !{!"_ZTSN13wordembedding13WordEmbeddingE", !7, i64 0, !10, i64 8, !11, i64 16, !11, i64 24, !11, i64 32, !11, i64 40, !12, i64 48, !12, i64 104, !16, i64 160, !11, i64 168}
!7 = !{!"float", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C++ TBAA"}
!10 = !{!"long", !8, i64 0}
!11 = !{!"any pointer", !8, i64 0}
!12 = !{!"_ZTSSt13unordered_setIiSt4hashIiESt8equal_toIiESaIiEE", !13, i64 0}
!13 = !{!"_ZTSSt10_HashtableIiiSaIiENSt8__detail9_IdentityESt8equal_toIiESt4hashIiENS1_18_Mod_range_hashingENS1_20_Default_ranged_hashENS1_20_Prime_rehash_policyENS1_17_Hashtable_traitsILb0ELb1ELb1EEEE", !11, i64 0, !10, i64 8, !14, i64 16, !10, i64 24, !15, i64 32, !11, i64 48}
!14 = !{!"_ZTSNSt8__detail15_Hash_node_baseE", !11, i64 0}
!15 = !{!"_ZTSNSt8__detail20_Prime_rehash_policyE", !7, i64 0, !10, i64 8}
!16 = !{!"int", !8, i64 0}
!17 = !{!18, !16, i64 64}
!18 = !{!"_ZTSN13wordembedding6OptionE", !11, i64 0, !11, i64 8, !11, i64 16, !11, i64 24, !11, i64 32, !19, i64 40, !19, i64 41, !19, i64 42, !19, i64 43, !19, i64 44, !19, i64 45, !7, i64 48, !10, i64 56, !16, i64 64, !16, i64 68, !16, i64 72, !16, i64 76, !16, i64 80, !16, i64 84, !10, i64 88, !10, i64 96, !7, i64 104}
!19 = !{!"bool", !8, i64 0}
!20 = !{!18, !19, i64 44}
!21 = !{i8 0, i8 2}
!22 = !{}
!23 = !{!6, !7, i64 0}
!24 = !{!7, !7, i64 0}
!25 = distinct !{!25, !26}
!26 = !{!"llvm.loop.unroll.disable"}
!27 = !{!28}
!28 = distinct !{!28, !29}
!29 = distinct !{!29, !"LVerDomain"}
!30 = !{!31}
!31 = distinct !{!31, !29}
!32 = distinct !{!32, !33, !34, !35}
!33 = !{!"llvm.loop.mustprogress"}
!34 = !{!"llvm.loop.isvectorized", i32 1}
!35 = !{!"llvm.loop.unroll.runtime.disable"}
!36 = !{!16, !16, i64 0}
!37 = distinct !{!37, !33}
!38 = distinct !{!38, !33}
!39 = !{!18, !7, i64 104}
!40 = distinct !{!40, !33}
!41 = distinct !{!41, !33, !34}
!42 = distinct !{!42, !26}
!43 = !{!44}
!44 = distinct !{!44, !45}
!45 = distinct !{!45, !"LVerDomain"}
!46 = !{!47}
!47 = distinct !{!47, !45}
!48 = distinct !{!48, !33, !34, !35}
!49 = distinct !{!49, !33}
!50 = distinct !{!50, !33, !34}


; Effective O3 passes: EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopLoadEliminationPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,LoopVectorizePass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass,VectorCombinePass