; LLVM IR from oservo/aiFi :: mlpLayer (mlpLayerPropagateBackward)

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

%struct.mlpLayer = type { i32, i32, i32, i32, double, double, i32, i32, i32, double, double, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
%struct.loss = type { i32, ptr, ptr }
%struct.activation = type { i32, ptr, ptr }

; Function Attrs: nounwind uwtable
define dso_local void @mlpLayerPropagateBackward(ptr noundef %0, ptr noundef %1, ptr noundef %2, double noundef %3, double noundef %4) #0 {
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca double, align 8
  %10 = alloca double, align 8
  %11 = alloca i32, align 4
  %12 = alloca double, align 8
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca double, align 8
  %16 = alloca i32, align 4
  %17 = alloca i32, align 4
  %18 = alloca double, align 8
  %19 = alloca double, align 8
  %20 = 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 double %3, ptr %9, align 8, !tbaa !9
  store double %4, ptr %10, align 8, !tbaa !9
  %21 = load ptr, ptr %7, align 8, !tbaa !5
  %22 = getelementptr inbounds %struct.mlpLayer, ptr %21, i32 0, i32 2
  %23 = load i32, ptr %22, align 8, !tbaa !11
  %24 = icmp eq i32 %23, 2
  br i1 %24, label %25, label %102

25:                                               ; preds = %5
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #3
  store i32 0, ptr %11, align 4, !tbaa !14
  br label %26

26:                                               ; preds = %98, %25
  %27 = load i32, ptr %11, align 4, !tbaa !14
  %28 = load ptr, ptr %7, align 8, !tbaa !5
  %29 = getelementptr inbounds %struct.mlpLayer, ptr %28, i32 0, i32 1
  %30 = load i32, ptr %29, align 4, !tbaa !15
  %31 = icmp slt i32 %27, %30
  br i1 %31, label %33, label %32

32:                                               ; preds = %26
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #3
  br label %101

33:                                               ; preds = %26
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #3
  store double 0.000000e+00, ptr %12, align 8, !tbaa !9
  %34 = load ptr, ptr %7, align 8, !tbaa !5
  %35 = getelementptr inbounds %struct.mlpLayer, ptr %34, i32 0, i32 23
  %36 = load ptr, ptr %35, align 8, !tbaa !16
  %37 = load i32, ptr %11, align 4, !tbaa !14
  %38 = sext i32 %37 to i64
  %39 = getelementptr inbounds ptr, ptr %36, i64 %38
  %40 = load ptr, ptr %39, align 8, !tbaa !5
  %41 = getelementptr inbounds %struct.loss, ptr %40, i32 0, i32 1
  %42 = load ptr, ptr %41, align 8, !tbaa !17
  %43 = load ptr, ptr %7, align 8, !tbaa !5
  %44 = getelementptr inbounds %struct.mlpLayer, ptr %43, i32 0, i32 15
  %45 = load ptr, ptr %44, align 8, !tbaa !19
  %46 = load i32, ptr %11, align 4, !tbaa !14
  %47 = sext i32 %46 to i64
  %48 = getelementptr inbounds double, ptr %45, i64 %47
  %49 = load double, ptr %48, align 8, !tbaa !9
  %50 = load ptr, ptr %7, align 8, !tbaa !5
  %51 = getelementptr inbounds %struct.mlpLayer, ptr %50, i32 0, i32 14
  %52 = load ptr, ptr %51, align 8, !tbaa !20
  %53 = load i32, ptr %11, align 4, !tbaa !14
  %54 = sext i32 %53 to i64
  %55 = getelementptr inbounds double, ptr %52, i64 %54
  %56 = load double, ptr %55, align 8, !tbaa !9
  %57 = call double %42(double noundef %49, double noundef %56)
  store double %57, ptr %12, align 8, !tbaa !9
  %58 = load double, ptr %12, align 8, !tbaa !9
  %59 = load ptr, ptr %7, align 8, !tbaa !5
  %60 = getelementptr inbounds %struct.mlpLayer, ptr %59, i32 0, i32 16
  %61 = load ptr, ptr %60, align 8, !tbaa !21
  %62 = load i32, ptr %11, align 4, !tbaa !14
  %63 = sext i32 %62 to i64
  %64 = getelementptr inbounds double, ptr %61, i64 %63
  store double %58, ptr %64, align 8, !tbaa !9
  %65 = load double, ptr %12, align 8, !tbaa !9
  %66 = load ptr, ptr %7, align 8, !tbaa !5
  %67 = getelementptr inbounds %struct.mlpLayer, ptr %66, i32 0, i32 22
  %68 = load ptr, ptr %67, align 8, !tbaa !22
  %69 = load i32, ptr %11, align 4, !tbaa !14
  %70 = sext i32 %69 to i64
  %71 = getelementptr inbounds ptr, ptr %68, i64 %70
  %72 = load ptr, ptr %71, align 8, !tbaa !5
  %73 = getelementptr inbounds %struct.activation, ptr %72, i32 0, i32 2
  %74 = load ptr, ptr %73, align 8, !tbaa !23
  %75 = load ptr, ptr %7, align 8, !tbaa !5
  %76 = getelementptr inbounds %struct.mlpLayer, ptr %75, i32 0, i32 14
  %77 = load ptr, ptr %76, align 8, !tbaa !20
  %78 = load i32, ptr %11, align 4, !tbaa !14
  %79 = sext i32 %78 to i64
  %80 = getelementptr inbounds double, ptr %77, i64 %79
  %81 = load double, ptr %80, align 8, !tbaa !9
  %82 = call double %74(double noundef %81)
  %83 = fmul double %65, %82
  %84 = load ptr, ptr %7, align 8, !tbaa !5
  %85 = getelementptr inbounds %struct.mlpLayer, ptr %84, i32 0, i32 17
  %86 = load ptr, ptr %85, align 8, !tbaa !25
  %87 = load i32, ptr %11, align 4, !tbaa !14
  %88 = sext i32 %87 to i64
  %89 = getelementptr inbounds double, ptr %86, i64 %88
  store double %83, ptr %89, align 8, !tbaa !9
  %90 = load double, ptr %12, align 8, !tbaa !9
  %91 = fptosi double %90 to i32
  %92 = call i32 @llvm.abs.i32(i32 %91, i1 true)
  %93 = sitofp i32 %92 to double
  %94 = load ptr, ptr %7, align 8, !tbaa !5
  %95 = getelementptr inbounds %struct.mlpLayer, ptr %94, i32 0, i32 4
  %96 = load double, ptr %95, align 8, !tbaa !26
  %97 = fadd double %96, %93
  store double %97, ptr %95, align 8, !tbaa !26
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #3
  br label %98

98:                                               ; preds = %33
  %99 = load i32, ptr %11, align 4, !tbaa !14
  %100 = add nsw i32 %99, 1
  store i32 %100, ptr %11, align 4, !tbaa !14
  br label %26, !llvm.loop !27

101:                                              ; preds = %32
  br label %194

102:                                              ; preds = %5
  %103 = load ptr, ptr %7, align 8, !tbaa !5
  %104 = getelementptr inbounds %struct.mlpLayer, ptr %103, i32 0, i32 2
  %105 = load i32, ptr %104, align 8, !tbaa !11
  %106 = icmp eq i32 %105, 0
  br i1 %106, label %107, label %108

107:                                              ; preds = %102
  br label %193

108:                                              ; preds = %102
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #3
  store i32 0, ptr %13, align 4, !tbaa !14
  br label %109

109:                                              ; preds = %189, %108
  %110 = load i32, ptr %13, align 4, !tbaa !14
  %111 = load ptr, ptr %7, align 8, !tbaa !5
  %112 = getelementptr inbounds %struct.mlpLayer, ptr %111, i32 0, i32 1
  %113 = load i32, ptr %112, align 4, !tbaa !15
  %114 = icmp slt i32 %110, %113
  br i1 %114, label %116, label %115

115:                                              ; preds = %109
  store i32 5, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #3
  br label %192

116:                                              ; preds = %109
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #3
  store double 0.000000e+00, ptr %15, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #3
  store i32 0, ptr %16, align 4, !tbaa !14
  br label %117

117:                                              ; preds = %145, %116
  %118 = load i32, ptr %16, align 4, !tbaa !14
  %119 = load ptr, ptr %8, align 8, !tbaa !5
  %120 = getelementptr inbounds %struct.mlpLayer, ptr %119, i32 0, i32 1
  %121 = load i32, ptr %120, align 4, !tbaa !15
  %122 = icmp slt i32 %118, %121
  br i1 %122, label %124, label %123

123:                                              ; preds = %117
  store i32 8, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #3
  br label %148

124:                                              ; preds = %117
  %125 = load ptr, ptr %8, align 8, !tbaa !5
  %126 = getelementptr inbounds %struct.mlpLayer, ptr %125, i32 0, i32 13
  %127 = load ptr, ptr %126, align 8, !tbaa !29
  %128 = load i32, ptr %16, align 4, !tbaa !14
  %129 = sext i32 %128 to i64
  %130 = getelementptr inbounds ptr, ptr %127, i64 %129
  %131 = load ptr, ptr %130, align 8, !tbaa !5
  %132 = load i32, ptr %13, align 4, !tbaa !14
  %133 = sext i32 %132 to i64
  %134 = getelementptr inbounds double, ptr %131, i64 %133
  %135 = load double, ptr %134, align 8, !tbaa !9
  %136 = load ptr, ptr %8, align 8, !tbaa !5
  %137 = getelementptr inbounds %struct.mlpLayer, ptr %136, i32 0, i32 17
  %138 = load ptr, ptr %137, align 8, !tbaa !25
  %139 = load i32, ptr %16, align 4, !tbaa !14
  %140 = sext i32 %139 to i64
  %141 = getelementptr inbounds double, ptr %138, i64 %140
  %142 = load double, ptr %141, align 8, !tbaa !9
  %143 = load double, ptr %15, align 8, !tbaa !9
  %144 = call double @llvm.fmuladd.f64(double %135, double %142, double %143)
  store double %144, ptr %15, align 8, !tbaa !9
  br label %145

145:                                              ; preds = %124
  %146 = load i32, ptr %16, align 4, !tbaa !14
  %147 = add nsw i32 %146, 1
  store i32 %147, ptr %16, align 4, !tbaa !14
  br label %117, !llvm.loop !30

148:                                              ; preds = %123
  %149 = load double, ptr %15, align 8, !tbaa !9
  %150 = load ptr, ptr %7, align 8, !tbaa !5
  %151 = getelementptr inbounds %struct.mlpLayer, ptr %150, i32 0, i32 16
  %152 = load ptr, ptr %151, align 8, !tbaa !21
  %153 = load i32, ptr %13, align 4, !tbaa !14
  %154 = sext i32 %153 to i64
  %155 = getelementptr inbounds double, ptr %152, i64 %154
  store double %149, ptr %155, align 8, !tbaa !9
  %156 = load double, ptr %15, align 8, !tbaa !9
  %157 = load ptr, ptr %7, align 8, !tbaa !5
  %158 = getelementptr inbounds %struct.mlpLayer, ptr %157, i32 0, i32 22
  %159 = load ptr, ptr %158, align 8, !tbaa !22
  %160 = load i32, ptr %13, align 4, !tbaa !14
  %161 = sext i32 %160 to i64
  %162 = getelementptr inbounds ptr, ptr %159, i64 %161
  %163 = load ptr, ptr %162, align 8, !tbaa !5
  %164 = getelementptr inbounds %struct.activation, ptr %163, i32 0, i32 2
  %165 = load ptr, ptr %164, align 8, !tbaa !23
  %166 = load ptr, ptr %7, align 8, !tbaa !5
  %167 = getelementptr inbounds %struct.mlpLayer, ptr %166, i32 0, i32 14
  %168 = load ptr, ptr %167, align 8, !tbaa !20
  %169 = load i32, ptr %13, align 4, !tbaa !14
  %170 = sext i32 %169 to i64
  %171 = getelementptr inbounds double, ptr %168, i64 %170
  %172 = load double, ptr %171, align 8, !tbaa !9
  %173 = call double %165(double noundef %172)
  %174 = fmul double %156, %173
  %175 = load ptr, ptr %7, align 8, !tbaa !5
  %176 = getelementptr inbounds %struct.mlpLayer, ptr %175, i32 0, i32 17
  %177 = load ptr, ptr %176, align 8, !tbaa !25
  %178 = load i32, ptr %13, align 4, !tbaa !14
  %179 = sext i32 %178 to i64
  %180 = getelementptr inbounds double, ptr %177, i64 %179
  store double %174, ptr %180, align 8, !tbaa !9
  %181 = load double, ptr %15, align 8, !tbaa !9
  %182 = fptosi double %181 to i32
  %183 = call i32 @llvm.abs.i32(i32 %182, i1 true)
  %184 = sitofp i32 %183 to double
  %185 = load ptr, ptr %7, align 8, !tbaa !5
  %186 = getelementptr inbounds %struct.mlpLayer, ptr %185, i32 0, i32 4
  %187 = load double, ptr %186, align 8, !tbaa !26
  %188 = fadd double %187, %184
  store double %188, ptr %186, align 8, !tbaa !26
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #3
  br label %189

189:                                              ; preds = %148
  %190 = load i32, ptr %13, align 4, !tbaa !14
  %191 = add nsw i32 %190, 1
  store i32 %191, ptr %13, align 4, !tbaa !14
  br label %109, !llvm.loop !31

192:                                              ; preds = %115
  br label %193

193:                                              ; preds = %192, %107
  br label %194

194:                                              ; preds = %193, %101
  %195 = load ptr, ptr %7, align 8, !tbaa !5
  %196 = getelementptr inbounds %struct.mlpLayer, ptr %195, i32 0, i32 2
  %197 = load i32, ptr %196, align 8, !tbaa !11
  %198 = icmp eq i32 %197, 0
  br i1 %198, label %199, label %200

199:                                              ; preds = %194
  br label %328

200:                                              ; preds = %194
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #3
  store i32 0, ptr %17, align 4, !tbaa !14
  br label %201

201:                                              ; preds = %324, %200
  %202 = load i32, ptr %17, align 4, !tbaa !14
  %203 = load ptr, ptr %7, align 8, !tbaa !5
  %204 = getelementptr inbounds %struct.mlpLayer, ptr %203, i32 0, i32 1
  %205 = load i32, ptr %204, align 4, !tbaa !15
  %206 = icmp slt i32 %202, %205
  br i1 %206, label %208, label %207

207:                                              ; preds = %201
  store i32 11, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #3
  br label %327

208:                                              ; preds = %201
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #3
  store double 0.000000e+00, ptr %18, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #3
  store double 0.000000e+00, ptr %19, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #3
  store i32 0, ptr %20, align 4, !tbaa !14
  br label %209

209:                                              ; preds = %278, %208
  %210 = load i32, ptr %20, align 4, !tbaa !14
  %211 = load ptr, ptr %7, align 8, !tbaa !5
  %212 = getelementptr inbounds %struct.mlpLayer, ptr %211, i32 0, i32 11
  %213 = load ptr, ptr %212, align 8, !tbaa !32
  %214 = load i32, ptr %17, align 4, !tbaa !14
  %215 = sext i32 %214 to i64
  %216 = getelementptr inbounds i32, ptr %213, i64 %215
  %217 = load i32, ptr %216, align 4, !tbaa !14
  %218 = icmp slt i32 %210, %217
  br i1 %218, label %220, label %219

219:                                              ; preds = %209
  store i32 14, ptr %14, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #3
  br label %281

220:                                              ; preds = %209
  %221 = load double, ptr %9, align 8, !tbaa !9
  %222 = load ptr, ptr %7, align 8, !tbaa !5
  %223 = getelementptr inbounds %struct.mlpLayer, ptr %222, i32 0, i32 17
  %224 = load ptr, ptr %223, align 8, !tbaa !25
  %225 = load i32, ptr %17, align 4, !tbaa !14
  %226 = sext i32 %225 to i64
  %227 = getelementptr inbounds double, ptr %224, i64 %226
  %228 = load double, ptr %227, align 8, !tbaa !9
  %229 = fmul double %221, %228
  %230 = load ptr, ptr %6, align 8, !tbaa !5
  %231 = getelementptr inbounds %struct.mlpLayer, ptr %230, i32 0, i32 14
  %232 = load ptr, ptr %231, align 8, !tbaa !20
  %233 = load i32, ptr %20, align 4, !tbaa !14
  %234 = sext i32 %233 to i64
  %235 = getelementptr inbounds double, ptr %232, i64 %234
  %236 = load double, ptr %235, align 8, !tbaa !9
  %237 = fmul double %229, %236
  store double %237, ptr %18, align 8, !tbaa !9
  %238 = load double, ptr %18, align 8, !tbaa !9
  %239 = load ptr, ptr %7, align 8, !tbaa !5
  %240 = getelementptr inbounds %struct.mlpLayer, ptr %239, i32 0, i32 13
  %241 = load ptr, ptr %240, align 8, !tbaa !29
  %242 = load i32, ptr %17, align 4, !tbaa !14
  %243 = sext i32 %242 to i64
  %244 = getelementptr inbounds ptr, ptr %241, i64 %243
  %245 = load ptr, ptr %244, align 8, !tbaa !5
  %246 = load i32, ptr %20, align 4, !tbaa !14
  %247 = sext i32 %246 to i64
  %248 = getelementptr inbounds double, ptr %245, i64 %247
  %249 = load double, ptr %248, align 8, !tbaa !9
  %250 = fadd double %249, %238
  store double %250, ptr %248, align 8, !tbaa !9
  %251 = load double, ptr %10, align 8, !tbaa !9
  %252 = load ptr, ptr %7, align 8, !tbaa !5
  %253 = getelementptr inbounds %struct.mlpLayer, ptr %252, i32 0, i32 18
  %254 = load ptr, ptr %253, align 8, !tbaa !33
  %255 = load i32, ptr %17, align 4, !tbaa !14
  %256 = sext i32 %255 to i64
  %257 = getelementptr inbounds double, ptr %254, i64 %256
  %258 = load double, ptr %257, align 8, !tbaa !9
  %259 = load ptr, ptr %7, align 8, !tbaa !5
  %260 = getelementptr inbounds %struct.mlpLayer, ptr %259, i32 0, i32 13
  %261 = load ptr, ptr %260, align 8, !tbaa !29
  %262 = load i32, ptr %17, align 4, !tbaa !14
  %263 = sext i32 %262 to i64
  %264 = getelementptr inbounds ptr, ptr %261, i64 %263
  %265 = load ptr, ptr %264, align 8, !tbaa !5
  %266 = load i32, ptr %20, align 4, !tbaa !14
  %267 = sext i32 %266 to i64
  %268 = getelementptr inbounds double, ptr %265, i64 %267
  %269 = load double, ptr %268, align 8, !tbaa !9
  %270 = call double @llvm.fmuladd.f64(double %251, double %258, double %269)
  store double %270, ptr %268, align 8, !tbaa !9
  %271 = load double, ptr %18, align 8, !tbaa !9
  %272 = load ptr, ptr %7, align 8, !tbaa !5
  %273 = getelementptr inbounds %struct.mlpLayer, ptr %272, i32 0, i32 18
  %274 = load ptr, ptr %273, align 8, !tbaa !33
  %275 = load i32, ptr %17, align 4, !tbaa !14
  %276 = sext i32 %275 to i64
  %277 = getelementptr inbounds double, ptr %274, i64 %276
  store double %271, ptr %277, align 8, !tbaa !9
  br label %278

278:                                              ; preds = %220
  %279 = load i32, ptr %20, align 4, !tbaa !14
  %280 = add nsw i32 %279, 1
  store i32 %280, ptr %20, align 4, !tbaa !14
  br label %209, !llvm.loop !34

281:                                              ; preds = %219
  %282 = load double, ptr %9, align 8, !tbaa !9
  %283 = load ptr, ptr %7, align 8, !tbaa !5
  %284 = getelementptr inbounds %struct.mlpLayer, ptr %283, i32 0, i32 17
  %285 = load ptr, ptr %284, align 8, !tbaa !25
  %286 = load i32, ptr %17, align 4, !tbaa !14
  %287 = sext i32 %286 to i64
  %288 = getelementptr inbounds double, ptr %285, i64 %287
  %289 = load double, ptr %288, align 8, !tbaa !9
  %290 = fmul double %282, %289
  %291 = fmul double %290, 1.000000e+00
  store double %291, ptr %19, align 8, !tbaa !9
  %292 = load double, ptr %19, align 8, !tbaa !9
  %293 = load ptr, ptr %7, align 8, !tbaa !5
  %294 = getelementptr inbounds %struct.mlpLayer, ptr %293, i32 0, i32 19
  %295 = load ptr, ptr %294, align 8, !tbaa !35
  %296 = load i32, ptr %17, align 4, !tbaa !14
  %297 = sext i32 %296 to i64
  %298 = getelementptr inbounds double, ptr %295, i64 %297
  %299 = load double, ptr %298, align 8, !tbaa !9
  %300 = fadd double %299, %292
  store double %300, ptr %298, align 8, !tbaa !9
  %301 = load double, ptr %10, align 8, !tbaa !9
  %302 = load ptr, ptr %7, align 8, !tbaa !5
  %303 = getelementptr inbounds %struct.mlpLayer, ptr %302, i32 0, i32 21
  %304 = load ptr, ptr %303, align 8, !tbaa !36
  %305 = load i32, ptr %17, align 4, !tbaa !14
  %306 = sext i32 %305 to i64
  %307 = getelementptr inbounds double, ptr %304, i64 %306
  %308 = load double, ptr %307, align 8, !tbaa !9
  %309 = load ptr, ptr %7, align 8, !tbaa !5
  %310 = getelementptr inbounds %struct.mlpLayer, ptr %309, i32 0, i32 19
  %311 = load ptr, ptr %310, align 8, !tbaa !35
  %312 = load i32, ptr %17, align 4, !tbaa !14
  %313 = sext i32 %312 to i64
  %314 = getelementptr inbounds double, ptr %311, i64 %313
  %315 = load double, ptr %314, align 8, !tbaa !9
  %316 = call double @llvm.fmuladd.f64(double %301, double %308, double %315)
  store double %316, ptr %314, align 8, !tbaa !9
  %317 = load double, ptr %19, align 8, !tbaa !9
  %318 = load ptr, ptr %7, align 8, !tbaa !5
  %319 = getelementptr inbounds %struct.mlpLayer, ptr %318, i32 0, i32 21
  %320 = load ptr, ptr %319, align 8, !tbaa !36
  %321 = load i32, ptr %17, align 4, !tbaa !14
  %322 = sext i32 %321 to i64
  %323 = getelementptr inbounds double, ptr %320, i64 %322
  store double %317, ptr %323, align 8, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #3
  br label %324

324:                                              ; preds = %281
  %325 = load i32, ptr %17, align 4, !tbaa !14
  %326 = add nsw i32 %325, 1
  store i32 %326, ptr %17, align 4, !tbaa !14
  br label %201, !llvm.loop !37

327:                                              ; preds = %207
  br label %328

328:                                              ; preds = %327, %199
  ret void
}

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

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

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fmuladd.f64(double, double, double) #2

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.abs.i32(i32, i1 immarg) #2

attributes #0 = { 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 #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #3 = { 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/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"double", !7, i64 0}
!11 = !{!12, !13, i64 8}
!12 = !{!"mlpLayer", !13, i64 0, !13, i64 4, !13, i64 8, !13, i64 12, !10, i64 16, !10, i64 24, !13, i64 32, !13, i64 36, !13, i64 40, !10, i64 48, !10, i64 56, !6, i64 64, !6, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !6, i64 112, !6, i64 120, !6, i64 128, !6, i64 136, !6, i64 144, !6, i64 152, !6, i64 160, !6, i64 168}
!13 = !{!"int", !7, i64 0}
!14 = !{!13, !13, i64 0}
!15 = !{!12, !13, i64 4}
!16 = !{!12, !6, i64 160}
!17 = !{!18, !6, i64 8}
!18 = !{!"loss", !13, i64 0, !6, i64 8, !6, i64 16}
!19 = !{!12, !6, i64 96}
!20 = !{!12, !6, i64 88}
!21 = !{!12, !6, i64 104}
!22 = !{!12, !6, i64 152}
!23 = !{!24, !6, i64 16}
!24 = !{!"activation", !13, i64 0, !6, i64 8, !6, i64 16}
!25 = !{!12, !6, i64 112}
!26 = !{!12, !10, i64 16}
!27 = distinct !{!27, !28}
!28 = !{!"llvm.loop.mustprogress"}
!29 = !{!12, !6, i64 80}
!30 = distinct !{!30, !28}
!31 = distinct !{!31, !28}
!32 = !{!12, !6, i64 64}
!33 = !{!12, !6, i64 120}
!34 = distinct !{!34, !28}
!35 = !{!12, !6, i64 128}
!36 = !{!12, !6, i64 144}
!37 = distinct !{!37, !28}


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

; Function Attrs: nounwind uwtable
define dso_local void @mlpLayerPropagateBackward(ptr nocapture noundef readonly %0, ptr nocapture noundef %1, ptr nocapture noundef readonly %2, double noundef %3, double noundef %4) local_unnamed_addr #0 {
  %6 = getelementptr inbounds i8, ptr %1, i64 8
  %7 = load i32, ptr %6, align 8, !tbaa !5
  switch i32 %7, label %.preheader94 [
    i32 2, label %.preheader95
    i32 0, label %.thread
  ]

.preheader95:                                     ; preds = %5
  %8 = getelementptr inbounds i8, ptr %1, i64 4
  %9 = load i32, ptr %8, align 4, !tbaa !12
  %10 = icmp sgt i32 %9, 0
  br i1 %10, label %.lr.ph, label %.thread

.lr.ph:                                           ; preds = %.preheader95
  %11 = getelementptr inbounds i8, ptr %1, i64 160
  %12 = getelementptr inbounds i8, ptr %1, i64 96
  %13 = getelementptr inbounds i8, ptr %1, i64 88
  %14 = getelementptr inbounds i8, ptr %1, i64 104
  %15 = getelementptr inbounds i8, ptr %1, i64 152
  %16 = getelementptr inbounds i8, ptr %1, i64 112
  %17 = getelementptr inbounds i8, ptr %1, i64 16
  br label %29

.preheader94:                                     ; preds = %5
  %18 = getelementptr inbounds i8, ptr %1, i64 4
  %19 = load i32, ptr %18, align 4, !tbaa !12
  %20 = icmp sgt i32 %19, 0
  br i1 %20, label %.preheader93.lr.ph, label %.thread

.preheader93.lr.ph:                               ; preds = %.preheader94
  %21 = getelementptr inbounds i8, ptr %2, i64 4
  %22 = getelementptr inbounds i8, ptr %2, i64 80
  %23 = getelementptr inbounds i8, ptr %2, i64 112
  %24 = getelementptr inbounds i8, ptr %1, i64 104
  %25 = getelementptr inbounds i8, ptr %1, i64 152
  %26 = getelementptr inbounds i8, ptr %1, i64 88
  %27 = getelementptr inbounds i8, ptr %1, i64 112
  %28 = getelementptr inbounds i8, ptr %1, i64 16
  br label %.preheader93

29:                                               ; preds = %.lr.ph, %29
  %indvars.iv = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next, %29 ]
  %30 = load ptr, ptr %11, align 8, !tbaa !13
  %31 = getelementptr inbounds ptr, ptr %30, i64 %indvars.iv
  %32 = load ptr, ptr %31, align 8, !tbaa !14
  %33 = getelementptr inbounds i8, ptr %32, i64 8
  %34 = load ptr, ptr %33, align 8, !tbaa !15
  %35 = load ptr, ptr %12, align 8, !tbaa !17
  %36 = getelementptr inbounds double, ptr %35, i64 %indvars.iv
  %37 = load double, ptr %36, align 8, !tbaa !18
  %38 = load ptr, ptr %13, align 8, !tbaa !19
  %39 = getelementptr inbounds double, ptr %38, i64 %indvars.iv
  %40 = load double, ptr %39, align 8, !tbaa !18
  %41 = tail call double %34(double noundef %37, double noundef %40) #2
  %42 = load ptr, ptr %14, align 8, !tbaa !20
  %43 = getelementptr inbounds double, ptr %42, i64 %indvars.iv
  store double %41, ptr %43, align 8, !tbaa !18
  %44 = load ptr, ptr %15, align 8, !tbaa !21
  %45 = getelementptr inbounds ptr, ptr %44, i64 %indvars.iv
  %46 = load ptr, ptr %45, align 8, !tbaa !14
  %47 = getelementptr inbounds i8, ptr %46, i64 16
  %48 = load ptr, ptr %47, align 8, !tbaa !22
  %49 = load ptr, ptr %13, align 8, !tbaa !19
  %50 = getelementptr inbounds double, ptr %49, i64 %indvars.iv
  %51 = load double, ptr %50, align 8, !tbaa !18
  %52 = tail call double %48(double noundef %51) #2
  %53 = fmul double %41, %52
  %54 = load ptr, ptr %16, align 8, !tbaa !24
  %55 = getelementptr inbounds double, ptr %54, i64 %indvars.iv
  store double %53, ptr %55, align 8, !tbaa !18
  %56 = fptosi double %41 to i32
  %57 = tail call i32 @llvm.abs.i32(i32 %56, i1 true)
  %58 = uitofp nneg i32 %57 to double
  %59 = load double, ptr %17, align 8, !tbaa !25
  %60 = fadd double %59, %58
  store double %60, ptr %17, align 8, !tbaa !25
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %61 = load i32, ptr %8, align 4, !tbaa !12
  %62 = sext i32 %61 to i64
  %63 = icmp slt i64 %indvars.iv.next, %62
  br i1 %63, label %29, label %.loopexit, !llvm.loop !26

.preheader93:                                     ; preds = %.preheader93.lr.ph, %._crit_edge
  %indvars.iv112 = phi i64 [ 0, %.preheader93.lr.ph ], [ %indvars.iv.next113, %._crit_edge ]
  %64 = load i32, ptr %21, align 4, !tbaa !12
  %65 = icmp sgt i32 %64, 0
  br i1 %65, label %.lr.ph100, label %._crit_edge

.lr.ph100:                                        ; preds = %.preheader93
  %66 = load ptr, ptr %22, align 8, !tbaa !28
  %67 = load ptr, ptr %23, align 8, !tbaa !24
  %wide.trip.count = zext nneg i32 %64 to i64
  %xtraiter = and i64 %wide.trip.count, 3
  %68 = icmp ult i32 %64, 4
  br i1 %68, label %._crit_edge.loopexit.unr-lcssa, label %.lr.ph100.new

.lr.ph100.new:                                    ; preds = %.lr.ph100
  %unroll_iter = and i64 %wide.trip.count, 2147483644
  br label %98

._crit_edge.loopexit.unr-lcssa:                   ; preds = %98, %.lr.ph100
  %.lcssa.ph = phi double [ poison, %.lr.ph100 ], [ %126, %98 ]
  %indvars.iv109.unr = phi i64 [ 0, %.lr.ph100 ], [ %indvars.iv.next110.3, %98 ]
  %.08898.unr = phi double [ 0.000000e+00, %.lr.ph100 ], [ %126, %98 ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %._crit_edge, label %.epil.preheader

.epil.preheader:                                  ; preds = %._crit_edge.loopexit.unr-lcssa, %.epil.preheader
  %indvars.iv109.epil = phi i64 [ %indvars.iv.next110.epil, %.epil.preheader ], [ %indvars.iv109.unr, %._crit_edge.loopexit.unr-lcssa ]
  %.08898.epil = phi double [ %75, %.epil.preheader ], [ %.08898.unr, %._crit_edge.loopexit.unr-lcssa ]
  %epil.iter = phi i64 [ %epil.iter.next, %.epil.preheader ], [ 0, %._crit_edge.loopexit.unr-lcssa ]
  %69 = getelementptr inbounds ptr, ptr %66, i64 %indvars.iv109.epil
  %70 = load ptr, ptr %69, align 8, !tbaa !14
  %71 = getelementptr inbounds double, ptr %70, i64 %indvars.iv112
  %72 = load double, ptr %71, align 8, !tbaa !18
  %73 = getelementptr inbounds double, ptr %67, i64 %indvars.iv109.epil
  %74 = load double, ptr %73, align 8, !tbaa !18
  %75 = tail call double @llvm.fmuladd.f64(double %72, double %74, double %.08898.epil)
  %indvars.iv.next110.epil = add nuw nsw i64 %indvars.iv109.epil, 1
  %epil.iter.next = add i64 %epil.iter, 1
  %epil.iter.cmp.not = icmp eq i64 %epil.iter.next, %xtraiter
  br i1 %epil.iter.cmp.not, label %._crit_edge, label %.epil.preheader, !llvm.loop !29

._crit_edge:                                      ; preds = %._crit_edge.loopexit.unr-lcssa, %.epil.preheader, %.preheader93
  %.088.lcssa = phi double [ 0.000000e+00, %.preheader93 ], [ %.lcssa.ph, %._crit_edge.loopexit.unr-lcssa ], [ %75, %.epil.preheader ]
  %76 = load ptr, ptr %24, align 8, !tbaa !20
  %77 = getelementptr inbounds double, ptr %76, i64 %indvars.iv112
  store double %.088.lcssa, ptr %77, align 8, !tbaa !18
  %78 = load ptr, ptr %25, align 8, !tbaa !21
  %79 = getelementptr inbounds ptr, ptr %78, i64 %indvars.iv112
  %80 = load ptr, ptr %79, align 8, !tbaa !14
  %81 = getelementptr inbounds i8, ptr %80, i64 16
  %82 = load ptr, ptr %81, align 8, !tbaa !22
  %83 = load ptr, ptr %26, align 8, !tbaa !19
  %84 = getelementptr inbounds double, ptr %83, i64 %indvars.iv112
  %85 = load double, ptr %84, align 8, !tbaa !18
  %86 = tail call double %82(double noundef %85) #2
  %87 = fmul double %.088.lcssa, %86
  %88 = load ptr, ptr %27, align 8, !tbaa !24
  %89 = getelementptr inbounds double, ptr %88, i64 %indvars.iv112
  store double %87, ptr %89, align 8, !tbaa !18
  %90 = fptosi double %.088.lcssa to i32
  %91 = tail call i32 @llvm.abs.i32(i32 %90, i1 true)
  %92 = uitofp nneg i32 %91 to double
  %93 = load double, ptr %28, align 8, !tbaa !25
  %94 = fadd double %93, %92
  store double %94, ptr %28, align 8, !tbaa !25
  %indvars.iv.next113 = add nuw nsw i64 %indvars.iv112, 1
  %95 = load i32, ptr %18, align 4, !tbaa !12
  %96 = sext i32 %95 to i64
  %97 = icmp slt i64 %indvars.iv.next113, %96
  br i1 %97, label %.preheader93, label %.loopexit, !llvm.loop !31

98:                                               ; preds = %98, %.lr.ph100.new
  %indvars.iv109 = phi i64 [ 0, %.lr.ph100.new ], [ %indvars.iv.next110.3, %98 ]
  %.08898 = phi double [ 0.000000e+00, %.lr.ph100.new ], [ %126, %98 ]
  %niter = phi i64 [ 0, %.lr.ph100.new ], [ %niter.next.3, %98 ]
  %99 = getelementptr inbounds ptr, ptr %66, i64 %indvars.iv109
  %100 = load ptr, ptr %99, align 8, !tbaa !14
  %101 = getelementptr inbounds double, ptr %100, i64 %indvars.iv112
  %102 = load double, ptr %101, align 8, !tbaa !18
  %103 = getelementptr inbounds double, ptr %67, i64 %indvars.iv109
  %104 = load double, ptr %103, align 8, !tbaa !18
  %105 = tail call double @llvm.fmuladd.f64(double %102, double %104, double %.08898)
  %indvars.iv.next110 = or disjoint i64 %indvars.iv109, 1
  %106 = getelementptr inbounds ptr, ptr %66, i64 %indvars.iv.next110
  %107 = load ptr, ptr %106, align 8, !tbaa !14
  %108 = getelementptr inbounds double, ptr %107, i64 %indvars.iv112
  %109 = load double, ptr %108, align 8, !tbaa !18
  %110 = getelementptr inbounds double, ptr %67, i64 %indvars.iv.next110
  %111 = load double, ptr %110, align 8, !tbaa !18
  %112 = tail call double @llvm.fmuladd.f64(double %109, double %111, double %105)
  %indvars.iv.next110.1 = or disjoint i64 %indvars.iv109, 2
  %113 = getelementptr inbounds ptr, ptr %66, i64 %indvars.iv.next110.1
  %114 = load ptr, ptr %113, align 8, !tbaa !14
  %115 = getelementptr inbounds double, ptr %114, i64 %indvars.iv112
  %116 = load double, ptr %115, align 8, !tbaa !18
  %117 = getelementptr inbounds double, ptr %67, i64 %indvars.iv.next110.1
  %118 = load double, ptr %117, align 8, !tbaa !18
  %119 = tail call double @llvm.fmuladd.f64(double %116, double %118, double %112)
  %indvars.iv.next110.2 = or disjoint i64 %indvars.iv109, 3
  %120 = getelementptr inbounds ptr, ptr %66, i64 %indvars.iv.next110.2
  %121 = load ptr, ptr %120, align 8, !tbaa !14
  %122 = getelementptr inbounds double, ptr %121, i64 %indvars.iv112
  %123 = load double, ptr %122, align 8, !tbaa !18
  %124 = getelementptr inbounds double, ptr %67, i64 %indvars.iv.next110.2
  %125 = load double, ptr %124, align 8, !tbaa !18
  %126 = tail call double @llvm.fmuladd.f64(double %123, double %125, double %119)
  %indvars.iv.next110.3 = add nuw nsw i64 %indvars.iv109, 4
  %niter.next.3 = add i64 %niter, 4
  %niter.ncmp.3 = icmp eq i64 %niter.next.3, %unroll_iter
  br i1 %niter.ncmp.3, label %._crit_edge.loopexit.unr-lcssa, label %98, !llvm.loop !32

.loopexit:                                        ; preds = %29, %._crit_edge
  %.ph = phi i32 [ %95, %._crit_edge ], [ %61, %29 ]
  %.pr.pr = load i32, ptr %6, align 8, !tbaa !5
  %127 = icmp ne i32 %.pr.pr, 0
  %128 = icmp sgt i32 %.ph, 0
  %or.cond = and i1 %127, %128
  br i1 %or.cond, label %.preheader.lr.ph, label %.thread

.preheader.lr.ph:                                 ; preds = %.loopexit
  %129 = getelementptr inbounds i8, ptr %1, i64 64
  %130 = load ptr, ptr %129, align 8, !tbaa !33
  %131 = getelementptr inbounds i8, ptr %1, i64 112
  %132 = getelementptr inbounds i8, ptr %0, i64 88
  %133 = getelementptr inbounds i8, ptr %1, i64 80
  %134 = getelementptr inbounds i8, ptr %1, i64 120
  %135 = load ptr, ptr %131, align 8, !tbaa !24
  %136 = getelementptr inbounds i8, ptr %1, i64 128
  %137 = load ptr, ptr %136, align 8, !tbaa !34
  %138 = getelementptr inbounds i8, ptr %1, i64 144
  %139 = load ptr, ptr %138, align 8, !tbaa !35
  %wide.trip.count123 = zext nneg i32 %.ph to i64
  br label %.preheader

.preheader:                                       ; preds = %.preheader.lr.ph, %._crit_edge104
  %indvars.iv120 = phi i64 [ 0, %.preheader.lr.ph ], [ %indvars.iv.next121, %._crit_edge104 ]
  %140 = getelementptr inbounds i32, ptr %130, i64 %indvars.iv120
  %141 = load i32, ptr %140, align 4, !tbaa !36
  %142 = icmp sgt i32 %141, 0
  br i1 %142, label %.lr.ph103, label %._crit_edge104

.lr.ph103:                                        ; preds = %.preheader
  %143 = getelementptr inbounds double, ptr %135, i64 %indvars.iv120
  %144 = load ptr, ptr %132, align 8, !tbaa !19
  %145 = load ptr, ptr %133, align 8, !tbaa !28
  %146 = getelementptr inbounds ptr, ptr %145, i64 %indvars.iv120
  %147 = load ptr, ptr %146, align 8, !tbaa !14
  %148 = load ptr, ptr %134, align 8, !tbaa !37
  %149 = getelementptr inbounds double, ptr %148, i64 %indvars.iv120
  %wide.trip.count118 = zext nneg i32 %141 to i64
  br label %159

._crit_edge104:                                   ; preds = %159, %.preheader
  %150 = getelementptr inbounds double, ptr %135, i64 %indvars.iv120
  %151 = load double, ptr %150, align 8, !tbaa !18
  %152 = fmul double %151, %3
  %153 = getelementptr inbounds double, ptr %137, i64 %indvars.iv120
  %154 = load double, ptr %153, align 8, !tbaa !18
  %155 = fadd double %152, %154
  store double %155, ptr %153, align 8, !tbaa !18
  %156 = getelementptr inbounds double, ptr %139, i64 %indvars.iv120
  %157 = load double, ptr %156, align 8, !tbaa !18
  %158 = tail call double @llvm.fmuladd.f64(double %4, double %157, double %155)
  store double %158, ptr %153, align 8, !tbaa !18
  store double %152, ptr %156, align 8, !tbaa !18
  %indvars.iv.next121 = add nuw nsw i64 %indvars.iv120, 1
  %exitcond124.not = icmp eq i64 %indvars.iv.next121, %wide.trip.count123
  br i1 %exitcond124.not, label %.thread, label %.preheader, !llvm.loop !38

159:                                              ; preds = %.lr.ph103, %159
  %indvars.iv115 = phi i64 [ 0, %.lr.ph103 ], [ %indvars.iv.next116, %159 ]
  %160 = load double, ptr %143, align 8, !tbaa !18
  %161 = fmul double %160, %3
  %162 = getelementptr inbounds double, ptr %144, i64 %indvars.iv115
  %163 = load double, ptr %162, align 8, !tbaa !18
  %164 = fmul double %161, %163
  %165 = getelementptr inbounds double, ptr %147, i64 %indvars.iv115
  %166 = load double, ptr %165, align 8, !tbaa !18
  %167 = fadd double %164, %166
  store double %167, ptr %165, align 8, !tbaa !18
  %168 = load double, ptr %149, align 8, !tbaa !18
  %169 = tail call double @llvm.fmuladd.f64(double %4, double %168, double %167)
  store double %169, ptr %165, align 8, !tbaa !18
  store double %164, ptr %149, align 8, !tbaa !18
  %indvars.iv.next116 = add nuw nsw i64 %indvars.iv115, 1
  %exitcond119.not = icmp eq i64 %indvars.iv.next116, %wide.trip.count118
  br i1 %exitcond119.not, label %._crit_edge104, label %159, !llvm.loop !39

.thread:                                          ; preds = %._crit_edge104, %.preheader95, %.preheader94, %5, %.loopexit
  ret void
}

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fmuladd.f64(double, double, double) #1

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.abs.i32(i32, i1 immarg) #1

attributes #0 = { 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 #1 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #2 = { 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, !7, i64 8}
!6 = !{!"mlpLayer", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !10, i64 16, !10, i64 24, !7, i64 32, !7, i64 36, !7, i64 40, !10, i64 48, !10, i64 56, !11, i64 64, !11, i64 72, !11, i64 80, !11, i64 88, !11, i64 96, !11, i64 104, !11, i64 112, !11, i64 120, !11, i64 128, !11, i64 136, !11, i64 144, !11, i64 152, !11, i64 160, !11, i64 168}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"double", !8, i64 0}
!11 = !{!"any pointer", !8, i64 0}
!12 = !{!6, !7, i64 4}
!13 = !{!6, !11, i64 160}
!14 = !{!11, !11, i64 0}
!15 = !{!16, !11, i64 8}
!16 = !{!"loss", !7, i64 0, !11, i64 8, !11, i64 16}
!17 = !{!6, !11, i64 96}
!18 = !{!10, !10, i64 0}
!19 = !{!6, !11, i64 88}
!20 = !{!6, !11, i64 104}
!21 = !{!6, !11, i64 152}
!22 = !{!23, !11, i64 16}
!23 = !{!"activation", !7, i64 0, !11, i64 8, !11, i64 16}
!24 = !{!6, !11, i64 112}
!25 = !{!6, !10, i64 16}
!26 = distinct !{!26, !27}
!27 = !{!"llvm.loop.mustprogress"}
!28 = !{!6, !11, i64 80}
!29 = distinct !{!29, !30}
!30 = !{!"llvm.loop.unroll.disable"}
!31 = distinct !{!31, !27}
!32 = distinct !{!32, !27}
!33 = !{!6, !11, i64 64}
!34 = !{!6, !11, i64 128}
!35 = !{!6, !11, i64 144}
!36 = !{!7, !7, i64 0}
!37 = !{!6, !11, i64 120}
!38 = distinct !{!38, !27}
!39 = distinct !{!39, !27}


; Effective O3 passes: BDCEPass,CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopInstSimplifyPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,PostOrderFunctionAttrsPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass