; LLVM IR from cpuimage/cpuimagelib :: cpuimage (CPUImageSobelEdge)

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

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

; Function Attrs: nounwind
declare float @sqrtf(float noundef) #1

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

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #2

; Function Attrs: nounwind allocsize(0)
declare noalias ptr @malloc(i64 noundef) #3

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

; Function Attrs: nounwind uwtable
define dso_local void @CPUImageSobelEdge(ptr noundef %0, ptr noundef %1, i32 noundef %2, i32 noundef %3) #4 {
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca i32, align 4
  %8 = alloca i32, align 4
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca ptr, align 8
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %17 = alloca ptr, align 8
  %18 = alloca ptr, align 8
  %19 = alloca ptr, align 8
  %20 = alloca i32, align 4
  %21 = alloca i32, align 4
  %22 = alloca i32, align 4
  %23 = alloca i32, align 4
  store ptr %0, ptr %5, align 8, !tbaa !5
  store ptr %1, ptr %6, align 8, !tbaa !5
  store i32 %2, ptr %7, align 4, !tbaa !9
  store i32 %3, ptr %8, align 4, !tbaa !9
  %24 = load ptr, ptr %5, align 8, !tbaa !5
  %25 = icmp eq ptr %24, null
  br i1 %25, label %29, label %26

26:                                               ; preds = %4
  %27 = load ptr, ptr %6, align 8, !tbaa !5
  %28 = icmp eq ptr %27, null
  br i1 %28, label %29, label %30

29:                                               ; preds = %26, %4
  br label %373

30:                                               ; preds = %26
  %31 = load i32, ptr %7, align 4, !tbaa !9
  %32 = icmp sle i32 %31, 0
  br i1 %32, label %36, label %33

33:                                               ; preds = %30
  %34 = load i32, ptr %8, align 4, !tbaa !9
  %35 = icmp sle i32 %34, 0
  br i1 %35, label %36, label %37

36:                                               ; preds = %33, %30
  br label %373

37:                                               ; preds = %33
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #5
  %38 = call noalias ptr @malloc(i64 noundef 65026) #6
  store ptr %38, ptr %9, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #5
  %39 = load i32, ptr %7, align 4, !tbaa !9
  %40 = add nsw i32 %39, 2
  %41 = mul nsw i32 %40, 3
  %42 = sext i32 %41 to i64
  %43 = mul i64 %42, 1
  %44 = call noalias ptr @malloc(i64 noundef %43) #6
  store ptr %44, ptr %10, align 8, !tbaa !5
  %45 = load ptr, ptr %9, align 8, !tbaa !5
  %46 = icmp eq ptr %45, null
  br i1 %46, label %50, label %47

47:                                               ; preds = %37
  %48 = load ptr, ptr %10, align 8, !tbaa !5
  %49 = icmp eq ptr %48, null
  br i1 %49, label %50, label %61

50:                                               ; preds = %47, %37
  %51 = load ptr, ptr %9, align 8, !tbaa !5
  %52 = icmp ne ptr %51, null
  br i1 %52, label %53, label %55

53:                                               ; preds = %50
  %54 = load ptr, ptr %9, align 8, !tbaa !5
  call void @free(ptr noundef %54) #5
  br label %55

55:                                               ; preds = %53, %50
  %56 = load ptr, ptr %10, align 8, !tbaa !5
  %57 = icmp ne ptr %56, null
  br i1 %57, label %58, label %60

58:                                               ; preds = %55
  %59 = load ptr, ptr %10, align 8, !tbaa !5
  call void @free(ptr noundef %59) #5
  br label %60

60:                                               ; preds = %58, %55
  br label %61

61:                                               ; preds = %60, %47
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #5
  %62 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %62, ptr %11, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #5
  %63 = load ptr, ptr %10, align 8, !tbaa !5
  %64 = load i32, ptr %7, align 4, !tbaa !9
  %65 = add nsw i32 %64, 2
  %66 = sext i32 %65 to i64
  %67 = getelementptr inbounds i8, ptr %63, i64 %66
  store ptr %67, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #5
  %68 = load ptr, ptr %10, align 8, !tbaa !5
  %69 = load i32, ptr %7, align 4, !tbaa !9
  %70 = add nsw i32 %69, 2
  %71 = mul nsw i32 %70, 2
  %72 = sext i32 %71 to i64
  %73 = getelementptr inbounds i8, ptr %68, i64 %72
  store ptr %73, ptr %13, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #5
  store i32 0, ptr %14, align 4, !tbaa !9
  br label %74

74:                                               ; preds = %109, %61
  %75 = load i32, ptr %14, align 4, !tbaa !9
  %76 = icmp slt i32 %75, 65026
  br i1 %76, label %78, label %77

77:                                               ; preds = %74
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #5
  br label %112

78:                                               ; preds = %74
  %79 = load i32, ptr %14, align 4, !tbaa !9
  %80 = sitofp i32 %79 to float
  %81 = fadd float %80, 0.000000e+00
  %82 = call float @sqrtf(float noundef %81) #5
  %83 = fadd float %82, 5.000000e-01
  %84 = fptosi float %83 to i32
  %85 = icmp ult i32 %84, 255
  br i1 %85, label %86, label %92

86:                                               ; preds = %78
  %87 = load i32, ptr %14, align 4, !tbaa !9
  %88 = sitofp i32 %87 to float
  %89 = fadd float %88, 0.000000e+00
  %90 = call float @sqrtf(float noundef %89) #5
  %91 = fadd float %90, 5.000000e-01
  br label %102

92:                                               ; preds = %78
  %93 = load i32, ptr %14, align 4, !tbaa !9
  %94 = sitofp i32 %93 to float
  %95 = fadd float %94, 0.000000e+00
  %96 = call float @sqrtf(float noundef %95) #5
  %97 = fadd float %96, 5.000000e-01
  %98 = fcmp olt float %97, 0.000000e+00
  %99 = zext i1 %98 to i64
  %100 = select i1 %98, i32 0, i32 255
  %101 = sitofp i32 %100 to float
  br label %102

102:                                              ; preds = %92, %86
  %103 = phi float [ %91, %86 ], [ %101, %92 ]
  %104 = fptoui float %103 to i8
  %105 = load ptr, ptr %9, align 8, !tbaa !5
  %106 = load i32, ptr %14, align 4, !tbaa !9
  %107 = sext i32 %106 to i64
  %108 = getelementptr inbounds i8, ptr %105, i64 %107
  store i8 %104, ptr %108, align 1, !tbaa !11
  br label %109

109:                                              ; preds = %102
  %110 = load i32, ptr %14, align 4, !tbaa !9
  %111 = add nsw i32 %110, 1
  store i32 %111, ptr %14, align 4, !tbaa !9
  br label %74, !llvm.loop !12

112:                                              ; preds = %77
  %113 = load ptr, ptr %12, align 8, !tbaa !5
  %114 = load ptr, ptr %5, align 8, !tbaa !5
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %113, ptr align 1 %114, i64 1, i1 false)
  %115 = load ptr, ptr %12, align 8, !tbaa !5
  %116 = getelementptr inbounds i8, ptr %115, i64 1
  %117 = load ptr, ptr %5, align 8, !tbaa !5
  %118 = load i32, ptr %7, align 4, !tbaa !9
  %119 = sext i32 %118 to i64
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %116, ptr align 1 %117, i64 %119, i1 false)
  %120 = load ptr, ptr %12, align 8, !tbaa !5
  %121 = load i32, ptr %7, align 4, !tbaa !9
  %122 = sext i32 %121 to i64
  %123 = getelementptr inbounds i8, ptr %120, i64 %122
  %124 = getelementptr inbounds i8, ptr %123, i64 1
  %125 = load ptr, ptr %5, align 8, !tbaa !5
  %126 = load i32, ptr %7, align 4, !tbaa !9
  %127 = sext i32 %126 to i64
  %128 = getelementptr inbounds i8, ptr %125, i64 %127
  %129 = getelementptr inbounds i8, ptr %128, i64 -1
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %124, ptr align 1 %129, i64 1, i1 false)
  %130 = load ptr, ptr %11, align 8, !tbaa !5
  %131 = load ptr, ptr %12, align 8, !tbaa !5
  %132 = load i32, ptr %7, align 4, !tbaa !9
  %133 = add nsw i32 %132, 2
  %134 = sext i32 %133 to i64
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %130, ptr align 1 %131, i64 %134, i1 false)
  %135 = load ptr, ptr %13, align 8, !tbaa !5
  %136 = load ptr, ptr %5, align 8, !tbaa !5
  %137 = load i32, ptr %7, align 4, !tbaa !9
  %138 = sext i32 %137 to i64
  %139 = getelementptr inbounds i8, ptr %136, i64 %138
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %135, ptr align 1 %139, i64 1, i1 false)
  %140 = load ptr, ptr %13, align 8, !tbaa !5
  %141 = getelementptr inbounds i8, ptr %140, i64 1
  %142 = load ptr, ptr %5, align 8, !tbaa !5
  %143 = load i32, ptr %7, align 4, !tbaa !9
  %144 = sext i32 %143 to i64
  %145 = getelementptr inbounds i8, ptr %142, i64 %144
  %146 = load i32, ptr %7, align 4, !tbaa !9
  %147 = sext i32 %146 to i64
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %141, ptr align 1 %145, i64 %147, i1 false)
  %148 = load ptr, ptr %13, align 8, !tbaa !5
  %149 = load i32, ptr %7, align 4, !tbaa !9
  %150 = sext i32 %149 to i64
  %151 = getelementptr inbounds i8, ptr %148, i64 %150
  %152 = getelementptr inbounds i8, ptr %151, i64 1
  %153 = load ptr, ptr %5, align 8, !tbaa !5
  %154 = load i32, ptr %7, align 4, !tbaa !9
  %155 = sext i32 %154 to i64
  %156 = getelementptr inbounds i8, ptr %153, i64 %155
  %157 = load i32, ptr %7, align 4, !tbaa !9
  %158 = sext i32 %157 to i64
  %159 = getelementptr inbounds i8, ptr %156, i64 %158
  %160 = getelementptr inbounds i8, ptr %159, i64 -1
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %152, ptr align 1 %160, i64 1, i1 false)
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #5
  store i32 0, ptr %15, align 4, !tbaa !9
  br label %161

161:                                              ; preds = %359, %112
  %162 = load i32, ptr %15, align 4, !tbaa !9
  %163 = load i32, ptr %8, align 4, !tbaa !9
  %164 = icmp slt i32 %162, %163
  br i1 %164, label %166, label %165

165:                                              ; preds = %161
  store i32 5, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #5
  br label %362

166:                                              ; preds = %161
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #5
  %167 = load ptr, ptr %5, align 8, !tbaa !5
  %168 = load i32, ptr %15, align 4, !tbaa !9
  %169 = load i32, ptr %7, align 4, !tbaa !9
  %170 = mul nsw i32 %168, %169
  %171 = sext i32 %170 to i64
  %172 = getelementptr inbounds i8, ptr %167, i64 %171
  store ptr %172, ptr %17, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #5
  %173 = load ptr, ptr %6, align 8, !tbaa !5
  %174 = load i32, ptr %15, align 4, !tbaa !9
  %175 = load i32, ptr %7, align 4, !tbaa !9
  %176 = mul nsw i32 %174, %175
  %177 = sext i32 %176 to i64
  %178 = getelementptr inbounds i8, ptr %173, i64 %177
  store ptr %178, ptr %18, align 8, !tbaa !5
  %179 = load i32, ptr %15, align 4, !tbaa !9
  %180 = icmp ne i32 %179, 0
  br i1 %180, label %181, label %186

181:                                              ; preds = %166
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #5
  %182 = load ptr, ptr %11, align 8, !tbaa !5
  store ptr %182, ptr %19, align 8, !tbaa !5
  %183 = load ptr, ptr %12, align 8, !tbaa !5
  store ptr %183, ptr %11, align 8, !tbaa !5
  %184 = load ptr, ptr %13, align 8, !tbaa !5
  store ptr %184, ptr %12, align 8, !tbaa !5
  %185 = load ptr, ptr %19, align 8, !tbaa !5
  store ptr %185, ptr %13, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #5
  br label %186

186:                                              ; preds = %181, %166
  %187 = load i32, ptr %15, align 4, !tbaa !9
  %188 = load i32, ptr %8, align 4, !tbaa !9
  %189 = sub nsw i32 %188, 1
  %190 = icmp eq i32 %187, %189
  br i1 %190, label %191, label %197

191:                                              ; preds = %186
  %192 = load ptr, ptr %13, align 8, !tbaa !5
  %193 = load ptr, ptr %12, align 8, !tbaa !5
  %194 = load i32, ptr %7, align 4, !tbaa !9
  %195 = add nsw i32 %194, 2
  %196 = sext i32 %195 to i64
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %192, ptr align 1 %193, i64 %196, i1 false)
  br label %233

197:                                              ; preds = %186
  %198 = load ptr, ptr %13, align 8, !tbaa !5
  %199 = load ptr, ptr %5, align 8, !tbaa !5
  %200 = load i32, ptr %15, align 4, !tbaa !9
  %201 = add nsw i32 %200, 1
  %202 = load i32, ptr %7, align 4, !tbaa !9
  %203 = mul nsw i32 %201, %202
  %204 = sext i32 %203 to i64
  %205 = getelementptr inbounds i8, ptr %199, i64 %204
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %198, ptr align 1 %205, i64 1, i1 false)
  %206 = load ptr, ptr %13, align 8, !tbaa !5
  %207 = getelementptr inbounds i8, ptr %206, i64 1
  %208 = load ptr, ptr %5, align 8, !tbaa !5
  %209 = load i32, ptr %15, align 4, !tbaa !9
  %210 = add nsw i32 %209, 1
  %211 = load i32, ptr %7, align 4, !tbaa !9
  %212 = mul nsw i32 %210, %211
  %213 = sext i32 %212 to i64
  %214 = getelementptr inbounds i8, ptr %208, i64 %213
  %215 = load i32, ptr %7, align 4, !tbaa !9
  %216 = sext i32 %215 to i64
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %207, ptr align 1 %214, i64 %216, i1 false)
  %217 = load ptr, ptr %13, align 8, !tbaa !5
  %218 = load i32, ptr %7, align 4, !tbaa !9
  %219 = sext i32 %218 to i64
  %220 = getelementptr inbounds i8, ptr %217, i64 %219
  %221 = getelementptr inbounds i8, ptr %220, i64 1
  %222 = load ptr, ptr %5, align 8, !tbaa !5
  %223 = load i32, ptr %15, align 4, !tbaa !9
  %224 = add nsw i32 %223, 1
  %225 = load i32, ptr %7, align 4, !tbaa !9
  %226 = mul nsw i32 %224, %225
  %227 = sext i32 %226 to i64
  %228 = getelementptr inbounds i8, ptr %222, i64 %227
  %229 = load i32, ptr %7, align 4, !tbaa !9
  %230 = sext i32 %229 to i64
  %231 = getelementptr inbounds i8, ptr %228, i64 %230
  %232 = getelementptr inbounds i8, ptr %231, i64 -1
  call void @llvm.memcpy.p0.p0.i64(ptr align 1 %221, ptr align 1 %232, i64 1, i1 false)
  br label %233

233:                                              ; preds = %197, %191
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #5
  store i32 0, ptr %20, align 4, !tbaa !9
  br label %234

234:                                              ; preds = %355, %233
  %235 = load i32, ptr %20, align 4, !tbaa !9
  %236 = load i32, ptr %7, align 4, !tbaa !9
  %237 = icmp slt i32 %235, %236
  br i1 %237, label %239, label %238

238:                                              ; preds = %234
  store i32 8, ptr %16, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #5
  br label %358

239:                                              ; preds = %234
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #5
  %240 = load ptr, ptr %11, align 8, !tbaa !5
  %241 = load i32, ptr %20, align 4, !tbaa !9
  %242 = sext i32 %241 to i64
  %243 = getelementptr inbounds i8, ptr %240, i64 %242
  %244 = load i8, ptr %243, align 1, !tbaa !11
  %245 = zext i8 %244 to i32
  %246 = load ptr, ptr %11, align 8, !tbaa !5
  %247 = load i32, ptr %20, align 4, !tbaa !9
  %248 = add nsw i32 %247, 1
  %249 = sext i32 %248 to i64
  %250 = getelementptr inbounds i8, ptr %246, i64 %249
  %251 = load i8, ptr %250, align 1, !tbaa !11
  %252 = zext i8 %251 to i32
  %253 = mul nsw i32 2, %252
  %254 = add nsw i32 %245, %253
  %255 = load ptr, ptr %11, align 8, !tbaa !5
  %256 = load i32, ptr %20, align 4, !tbaa !9
  %257 = add nsw i32 %256, 3
  %258 = sext i32 %257 to i64
  %259 = getelementptr inbounds i8, ptr %255, i64 %258
  %260 = load i8, ptr %259, align 1, !tbaa !11
  %261 = zext i8 %260 to i32
  %262 = add nsw i32 %254, %261
  %263 = load ptr, ptr %13, align 8, !tbaa !5
  %264 = load i32, ptr %20, align 4, !tbaa !9
  %265 = sext i32 %264 to i64
  %266 = getelementptr inbounds i8, ptr %263, i64 %265
  %267 = load i8, ptr %266, align 1, !tbaa !11
  %268 = zext i8 %267 to i32
  %269 = load ptr, ptr %13, align 8, !tbaa !5
  %270 = load i32, ptr %20, align 4, !tbaa !9
  %271 = add nsw i32 %270, 1
  %272 = sext i32 %271 to i64
  %273 = getelementptr inbounds i8, ptr %269, i64 %272
  %274 = load i8, ptr %273, align 1, !tbaa !11
  %275 = zext i8 %274 to i32
  %276 = mul nsw i32 2, %275
  %277 = add nsw i32 %268, %276
  %278 = load ptr, ptr %13, align 8, !tbaa !5
  %279 = load i32, ptr %20, align 4, !tbaa !9
  %280 = add nsw i32 %279, 2
  %281 = sext i32 %280 to i64
  %282 = getelementptr inbounds i8, ptr %278, i64 %281
  %283 = load i8, ptr %282, align 1, !tbaa !11
  %284 = zext i8 %283 to i32
  %285 = add nsw i32 %277, %284
  %286 = sub nsw i32 %262, %285
  store i32 %286, ptr %21, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #5
  %287 = load ptr, ptr %11, align 8, !tbaa !5
  %288 = load i32, ptr %20, align 4, !tbaa !9
  %289 = sext i32 %288 to i64
  %290 = getelementptr inbounds i8, ptr %287, i64 %289
  %291 = load i8, ptr %290, align 1, !tbaa !11
  %292 = zext i8 %291 to i32
  %293 = load ptr, ptr %12, align 8, !tbaa !5
  %294 = load i32, ptr %20, align 4, !tbaa !9
  %295 = sext i32 %294 to i64
  %296 = getelementptr inbounds i8, ptr %293, i64 %295
  %297 = load i8, ptr %296, align 1, !tbaa !11
  %298 = zext i8 %297 to i32
  %299 = mul nsw i32 2, %298
  %300 = add nsw i32 %292, %299
  %301 = load ptr, ptr %13, align 8, !tbaa !5
  %302 = load i32, ptr %20, align 4, !tbaa !9
  %303 = sext i32 %302 to i64
  %304 = getelementptr inbounds i8, ptr %301, i64 %303
  %305 = load i8, ptr %304, align 1, !tbaa !11
  %306 = zext i8 %305 to i32
  %307 = add nsw i32 %300, %306
  %308 = load ptr, ptr %11, align 8, !tbaa !5
  %309 = load i32, ptr %20, align 4, !tbaa !9
  %310 = add nsw i32 %309, 2
  %311 = sext i32 %310 to i64
  %312 = getelementptr inbounds i8, ptr %308, i64 %311
  %313 = load i8, ptr %312, align 1, !tbaa !11
  %314 = zext i8 %313 to i32
  %315 = load ptr, ptr %12, align 8, !tbaa !5
  %316 = load i32, ptr %20, align 4, !tbaa !9
  %317 = add nsw i32 %316, 2
  %318 = sext i32 %317 to i64
  %319 = getelementptr inbounds i8, ptr %315, i64 %318
  %320 = load i8, ptr %319, align 1, !tbaa !11
  %321 = zext i8 %320 to i32
  %322 = mul nsw i32 2, %321
  %323 = add nsw i32 %314, %322
  %324 = load ptr, ptr %13, align 8, !tbaa !5
  %325 = load i32, ptr %20, align 4, !tbaa !9
  %326 = add nsw i32 %325, 2
  %327 = sext i32 %326 to i64
  %328 = getelementptr inbounds i8, ptr %324, i64 %327
  %329 = load i8, ptr %328, align 1, !tbaa !11
  %330 = zext i8 %329 to i32
  %331 = add nsw i32 %323, %330
  %332 = sub nsw i32 %307, %331
  store i32 %332, ptr %22, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #5
  %333 = load i32, ptr %21, align 4, !tbaa !9
  %334 = load i32, ptr %21, align 4, !tbaa !9
  %335 = mul nsw i32 %333, %334
  %336 = load i32, ptr %22, align 4, !tbaa !9
  %337 = load i32, ptr %22, align 4, !tbaa !9
  %338 = mul nsw i32 %336, %337
  %339 = add nsw i32 %335, %338
  store i32 %339, ptr %23, align 4, !tbaa !9
  %340 = load ptr, ptr %9, align 8, !tbaa !5
  %341 = load i32, ptr %23, align 4, !tbaa !9
  %342 = icmp slt i32 %341, 65025
  br i1 %342, label %343, label %345

343:                                              ; preds = %239
  %344 = load i32, ptr %23, align 4, !tbaa !9
  br label %346

345:                                              ; preds = %239
  br label %346

346:                                              ; preds = %345, %343
  %347 = phi i32 [ %344, %343 ], [ 65025, %345 ]
  %348 = sext i32 %347 to i64
  %349 = getelementptr inbounds i8, ptr %340, i64 %348
  %350 = load i8, ptr %349, align 1, !tbaa !11
  %351 = load ptr, ptr %18, align 8, !tbaa !5
  %352 = load i32, ptr %20, align 4, !tbaa !9
  %353 = sext i32 %352 to i64
  %354 = getelementptr inbounds i8, ptr %351, i64 %353
  store i8 %350, ptr %354, align 1, !tbaa !11
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #5
  br label %355

355:                                              ; preds = %346
  %356 = load i32, ptr %20, align 4, !tbaa !9
  %357 = add nsw i32 %356, 1
  store i32 %357, ptr %20, align 4, !tbaa !9
  br label %234, !llvm.loop !14

358:                                              ; preds = %238
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #5
  br label %359

359:                                              ; preds = %358
  %360 = load i32, ptr %15, align 4, !tbaa !9
  %361 = add nsw i32 %360, 1
  store i32 %361, ptr %15, align 4, !tbaa !9
  br label %161, !llvm.loop !15

362:                                              ; preds = %165
  %363 = load ptr, ptr %10, align 8, !tbaa !5
  %364 = icmp ne ptr %363, null
  br i1 %364, label %365, label %367

365:                                              ; preds = %362
  %366 = load ptr, ptr %10, align 8, !tbaa !5
  call void @free(ptr noundef %366) #5
  br label %367

367:                                              ; preds = %365, %362
  %368 = load ptr, ptr %9, align 8, !tbaa !5
  %369 = icmp ne ptr %368, null
  br i1 %369, label %370, label %372

370:                                              ; preds = %367
  %371 = load ptr, ptr %9, align 8, !tbaa !5
  call void @free(ptr noundef %371) #5
  br label %372

372:                                              ; preds = %370, %367
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #5
  br label %373

373:                                              ; preds = %372, %36, %29
  ret void
}

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { 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 #2 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #3 = { nounwind allocsize(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 #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 = { nounwind }
attributes #6 = { nounwind allocsize(0) }

!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 = !{!"int", !7, i64 0}
!11 = !{!7, !7, i64 0}
!12 = distinct !{!12, !13}
!13 = !{!"llvm.loop.mustprogress"}
!14 = distinct !{!14, !13}
!15 = distinct !{!15, !13}


; 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: mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #0

; Function Attrs: mustprogress nofree nounwind willreturn allockind("alloc,uninitialized") allocsize(0) memory(inaccessiblemem: readwrite)
declare noalias noundef ptr @malloc(i64 noundef) local_unnamed_addr #1

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

; Function Attrs: nounwind uwtable
define dso_local void @CPUImageSobelEdge(ptr noundef readonly %0, ptr noundef writeonly %1, i32 noundef %2, i32 noundef %3) local_unnamed_addr #3 {
  %5 = icmp eq ptr %0, null
  %6 = icmp eq ptr %1, null
  %or.cond = or i1 %5, %6
  br i1 %or.cond, label %126, label %7

7:                                                ; preds = %4
  %8 = icmp slt i32 %2, 1
  %9 = icmp slt i32 %3, 1
  %or.cond3 = or i1 %8, %9
  br i1 %or.cond3, label %126, label %10

10:                                               ; preds = %7
  %11 = tail call noalias dereferenceable_or_null(65026) ptr @malloc(i64 noundef 65026) #5
  %12 = add nuw nsw i32 %2, 2
  %13 = mul nuw nsw i32 %12, 3
  %14 = zext nneg i32 %13 to i64
  %15 = tail call noalias ptr @malloc(i64 noundef %14) #5
  %16 = icmp eq ptr %11, null
  %17 = icmp eq ptr %15, null
  %or.cond5 = or i1 %16, %17
  br i1 %or.cond5, label %18, label %iter.check

18:                                               ; preds = %10
  br i1 %16, label %20, label %19

19:                                               ; preds = %18
  tail call void @free(ptr noundef nonnull %11) #6
  br label %20

20:                                               ; preds = %19, %18
  br i1 %17, label %iter.check, label %21

21:                                               ; preds = %20
  tail call void @free(ptr noundef nonnull %15) #6
  br label %iter.check

iter.check:                                       ; preds = %20, %21, %10
  %22 = zext nneg i32 %12 to i64
  %23 = shl nuw nsw i32 %12, 1
  %24 = zext nneg i32 %23 to i64
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %iter.check
  %index = phi i64 [ 0, %iter.check ], [ %index.next, %vector.body ]
  %vec.ind = phi <16 x i32> [ <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>, %iter.check ], [ %vec.ind.next, %vector.body ]
  %25 = uitofp <16 x i32> %vec.ind to <16 x float>
  %26 = tail call <16 x float> @llvm.sqrt.v16f32(<16 x float> %25)
  %27 = fadd <16 x float> %26, <float 5.000000e-01, float 5.000000e-01, float 5.000000e-01, float 5.000000e-01, float 5.000000e-01, float 5.000000e-01, float 5.000000e-01, float 5.000000e-01, float 5.000000e-01, float 5.000000e-01, float 5.000000e-01, float 5.000000e-01, float 5.000000e-01, float 5.000000e-01, float 5.000000e-01, float 5.000000e-01>
  %28 = fptosi <16 x float> %27 to <16 x i32>
  %29 = icmp ult <16 x i32> %28, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255>
  %30 = fptoui <16 x float> %27 to <16 x i8>
  %31 = select <16 x i1> %29, <16 x i8> %30, <16 x i8> <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
  %32 = getelementptr inbounds i8, ptr %11, i64 %index
  store <16 x i8> %31, ptr %32, align 1, !tbaa !5
  %index.next = add nuw i64 %index, 16
  %vec.ind.next = add <16 x i32> %vec.ind, <i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16, i32 16>
  %33 = icmp eq i64 %index.next, 65024
  br i1 %33, label %vec.epilog.vector.body, label %vector.body, !llvm.loop !8

vec.epilog.vector.body:                           ; preds = %vector.body
  %34 = getelementptr inbounds i8, ptr %11, i64 65024
  store <2 x i8> <i8 -1, i8 -1>, ptr %34, align 1, !tbaa !5
  %35 = getelementptr inbounds i8, ptr %15, i64 %22
  %36 = getelementptr inbounds i8, ptr %15, i64 %24
  %37 = load i8, ptr %0, align 1
  store i8 %37, ptr %35, align 1
  %38 = getelementptr inbounds i8, ptr %35, i64 1
  %39 = zext nneg i32 %2 to i64
  tail call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %38, ptr nonnull align 1 %0, i64 %39, i1 false)
  %40 = getelementptr inbounds i8, ptr %35, i64 %39
  %41 = getelementptr inbounds i8, ptr %40, i64 1
  %42 = getelementptr inbounds i8, ptr %0, i64 %39
  %43 = getelementptr inbounds i8, ptr %42, i64 -1
  %44 = load i8, ptr %43, align 1
  store i8 %44, ptr %41, align 1
  tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 1 dereferenceable(1) %15, ptr noundef nonnull align 1 dereferenceable(1) %35, i64 %22, i1 false)
  %45 = load i8, ptr %42, align 1
  store i8 %45, ptr %36, align 1
  %46 = getelementptr inbounds i8, ptr %36, i64 1
  tail call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %46, ptr nonnull align 1 %42, i64 %39, i1 false)
  %47 = getelementptr inbounds i8, ptr %36, i64 %39
  %48 = getelementptr inbounds i8, ptr %47, i64 1
  %49 = getelementptr inbounds i8, ptr %42, i64 %39
  %50 = getelementptr inbounds i8, ptr %49, i64 -1
  %51 = load i8, ptr %50, align 1
  store i8 %51, ptr %48, align 1
  %52 = icmp sgt i32 %3, 0
  br i1 %52, label %.lr.ph164, label %._crit_edge165.thread

.lr.ph164:                                        ; preds = %vec.epilog.vector.body
  %53 = add nsw i32 %3, -1
  %54 = icmp sgt i32 %2, 0
  %55 = zext nneg i32 %53 to i64
  %wide.trip.count181 = zext nneg i32 %3 to i64
  br i1 %54, label %.lr.ph164.split.us, label %.lr.ph164.split.preheader

.lr.ph164.split.preheader:                        ; preds = %.lr.ph164
  %56 = icmp eq i32 %53, 0
  br i1 %56, label %._crit_edge165.thread, label %.lr.ph164.split.peel.next

.lr.ph164.split.peel.next:                        ; preds = %.lr.ph164.split.preheader
  store i8 %45, ptr %36, align 1
  tail call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %46, ptr nonnull align 1 %42, i64 %39, i1 false)
  store i8 %51, ptr %48, align 1
  br label %.lr.ph164.split

.lr.ph164.split.us:                               ; preds = %.lr.ph164, %._crit_edge.us
  %indvars.iv178 = phi i64 [ %indvars.iv.next179, %._crit_edge.us ], [ 0, %.lr.ph164 ]
  %.0162.us = phi ptr [ %.1.us, %._crit_edge.us ], [ %15, %.lr.ph164 ]
  %.0125161.us = phi ptr [ %.1126.us, %._crit_edge.us ], [ %35, %.lr.ph164 ]
  %.0127160.us = phi ptr [ %.1128.us, %._crit_edge.us ], [ %36, %.lr.ph164 ]
  %57 = mul nuw nsw i64 %indvars.iv178, %39
  %58 = getelementptr inbounds i8, ptr %1, i64 %57
  %.not143.us = icmp eq i64 %indvars.iv178, 0
  %.1128.us = select i1 %.not143.us, ptr %.0127160.us, ptr %.0162.us
  %.1126.us = select i1 %.not143.us, ptr %.0125161.us, ptr %.0127160.us
  %.1.us = select i1 %.not143.us, ptr %.0162.us, ptr %.0125161.us
  %59 = icmp eq i64 %indvars.iv178, %55
  br i1 %59, label %71, label %60

60:                                               ; preds = %.lr.ph164.split.us
  %61 = add nuw nsw i64 %indvars.iv178, 1
  %62 = mul nuw nsw i64 %61, %39
  %63 = getelementptr inbounds i8, ptr %0, i64 %62
  %64 = load i8, ptr %63, align 1
  store i8 %64, ptr %.1128.us, align 1
  %65 = getelementptr inbounds i8, ptr %.1128.us, i64 1
  tail call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %65, ptr nonnull align 1 %63, i64 %39, i1 false)
  %66 = getelementptr inbounds i8, ptr %.1128.us, i64 %39
  %67 = getelementptr inbounds i8, ptr %66, i64 1
  %68 = getelementptr inbounds i8, ptr %63, i64 %39
  %69 = getelementptr inbounds i8, ptr %68, i64 -1
  %70 = load i8, ptr %69, align 1
  store i8 %70, ptr %67, align 1
  br label %.lr.ph.us

71:                                               ; preds = %.lr.ph164.split.us
  tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 1 dereferenceable(1) %.1128.us, ptr noundef nonnull align 1 dereferenceable(1) %.1126.us, i64 %22, i1 false)
  %.pre184.pre = load i8, ptr %.1128.us, align 1, !tbaa !5
  br label %.lr.ph.us

.lr.ph.us:                                        ; preds = %71, %60
  %.pre184 = phi i8 [ %.pre184.pre, %71 ], [ %64, %60 ]
  %invariant.gep.us = getelementptr inbounds i8, ptr %.1.us, i64 3
  %.pre = load i8, ptr %.1.us, align 1, !tbaa !5
  %.phi.trans.insert = getelementptr inbounds i8, ptr %.1.us, i64 1
  %.pre183 = load i8, ptr %.phi.trans.insert, align 1, !tbaa !5
  %.phi.trans.insert185 = getelementptr inbounds i8, ptr %.1128.us, i64 1
  %.pre186 = load i8, ptr %.phi.trans.insert185, align 1, !tbaa !5
  br label %72

72:                                               ; preds = %.lr.ph.us, %72
  %73 = phi i8 [ %.pre186, %.lr.ph.us ], [ %85, %72 ]
  %74 = phi i8 [ %.pre184, %.lr.ph.us ], [ %73, %72 ]
  %75 = phi i8 [ %.pre183, %.lr.ph.us ], [ %94, %72 ]
  %76 = phi i8 [ %.pre, %.lr.ph.us ], [ %75, %72 ]
  %indvars.iv173 = phi i64 [ 0, %.lr.ph.us ], [ %indvars.iv.next174, %72 ]
  %77 = zext i8 %76 to i32
  %indvars.iv.next174 = add nuw nsw i64 %indvars.iv173, 1
  %78 = zext i8 %75 to i32
  %gep.us = getelementptr inbounds i8, ptr %invariant.gep.us, i64 %indvars.iv173
  %79 = load i8, ptr %gep.us, align 1, !tbaa !5
  %80 = zext i8 %79 to i32
  %81 = zext i8 %74 to i32
  %82 = zext i8 %73 to i32
  %83 = add nuw nsw i64 %indvars.iv173, 2
  %84 = getelementptr inbounds i8, ptr %.1128.us, i64 %83
  %85 = load i8, ptr %84, align 1, !tbaa !5
  %86 = zext i8 %85 to i32
  %reass.add.us = sub nsw i32 %78, %82
  %reass.mul.us = shl nsw i32 %reass.add.us, 1
  %.neg149.us = add nuw nsw i32 %80, %77
  %87 = add nuw nsw i32 %81, %86
  %88 = sub nsw i32 %.neg149.us, %87
  %89 = add nsw i32 %88, %reass.mul.us
  %90 = getelementptr inbounds i8, ptr %.1126.us, i64 %indvars.iv173
  %91 = load i8, ptr %90, align 1, !tbaa !5
  %92 = zext i8 %91 to i32
  %93 = getelementptr inbounds i8, ptr %.1.us, i64 %83
  %94 = load i8, ptr %93, align 1, !tbaa !5
  %95 = zext i8 %94 to i32
  %96 = getelementptr inbounds i8, ptr %.1126.us, i64 %83
  %97 = load i8, ptr %96, align 1, !tbaa !5
  %98 = zext i8 %97 to i32
  %reass.add155.us = sub nsw i32 %92, %98
  %reass.mul156.us = shl nsw i32 %reass.add155.us, 1
  %.neg153.us = add nuw nsw i32 %81, %77
  %99 = add nuw nsw i32 %86, %95
  %100 = sub nsw i32 %.neg153.us, %99
  %101 = add nsw i32 %100, %reass.mul156.us
  %102 = mul nsw i32 %89, %89
  %103 = mul nsw i32 %101, %101
  %104 = add nuw nsw i32 %103, %102
  %105 = tail call i32 @llvm.umin.i32(i32 %104, i32 65025)
  %106 = zext nneg i32 %105 to i64
  %107 = getelementptr inbounds i8, ptr %11, i64 %106
  %108 = load i8, ptr %107, align 1, !tbaa !5
  %109 = getelementptr inbounds i8, ptr %58, i64 %indvars.iv173
  store i8 %108, ptr %109, align 1, !tbaa !5
  %exitcond177.not = icmp eq i64 %indvars.iv.next174, %39
  br i1 %exitcond177.not, label %._crit_edge.us, label %72, !llvm.loop !12

._crit_edge.us:                                   ; preds = %72
  %indvars.iv.next179 = add nuw nsw i64 %indvars.iv178, 1
  %exitcond182.not = icmp eq i64 %indvars.iv.next179, %wide.trip.count181
  br i1 %exitcond182.not, label %._crit_edge165, label %.lr.ph164.split.us, !llvm.loop !13

._crit_edge165:                                   ; preds = %123, %._crit_edge.us
  br i1 %17, label %124, label %._crit_edge165.thread

.lr.ph164.split:                                  ; preds = %.lr.ph164.split.peel.next, %123
  %indvars.iv168 = phi i64 [ 1, %.lr.ph164.split.peel.next ], [ %indvars.iv.next169.pre-phi, %123 ]
  %.0162 = phi ptr [ %15, %.lr.ph164.split.peel.next ], [ %.0125161, %123 ]
  %.0125161 = phi ptr [ %35, %.lr.ph164.split.peel.next ], [ %.0127160, %123 ]
  %.0127160 = phi ptr [ %36, %.lr.ph164.split.peel.next ], [ %.0162, %123 ]
  %110 = icmp eq i64 %indvars.iv168, %55
  br i1 %110, label %111, label %112

111:                                              ; preds = %.lr.ph164.split
  tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 1 dereferenceable(1) %.0162, ptr noundef nonnull align 1 dereferenceable(1) %.0127160, i64 %22, i1 false)
  %.pre188 = add nuw nsw i64 %indvars.iv168, 1
  br label %123

112:                                              ; preds = %.lr.ph164.split
  %113 = add nuw nsw i64 %indvars.iv168, 1
  %114 = mul nuw nsw i64 %113, %39
  %115 = getelementptr inbounds i8, ptr %0, i64 %114
  %116 = load i8, ptr %115, align 1
  store i8 %116, ptr %.0162, align 1
  %117 = getelementptr inbounds i8, ptr %.0162, i64 1
  tail call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 1 %117, ptr nonnull align 1 %115, i64 %39, i1 false)
  %118 = getelementptr inbounds i8, ptr %.0162, i64 %39
  %119 = getelementptr inbounds i8, ptr %118, i64 1
  %120 = getelementptr inbounds i8, ptr %115, i64 %39
  %121 = getelementptr inbounds i8, ptr %120, i64 -1
  %122 = load i8, ptr %121, align 1
  store i8 %122, ptr %119, align 1
  br label %123

123:                                              ; preds = %112, %111
  %indvars.iv.next169.pre-phi = phi i64 [ %113, %112 ], [ %.pre188, %111 ]
  %exitcond171.not = icmp eq i64 %indvars.iv.next169.pre-phi, %wide.trip.count181
  br i1 %exitcond171.not, label %._crit_edge165, label %.lr.ph164.split, !llvm.loop !14

._crit_edge165.thread:                            ; preds = %.lr.ph164.split.preheader, %vec.epilog.vector.body, %._crit_edge165
  tail call void @free(ptr noundef nonnull %15) #6
  br label %124

124:                                              ; preds = %._crit_edge165.thread, %._crit_edge165
  br i1 %16, label %126, label %125

125:                                              ; preds = %124
  tail call void @free(ptr noundef nonnull %11) #6
  br label %126

126:                                              ; preds = %124, %125, %7, %4
  ret void
}

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

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare <16 x float> @llvm.sqrt.v16f32(<16 x float>) #4

attributes #0 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { mustprogress nofree nounwind willreturn allockind("alloc,uninitialized") allocsize(0) memory(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 #2 = { 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 #3 = { 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 #4 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #5 = { nounwind allocsize(0) }
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 = !{!"omnipotent char", !7, i64 0}
!7 = !{!"Simple C/C++ TBAA"}
!8 = distinct !{!8, !9, !10, !11}
!9 = !{!"llvm.loop.mustprogress"}
!10 = !{!"llvm.loop.isvectorized", i32 1}
!11 = !{!"llvm.loop.unroll.runtime.disable"}
!12 = distinct !{!12, !9}
!13 = distinct !{!13, !9}
!14 = distinct !{!14, !9, !15}
!15 = !{!"llvm.loop.peeled.count", i32 1}


; Effective O3 passes: AggressiveInstCombinePass,BDCEPass,CorrelatedValuePropagationPass,DSEPass,EarlyCSEPass,GVNPass,GlobalDCEPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LICMPass,LoopFullUnrollPass,LoopInstSimplifyPass,LoopLoadEliminationPass,LoopRotatePass,LoopSimplifyCFGPass,LoopSimplifyPass,LoopUnrollPass,LoopVectorizePass,PostOrderFunctionAttrsPass,ReassociatePass,SLPVectorizerPass,SROAPass,SimplifyCFGPass,TailCallElimPass