; LLVM IR from whoiswelliton/Computer_Engineering_UTFPR-PB :: Embedded_Systems/TIVA Connected TM4C1294XL Projects/01 - lwIP_HTTPServer_on_TIVA (recvmsg)

; 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.msghdr = type { ptr, i32, ptr, i32, ptr, i32, i32 }
%struct.iovec = type { ptr, i64 }
%struct.lwip_sock = type { ptr, %union.lwip_sock_lastdata, i16, i16, i16, i8 }
%union.lwip_sock_lastdata = type { ptr }
%struct.netconn = type { i32, i32, %union.anon, i8, ptr, ptr, ptr, i32, i32, i32, i8, ptr, ptr }
%union.anon = type { ptr }

@errno = external global i32, align 4
@.str = external hidden unnamed_addr constant [40 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [181 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [38 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [32 x i8], align 1

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

; Function Attrs: nounwind uwtable
declare hidden ptr @get_socket(i32 noundef) #1

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

declare i32 @err_to_errno(i8 noundef signext) #2

declare i32 @printf(ptr noundef, ...) #2

; Function Attrs: nounwind uwtable
declare hidden i64 @lwip_recv_tcp(ptr noundef, ptr noundef, i64 noundef, i32 noundef) #1

; Function Attrs: nounwind uwtable
declare hidden signext i8 @lwip_recvfrom_udp_raw(ptr noundef, i32 noundef, ptr noundef, ptr noundef, i32 noundef) #1

; Function Attrs: nounwind uwtable
define dso_local i64 @lwip_recvmsg(i32 noundef %0, ptr noundef %1, i32 noundef %2) #1 {
  %4 = alloca i64, align 8
  %5 = alloca i32, align 4
  %6 = alloca ptr, align 8
  %7 = alloca i32, align 4
  %8 = alloca ptr, align 8
  %9 = alloca i32, align 4
  %10 = alloca i64, align 8
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca i64, align 8
  %15 = alloca i32, align 4
  %16 = alloca i16, align 2
  %17 = alloca i8, align 1
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  store i32 %0, ptr %5, align 4, !tbaa !5
  store ptr %1, ptr %6, align 8, !tbaa !9
  store i32 %2, ptr %7, align 4, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #3
  br label %20

20:                                               ; preds = %3
  %21 = load ptr, ptr %6, align 8, !tbaa !9
  %22 = icmp ne ptr %21, null
  br i1 %22, label %28, label %23

23:                                               ; preds = %20
  br label %24

24:                                               ; preds = %23
  %25 = call i32 (ptr, ...) @printf(ptr noundef @.str, ptr noundef @.str.8, i32 noundef 1288, ptr noundef @.str.2)
  br label %26

26:                                               ; preds = %24
  br label %27

27:                                               ; preds = %26
  store i64 -16, ptr %4, align 8
  store i32 1, ptr %11, align 4
  br label %284

28:                                               ; preds = %20
  br label %29

29:                                               ; preds = %28
  br label %30

30:                                               ; preds = %29
  br label %31

31:                                               ; preds = %30
  %32 = load i32, ptr %7, align 4, !tbaa !5
  %33 = and i32 %32, -10
  %34 = icmp eq i32 %33, 0
  br i1 %34, label %43, label %35

35:                                               ; preds = %31
  br label %36

36:                                               ; preds = %35
  %37 = call i32 (ptr, ...) @printf(ptr noundef @.str, ptr noundef @.str.9, i32 noundef 1290, ptr noundef @.str.2)
  br label %38

38:                                               ; preds = %36
  br label %39

39:                                               ; preds = %38
  br label %40

40:                                               ; preds = %39
  store i32 95, ptr @errno, align 4, !tbaa !5
  br label %41

41:                                               ; preds = %40
  br label %42

42:                                               ; preds = %41
  store i64 -1, ptr %4, align 8
  store i32 1, ptr %11, align 4
  br label %284

43:                                               ; preds = %31
  br label %44

44:                                               ; preds = %43
  br label %45

45:                                               ; preds = %44
  %46 = load ptr, ptr %6, align 8, !tbaa !9
  %47 = getelementptr inbounds %struct.msghdr, ptr %46, i32 0, i32 3
  %48 = load i32, ptr %47, align 8, !tbaa !11
  %49 = icmp sle i32 %48, 0
  br i1 %49, label %55, label %50

50:                                               ; preds = %45
  %51 = load ptr, ptr %6, align 8, !tbaa !9
  %52 = getelementptr inbounds %struct.msghdr, ptr %51, i32 0, i32 3
  %53 = load i32, ptr %52, align 8, !tbaa !11
  %54 = icmp sgt i32 %53, 65535
  br i1 %54, label %55, label %59

55:                                               ; preds = %50, %45
  br label %56

56:                                               ; preds = %55
  store i32 90, ptr @errno, align 4, !tbaa !5
  br label %57

57:                                               ; preds = %56
  br label %58

58:                                               ; preds = %57
  store i64 -1, ptr %4, align 8
  store i32 1, ptr %11, align 4
  br label %284

59:                                               ; preds = %50
  %60 = load i32, ptr %5, align 4, !tbaa !5
  %61 = call ptr @get_socket(i32 noundef %60)
  store ptr %61, ptr %8, align 8, !tbaa !9
  %62 = load ptr, ptr %8, align 8, !tbaa !9
  %63 = icmp ne ptr %62, null
  br i1 %63, label %65, label %64

64:                                               ; preds = %59
  store i64 -1, ptr %4, align 8
  store i32 1, ptr %11, align 4
  br label %284

65:                                               ; preds = %59
  store i64 0, ptr %10, align 8, !tbaa !13
  store i32 0, ptr %9, align 4, !tbaa !5
  br label %66

66:                                               ; preds = %146, %65
  %67 = load i32, ptr %9, align 4, !tbaa !5
  %68 = load ptr, ptr %6, align 8, !tbaa !9
  %69 = getelementptr inbounds %struct.msghdr, ptr %68, i32 0, i32 3
  %70 = load i32, ptr %69, align 8, !tbaa !11
  %71 = icmp slt i32 %67, %70
  br i1 %71, label %72, label %149

72:                                               ; preds = %66
  %73 = load ptr, ptr %6, align 8, !tbaa !9
  %74 = getelementptr inbounds %struct.msghdr, ptr %73, i32 0, i32 2
  %75 = load ptr, ptr %74, align 8, !tbaa !15
  %76 = load i32, ptr %9, align 4, !tbaa !5
  %77 = sext i32 %76 to i64
  %78 = getelementptr inbounds %struct.iovec, ptr %75, i64 %77
  %79 = getelementptr inbounds %struct.iovec, ptr %78, i32 0, i32 0
  %80 = load ptr, ptr %79, align 8, !tbaa !16
  %81 = icmp eq ptr %80, null
  br i1 %81, label %122, label %82

82:                                               ; preds = %72
  %83 = load ptr, ptr %6, align 8, !tbaa !9
  %84 = getelementptr inbounds %struct.msghdr, ptr %83, i32 0, i32 2
  %85 = load ptr, ptr %84, align 8, !tbaa !15
  %86 = load i32, ptr %9, align 4, !tbaa !5
  %87 = sext i32 %86 to i64
  %88 = getelementptr inbounds %struct.iovec, ptr %85, i64 %87
  %89 = getelementptr inbounds %struct.iovec, ptr %88, i32 0, i32 1
  %90 = load i64, ptr %89, align 8, !tbaa !18
  %91 = icmp sle i64 %90, 0
  br i1 %91, label %122, label %92

92:                                               ; preds = %82
  %93 = load ptr, ptr %6, align 8, !tbaa !9
  %94 = getelementptr inbounds %struct.msghdr, ptr %93, i32 0, i32 2
  %95 = load ptr, ptr %94, align 8, !tbaa !15
  %96 = load i32, ptr %9, align 4, !tbaa !5
  %97 = sext i32 %96 to i64
  %98 = getelementptr inbounds %struct.iovec, ptr %95, i64 %97
  %99 = getelementptr inbounds %struct.iovec, ptr %98, i32 0, i32 1
  %100 = load i64, ptr %99, align 8, !tbaa !18
  %101 = load ptr, ptr %6, align 8, !tbaa !9
  %102 = getelementptr inbounds %struct.msghdr, ptr %101, i32 0, i32 2
  %103 = load ptr, ptr %102, align 8, !tbaa !15
  %104 = load i32, ptr %9, align 4, !tbaa !5
  %105 = sext i32 %104 to i64
  %106 = getelementptr inbounds %struct.iovec, ptr %103, i64 %105
  %107 = getelementptr inbounds %struct.iovec, ptr %106, i32 0, i32 1
  %108 = load i64, ptr %107, align 8, !tbaa !18
  %109 = icmp ne i64 %100, %108
  br i1 %109, label %122, label %110

110:                                              ; preds = %92
  %111 = load i64, ptr %10, align 8, !tbaa !13
  %112 = load ptr, ptr %6, align 8, !tbaa !9
  %113 = getelementptr inbounds %struct.msghdr, ptr %112, i32 0, i32 2
  %114 = load ptr, ptr %113, align 8, !tbaa !15
  %115 = load i32, ptr %9, align 4, !tbaa !5
  %116 = sext i32 %115 to i64
  %117 = getelementptr inbounds %struct.iovec, ptr %114, i64 %116
  %118 = getelementptr inbounds %struct.iovec, ptr %117, i32 0, i32 1
  %119 = load i64, ptr %118, align 8, !tbaa !18
  %120 = add nsw i64 %111, %119
  %121 = icmp sle i64 %120, 0
  br i1 %121, label %122, label %135

122:                                              ; preds = %110, %92, %82, %72
  br label %123

123:                                              ; preds = %122
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #3
  %124 = call i32 @err_to_errno(i8 noundef signext -6)
  store i32 %124, ptr %12, align 4, !tbaa !5
  br label %125

125:                                              ; preds = %123
  %126 = load i32, ptr %12, align 4, !tbaa !5
  %127 = icmp ne i32 %126, 0
  br i1 %127, label %128, label %130

128:                                              ; preds = %125
  %129 = load i32, ptr %12, align 4, !tbaa !5
  store i32 %129, ptr @errno, align 4, !tbaa !5
  br label %130

130:                                              ; preds = %128, %125
  br label %131

131:                                              ; preds = %130
  br label %132

132:                                              ; preds = %131
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #3
  br label %133

133:                                              ; preds = %132
  br label %134

134:                                              ; preds = %133
  store i64 -1, ptr %4, align 8
  store i32 1, ptr %11, align 4
  br label %284

135:                                              ; preds = %110
  %136 = load i64, ptr %10, align 8, !tbaa !13
  %137 = load ptr, ptr %6, align 8, !tbaa !9
  %138 = getelementptr inbounds %struct.msghdr, ptr %137, i32 0, i32 2
  %139 = load ptr, ptr %138, align 8, !tbaa !15
  %140 = load i32, ptr %9, align 4, !tbaa !5
  %141 = sext i32 %140 to i64
  %142 = getelementptr inbounds %struct.iovec, ptr %139, i64 %141
  %143 = getelementptr inbounds %struct.iovec, ptr %142, i32 0, i32 1
  %144 = load i64, ptr %143, align 8, !tbaa !18
  %145 = add nsw i64 %136, %144
  store i64 %145, ptr %10, align 8, !tbaa !13
  br label %146

146:                                              ; preds = %135
  %147 = load i32, ptr %9, align 4, !tbaa !5
  %148 = add nsw i32 %147, 1
  store i32 %148, ptr %9, align 4, !tbaa !5
  br label %66, !llvm.loop !19

149:                                              ; preds = %66
  %150 = load ptr, ptr %8, align 8, !tbaa !9
  %151 = getelementptr inbounds %struct.lwip_sock, ptr %150, i32 0, i32 0
  %152 = load ptr, ptr %151, align 8, !tbaa !21
  %153 = getelementptr inbounds %struct.netconn, ptr %152, i32 0, i32 0
  %154 = load i32, ptr %153, align 8, !tbaa !24
  %155 = and i32 %154, 240
  %156 = icmp eq i32 %155, 16
  br i1 %156, label %157, label %240

157:                                              ; preds = %149
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #3
  %158 = load i32, ptr %7, align 4, !tbaa !5
  store i32 %158, ptr %13, align 4, !tbaa !5
  %159 = load ptr, ptr %6, align 8, !tbaa !9
  %160 = getelementptr inbounds %struct.msghdr, ptr %159, i32 0, i32 6
  store i32 0, ptr %160, align 4, !tbaa !26
  store i64 0, ptr %10, align 8, !tbaa !13
  store i32 0, ptr %9, align 4, !tbaa !5
  br label %161

161:                                              ; preds = %225, %157
  %162 = load i32, ptr %9, align 4, !tbaa !5
  %163 = load ptr, ptr %6, align 8, !tbaa !9
  %164 = getelementptr inbounds %struct.msghdr, ptr %163, i32 0, i32 3
  %165 = load i32, ptr %164, align 8, !tbaa !11
  %166 = icmp slt i32 %162, %165
  br i1 %166, label %167, label %228

167:                                              ; preds = %161
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #3
  %168 = load ptr, ptr %8, align 8, !tbaa !9
  %169 = load ptr, ptr %6, align 8, !tbaa !9
  %170 = getelementptr inbounds %struct.msghdr, ptr %169, i32 0, i32 2
  %171 = load ptr, ptr %170, align 8, !tbaa !15
  %172 = load i32, ptr %9, align 4, !tbaa !5
  %173 = sext i32 %172 to i64
  %174 = getelementptr inbounds %struct.iovec, ptr %171, i64 %173
  %175 = getelementptr inbounds %struct.iovec, ptr %174, i32 0, i32 0
  %176 = load ptr, ptr %175, align 8, !tbaa !16
  %177 = load ptr, ptr %6, align 8, !tbaa !9
  %178 = getelementptr inbounds %struct.msghdr, ptr %177, i32 0, i32 2
  %179 = load ptr, ptr %178, align 8, !tbaa !15
  %180 = load i32, ptr %9, align 4, !tbaa !5
  %181 = sext i32 %180 to i64
  %182 = getelementptr inbounds %struct.iovec, ptr %179, i64 %181
  %183 = getelementptr inbounds %struct.iovec, ptr %182, i32 0, i32 1
  %184 = load i64, ptr %183, align 8, !tbaa !18
  %185 = load i32, ptr %13, align 4, !tbaa !5
  %186 = call i64 @lwip_recv_tcp(ptr noundef %168, ptr noundef %176, i64 noundef %184, i32 noundef %185)
  store i64 %186, ptr %14, align 8, !tbaa !13
  %187 = load i64, ptr %14, align 8, !tbaa !13
  %188 = icmp sgt i64 %187, 0
  br i1 %188, label %189, label %193

189:                                              ; preds = %167
  %190 = load i64, ptr %14, align 8, !tbaa !13
  %191 = load i64, ptr %10, align 8, !tbaa !13
  %192 = add nsw i64 %191, %190
  store i64 %192, ptr %10, align 8, !tbaa !13
  br label %193

193:                                              ; preds = %189, %167
  %194 = load i64, ptr %14, align 8, !tbaa !13
  %195 = icmp slt i64 %194, 0
  br i1 %195, label %213, label %196

196:                                              ; preds = %193
  %197 = load i64, ptr %14, align 8, !tbaa !13
  %198 = load ptr, ptr %6, align 8, !tbaa !9
  %199 = getelementptr inbounds %struct.msghdr, ptr %198, i32 0, i32 2
  %200 = load ptr, ptr %199, align 8, !tbaa !15
  %201 = load i32, ptr %9, align 4, !tbaa !5
  %202 = sext i32 %201 to i64
  %203 = getelementptr inbounds %struct.iovec, ptr %200, i64 %202
  %204 = getelementptr inbounds %struct.iovec, ptr %203, i32 0, i32 1
  %205 = load i64, ptr %204, align 8, !tbaa !18
  %206 = trunc i64 %205 to i32
  %207 = sext i32 %206 to i64
  %208 = icmp slt i64 %197, %207
  br i1 %208, label %213, label %209

209:                                              ; preds = %196
  %210 = load i32, ptr %7, align 4, !tbaa !5
  %211 = and i32 %210, 1
  %212 = icmp ne i32 %211, 0
  br i1 %212, label %213, label %219

213:                                              ; preds = %209, %196, %193
  %214 = load i64, ptr %10, align 8, !tbaa !13
  %215 = icmp sle i64 %214, 0
  br i1 %215, label %216, label %218

216:                                              ; preds = %213
  %217 = load i64, ptr %14, align 8, !tbaa !13
  store i64 %217, ptr %10, align 8, !tbaa !13
  br label %218

218:                                              ; preds = %216, %213
  store i32 21, ptr %11, align 4
  br label %222

219:                                              ; preds = %209
  %220 = load i32, ptr %13, align 4, !tbaa !5
  %221 = or i32 %220, 8
  store i32 %221, ptr %13, align 4, !tbaa !5
  store i32 0, ptr %11, align 4
  br label %222

222:                                              ; preds = %219, %218
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #3
  %223 = load i32, ptr %11, align 4
  switch i32 %223, label %286 [
    i32 0, label %224
    i32 21, label %228
  ]

224:                                              ; preds = %222
  br label %225

225:                                              ; preds = %224
  %226 = load i32, ptr %9, align 4, !tbaa !5
  %227 = add nsw i32 %226, 1
  store i32 %227, ptr %9, align 4, !tbaa !5
  br label %161, !llvm.loop !27

228:                                              ; preds = %222, %161
  %229 = load i64, ptr %10, align 8, !tbaa !13
  %230 = icmp sgt i64 %229, 0
  br i1 %230, label %231, label %238

231:                                              ; preds = %228
  br label %232

232:                                              ; preds = %231
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #3
  store i32 0, ptr %15, align 4, !tbaa !5
  br label %233

233:                                              ; preds = %232
  br label %234

234:                                              ; preds = %233
  br label %235

235:                                              ; preds = %234
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #3
  br label %236

236:                                              ; preds = %235
  br label %237

237:                                              ; preds = %236
  br label %238

238:                                              ; preds = %237, %228
  %239 = load i64, ptr %10, align 8, !tbaa !13
  store i64 %239, ptr %4, align 8
  store i32 1, ptr %11, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #3
  br label %284

240:                                              ; preds = %149
  call void @llvm.lifetime.start.p0(i64 2, ptr %16) #3
  store i16 0, ptr %16, align 2, !tbaa !28
  call void @llvm.lifetime.start.p0(i64 1, ptr %17) #3
  %241 = load ptr, ptr %8, align 8, !tbaa !9
  %242 = load i32, ptr %7, align 4, !tbaa !5
  %243 = load ptr, ptr %6, align 8, !tbaa !9
  %244 = load i32, ptr %5, align 4, !tbaa !5
  %245 = call signext i8 @lwip_recvfrom_udp_raw(ptr noundef %241, i32 noundef %242, ptr noundef %243, ptr noundef %16, i32 noundef %244)
  store i8 %245, ptr %17, align 1, !tbaa !29
  %246 = load i8, ptr %17, align 1, !tbaa !29
  %247 = sext i8 %246 to i32
  %248 = icmp ne i32 %247, 0
  br i1 %248, label %249, label %263

249:                                              ; preds = %240
  br label %250

250:                                              ; preds = %249
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #3
  %251 = load i8, ptr %17, align 1, !tbaa !29
  %252 = call i32 @err_to_errno(i8 noundef signext %251)
  store i32 %252, ptr %18, align 4, !tbaa !5
  br label %253

253:                                              ; preds = %250
  %254 = load i32, ptr %18, align 4, !tbaa !5
  %255 = icmp ne i32 %254, 0
  br i1 %255, label %256, label %258

256:                                              ; preds = %253
  %257 = load i32, ptr %18, align 4, !tbaa !5
  store i32 %257, ptr @errno, align 4, !tbaa !5
  br label %258

258:                                              ; preds = %256, %253
  br label %259

259:                                              ; preds = %258
  br label %260

260:                                              ; preds = %259
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #3
  br label %261

261:                                              ; preds = %260
  br label %262

262:                                              ; preds = %261
  store i64 -1, ptr %4, align 8
  store i32 1, ptr %11, align 4
  br label %283

263:                                              ; preds = %240
  %264 = load i16, ptr %16, align 2, !tbaa !28
  %265 = zext i16 %264 to i64
  %266 = load i64, ptr %10, align 8, !tbaa !13
  %267 = icmp sgt i64 %265, %266
  br i1 %267, label %268, label %273

268:                                              ; preds = %263
  %269 = load ptr, ptr %6, align 8, !tbaa !9
  %270 = getelementptr inbounds %struct.msghdr, ptr %269, i32 0, i32 6
  %271 = load i32, ptr %270, align 4, !tbaa !26
  %272 = or i32 %271, 4
  store i32 %272, ptr %270, align 4, !tbaa !26
  br label %273

273:                                              ; preds = %268, %263
  br label %274

274:                                              ; preds = %273
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #3
  store i32 0, ptr %19, align 4, !tbaa !5
  br label %275

275:                                              ; preds = %274
  br label %276

276:                                              ; preds = %275
  br label %277

277:                                              ; preds = %276
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #3
  br label %278

278:                                              ; preds = %277
  br label %279

279:                                              ; preds = %278
  %280 = load i16, ptr %16, align 2, !tbaa !28
  %281 = zext i16 %280 to i32
  %282 = sext i32 %281 to i64
  store i64 %282, ptr %4, align 8
  store i32 1, ptr %11, align 4
  br label %283

283:                                              ; preds = %279, %262
  call void @llvm.lifetime.end.p0(i64 1, ptr %17) #3
  call void @llvm.lifetime.end.p0(i64 2, ptr %16) #3
  br label %284

284:                                              ; preds = %283, %238, %134, %64, %58, %42, %27
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #3
  %285 = load i64, ptr %4, align 8
  ret i64 %285

286:                                              ; preds = %222
  unreachable
}

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { "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 }

!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 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"any pointer", !7, i64 0}
!11 = !{!12, !6, i64 24}
!12 = !{!"msghdr", !10, i64 0, !6, i64 8, !10, i64 16, !6, i64 24, !10, i64 32, !6, i64 40, !6, i64 44}
!13 = !{!14, !14, i64 0}
!14 = !{!"long", !7, i64 0}
!15 = !{!12, !10, i64 16}
!16 = !{!17, !10, i64 0}
!17 = !{!"iovec", !10, i64 0, !14, i64 8}
!18 = !{!17, !14, i64 8}
!19 = distinct !{!19, !20}
!20 = !{!"llvm.loop.mustprogress"}
!21 = !{!22, !10, i64 0}
!22 = !{!"lwip_sock", !10, i64 0, !7, i64 8, !23, i64 16, !23, i64 18, !23, i64 20, !7, i64 22}
!23 = !{!"short", !7, i64 0}
!24 = !{!25, !6, i64 0}
!25 = !{!"netconn", !6, i64 0, !6, i64 4, !7, i64 8, !7, i64 16, !10, i64 24, !10, i64 32, !10, i64 40, !6, i64 48, !6, i64 52, !6, i64 56, !7, i64 60, !10, i64 64, !10, i64 72}
!26 = !{!12, !6, i64 44}
!27 = distinct !{!27, !20}
!28 = !{!23, !23, i64 0}
!29 = !{!7, !7, i64 0}


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

%struct.iovec = type { ptr, i64 }

@errno = external local_unnamed_addr global i32, align 4
@.str = external hidden unnamed_addr constant [40 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [181 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [38 x i8], align 1
@.str.9 = external hidden unnamed_addr constant [32 x i8], align 1

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

; Function Attrs: nounwind uwtable
declare hidden ptr @get_socket(i32 noundef) local_unnamed_addr #1

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

declare i32 @err_to_errno(i8 noundef signext) local_unnamed_addr #2

; Function Attrs: nofree nounwind
declare noundef i32 @printf(ptr nocapture noundef readonly, ...) local_unnamed_addr #3

; Function Attrs: nounwind uwtable
declare hidden i64 @lwip_recv_tcp(ptr noundef, ptr noundef, i64 noundef, i32 noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
declare hidden signext i8 @lwip_recvfrom_udp_raw(ptr noundef, i32 noundef, ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
define dso_local i64 @lwip_recvmsg(i32 noundef %0, ptr noundef %1, i32 noundef %2) local_unnamed_addr #1 {
  %4 = alloca i16, align 2
  %.not = icmp eq ptr %1, null
  br i1 %.not, label %5, label %7

5:                                                ; preds = %3
  %6 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str, ptr noundef nonnull @.str.8, i32 noundef 1288, ptr noundef nonnull @.str.2)
  br label %.loopexit

7:                                                ; preds = %3
  %8 = and i32 %2, -10
  %9 = icmp eq i32 %8, 0
  br i1 %9, label %12, label %10

10:                                               ; preds = %7
  %11 = tail call i32 (ptr, ...) @printf(ptr noundef nonnull dereferenceable(1) @.str, ptr noundef nonnull @.str.9, i32 noundef 1290, ptr noundef nonnull @.str.2)
  store i32 95, ptr @errno, align 4, !tbaa !5
  br label %.loopexit

12:                                               ; preds = %7
  %13 = getelementptr inbounds i8, ptr %1, i64 24
  %14 = load i32, ptr %13, align 8, !tbaa !9
  %15 = add i32 %14, -65536
  %or.cond = icmp ult i32 %15, -65535
  br i1 %or.cond, label %16, label %17

16:                                               ; preds = %12
  store i32 90, ptr @errno, align 4, !tbaa !5
  br label %.loopexit

17:                                               ; preds = %12
  %18 = tail call ptr @get_socket(i32 noundef %0)
  %.not77 = icmp eq ptr %18, null
  br i1 %.not77, label %.loopexit, label %.preheader

.preheader:                                       ; preds = %17
  %19 = load i32, ptr %13, align 8, !tbaa !9
  %20 = icmp sgt i32 %19, 0
  br i1 %20, label %.lr.ph, label %._crit_edge.thread

.lr.ph:                                           ; preds = %.preheader
  %21 = getelementptr inbounds i8, ptr %1, i64 16
  %22 = load ptr, ptr %21, align 8, !tbaa !12
  %wide.trip.count = zext nneg i32 %19 to i64
  br label %23

23:                                               ; preds = %.lr.ph, %34
  %indvars.iv = phi i64 [ 0, %.lr.ph ], [ %indvars.iv.next, %34 ]
  %.06392 = phi i64 [ 0, %.lr.ph ], [ %35, %34 ]
  %24 = getelementptr inbounds %struct.iovec, ptr %22, i64 %indvars.iv
  %25 = load ptr, ptr %24, align 8, !tbaa !13
  %26 = icmp eq ptr %25, null
  br i1 %26, label %31, label %27

27:                                               ; preds = %23
  %28 = getelementptr inbounds i8, ptr %24, i64 8
  %29 = load i64, ptr %28, align 8, !tbaa !16
  %30 = icmp slt i64 %29, 1
  br i1 %30, label %31, label %34

31:                                               ; preds = %23, %27
  %32 = tail call i32 @err_to_errno(i8 noundef signext -6) #5
  %.not81 = icmp eq i32 %32, 0
  br i1 %.not81, label %.loopexit, label %33

33:                                               ; preds = %31
  store i32 %32, ptr @errno, align 4, !tbaa !5
  br label %.loopexit

34:                                               ; preds = %27
  %35 = add nuw nsw i64 %29, %.06392
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
  br i1 %exitcond.not, label %._crit_edge, label %23, !llvm.loop !17

._crit_edge:                                      ; preds = %34
  %36 = load ptr, ptr %18, align 8, !tbaa !19
  %37 = load i32, ptr %36, align 8, !tbaa !22
  %38 = and i32 %37, 240
  %39 = icmp eq i32 %38, 16
  br i1 %39, label %45, label %82

._crit_edge.thread:                               ; preds = %.preheader
  %40 = load ptr, ptr %18, align 8, !tbaa !19
  %41 = load i32, ptr %40, align 8, !tbaa !22
  %42 = and i32 %41, 240
  %43 = icmp eq i32 %42, 16
  br i1 %43, label %.thread, label %82

.thread:                                          ; preds = %._crit_edge.thread
  %44 = getelementptr inbounds i8, ptr %1, i64 44
  store i32 0, ptr %44, align 4, !tbaa !24
  br label %.loopexit

45:                                               ; preds = %._crit_edge
  %46 = getelementptr inbounds i8, ptr %1, i64 44
  store i32 0, ptr %46, align 4, !tbaa !24
  br i1 %20, label %.lr.ph98, label %.loopexit

.lr.ph98:                                         ; preds = %45
  %47 = getelementptr inbounds i8, ptr %1, i64 16
  %48 = and i32 %2, 1
  %.not80 = icmp ne i32 %48, 0
  %49 = load ptr, ptr %47, align 8, !tbaa !12
  %50 = load ptr, ptr %49, align 8, !tbaa !13
  %51 = getelementptr inbounds i8, ptr %49, i64 8
  %52 = load i64, ptr %51, align 8, !tbaa !16
  %53 = tail call i64 @lwip_recv_tcp(ptr noundef nonnull %18, ptr noundef %50, i64 noundef %52, i32 noundef %2)
  %54 = tail call i64 @llvm.smax.i64(i64 %53, i64 0)
  %55 = icmp slt i64 %53, 0
  %or.cond115 = select i1 %.not80, i1 true, i1 %55
  br i1 %or.cond115, label %.split, label %56

56:                                               ; preds = %.lr.ph98
  %57 = load ptr, ptr %47, align 8, !tbaa !12
  %58 = getelementptr inbounds i8, ptr %57, i64 8
  %59 = load i64, ptr %58, align 8, !tbaa !16
  %sext.peel = shl i64 %59, 32
  %60 = ashr exact i64 %sext.peel, 32
  %.not101.peel = icmp slt i64 %53, %60
  br i1 %.not101.peel, label %.split, label %61

61:                                               ; preds = %56
  %62 = load i32, ptr %13, align 8, !tbaa !9
  %63 = icmp sgt i32 %62, 1
  br i1 %63, label %.lr.ph98.split, label %.loopexit

64:                                               ; preds = %76
  %indvars.iv.next107 = add nuw nsw i64 %indvars.iv106, 1
  %65 = load i32, ptr %13, align 8, !tbaa !9
  %66 = sext i32 %65 to i64
  %67 = icmp slt i64 %indvars.iv.next107, %66
  br i1 %67, label %.lr.ph98.split, label %.loopexit, !llvm.loop !25

.lr.ph98.split:                                   ; preds = %61, %64
  %68 = phi ptr [ %77, %64 ], [ %57, %61 ]
  %indvars.iv106 = phi i64 [ %indvars.iv.next107, %64 ], [ 1, %61 ]
  %.16495 = phi i64 [ %spec.select, %64 ], [ %54, %61 ]
  %69 = getelementptr inbounds %struct.iovec, ptr %68, i64 %indvars.iv106
  %70 = load ptr, ptr %69, align 8, !tbaa !13
  %71 = getelementptr inbounds i8, ptr %69, i64 8
  %72 = load i64, ptr %71, align 8, !tbaa !16
  %73 = tail call i64 @lwip_recv_tcp(ptr noundef nonnull %18, ptr noundef %70, i64 noundef %72, i32 noundef 8)
  %74 = tail call i64 @llvm.smax.i64(i64 %73, i64 0)
  %spec.select = add nuw nsw i64 %74, %.16495
  %75 = icmp slt i64 %73, 0
  br i1 %75, label %.split, label %76

76:                                               ; preds = %.lr.ph98.split
  %77 = load ptr, ptr %47, align 8, !tbaa !12
  %78 = getelementptr inbounds %struct.iovec, ptr %77, i64 %indvars.iv106, i32 1
  %79 = load i64, ptr %78, align 8, !tbaa !16
  %sext = shl i64 %79, 32
  %80 = ashr exact i64 %sext, 32
  %.not101 = icmp slt i64 %73, %80
  br i1 %.not101, label %.split, label %64

.split:                                           ; preds = %76, %.lr.ph98.split, %.lr.ph98, %56
  %.us-phi = phi i64 [ %53, %56 ], [ %53, %.lr.ph98 ], [ %73, %.lr.ph98.split ], [ %73, %76 ]
  %.us-phi100 = phi i64 [ %54, %56 ], [ %54, %.lr.ph98 ], [ %spec.select, %.lr.ph98.split ], [ %spec.select, %76 ]
  %81 = icmp eq i64 %.us-phi100, 0
  %spec.select83 = select i1 %81, i64 %.us-phi, i64 %.us-phi100
  br label %.loopexit

82:                                               ; preds = %._crit_edge.thread, %._crit_edge
  %.063.lcssa111 = phi i64 [ 0, %._crit_edge.thread ], [ %35, %._crit_edge ]
  call void @llvm.lifetime.start.p0(i64 2, ptr nonnull %4) #5
  store i16 0, ptr %4, align 2, !tbaa !27
  %83 = call signext i8 @lwip_recvfrom_udp_raw(ptr noundef nonnull %18, i32 noundef %2, ptr noundef nonnull %1, ptr noundef nonnull %4, i32 noundef %0)
  %.not78 = icmp eq i8 %83, 0
  br i1 %.not78, label %87, label %84

84:                                               ; preds = %82
  %85 = call i32 @err_to_errno(i8 noundef signext %83) #5
  %.not79 = icmp eq i32 %85, 0
  br i1 %.not79, label %95, label %86

86:                                               ; preds = %84
  store i32 %85, ptr @errno, align 4, !tbaa !5
  br label %95

87:                                               ; preds = %82
  %88 = load i16, ptr %4, align 2, !tbaa !27
  %89 = zext i16 %88 to i64
  %90 = icmp slt i64 %.063.lcssa111, %89
  br i1 %90, label %91, label %95

91:                                               ; preds = %87
  %92 = getelementptr inbounds i8, ptr %1, i64 44
  %93 = load i32, ptr %92, align 4, !tbaa !24
  %94 = or i32 %93, 4
  store i32 %94, ptr %92, align 4, !tbaa !24
  br label %95

95:                                               ; preds = %91, %87, %84, %86
  %.0 = phi i64 [ -1, %86 ], [ -1, %84 ], [ %89, %87 ], [ %89, %91 ]
  call void @llvm.lifetime.end.p0(i64 2, ptr nonnull %4) #5
  br label %.loopexit

.loopexit:                                        ; preds = %64, %61, %.thread, %45, %.split, %31, %33, %17, %95, %16, %10, %5
  %.1 = phi i64 [ -1, %16 ], [ %.0, %95 ], [ -1, %10 ], [ -16, %5 ], [ -1, %17 ], [ -1, %33 ], [ -1, %31 ], [ %spec.select83, %.split ], [ 0, %45 ], [ 0, %.thread ], [ %54, %61 ], [ %spec.select, %64 ]
  ret i64 %.1
}

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

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { "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 = { nofree nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #5 = { nounwind }

!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 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !6, i64 24}
!10 = !{!"msghdr", !11, i64 0, !6, i64 8, !11, i64 16, !6, i64 24, !11, i64 32, !6, i64 40, !6, i64 44}
!11 = !{!"any pointer", !7, i64 0}
!12 = !{!10, !11, i64 16}
!13 = !{!14, !11, i64 0}
!14 = !{!"iovec", !11, i64 0, !15, i64 8}
!15 = !{!"long", !7, i64 0}
!16 = !{!14, !15, i64 8}
!17 = distinct !{!17, !18}
!18 = !{!"llvm.loop.mustprogress"}
!19 = !{!20, !11, i64 0}
!20 = !{!"lwip_sock", !11, i64 0, !7, i64 8, !21, i64 16, !21, i64 18, !21, i64 20, !7, i64 22}
!21 = !{!"short", !7, i64 0}
!22 = !{!23, !6, i64 0}
!23 = !{!"netconn", !6, i64 0, !6, i64 4, !7, i64 8, !7, i64 16, !11, i64 24, !11, i64 32, !11, i64 40, !6, i64 48, !6, i64 52, !6, i64 56, !7, i64 60, !11, i64 64, !11, i64 72}
!24 = !{!10, !6, i64 44}
!25 = distinct !{!25, !18, !26}
!26 = !{!"llvm.loop.peeled.count", i32 1}
!27 = !{!21, !21, i64 0}


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