; LLVM IR from kala13x/libxutils :: src/net (http)

; 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.xhttp_ = type { ptr, i16, ptr, i32, %struct.XByteBuffer, i32, %struct.XMap, i16, i16, i64, i64, i64, i64, i64, i8, i8, i8, [256 x i8], [128 x i8], [2048 x i8] }
%struct.XByteBuffer = type { ptr, i64, i64, i16, i16, i32 }
%struct.XMap = type { ptr, ptr, ptr, i64, i64, i32 }
%struct.XSocket = type { i32, %union.xsock_addr_t, i32, i32, i16, i32, i32, i32, i32, ptr }
%union.xsock_addr_t = type { %struct.sockaddr_in, [96 x i8] }
%struct.sockaddr_in = type { i16, i16, %struct.in_addr, [8 x i8] }
%struct.in_addr = type { i32 }

@.str.40 = external hidden unnamed_addr constant [13 x i8], align 1

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

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

declare zeroext i8 @xstrused(ptr noundef) #1

declare i32 @XByteBuffer_Add(ptr noundef, ptr noundef, i64 noundef) #1

; Function Attrs: nounwind uwtable
declare dso_local ptr @XHTTP_GetHeader(ptr noundef, ptr noundef) #2

; Function Attrs: nounwind uwtable
declare dso_local i64 @XHTTP_GetBodySize(ptr noundef) #2

; Function Attrs: nounwind uwtable
declare hidden i32 @XHTTP_StatusCb(ptr noundef, i32 noundef) #2

declare i32 @XSock_Read(ptr noundef, ptr noundef, i64 noundef) #1

declare zeroext i8 @XSock_IsNB(ptr noundef) #1

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

; Function Attrs: nounwind uwtable
define dso_local i32 @XHTTP_ReadContent(ptr noundef %0, ptr noundef %1) #2 {
  %3 = alloca i32, align 4
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca [4096 x i8], align 16
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca i64, align 8
  %11 = alloca i32, align 4
  %12 = alloca ptr, align 8
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  %13 = load ptr, ptr %4, align 8, !tbaa !5
  %14 = getelementptr inbounds %struct.xhttp_, ptr %13, i32 0, i32 16
  %15 = load i8, ptr %14, align 2, !tbaa !9
  %16 = icmp ne i8 %15, 0
  br i1 %16, label %17, label %18

17:                                               ; preds = %2
  store i32 20, ptr %3, align 4
  br label %242

18:                                               ; preds = %2
  call void @llvm.lifetime.start.p0(i64 8, ptr %6) #3
  %19 = load ptr, ptr %4, align 8, !tbaa !5
  %20 = getelementptr inbounds %struct.xhttp_, ptr %19, i32 0, i32 4
  store ptr %20, ptr %6, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4096, ptr %7) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #3
  store i32 0, ptr %9, align 4, !tbaa !16
  %21 = load ptr, ptr %4, align 8, !tbaa !5
  %22 = getelementptr inbounds %struct.xhttp_, ptr %21, i32 0, i32 9
  %23 = load i64, ptr %22, align 8, !tbaa !17
  %24 = icmp ne i64 %23, 0
  br i1 %24, label %25, label %125

25:                                               ; preds = %18
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #3
  %26 = load ptr, ptr %4, align 8, !tbaa !5
  %27 = call i64 @XHTTP_GetBodySize(ptr noundef %26)
  store i64 %27, ptr %10, align 8, !tbaa !18
  br label %28

28:                                               ; preds = %113, %66, %25
  %29 = load i64, ptr %10, align 8, !tbaa !18
  %30 = load ptr, ptr %4, align 8, !tbaa !5
  %31 = getelementptr inbounds %struct.xhttp_, ptr %30, i32 0, i32 9
  %32 = load i64, ptr %31, align 8, !tbaa !17
  %33 = icmp ult i64 %29, %32
  br i1 %33, label %34, label %114

34:                                               ; preds = %28
  %35 = load ptr, ptr %5, align 8, !tbaa !5
  %36 = getelementptr inbounds [4096 x i8], ptr %7, i64 0, i64 0
  %37 = call i32 @XSock_Read(ptr noundef %35, ptr noundef %36, i64 noundef 4096)
  store i32 %37, ptr %9, align 4, !tbaa !16
  %38 = load i32, ptr %9, align 4, !tbaa !16
  %39 = icmp sle i32 %38, 0
  br i1 %39, label %40, label %43

40:                                               ; preds = %34
  %41 = load ptr, ptr %4, align 8, !tbaa !5
  %42 = call i32 @XHTTP_StatusCb(ptr noundef %41, i32 noundef 5)
  store i32 %42, ptr %3, align 4
  store i32 1, ptr %11, align 4
  br label %124

43:                                               ; preds = %34
  %44 = load ptr, ptr %4, align 8, !tbaa !5
  %45 = getelementptr inbounds [4096 x i8], ptr %7, i64 0, i64 0
  %46 = load i32, ptr %9, align 4, !tbaa !16
  %47 = sext i32 %46 to i64
  %48 = call i32 @XHTTP_Callback(ptr noundef %44, i32 noundef 32, ptr noundef %45, i64 noundef %47)
  store i32 %48, ptr %8, align 4, !tbaa !16
  %49 = load i32, ptr %8, align 4, !tbaa !16
  %50 = icmp eq i32 %49, -1
  br i1 %50, label %51, label %52

51:                                               ; preds = %43
  store i32 16, ptr %3, align 4
  store i32 1, ptr %11, align 4
  br label %124

52:                                               ; preds = %43
  %53 = load i32, ptr %8, align 4, !tbaa !16
  %54 = icmp eq i32 %53, 0
  br i1 %54, label %55, label %58

55:                                               ; preds = %52
  %56 = load ptr, ptr %4, align 8, !tbaa !5
  %57 = getelementptr inbounds %struct.xhttp_, ptr %56, i32 0, i32 16
  store i8 1, ptr %57, align 2, !tbaa !9
  store i32 20, ptr %3, align 4
  store i32 1, ptr %11, align 4
  br label %124

58:                                               ; preds = %52
  %59 = load i32, ptr %8, align 4, !tbaa !16
  %60 = icmp eq i32 %59, 1
  br i1 %60, label %61, label %71

61:                                               ; preds = %58
  %62 = load ptr, ptr %5, align 8, !tbaa !5
  %63 = call zeroext i8 @XSock_IsNB(ptr noundef %62)
  %64 = icmp ne i8 %63, 0
  br i1 %64, label %65, label %66

65:                                               ; preds = %61
  br label %114

66:                                               ; preds = %61
  %67 = load i32, ptr %9, align 4, !tbaa !16
  %68 = sext i32 %67 to i64
  %69 = load i64, ptr %10, align 8, !tbaa !18
  %70 = add i64 %69, %68
  store i64 %70, ptr %10, align 8, !tbaa !18
  br label %28, !llvm.loop !19

71:                                               ; preds = %58
  br label %72

72:                                               ; preds = %71
  br label %73

73:                                               ; preds = %72
  %74 = load ptr, ptr %6, align 8, !tbaa !5
  %75 = getelementptr inbounds [4096 x i8], ptr %7, i64 0, i64 0
  %76 = load i32, ptr %9, align 4, !tbaa !16
  %77 = sext i32 %76 to i64
  %78 = call i32 @XByteBuffer_Add(ptr noundef %74, ptr noundef %75, i64 noundef %77)
  %79 = icmp sle i32 %78, 0
  br i1 %79, label %80, label %83

80:                                               ; preds = %73
  %81 = load ptr, ptr %4, align 8, !tbaa !5
  %82 = call i32 @XHTTP_StatusCb(ptr noundef %81, i32 noundef 9)
  store i32 %82, ptr %3, align 4
  store i32 1, ptr %11, align 4
  br label %124

83:                                               ; preds = %73
  %84 = load ptr, ptr %4, align 8, !tbaa !5
  %85 = call i64 @XHTTP_GetBodySize(ptr noundef %84)
  store i64 %85, ptr %10, align 8, !tbaa !18
  %86 = load ptr, ptr %5, align 8, !tbaa !5
  %87 = getelementptr inbounds %struct.XSocket, ptr %86, i32 0, i32 0
  %88 = load i32, ptr %87, align 8, !tbaa !21
  %89 = icmp ne i32 %88, 0
  br i1 %89, label %95, label %90

90:                                               ; preds = %83
  %91 = load ptr, ptr %5, align 8, !tbaa !5
  %92 = call zeroext i8 @XSock_IsNB(ptr noundef %91)
  %93 = zext i8 %92 to i32
  %94 = icmp ne i32 %93, 0
  br i1 %94, label %95, label %96

95:                                               ; preds = %90, %83
  br label %114

96:                                               ; preds = %90
  %97 = load ptr, ptr %4, align 8, !tbaa !5
  %98 = getelementptr inbounds %struct.xhttp_, ptr %97, i32 0, i32 11
  %99 = load i64, ptr %98, align 8, !tbaa !23
  %100 = icmp ne i64 %99, 0
  br i1 %100, label %101, label %112

101:                                              ; preds = %96
  %102 = load ptr, ptr %6, align 8, !tbaa !5
  %103 = getelementptr inbounds %struct.XByteBuffer, ptr %102, i32 0, i32 2
  %104 = load i64, ptr %103, align 8, !tbaa !24
  %105 = load ptr, ptr %4, align 8, !tbaa !5
  %106 = getelementptr inbounds %struct.xhttp_, ptr %105, i32 0, i32 11
  %107 = load i64, ptr %106, align 8, !tbaa !23
  %108 = icmp uge i64 %104, %107
  br i1 %108, label %109, label %112

109:                                              ; preds = %101
  %110 = load ptr, ptr %4, align 8, !tbaa !5
  %111 = call i32 @XHTTP_StatusCb(ptr noundef %110, i32 noundef 21)
  store i32 %111, ptr %3, align 4
  store i32 1, ptr %11, align 4
  br label %124

112:                                              ; preds = %101, %96
  br label %113

113:                                              ; preds = %112
  br label %28, !llvm.loop !19

114:                                              ; preds = %95, %65, %28
  %115 = load i64, ptr %10, align 8, !tbaa !18
  %116 = load ptr, ptr %4, align 8, !tbaa !5
  %117 = getelementptr inbounds %struct.xhttp_, ptr %116, i32 0, i32 9
  %118 = load i64, ptr %117, align 8, !tbaa !17
  %119 = icmp uge i64 %115, %118
  br i1 %119, label %120, label %123

120:                                              ; preds = %114
  %121 = load ptr, ptr %4, align 8, !tbaa !5
  %122 = getelementptr inbounds %struct.xhttp_, ptr %121, i32 0, i32 16
  store i8 1, ptr %122, align 2, !tbaa !9
  store i32 20, ptr %3, align 4
  store i32 1, ptr %11, align 4
  br label %124

123:                                              ; preds = %114
  store i32 17, ptr %3, align 4
  store i32 1, ptr %11, align 4
  br label %124

124:                                              ; preds = %123, %120, %109, %80, %55, %51, %40
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #3
  br label %241

125:                                              ; preds = %18
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #3
  %126 = load ptr, ptr %4, align 8, !tbaa !5
  %127 = call ptr @XHTTP_GetHeader(ptr noundef %126, ptr noundef @.str.40)
  store ptr %127, ptr %12, align 8, !tbaa !5
  %128 = load ptr, ptr %12, align 8, !tbaa !5
  %129 = call zeroext i8 @xstrused(ptr noundef %128)
  %130 = icmp ne i8 %129, 0
  br i1 %130, label %132, label %131

131:                                              ; preds = %125
  store i32 20, ptr %3, align 4
  store i32 1, ptr %11, align 4
  br label %240

132:                                              ; preds = %125
  br label %133

133:                                              ; preds = %231, %190, %132
  %134 = load ptr, ptr %5, align 8, !tbaa !5
  %135 = call i32 @XSock_IsOpen(ptr noundef %134)
  %136 = icmp ne i32 %135, 0
  br i1 %136, label %137, label %232

137:                                              ; preds = %133
  %138 = load ptr, ptr %5, align 8, !tbaa !5
  %139 = getelementptr inbounds [4096 x i8], ptr %7, i64 0, i64 0
  %140 = call i32 @XSock_Read(ptr noundef %138, ptr noundef %139, i64 noundef 4096)
  store i32 %140, ptr %9, align 4, !tbaa !16
  %141 = load i32, ptr %9, align 4, !tbaa !16
  %142 = icmp sle i32 %141, 0
  br i1 %142, label %143, label %167

143:                                              ; preds = %137
  %144 = load ptr, ptr %4, align 8, !tbaa !5
  %145 = getelementptr inbounds %struct.xhttp_, ptr %144, i32 0, i32 9
  %146 = load i64, ptr %145, align 8, !tbaa !17
  %147 = icmp ne i64 %146, 0
  br i1 %147, label %152, label %148

148:                                              ; preds = %143
  %149 = load ptr, ptr %4, align 8, !tbaa !5
  %150 = call i64 @XHTTP_GetBodySize(ptr noundef %149)
  %151 = icmp ne i64 %150, 0
  br i1 %151, label %152, label %163

152:                                              ; preds = %148, %143
  %153 = load ptr, ptr %4, align 8, !tbaa !5
  %154 = getelementptr inbounds %struct.xhttp_, ptr %153, i32 0, i32 9
  %155 = load i64, ptr %154, align 8, !tbaa !17
  %156 = load ptr, ptr %4, align 8, !tbaa !5
  %157 = call i64 @XHTTP_GetBodySize(ptr noundef %156)
  %158 = icmp eq i64 %155, %157
  br i1 %158, label %163, label %159

159:                                              ; preds = %152
  %160 = load ptr, ptr %5, align 8, !tbaa !5
  %161 = call i32 @XSock_Status(ptr noundef %160)
  %162 = icmp eq i32 %161, 38
  br i1 %162, label %163, label %164

163:                                              ; preds = %159, %152, %148
  store i32 20, ptr %3, align 4
  store i32 1, ptr %11, align 4
  br label %240

164:                                              ; preds = %159
  %165 = load ptr, ptr %4, align 8, !tbaa !5
  %166 = call i32 @XHTTP_StatusCb(ptr noundef %165, i32 noundef 5)
  store i32 %166, ptr %3, align 4
  store i32 1, ptr %11, align 4
  br label %240

167:                                              ; preds = %137
  %168 = load ptr, ptr %4, align 8, !tbaa !5
  %169 = getelementptr inbounds [4096 x i8], ptr %7, i64 0, i64 0
  %170 = load i32, ptr %9, align 4, !tbaa !16
  %171 = sext i32 %170 to i64
  %172 = call i32 @XHTTP_Callback(ptr noundef %168, i32 noundef 32, ptr noundef %169, i64 noundef %171)
  store i32 %172, ptr %8, align 4, !tbaa !16
  %173 = load i32, ptr %8, align 4, !tbaa !16
  %174 = icmp eq i32 %173, -1
  br i1 %174, label %175, label %176

175:                                              ; preds = %167
  store i32 16, ptr %3, align 4
  store i32 1, ptr %11, align 4
  br label %240

176:                                              ; preds = %167
  %177 = load i32, ptr %8, align 4, !tbaa !16
  %178 = icmp eq i32 %177, 0
  br i1 %178, label %179, label %182

179:                                              ; preds = %176
  %180 = load ptr, ptr %4, align 8, !tbaa !5
  %181 = getelementptr inbounds %struct.xhttp_, ptr %180, i32 0, i32 16
  store i8 1, ptr %181, align 2, !tbaa !9
  store i32 20, ptr %3, align 4
  store i32 1, ptr %11, align 4
  br label %240

182:                                              ; preds = %176
  %183 = load i32, ptr %8, align 4, !tbaa !16
  %184 = icmp eq i32 %183, 1
  br i1 %184, label %185, label %191

185:                                              ; preds = %182
  %186 = load ptr, ptr %5, align 8, !tbaa !5
  %187 = call zeroext i8 @XSock_IsNB(ptr noundef %186)
  %188 = icmp ne i8 %187, 0
  br i1 %188, label %189, label %190

189:                                              ; preds = %185
  br label %232

190:                                              ; preds = %185
  br label %133, !llvm.loop !25

191:                                              ; preds = %182
  br label %192

192:                                              ; preds = %191
  br label %193

193:                                              ; preds = %192
  %194 = load ptr, ptr %6, align 8, !tbaa !5
  %195 = getelementptr inbounds [4096 x i8], ptr %7, i64 0, i64 0
  %196 = load i32, ptr %9, align 4, !tbaa !16
  %197 = sext i32 %196 to i64
  %198 = call i32 @XByteBuffer_Add(ptr noundef %194, ptr noundef %195, i64 noundef %197)
  %199 = icmp sle i32 %198, 0
  br i1 %199, label %200, label %203

200:                                              ; preds = %193
  %201 = load ptr, ptr %4, align 8, !tbaa !5
  %202 = call i32 @XHTTP_StatusCb(ptr noundef %201, i32 noundef 9)
  store i32 %202, ptr %3, align 4
  store i32 1, ptr %11, align 4
  br label %240

203:                                              ; preds = %193
  %204 = load ptr, ptr %5, align 8, !tbaa !5
  %205 = getelementptr inbounds %struct.XSocket, ptr %204, i32 0, i32 0
  %206 = load i32, ptr %205, align 8, !tbaa !21
  %207 = icmp ne i32 %206, 0
  br i1 %207, label %213, label %208

208:                                              ; preds = %203
  %209 = load ptr, ptr %5, align 8, !tbaa !5
  %210 = call zeroext i8 @XSock_IsNB(ptr noundef %209)
  %211 = zext i8 %210 to i32
  %212 = icmp ne i32 %211, 0
  br i1 %212, label %213, label %214

213:                                              ; preds = %208, %203
  br label %232

214:                                              ; preds = %208
  %215 = load ptr, ptr %4, align 8, !tbaa !5
  %216 = getelementptr inbounds %struct.xhttp_, ptr %215, i32 0, i32 11
  %217 = load i64, ptr %216, align 8, !tbaa !23
  %218 = icmp ne i64 %217, 0
  br i1 %218, label %219, label %230

219:                                              ; preds = %214
  %220 = load ptr, ptr %6, align 8, !tbaa !5
  %221 = getelementptr inbounds %struct.XByteBuffer, ptr %220, i32 0, i32 2
  %222 = load i64, ptr %221, align 8, !tbaa !24
  %223 = load ptr, ptr %4, align 8, !tbaa !5
  %224 = getelementptr inbounds %struct.xhttp_, ptr %223, i32 0, i32 11
  %225 = load i64, ptr %224, align 8, !tbaa !23
  %226 = icmp uge i64 %222, %225
  br i1 %226, label %227, label %230

227:                                              ; preds = %219
  %228 = load ptr, ptr %4, align 8, !tbaa !5
  %229 = call i32 @XHTTP_StatusCb(ptr noundef %228, i32 noundef 21)
  store i32 %229, ptr %3, align 4
  store i32 1, ptr %11, align 4
  br label %240

230:                                              ; preds = %219, %214
  br label %231

231:                                              ; preds = %230
  br label %133, !llvm.loop !25

232:                                              ; preds = %213, %189, %133
  %233 = load ptr, ptr %5, align 8, !tbaa !5
  %234 = call i32 @XSock_Status(ptr noundef %233)
  %235 = icmp eq i32 %234, 38
  br i1 %235, label %236, label %239

236:                                              ; preds = %232
  %237 = load ptr, ptr %4, align 8, !tbaa !5
  %238 = getelementptr inbounds %struct.xhttp_, ptr %237, i32 0, i32 16
  store i8 1, ptr %238, align 2, !tbaa !9
  store i32 20, ptr %3, align 4
  store i32 1, ptr %11, align 4
  br label %240

239:                                              ; preds = %232
  store i32 17, ptr %3, align 4
  store i32 1, ptr %11, align 4
  br label %240

240:                                              ; preds = %239, %236, %227, %200, %179, %175, %164, %163, %131
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #3
  br label %241

241:                                              ; preds = %240, %124
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #3
  call void @llvm.lifetime.end.p0(i64 4096, ptr %7) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %6) #3
  br label %242

242:                                              ; preds = %241, %17
  %243 = load i32, ptr %3, align 4
  ret i32 %243
}

declare i32 @XSock_IsOpen(ptr noundef) #1

declare i32 @XSock_Status(ptr noundef) #1

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { "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 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { 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, !7, i64 170}
!10 = !{!"xhttp_", !6, i64 0, !11, i64 8, !6, i64 16, !12, i64 24, !13, i64 32, !12, i64 64, !15, i64 72, !11, i64 120, !11, i64 122, !14, i64 128, !14, i64 136, !14, i64 144, !14, i64 152, !14, i64 160, !7, i64 168, !7, i64 169, !7, i64 170, !7, i64 171, !7, i64 427, !7, i64 555}
!11 = !{!"short", !7, i64 0}
!12 = !{!"int", !7, i64 0}
!13 = !{!"XByteBuffer", !6, i64 0, !14, i64 8, !14, i64 16, !11, i64 24, !11, i64 26, !12, i64 28}
!14 = !{!"long", !7, i64 0}
!15 = !{!"XMap", !6, i64 0, !6, i64 8, !6, i64 16, !14, i64 24, !14, i64 32, !12, i64 40}
!16 = !{!12, !12, i64 0}
!17 = !{!10, !14, i64 128}
!18 = !{!14, !14, i64 0}
!19 = distinct !{!19, !20}
!20 = !{!"llvm.loop.mustprogress"}
!21 = !{!22, !12, i64 0}
!22 = !{!"XSocket", !12, i64 0, !7, i64 4, !12, i64 116, !12, i64 120, !11, i64 124, !12, i64 128, !12, i64 132, !12, i64 136, !12, i64 140, !6, i64 144}
!23 = !{!10, !14, i64 144}
!24 = !{!13, !14, i64 16}
!25 = distinct !{!25, !20}


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

@.str.40 = external hidden unnamed_addr constant [13 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: mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite)
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #0

declare zeroext i8 @xstrused(ptr noundef) local_unnamed_addr #1

declare i32 @XByteBuffer_Add(ptr noundef, ptr noundef, i64 noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
declare dso_local ptr @XHTTP_GetHeader(ptr noundef, ptr noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
declare dso_local i64 @XHTTP_GetBodySize(ptr noundef) local_unnamed_addr #2

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

declare i32 @XSock_Read(ptr noundef, ptr noundef, i64 noundef) local_unnamed_addr #1

declare zeroext i8 @XSock_IsNB(ptr noundef) local_unnamed_addr #1

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

; Function Attrs: nounwind uwtable
define dso_local i32 @XHTTP_ReadContent(ptr noundef %0, ptr noundef %1) local_unnamed_addr #2 {
  %3 = alloca [4096 x i8], align 16
  %4 = getelementptr inbounds i8, ptr %0, i64 170
  %5 = load i8, ptr %4, align 2, !tbaa !5
  %.not = icmp eq i8 %5, 0
  br i1 %.not, label %6, label %96

6:                                                ; preds = %2
  %7 = getelementptr inbounds i8, ptr %0, i64 32
  call void @llvm.lifetime.start.p0(i64 4096, ptr nonnull %3) #3
  %8 = getelementptr inbounds i8, ptr %0, i64 128
  %9 = load i64, ptr %8, align 8, !tbaa !15
  %.not68 = icmp eq i64 %9, 0
  br i1 %.not68, label %49, label %10

10:                                               ; preds = %6
  %11 = tail call i64 @XHTTP_GetBodySize(ptr noundef nonnull %0)
  %12 = load i64, ptr %8, align 8, !tbaa !15
  %13 = icmp ult i64 %11, %12
  br i1 %13, label %.lr.ph, label %._crit_edge

.lr.ph:                                           ; preds = %10
  %14 = getelementptr inbounds i8, ptr %0, i64 144
  %15 = getelementptr inbounds i8, ptr %0, i64 48
  br label %16

16:                                               ; preds = %.lr.ph, %.backedge85
  %.06086 = phi i64 [ %11, %.lr.ph ], [ %.060.be, %.backedge85 ]
  %17 = call i32 @XSock_Read(ptr noundef %1, ptr noundef nonnull %3, i64 noundef 4096) #3
  %18 = icmp slt i32 %17, 1
  br i1 %18, label %19, label %21

19:                                               ; preds = %16
  %20 = call i32 @XHTTP_StatusCb(ptr noundef nonnull %0, i32 noundef 5)
  br label %.loopexit

21:                                               ; preds = %16
  %22 = zext nneg i32 %17 to i64
  %23 = call i32 @XHTTP_Callback(ptr noundef nonnull %0, i32 noundef 32, ptr noundef nonnull %3, i64 noundef %22)
  switch i32 %23, label %31 [
    i32 -1, label %.loopexit
    i32 0, label %24
    i32 1, label %25
  ]

24:                                               ; preds = %21
  store i8 1, ptr %4, align 2, !tbaa !5
  br label %.loopexit

25:                                               ; preds = %21
  %26 = call zeroext i8 @XSock_IsNB(ptr noundef %1) #3
  %.not82 = icmp eq i8 %26, 0
  br i1 %.not82, label %27, label %._crit_edge.loopexit

27:                                               ; preds = %25
  %28 = add i64 %.06086, %22
  br label %.backedge85

.backedge85:                                      ; preds = %43, %41, %27
  %.060.be = phi i64 [ %28, %27 ], [ %37, %41 ], [ %37, %43 ]
  %29 = load i64, ptr %8, align 8, !tbaa !15
  %30 = icmp ult i64 %.060.be, %29
  br i1 %30, label %16, label %._crit_edge.loopexit, !llvm.loop !16

31:                                               ; preds = %21
  %32 = call i32 @XByteBuffer_Add(ptr noundef nonnull %7, ptr noundef nonnull %3, i64 noundef %22) #3
  %33 = icmp slt i32 %32, 1
  br i1 %33, label %34, label %36

34:                                               ; preds = %31
  %35 = call i32 @XHTTP_StatusCb(ptr noundef nonnull %0, i32 noundef 9)
  br label %.loopexit

36:                                               ; preds = %31
  %37 = call i64 @XHTTP_GetBodySize(ptr noundef nonnull %0)
  %38 = load i32, ptr %1, align 8, !tbaa !18
  %.not78 = icmp eq i32 %38, 0
  br i1 %.not78, label %39, label %._crit_edge.loopexit

39:                                               ; preds = %36
  %40 = call zeroext i8 @XSock_IsNB(ptr noundef nonnull %1) #3
  %.not79 = icmp eq i8 %40, 0
  br i1 %.not79, label %41, label %._crit_edge.loopexit

41:                                               ; preds = %39
  %42 = load i64, ptr %14, align 8, !tbaa !20
  %.not80 = icmp eq i64 %42, 0
  br i1 %.not80, label %.backedge85, label %43

43:                                               ; preds = %41
  %44 = load i64, ptr %15, align 8, !tbaa !21
  %.not81 = icmp ult i64 %44, %42
  br i1 %.not81, label %.backedge85, label %45

45:                                               ; preds = %43
  %46 = call i32 @XHTTP_StatusCb(ptr noundef nonnull %0, i32 noundef 21)
  br label %.loopexit

._crit_edge.loopexit:                             ; preds = %36, %39, %25, %.backedge85
  %.161.ph = phi i64 [ %.060.be, %.backedge85 ], [ %.06086, %25 ], [ %37, %39 ], [ %37, %36 ]
  %.pre = load i64, ptr %8, align 8, !tbaa !15
  br label %._crit_edge

._crit_edge:                                      ; preds = %._crit_edge.loopexit, %10
  %47 = phi i64 [ %12, %10 ], [ %.pre, %._crit_edge.loopexit ]
  %.161 = phi i64 [ %11, %10 ], [ %.161.ph, %._crit_edge.loopexit ]
  %.not83 = icmp ult i64 %.161, %47
  br i1 %.not83, label %.loopexit, label %48

48:                                               ; preds = %._crit_edge
  store i8 1, ptr %4, align 2, !tbaa !5
  br label %.loopexit

49:                                               ; preds = %6
  %50 = tail call ptr @XHTTP_GetHeader(ptr noundef nonnull %0, ptr noundef nonnull @.str.40)
  %51 = tail call zeroext i8 @xstrused(ptr noundef %50) #3
  %.not69 = icmp eq i8 %51, 0
  br i1 %.not69, label %.loopexit, label %.preheader

.preheader:                                       ; preds = %49
  %52 = tail call i32 @XSock_IsOpen(ptr noundef %1) #3
  %.not7093 = icmp eq i32 %52, 0
  br i1 %.not7093, label %._crit_edge95, label %.lr.ph94

.lr.ph94:                                         ; preds = %.preheader
  %53 = getelementptr inbounds i8, ptr %0, i64 144
  %54 = getelementptr inbounds i8, ptr %0, i64 48
  br label %55

55:                                               ; preds = %.lr.ph94, %.backedge
  %56 = call i32 @XSock_Read(ptr noundef %1, ptr noundef nonnull %3, i64 noundef 4096) #3
  %57 = icmp slt i32 %56, 1
  br i1 %57, label %58, label %71

58:                                               ; preds = %55
  %59 = load i64, ptr %8, align 8, !tbaa !15
  %.not76 = icmp eq i64 %59, 0
  br i1 %.not76, label %60, label %62

60:                                               ; preds = %58
  %61 = call i64 @XHTTP_GetBodySize(ptr noundef nonnull %0)
  %.not77 = icmp eq i64 %61, 0
  br i1 %.not77, label %.loopexit, label %._crit_edge100

._crit_edge100:                                   ; preds = %60
  %.pre101 = load i64, ptr %8, align 8, !tbaa !15
  br label %62

62:                                               ; preds = %._crit_edge100, %58
  %63 = phi i64 [ %.pre101, %._crit_edge100 ], [ %59, %58 ]
  %64 = call i64 @XHTTP_GetBodySize(ptr noundef nonnull %0)
  %65 = icmp eq i64 %63, %64
  br i1 %65, label %.loopexit, label %66

66:                                               ; preds = %62
  %67 = call i32 @XSock_Status(ptr noundef %1) #3
  %68 = icmp eq i32 %67, 38
  br i1 %68, label %.loopexit, label %69

69:                                               ; preds = %66
  %70 = call i32 @XHTTP_StatusCb(ptr noundef nonnull %0, i32 noundef 5)
  br label %.loopexit

71:                                               ; preds = %55
  %72 = zext nneg i32 %56 to i64
  %73 = call i32 @XHTTP_Callback(ptr noundef %0, i32 noundef 32, ptr noundef nonnull %3, i64 noundef %72)
  switch i32 %73, label %77 [
    i32 -1, label %.loopexit
    i32 0, label %74
    i32 1, label %75
  ]

74:                                               ; preds = %71
  store i8 1, ptr %4, align 2, !tbaa !5
  br label %.loopexit

75:                                               ; preds = %71
  %76 = call zeroext i8 @XSock_IsNB(ptr noundef %1) #3
  %.not75 = icmp eq i8 %76, 0
  br i1 %.not75, label %.backedge, label %._crit_edge95

77:                                               ; preds = %71
  %78 = call i32 @XByteBuffer_Add(ptr noundef nonnull %7, ptr noundef nonnull %3, i64 noundef %72) #3
  %79 = icmp slt i32 %78, 1
  br i1 %79, label %80, label %82

80:                                               ; preds = %77
  %81 = call i32 @XHTTP_StatusCb(ptr noundef %0, i32 noundef 9)
  br label %.loopexit

82:                                               ; preds = %77
  %83 = load i32, ptr %1, align 8, !tbaa !18
  %.not71 = icmp eq i32 %83, 0
  br i1 %.not71, label %84, label %._crit_edge95

84:                                               ; preds = %82
  %85 = call zeroext i8 @XSock_IsNB(ptr noundef nonnull %1) #3
  %.not72 = icmp eq i8 %85, 0
  br i1 %.not72, label %86, label %._crit_edge95

86:                                               ; preds = %84
  %87 = load i64, ptr %53, align 8, !tbaa !20
  %.not73 = icmp eq i64 %87, 0
  br i1 %.not73, label %.backedge, label %88

88:                                               ; preds = %86
  %89 = load i64, ptr %54, align 8, !tbaa !21
  %.not74 = icmp ult i64 %89, %87
  br i1 %.not74, label %.backedge, label %90

90:                                               ; preds = %88
  %91 = call i32 @XHTTP_StatusCb(ptr noundef nonnull %0, i32 noundef 21)
  br label %.loopexit

.backedge:                                        ; preds = %88, %86, %75
  %92 = call i32 @XSock_IsOpen(ptr noundef %1) #3
  %.not70 = icmp eq i32 %92, 0
  br i1 %.not70, label %._crit_edge95, label %55, !llvm.loop !22

._crit_edge95:                                    ; preds = %.backedge, %75, %84, %82, %.preheader
  %93 = call i32 @XSock_Status(ptr noundef %1) #3
  %94 = icmp eq i32 %93, 38
  br i1 %94, label %95, label %.loopexit

95:                                               ; preds = %._crit_edge95
  store i8 1, ptr %4, align 2, !tbaa !5
  br label %.loopexit

.loopexit:                                        ; preds = %21, %71, %69, %74, %80, %90, %95, %49, %66, %62, %60, %._crit_edge95, %19, %24, %34, %45, %48, %._crit_edge
  %.2 = phi i32 [ %20, %19 ], [ 20, %24 ], [ 20, %48 ], [ %35, %34 ], [ %46, %45 ], [ 17, %._crit_edge ], [ %70, %69 ], [ 20, %74 ], [ 20, %95 ], [ %81, %80 ], [ %91, %90 ], [ 20, %49 ], [ 20, %66 ], [ 20, %62 ], [ 20, %60 ], [ 17, %._crit_edge95 ], [ 16, %71 ], [ 16, %21 ]
  call void @llvm.lifetime.end.p0(i64 4096, ptr nonnull %3) #3
  br label %96

96:                                               ; preds = %2, %.loopexit
  %.3 = phi i32 [ %.2, %.loopexit ], [ 20, %2 ]
  ret i32 %.3
}

declare i32 @XSock_IsOpen(ptr noundef) local_unnamed_addr #1

declare i32 @XSock_Status(ptr noundef) local_unnamed_addr #1

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { "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 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { 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, !8, i64 170}
!6 = !{!"xhttp_", !7, i64 0, !10, i64 8, !7, i64 16, !11, i64 24, !12, i64 32, !11, i64 64, !14, i64 72, !10, i64 120, !10, i64 122, !13, i64 128, !13, i64 136, !13, i64 144, !13, i64 152, !13, i64 160, !8, i64 168, !8, i64 169, !8, i64 170, !8, i64 171, !8, i64 427, !8, i64 555}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"short", !8, i64 0}
!11 = !{!"int", !8, i64 0}
!12 = !{!"XByteBuffer", !7, i64 0, !13, i64 8, !13, i64 16, !10, i64 24, !10, i64 26, !11, i64 28}
!13 = !{!"long", !8, i64 0}
!14 = !{!"XMap", !7, i64 0, !7, i64 8, !7, i64 16, !13, i64 24, !13, i64 32, !11, i64 40}
!15 = !{!6, !13, i64 128}
!16 = distinct !{!16, !17}
!17 = !{!"llvm.loop.mustprogress"}
!18 = !{!19, !11, i64 0}
!19 = !{!"XSocket", !11, i64 0, !8, i64 4, !11, i64 116, !11, i64 120, !10, i64 124, !11, i64 128, !11, i64 132, !11, i64 136, !11, i64 140, !7, i64 144}
!20 = !{!6, !13, i64 144}
!21 = !{!12, !13, i64 16}
!22 = distinct !{!22, !17}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,LICMPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass