; LLVM IR from Dynmi/AlexNet :: src (convolution_layer)

; 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.conv_args = type { ptr, i16, i16, i16 }
%struct.conv_op = type { ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i16 }

; Function Attrs: nocallback nofree nosync nounwind willreturn
declare ptr @llvm.stacksave.p0() #0

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

; Function Attrs: nounwind
declare i32 @pthread_create(ptr noundef, ptr noundef, ptr noundef, ptr noundef) #2

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

declare i32 @pthread_join(i64 noundef, ptr noundef) #3

; Function Attrs: nocallback nofree nosync nounwind willreturn
declare void @llvm.stackrestore.p0(ptr) #0

; Function Attrs: nounwind uwtable
define dso_local void @conv_op_backward(ptr noundef %0) #4 {
  %2 = alloca ptr, align 8
  %3 = alloca i16, align 2
  %4 = alloca %struct.conv_args, align 8
  %5 = alloca ptr, align 8
  %6 = alloca i64, align 8
  %7 = alloca i64, align 8
  %8 = alloca i16, align 2
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  store ptr %0, ptr %2, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 2, ptr %3) #6
  store i16 12, ptr %3, align 2, !tbaa !9
  %11 = load ptr, ptr %2, align 8, !tbaa !5
  %12 = getelementptr inbounds %struct.conv_op, ptr %11, i32 0, i32 9
  %13 = load i32, ptr %12, align 8, !tbaa !11
  %14 = load ptr, ptr %2, align 8, !tbaa !5
  %15 = getelementptr inbounds %struct.conv_op, ptr %14, i32 0, i32 11
  %16 = load i32, ptr %15, align 8, !tbaa !14
  %17 = mul nsw i32 %13, %16
  %18 = load ptr, ptr %2, align 8, !tbaa !5
  %19 = getelementptr inbounds %struct.conv_op, ptr %18, i32 0, i32 11
  %20 = load i32, ptr %19, align 8, !tbaa !14
  %21 = mul nsw i32 %17, %20
  %22 = load i16, ptr %3, align 2, !tbaa !9
  %23 = sext i16 %22 to i32
  %24 = icmp slt i32 %21, %23
  br i1 %24, label %25, label %43

25:                                               ; preds = %1
  call void @llvm.lifetime.start.p0(i64 16, ptr %4) #6
  %26 = load ptr, ptr %2, align 8, !tbaa !5
  %27 = getelementptr inbounds %struct.conv_args, ptr %4, i32 0, i32 0
  store ptr %26, ptr %27, align 8, !tbaa !15
  %28 = getelementptr inbounds %struct.conv_args, ptr %4, i32 0, i32 2
  store i16 0, ptr %28, align 2, !tbaa !17
  %29 = load ptr, ptr %2, align 8, !tbaa !5
  %30 = getelementptr inbounds %struct.conv_op, ptr %29, i32 0, i32 9
  %31 = load i32, ptr %30, align 8, !tbaa !11
  %32 = load ptr, ptr %2, align 8, !tbaa !5
  %33 = getelementptr inbounds %struct.conv_op, ptr %32, i32 0, i32 11
  %34 = load i32, ptr %33, align 8, !tbaa !14
  %35 = mul nsw i32 %31, %34
  %36 = load ptr, ptr %2, align 8, !tbaa !5
  %37 = getelementptr inbounds %struct.conv_op, ptr %36, i32 0, i32 11
  %38 = load i32, ptr %37, align 8, !tbaa !14
  %39 = mul nsw i32 %35, %38
  %40 = trunc i32 %39 to i16
  %41 = getelementptr inbounds %struct.conv_args, ptr %4, i32 0, i32 3
  store i16 %40, ptr %41, align 4, !tbaa !18
  %42 = call ptr @pthread_conv_op_backward(ptr noundef %4)
  call void @llvm.lifetime.end.p0(i64 16, ptr %4) #6
  br label %175

43:                                               ; preds = %1
  %44 = load i16, ptr %3, align 2, !tbaa !9
  %45 = sext i16 %44 to i32
  %46 = add nsw i32 %45, 1
  %47 = zext i32 %46 to i64
  %48 = call ptr @llvm.stacksave.p0()
  store ptr %48, ptr %5, align 8
  %49 = alloca %struct.conv_args, i64 %47, align 16
  store i64 %47, ptr %6, align 8
  %50 = load i16, ptr %3, align 2, !tbaa !9
  %51 = sext i16 %50 to i32
  %52 = add nsw i32 %51, 1
  %53 = zext i32 %52 to i64
  %54 = alloca i64, i64 %53, align 16
  store i64 %53, ptr %7, align 8
  call void @llvm.lifetime.start.p0(i64 2, ptr %8) #6
  %55 = load ptr, ptr %2, align 8, !tbaa !5
  %56 = getelementptr inbounds %struct.conv_op, ptr %55, i32 0, i32 9
  %57 = load i32, ptr %56, align 8, !tbaa !11
  %58 = sitofp i32 %57 to double
  %59 = fmul double 1.000000e+00, %58
  %60 = load ptr, ptr %2, align 8, !tbaa !5
  %61 = getelementptr inbounds %struct.conv_op, ptr %60, i32 0, i32 11
  %62 = load i32, ptr %61, align 8, !tbaa !14
  %63 = sitofp i32 %62 to double
  %64 = fmul double %59, %63
  %65 = load ptr, ptr %2, align 8, !tbaa !5
  %66 = getelementptr inbounds %struct.conv_op, ptr %65, i32 0, i32 11
  %67 = load i32, ptr %66, align 8, !tbaa !14
  %68 = sitofp i32 %67 to double
  %69 = fmul double %64, %68
  %70 = load i16, ptr %3, align 2, !tbaa !9
  %71 = sext i16 %70 to i32
  %72 = sitofp i32 %71 to double
  %73 = fdiv double %69, %72
  %74 = call double @llvm.ceil.f64(double %73)
  %75 = fptosi double %74 to i16
  store i16 %75, ptr %8, align 2, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #6
  store i32 0, ptr %9, align 4, !tbaa !19
  br label %76

76:                                               ; preds = %154, %43
  %77 = load i32, ptr %9, align 4, !tbaa !19
  %78 = load i16, ptr %3, align 2, !tbaa !9
  %79 = sext i16 %78 to i32
  %80 = icmp slt i32 %77, %79
  br i1 %80, label %82, label %81

81:                                               ; preds = %76
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #6
  br label %157

82:                                               ; preds = %76
  %83 = load ptr, ptr %2, align 8, !tbaa !5
  %84 = load i32, ptr %9, align 4, !tbaa !19
  %85 = sext i32 %84 to i64
  %86 = getelementptr inbounds %struct.conv_args, ptr %49, i64 %85
  %87 = getelementptr inbounds %struct.conv_args, ptr %86, i32 0, i32 0
  store ptr %83, ptr %87, align 16, !tbaa !15
  %88 = load i32, ptr %9, align 4, !tbaa !19
  %89 = load i16, ptr %8, align 2, !tbaa !9
  %90 = sext i16 %89 to i32
  %91 = mul nsw i32 %88, %90
  %92 = trunc i32 %91 to i16
  %93 = load i32, ptr %9, align 4, !tbaa !19
  %94 = sext i32 %93 to i64
  %95 = getelementptr inbounds %struct.conv_args, ptr %49, i64 %94
  %96 = getelementptr inbounds %struct.conv_args, ptr %95, i32 0, i32 2
  store i16 %92, ptr %96, align 2, !tbaa !17
  %97 = load i32, ptr %9, align 4, !tbaa !19
  %98 = sext i32 %97 to i64
  %99 = getelementptr inbounds %struct.conv_args, ptr %49, i64 %98
  %100 = getelementptr inbounds %struct.conv_args, ptr %99, i32 0, i32 2
  %101 = load i16, ptr %100, align 2, !tbaa !17
  %102 = sext i16 %101 to i32
  %103 = load i16, ptr %8, align 2, !tbaa !9
  %104 = sext i16 %103 to i32
  %105 = add nsw i32 %102, %104
  %106 = load ptr, ptr %2, align 8, !tbaa !5
  %107 = getelementptr inbounds %struct.conv_op, ptr %106, i32 0, i32 9
  %108 = load i32, ptr %107, align 8, !tbaa !11
  %109 = load ptr, ptr %2, align 8, !tbaa !5
  %110 = getelementptr inbounds %struct.conv_op, ptr %109, i32 0, i32 11
  %111 = load i32, ptr %110, align 8, !tbaa !14
  %112 = mul nsw i32 %108, %111
  %113 = load ptr, ptr %2, align 8, !tbaa !5
  %114 = getelementptr inbounds %struct.conv_op, ptr %113, i32 0, i32 11
  %115 = load i32, ptr %114, align 8, !tbaa !14
  %116 = mul nsw i32 %112, %115
  %117 = icmp slt i32 %105, %116
  br i1 %117, label %118, label %128

118:                                              ; preds = %82
  %119 = load i32, ptr %9, align 4, !tbaa !19
  %120 = sext i32 %119 to i64
  %121 = getelementptr inbounds %struct.conv_args, ptr %49, i64 %120
  %122 = getelementptr inbounds %struct.conv_args, ptr %121, i32 0, i32 2
  %123 = load i16, ptr %122, align 2, !tbaa !17
  %124 = sext i16 %123 to i32
  %125 = load i16, ptr %8, align 2, !tbaa !9
  %126 = sext i16 %125 to i32
  %127 = add nsw i32 %124, %126
  br label %140

128:                                              ; preds = %82
  %129 = load ptr, ptr %2, align 8, !tbaa !5
  %130 = getelementptr inbounds %struct.conv_op, ptr %129, i32 0, i32 9
  %131 = load i32, ptr %130, align 8, !tbaa !11
  %132 = load ptr, ptr %2, align 8, !tbaa !5
  %133 = getelementptr inbounds %struct.conv_op, ptr %132, i32 0, i32 11
  %134 = load i32, ptr %133, align 8, !tbaa !14
  %135 = mul nsw i32 %131, %134
  %136 = load ptr, ptr %2, align 8, !tbaa !5
  %137 = getelementptr inbounds %struct.conv_op, ptr %136, i32 0, i32 11
  %138 = load i32, ptr %137, align 8, !tbaa !14
  %139 = mul nsw i32 %135, %138
  br label %140

140:                                              ; preds = %128, %118
  %141 = phi i32 [ %127, %118 ], [ %139, %128 ]
  %142 = trunc i32 %141 to i16
  %143 = load i32, ptr %9, align 4, !tbaa !19
  %144 = sext i32 %143 to i64
  %145 = getelementptr inbounds %struct.conv_args, ptr %49, i64 %144
  %146 = getelementptr inbounds %struct.conv_args, ptr %145, i32 0, i32 3
  store i16 %142, ptr %146, align 4, !tbaa !18
  %147 = load i32, ptr %9, align 4, !tbaa !19
  %148 = sext i32 %147 to i64
  %149 = getelementptr inbounds i64, ptr %54, i64 %148
  %150 = load i32, ptr %9, align 4, !tbaa !19
  %151 = sext i32 %150 to i64
  %152 = getelementptr inbounds %struct.conv_args, ptr %49, i64 %151
  %153 = call i32 @pthread_create(ptr noundef %149, ptr noundef null, ptr noundef @pthread_conv_op_backward, ptr noundef %152) #6
  br label %154

154:                                              ; preds = %140
  %155 = load i32, ptr %9, align 4, !tbaa !19
  %156 = add nsw i32 %155, 1
  store i32 %156, ptr %9, align 4, !tbaa !19
  br label %76, !llvm.loop !20

157:                                              ; preds = %81
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #6
  store i32 0, ptr %10, align 4, !tbaa !19
  br label %158

158:                                              ; preds = %170, %157
  %159 = load i32, ptr %10, align 4, !tbaa !19
  %160 = load i16, ptr %3, align 2, !tbaa !9
  %161 = sext i16 %160 to i32
  %162 = icmp slt i32 %159, %161
  br i1 %162, label %164, label %163

163:                                              ; preds = %158
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #6
  br label %173

164:                                              ; preds = %158
  %165 = load i32, ptr %10, align 4, !tbaa !19
  %166 = sext i32 %165 to i64
  %167 = getelementptr inbounds i64, ptr %54, i64 %166
  %168 = load i64, ptr %167, align 8, !tbaa !22
  %169 = call i32 @pthread_join(i64 noundef %168, ptr noundef null)
  br label %170

170:                                              ; preds = %164
  %171 = load i32, ptr %10, align 4, !tbaa !19
  %172 = add nsw i32 %171, 1
  store i32 %172, ptr %10, align 4, !tbaa !19
  br label %158, !llvm.loop !24

173:                                              ; preds = %163
  call void @llvm.lifetime.end.p0(i64 2, ptr %8) #6
  %174 = load ptr, ptr %5, align 8
  call void @llvm.stackrestore.p0(ptr %174)
  br label %175

175:                                              ; preds = %173, %25
  %176 = load ptr, ptr %2, align 8, !tbaa !5
  %177 = getelementptr inbounds %struct.conv_op, ptr %176, i32 0, i32 8
  %178 = load ptr, ptr %177, align 8, !tbaa !25
  call void @free(ptr noundef %178) #6
  call void @llvm.lifetime.end.p0(i64 2, ptr %3) #6
  ret void
}

; Function Attrs: nounwind uwtable
declare hidden ptr @pthread_conv_op_backward(ptr noundef) #4

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

; Function Attrs: nounwind
declare void @free(ptr noundef) #2

attributes #0 = { nocallback nofree nosync nounwind willreturn }
attributes #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { "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 = { 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 #5 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #6 = { 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 = !{!"short", !7, i64 0}
!11 = !{!12, !13, i64 72}
!12 = !{!"conv_op", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !6, i64 64, !13, i64 72, !13, i64 76, !13, i64 80, !13, i64 84, !13, i64 88, !13, i64 92, !13, i64 96, !13, i64 100, !13, i64 104, !13, i64 108, !13, i64 112, !10, i64 116}
!13 = !{!"int", !7, i64 0}
!14 = !{!12, !13, i64 80}
!15 = !{!16, !6, i64 0}
!16 = !{!"conv_args", !6, i64 0, !10, i64 8, !10, i64 10, !10, i64 12}
!17 = !{!16, !10, i64 10}
!18 = !{!16, !10, i64 12}
!19 = !{!13, !13, i64 0}
!20 = distinct !{!20, !21}
!21 = !{!"llvm.loop.mustprogress"}
!22 = !{!23, !23, i64 0}
!23 = !{!"long", !7, i64 0}
!24 = distinct !{!24, !21}
!25 = !{!12, !6, i64 64}


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

%struct.conv_args = type { ptr, i16, i16, i16 }

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn
declare ptr @llvm.stacksave.p0() #0

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

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

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

declare i32 @pthread_join(i64 noundef, ptr noundef) local_unnamed_addr #3

; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn
declare void @llvm.stackrestore.p0(ptr) #0

; Function Attrs: nounwind uwtable
define dso_local void @conv_op_backward(ptr noundef %0) local_unnamed_addr #4 {
  %2 = alloca %struct.conv_args, align 8
  %3 = getelementptr inbounds i8, ptr %0, i64 72
  %4 = load i32, ptr %3, align 8, !tbaa !5
  %5 = getelementptr inbounds i8, ptr %0, i64 80
  %6 = load i32, ptr %5, align 8, !tbaa !12
  %7 = mul nsw i32 %6, %4
  %8 = mul nsw i32 %7, %6
  %9 = icmp slt i32 %8, 12
  br i1 %9, label %10, label %.preheader.preheader

10:                                               ; preds = %1
  call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %2) #8
  store ptr %0, ptr %2, align 8, !tbaa !13
  %11 = getelementptr inbounds i8, ptr %2, i64 10
  store i16 0, ptr %11, align 2, !tbaa !15
  %12 = trunc i32 %8 to i16
  %13 = getelementptr inbounds i8, ptr %2, i64 12
  store i16 %12, ptr %13, align 4, !tbaa !16
  %14 = call ptr @pthread_conv_op_backward(ptr noundef nonnull %2)
  call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %2) #8
  br label %199

.preheader.preheader:                             ; preds = %1
  %15 = tail call ptr @llvm.stacksave.p0()
  %16 = alloca [13 x %struct.conv_args], align 16
  %17 = alloca [13 x i64], align 16
  %18 = load i32, ptr %3, align 8, !tbaa !5
  %19 = sitofp i32 %18 to double
  %20 = load i32, ptr %5, align 8, !tbaa !12
  %21 = sitofp i32 %20 to double
  %22 = fmul double %19, %21
  %23 = fmul double %22, %21
  %24 = fdiv double %23, 1.200000e+01
  %25 = tail call double @llvm.ceil.f64(double %24)
  %26 = fptosi double %25 to i16
  %27 = sext i16 %26 to i32
  store ptr %0, ptr %16, align 16, !tbaa !13
  %28 = getelementptr inbounds i8, ptr %16, i64 10
  store i16 0, ptr %28, align 2, !tbaa !15
  %29 = mul nsw i32 %20, %18
  %30 = mul nsw i32 %29, %20
  %. = tail call i32 @llvm.smin.i32(i32 %27, i32 %30)
  %31 = trunc i32 %. to i16
  %32 = getelementptr inbounds i8, ptr %16, i64 12
  store i16 %31, ptr %32, align 4, !tbaa !16
  %33 = call i32 @pthread_create(ptr noundef nonnull %17, ptr noundef null, ptr noundef nonnull @pthread_conv_op_backward, ptr noundef nonnull %16) #8
  %34 = getelementptr inbounds i8, ptr %16, i64 16
  store ptr %0, ptr %34, align 16, !tbaa !13
  %35 = getelementptr inbounds i8, ptr %16, i64 26
  store i16 %26, ptr %35, align 2, !tbaa !15
  %36 = shl nsw i32 %27, 1
  %37 = load i32, ptr %3, align 8, !tbaa !5
  %38 = load i32, ptr %5, align 8, !tbaa !12
  %39 = mul nsw i32 %38, %37
  %40 = mul nsw i32 %39, %38
  %..1 = call i32 @llvm.smin.i32(i32 %36, i32 %40)
  %41 = trunc i32 %..1 to i16
  %42 = getelementptr inbounds i8, ptr %16, i64 28
  store i16 %41, ptr %42, align 4, !tbaa !16
  %43 = getelementptr inbounds i8, ptr %17, i64 8
  %44 = call i32 @pthread_create(ptr noundef nonnull %43, ptr noundef null, ptr noundef nonnull @pthread_conv_op_backward, ptr noundef nonnull %34) #8
  %45 = getelementptr inbounds i8, ptr %16, i64 32
  store ptr %0, ptr %45, align 16, !tbaa !13
  %46 = shl i16 %26, 1
  %47 = getelementptr inbounds i8, ptr %16, i64 42
  store i16 %46, ptr %47, align 2, !tbaa !15
  %48 = sext i16 %46 to i32
  %49 = add nsw i32 %48, %27
  %50 = load i32, ptr %3, align 8, !tbaa !5
  %51 = load i32, ptr %5, align 8, !tbaa !12
  %52 = mul nsw i32 %51, %50
  %53 = mul nsw i32 %52, %51
  %..2 = call i32 @llvm.smin.i32(i32 %49, i32 %53)
  %54 = trunc i32 %..2 to i16
  %55 = getelementptr inbounds i8, ptr %16, i64 44
  store i16 %54, ptr %55, align 4, !tbaa !16
  %56 = getelementptr inbounds i8, ptr %17, i64 16
  %57 = call i32 @pthread_create(ptr noundef nonnull %56, ptr noundef null, ptr noundef nonnull @pthread_conv_op_backward, ptr noundef nonnull %45) #8
  %58 = getelementptr inbounds i8, ptr %16, i64 48
  store ptr %0, ptr %58, align 16, !tbaa !13
  %59 = mul i16 %26, 3
  %60 = getelementptr inbounds i8, ptr %16, i64 58
  store i16 %59, ptr %60, align 2, !tbaa !15
  %61 = sext i16 %59 to i32
  %62 = add nsw i32 %61, %27
  %63 = load i32, ptr %3, align 8, !tbaa !5
  %64 = load i32, ptr %5, align 8, !tbaa !12
  %65 = mul nsw i32 %64, %63
  %66 = mul nsw i32 %65, %64
  %..3 = call i32 @llvm.smin.i32(i32 %62, i32 %66)
  %67 = trunc i32 %..3 to i16
  %68 = getelementptr inbounds i8, ptr %16, i64 60
  store i16 %67, ptr %68, align 4, !tbaa !16
  %69 = getelementptr inbounds i8, ptr %17, i64 24
  %70 = call i32 @pthread_create(ptr noundef nonnull %69, ptr noundef null, ptr noundef nonnull @pthread_conv_op_backward, ptr noundef nonnull %58) #8
  %71 = getelementptr inbounds i8, ptr %16, i64 64
  store ptr %0, ptr %71, align 16, !tbaa !13
  %72 = shl i16 %26, 2
  %73 = getelementptr inbounds i8, ptr %16, i64 74
  store i16 %72, ptr %73, align 2, !tbaa !15
  %74 = sext i16 %72 to i32
  %75 = add nsw i32 %74, %27
  %76 = load i32, ptr %3, align 8, !tbaa !5
  %77 = load i32, ptr %5, align 8, !tbaa !12
  %78 = mul nsw i32 %77, %76
  %79 = mul nsw i32 %78, %77
  %..4 = call i32 @llvm.smin.i32(i32 %75, i32 %79)
  %80 = trunc i32 %..4 to i16
  %81 = getelementptr inbounds i8, ptr %16, i64 76
  store i16 %80, ptr %81, align 4, !tbaa !16
  %82 = getelementptr inbounds i8, ptr %17, i64 32
  %83 = call i32 @pthread_create(ptr noundef nonnull %82, ptr noundef null, ptr noundef nonnull @pthread_conv_op_backward, ptr noundef nonnull %71) #8
  %84 = getelementptr inbounds i8, ptr %16, i64 80
  store ptr %0, ptr %84, align 16, !tbaa !13
  %85 = mul i16 %26, 5
  %86 = getelementptr inbounds i8, ptr %16, i64 90
  store i16 %85, ptr %86, align 2, !tbaa !15
  %87 = sext i16 %85 to i32
  %88 = add nsw i32 %87, %27
  %89 = load i32, ptr %3, align 8, !tbaa !5
  %90 = load i32, ptr %5, align 8, !tbaa !12
  %91 = mul nsw i32 %90, %89
  %92 = mul nsw i32 %91, %90
  %..5 = call i32 @llvm.smin.i32(i32 %88, i32 %92)
  %93 = trunc i32 %..5 to i16
  %94 = getelementptr inbounds i8, ptr %16, i64 92
  store i16 %93, ptr %94, align 4, !tbaa !16
  %95 = getelementptr inbounds i8, ptr %17, i64 40
  %96 = call i32 @pthread_create(ptr noundef nonnull %95, ptr noundef null, ptr noundef nonnull @pthread_conv_op_backward, ptr noundef nonnull %84) #8
  %97 = getelementptr inbounds i8, ptr %16, i64 96
  store ptr %0, ptr %97, align 16, !tbaa !13
  %98 = mul i16 %26, 6
  %99 = getelementptr inbounds i8, ptr %16, i64 106
  store i16 %98, ptr %99, align 2, !tbaa !15
  %100 = sext i16 %98 to i32
  %101 = add nsw i32 %100, %27
  %102 = load i32, ptr %3, align 8, !tbaa !5
  %103 = load i32, ptr %5, align 8, !tbaa !12
  %104 = mul nsw i32 %103, %102
  %105 = mul nsw i32 %104, %103
  %..6 = call i32 @llvm.smin.i32(i32 %101, i32 %105)
  %106 = trunc i32 %..6 to i16
  %107 = getelementptr inbounds i8, ptr %16, i64 108
  store i16 %106, ptr %107, align 4, !tbaa !16
  %108 = getelementptr inbounds i8, ptr %17, i64 48
  %109 = call i32 @pthread_create(ptr noundef nonnull %108, ptr noundef null, ptr noundef nonnull @pthread_conv_op_backward, ptr noundef nonnull %97) #8
  %110 = getelementptr inbounds i8, ptr %16, i64 112
  store ptr %0, ptr %110, align 16, !tbaa !13
  %111 = mul i16 %26, 7
  %112 = getelementptr inbounds i8, ptr %16, i64 122
  store i16 %111, ptr %112, align 2, !tbaa !15
  %113 = sext i16 %111 to i32
  %114 = add nsw i32 %113, %27
  %115 = load i32, ptr %3, align 8, !tbaa !5
  %116 = load i32, ptr %5, align 8, !tbaa !12
  %117 = mul nsw i32 %116, %115
  %118 = mul nsw i32 %117, %116
  %..7 = call i32 @llvm.smin.i32(i32 %114, i32 %118)
  %119 = trunc i32 %..7 to i16
  %120 = getelementptr inbounds i8, ptr %16, i64 124
  store i16 %119, ptr %120, align 4, !tbaa !16
  %121 = getelementptr inbounds i8, ptr %17, i64 56
  %122 = call i32 @pthread_create(ptr noundef nonnull %121, ptr noundef null, ptr noundef nonnull @pthread_conv_op_backward, ptr noundef nonnull %110) #8
  %123 = getelementptr inbounds i8, ptr %16, i64 128
  store ptr %0, ptr %123, align 16, !tbaa !13
  %124 = shl i16 %26, 3
  %125 = getelementptr inbounds i8, ptr %16, i64 138
  store i16 %124, ptr %125, align 2, !tbaa !15
  %126 = sext i16 %124 to i32
  %127 = add nsw i32 %126, %27
  %128 = load i32, ptr %3, align 8, !tbaa !5
  %129 = load i32, ptr %5, align 8, !tbaa !12
  %130 = mul nsw i32 %129, %128
  %131 = mul nsw i32 %130, %129
  %..8 = call i32 @llvm.smin.i32(i32 %127, i32 %131)
  %132 = trunc i32 %..8 to i16
  %133 = getelementptr inbounds i8, ptr %16, i64 140
  store i16 %132, ptr %133, align 4, !tbaa !16
  %134 = getelementptr inbounds i8, ptr %17, i64 64
  %135 = call i32 @pthread_create(ptr noundef nonnull %134, ptr noundef null, ptr noundef nonnull @pthread_conv_op_backward, ptr noundef nonnull %123) #8
  %136 = getelementptr inbounds i8, ptr %16, i64 144
  store ptr %0, ptr %136, align 16, !tbaa !13
  %137 = mul i16 %26, 9
  %138 = getelementptr inbounds i8, ptr %16, i64 154
  store i16 %137, ptr %138, align 2, !tbaa !15
  %139 = sext i16 %137 to i32
  %140 = add nsw i32 %139, %27
  %141 = load i32, ptr %3, align 8, !tbaa !5
  %142 = load i32, ptr %5, align 8, !tbaa !12
  %143 = mul nsw i32 %142, %141
  %144 = mul nsw i32 %143, %142
  %..9 = call i32 @llvm.smin.i32(i32 %140, i32 %144)
  %145 = trunc i32 %..9 to i16
  %146 = getelementptr inbounds i8, ptr %16, i64 156
  store i16 %145, ptr %146, align 4, !tbaa !16
  %147 = getelementptr inbounds i8, ptr %17, i64 72
  %148 = call i32 @pthread_create(ptr noundef nonnull %147, ptr noundef null, ptr noundef nonnull @pthread_conv_op_backward, ptr noundef nonnull %136) #8
  %149 = getelementptr inbounds i8, ptr %16, i64 160
  store ptr %0, ptr %149, align 16, !tbaa !13
  %150 = mul i16 %26, 10
  %151 = getelementptr inbounds i8, ptr %16, i64 170
  store i16 %150, ptr %151, align 2, !tbaa !15
  %152 = sext i16 %150 to i32
  %153 = add nsw i32 %152, %27
  %154 = load i32, ptr %3, align 8, !tbaa !5
  %155 = load i32, ptr %5, align 8, !tbaa !12
  %156 = mul nsw i32 %155, %154
  %157 = mul nsw i32 %156, %155
  %..10 = call i32 @llvm.smin.i32(i32 %153, i32 %157)
  %158 = trunc i32 %..10 to i16
  %159 = getelementptr inbounds i8, ptr %16, i64 172
  store i16 %158, ptr %159, align 4, !tbaa !16
  %160 = getelementptr inbounds i8, ptr %17, i64 80
  %161 = call i32 @pthread_create(ptr noundef nonnull %160, ptr noundef null, ptr noundef nonnull @pthread_conv_op_backward, ptr noundef nonnull %149) #8
  %162 = getelementptr inbounds i8, ptr %16, i64 176
  store ptr %0, ptr %162, align 16, !tbaa !13
  %163 = mul i16 %26, 11
  %164 = getelementptr inbounds i8, ptr %16, i64 186
  store i16 %163, ptr %164, align 2, !tbaa !15
  %165 = sext i16 %163 to i32
  %166 = add nsw i32 %165, %27
  %167 = load i32, ptr %3, align 8, !tbaa !5
  %168 = load i32, ptr %5, align 8, !tbaa !12
  %169 = mul nsw i32 %168, %167
  %170 = mul nsw i32 %169, %168
  %..11 = call i32 @llvm.smin.i32(i32 %166, i32 %170)
  %171 = trunc i32 %..11 to i16
  %172 = getelementptr inbounds i8, ptr %16, i64 188
  store i16 %171, ptr %172, align 4, !tbaa !16
  %173 = getelementptr inbounds i8, ptr %17, i64 88
  %174 = call i32 @pthread_create(ptr noundef nonnull %173, ptr noundef null, ptr noundef nonnull @pthread_conv_op_backward, ptr noundef nonnull %162) #8
  %175 = load i64, ptr %17, align 16, !tbaa !17
  %176 = call i32 @pthread_join(i64 noundef %175, ptr noundef null) #8
  %177 = load i64, ptr %43, align 8, !tbaa !17
  %178 = call i32 @pthread_join(i64 noundef %177, ptr noundef null) #8
  %179 = load i64, ptr %56, align 16, !tbaa !17
  %180 = call i32 @pthread_join(i64 noundef %179, ptr noundef null) #8
  %181 = load i64, ptr %69, align 8, !tbaa !17
  %182 = call i32 @pthread_join(i64 noundef %181, ptr noundef null) #8
  %183 = load i64, ptr %82, align 16, !tbaa !17
  %184 = call i32 @pthread_join(i64 noundef %183, ptr noundef null) #8
  %185 = load i64, ptr %95, align 8, !tbaa !17
  %186 = call i32 @pthread_join(i64 noundef %185, ptr noundef null) #8
  %187 = load i64, ptr %108, align 16, !tbaa !17
  %188 = call i32 @pthread_join(i64 noundef %187, ptr noundef null) #8
  %189 = load i64, ptr %121, align 8, !tbaa !17
  %190 = call i32 @pthread_join(i64 noundef %189, ptr noundef null) #8
  %191 = load i64, ptr %134, align 16, !tbaa !17
  %192 = call i32 @pthread_join(i64 noundef %191, ptr noundef null) #8
  %193 = load i64, ptr %147, align 8, !tbaa !17
  %194 = call i32 @pthread_join(i64 noundef %193, ptr noundef null) #8
  %195 = load i64, ptr %160, align 16, !tbaa !17
  %196 = call i32 @pthread_join(i64 noundef %195, ptr noundef null) #8
  %197 = load i64, ptr %173, align 8, !tbaa !17
  %198 = call i32 @pthread_join(i64 noundef %197, ptr noundef null) #8
  call void @llvm.stackrestore.p0(ptr %15)
  br label %199

199:                                              ; preds = %.preheader.preheader, %10
  %200 = getelementptr inbounds i8, ptr %0, i64 64
  %201 = load ptr, ptr %200, align 8, !tbaa !19
  call void @free(ptr noundef %201) #8
  ret void
}

; Function Attrs: nounwind uwtable
declare hidden ptr @pthread_conv_op_backward(ptr noundef) #4

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

; Function Attrs: mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @free(ptr allocptr nocapture noundef) local_unnamed_addr #6

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.smin.i32(i32, i32) #7

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn }
attributes #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { "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 = { 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 #5 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #6 = { mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite) "alloc-family"="malloc" "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 #7 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #8 = { 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, !10, i64 72}
!6 = !{!"conv_op", !7, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !7, i64 32, !7, i64 40, !7, i64 48, !7, i64 56, !7, i64 64, !10, i64 72, !10, i64 76, !10, i64 80, !10, i64 84, !10, i64 88, !10, i64 92, !10, i64 96, !10, i64 100, !10, i64 104, !10, i64 108, !10, i64 112, !11, i64 116}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"int", !8, i64 0}
!11 = !{!"short", !8, i64 0}
!12 = !{!6, !10, i64 80}
!13 = !{!14, !7, i64 0}
!14 = !{!"conv_args", !7, i64 0, !11, i64 8, !11, i64 10, !11, i64 12}
!15 = !{!14, !11, i64 10}
!16 = !{!14, !11, i64 12}
!17 = !{!18, !18, i64 0}
!18 = !{!"long", !8, i64 0}
!19 = !{!6, !7, i64 64}


; Effective O3 passes: EarlyCSEPass,GVNPass,GlobalOptPass,IndVarSimplifyPass,InferAlignmentPass,InferFunctionAttrsPass,InstCombinePass,LICMPass,LoopRotatePass,LoopSimplifyPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass