; LLVM IR from libtcod/libtcod :: src/vendor/utf8proc (utf8proc)

; 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.utf8proc_property_struct = type { i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, [2 x i8] }

@utf8proc_combinations = external hidden constant [5410 x i16], align 16

; 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

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

; Function Attrs: nounwind uwtable
define dso_local i64 @utf8proc_normalize_utf32(ptr noundef %0, i64 noundef %1, i32 noundef %2) #1 {
  %4 = alloca ptr, align 8
  %5 = alloca i64, align 8
  %6 = alloca i32, align 4
  %7 = alloca i64, align 8
  %8 = alloca i64, align 8
  %9 = alloca i32, align 4
  %10 = alloca ptr, align 8
  %11 = alloca i32, align 4
  %12 = alloca ptr, align 8
  %13 = alloca ptr, align 8
  %14 = alloca i16, align 2
  %15 = alloca i64, align 8
  %16 = alloca i64, align 8
  %17 = alloca i32, align 4
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  %20 = alloca i32, align 4
  %21 = alloca i32, align 4
  %22 = alloca i32, align 4
  %23 = alloca i32, align 4
  %24 = alloca i32, align 4
  store ptr %0, ptr %4, align 8, !tbaa !5
  store i64 %1, ptr %5, align 8, !tbaa !9
  store i32 %2, ptr %6, align 4, !tbaa !11
  %25 = load i32, ptr %6, align 4, !tbaa !11
  %26 = and i32 %25, 896
  %27 = icmp ne i32 %26, 0
  br i1 %27, label %28, label %144

28:                                               ; preds = %3
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #2
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #2
  store i64 0, ptr %8, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #2
  store i64 0, ptr %7, align 8, !tbaa !9
  br label %29

29:                                               ; preds = %139, %28
  %30 = load i64, ptr %7, align 8, !tbaa !9
  %31 = load i64, ptr %5, align 8, !tbaa !9
  %32 = icmp slt i64 %30, %31
  br i1 %32, label %33, label %142

33:                                               ; preds = %29
  %34 = load ptr, ptr %4, align 8, !tbaa !5
  %35 = load i64, ptr %7, align 8, !tbaa !9
  %36 = getelementptr inbounds i32, ptr %34, i64 %35
  %37 = load i32, ptr %36, align 4, !tbaa !11
  store i32 %37, ptr %9, align 4, !tbaa !11
  %38 = load i32, ptr %9, align 4, !tbaa !11
  %39 = icmp eq i32 %38, 13
  br i1 %39, label %40, label %55

40:                                               ; preds = %33
  %41 = load i64, ptr %7, align 8, !tbaa !9
  %42 = load i64, ptr %5, align 8, !tbaa !9
  %43 = sub nsw i64 %42, 1
  %44 = icmp slt i64 %41, %43
  br i1 %44, label %45, label %55

45:                                               ; preds = %40
  %46 = load ptr, ptr %4, align 8, !tbaa !5
  %47 = load i64, ptr %7, align 8, !tbaa !9
  %48 = add nsw i64 %47, 1
  %49 = getelementptr inbounds i32, ptr %46, i64 %48
  %50 = load i32, ptr %49, align 4, !tbaa !11
  %51 = icmp eq i32 %50, 10
  br i1 %51, label %52, label %55

52:                                               ; preds = %45
  %53 = load i64, ptr %7, align 8, !tbaa !9
  %54 = add nsw i64 %53, 1
  store i64 %54, ptr %7, align 8, !tbaa !9
  br label %55

55:                                               ; preds = %52, %45, %40, %33
  %56 = load i32, ptr %9, align 4, !tbaa !11
  %57 = icmp eq i32 %56, 10
  br i1 %57, label %74, label %58

58:                                               ; preds = %55
  %59 = load i32, ptr %9, align 4, !tbaa !11
  %60 = icmp eq i32 %59, 13
  br i1 %60, label %74, label %61

61:                                               ; preds = %58
  %62 = load i32, ptr %9, align 4, !tbaa !11
  %63 = icmp eq i32 %62, 133
  br i1 %63, label %74, label %64

64:                                               ; preds = %61
  %65 = load i32, ptr %6, align 4, !tbaa !11
  %66 = and i32 %65, 512
  %67 = icmp ne i32 %66, 0
  br i1 %67, label %68, label %109

68:                                               ; preds = %64
  %69 = load i32, ptr %9, align 4, !tbaa !11
  %70 = icmp eq i32 %69, 11
  br i1 %70, label %74, label %71

71:                                               ; preds = %68
  %72 = load i32, ptr %9, align 4, !tbaa !11
  %73 = icmp eq i32 %72, 12
  br i1 %73, label %74, label %109

74:                                               ; preds = %71, %68, %61, %58, %55
  %75 = load i32, ptr %6, align 4, !tbaa !11
  %76 = and i32 %75, 128
  %77 = icmp ne i32 %76, 0
  br i1 %77, label %78, label %93

78:                                               ; preds = %74
  %79 = load i32, ptr %6, align 4, !tbaa !11
  %80 = and i32 %79, 256
  %81 = icmp ne i32 %80, 0
  br i1 %81, label %82, label %87

82:                                               ; preds = %78
  %83 = load ptr, ptr %4, align 8, !tbaa !5
  %84 = load i64, ptr %8, align 8, !tbaa !9
  %85 = add nsw i64 %84, 1
  store i64 %85, ptr %8, align 8, !tbaa !9
  %86 = getelementptr inbounds i32, ptr %83, i64 %84
  store i32 10, ptr %86, align 4, !tbaa !11
  br label %92

87:                                               ; preds = %78
  %88 = load ptr, ptr %4, align 8, !tbaa !5
  %89 = load i64, ptr %8, align 8, !tbaa !9
  %90 = add nsw i64 %89, 1
  store i64 %90, ptr %8, align 8, !tbaa !9
  %91 = getelementptr inbounds i32, ptr %88, i64 %89
  store i32 8232, ptr %91, align 4, !tbaa !11
  br label %92

92:                                               ; preds = %87, %82
  br label %108

93:                                               ; preds = %74
  %94 = load i32, ptr %6, align 4, !tbaa !11
  %95 = and i32 %94, 256
  %96 = icmp ne i32 %95, 0
  br i1 %96, label %97, label %102

97:                                               ; preds = %93
  %98 = load ptr, ptr %4, align 8, !tbaa !5
  %99 = load i64, ptr %8, align 8, !tbaa !9
  %100 = add nsw i64 %99, 1
  store i64 %100, ptr %8, align 8, !tbaa !9
  %101 = getelementptr inbounds i32, ptr %98, i64 %99
  store i32 8233, ptr %101, align 4, !tbaa !11
  br label %107

102:                                              ; preds = %93
  %103 = load ptr, ptr %4, align 8, !tbaa !5
  %104 = load i64, ptr %8, align 8, !tbaa !9
  %105 = add nsw i64 %104, 1
  store i64 %105, ptr %8, align 8, !tbaa !9
  %106 = getelementptr inbounds i32, ptr %103, i64 %104
  store i32 32, ptr %106, align 4, !tbaa !11
  br label %107

107:                                              ; preds = %102, %97
  br label %108

108:                                              ; preds = %107, %92
  br label %138

109:                                              ; preds = %71, %64
  %110 = load i32, ptr %6, align 4, !tbaa !11
  %111 = and i32 %110, 512
  %112 = icmp ne i32 %111, 0
  br i1 %112, label %113, label %131

113:                                              ; preds = %109
  %114 = load i32, ptr %9, align 4, !tbaa !11
  %115 = icmp slt i32 %114, 32
  br i1 %115, label %122, label %116

116:                                              ; preds = %113
  %117 = load i32, ptr %9, align 4, !tbaa !11
  %118 = icmp sge i32 %117, 127
  br i1 %118, label %119, label %131

119:                                              ; preds = %116
  %120 = load i32, ptr %9, align 4, !tbaa !11
  %121 = icmp slt i32 %120, 160
  br i1 %121, label %122, label %131

122:                                              ; preds = %119, %113
  %123 = load i32, ptr %9, align 4, !tbaa !11
  %124 = icmp eq i32 %123, 9
  br i1 %124, label %125, label %130

125:                                              ; preds = %122
  %126 = load ptr, ptr %4, align 8, !tbaa !5
  %127 = load i64, ptr %8, align 8, !tbaa !9
  %128 = add nsw i64 %127, 1
  store i64 %128, ptr %8, align 8, !tbaa !9
  %129 = getelementptr inbounds i32, ptr %126, i64 %127
  store i32 32, ptr %129, align 4, !tbaa !11
  br label %130

130:                                              ; preds = %125, %122
  br label %137

131:                                              ; preds = %119, %116, %109
  %132 = load i32, ptr %9, align 4, !tbaa !11
  %133 = load ptr, ptr %4, align 8, !tbaa !5
  %134 = load i64, ptr %8, align 8, !tbaa !9
  %135 = add nsw i64 %134, 1
  store i64 %135, ptr %8, align 8, !tbaa !9
  %136 = getelementptr inbounds i32, ptr %133, i64 %134
  store i32 %132, ptr %136, align 4, !tbaa !11
  br label %137

137:                                              ; preds = %131, %130
  br label %138

138:                                              ; preds = %137, %108
  br label %139

139:                                              ; preds = %138
  %140 = load i64, ptr %7, align 8, !tbaa !9
  %141 = add nsw i64 %140, 1
  store i64 %141, ptr %7, align 8, !tbaa !9
  br label %29, !llvm.loop !13

142:                                              ; preds = %29
  %143 = load i64, ptr %8, align 8, !tbaa !9
  store i64 %143, ptr %5, align 8, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #2
  br label %144

144:                                              ; preds = %142, %3
  %145 = load i32, ptr %6, align 4, !tbaa !11
  %146 = and i32 %145, 8
  %147 = icmp ne i32 %146, 0
  br i1 %147, label %148, label %379

148:                                              ; preds = %144
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #2
  store ptr null, ptr %10, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #2
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #2
  store ptr null, ptr %12, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #2
  call void @llvm.lifetime.start.p0(i64 2, ptr %14) #2
  store i16 -1, ptr %14, align 2, !tbaa !15
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #2
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #2
  store i64 0, ptr %16, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #2
  store i64 0, ptr %15, align 8, !tbaa !9
  br label %149

149:                                              ; preds = %374, %148
  %150 = load i64, ptr %15, align 8, !tbaa !9
  %151 = load i64, ptr %5, align 8, !tbaa !9
  %152 = icmp slt i64 %150, %151
  br i1 %152, label %153, label %377

153:                                              ; preds = %149
  %154 = load ptr, ptr %4, align 8, !tbaa !5
  %155 = load i64, ptr %15, align 8, !tbaa !9
  %156 = getelementptr inbounds i32, ptr %154, i64 %155
  %157 = load i32, ptr %156, align 4, !tbaa !11
  store i32 %157, ptr %11, align 4, !tbaa !11
  %158 = load i32, ptr %11, align 4, !tbaa !11
  %159 = call ptr @unsafe_get_property(i32 noundef %158)
  store ptr %159, ptr %13, align 8, !tbaa !5
  %160 = load ptr, ptr %10, align 8, !tbaa !5
  %161 = icmp ne ptr %160, null
  br i1 %161, label %162, label %345

162:                                              ; preds = %153
  %163 = load ptr, ptr %13, align 8, !tbaa !5
  %164 = getelementptr inbounds %struct.utf8proc_property_struct, ptr %163, i32 0, i32 1
  %165 = load i16, ptr %164, align 2, !tbaa !17
  %166 = sext i16 %165 to i32
  %167 = load i16, ptr %14, align 2, !tbaa !15
  %168 = sext i16 %167 to i32
  %169 = icmp sgt i32 %166, %168
  br i1 %169, label %170, label %345

170:                                              ; preds = %162
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #2
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #2
  %171 = load ptr, ptr %10, align 8, !tbaa !5
  %172 = load i32, ptr %171, align 4, !tbaa !11
  %173 = sub nsw i32 %172, 4352
  store i32 %173, ptr %18, align 4, !tbaa !11
  %174 = load i32, ptr %18, align 4, !tbaa !11
  %175 = icmp sge i32 %174, 0
  br i1 %175, label %176, label %199

176:                                              ; preds = %170
  %177 = load i32, ptr %18, align 4, !tbaa !11
  %178 = icmp slt i32 %177, 19
  br i1 %178, label %179, label %199

179:                                              ; preds = %176
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #2
  %180 = load i32, ptr %11, align 4, !tbaa !11
  %181 = sub nsw i32 %180, 4449
  store i32 %181, ptr %20, align 4, !tbaa !11
  %182 = load i32, ptr %20, align 4, !tbaa !11
  %183 = icmp sge i32 %182, 0
  br i1 %183, label %184, label %195

184:                                              ; preds = %179
  %185 = load i32, ptr %20, align 4, !tbaa !11
  %186 = icmp slt i32 %185, 21
  br i1 %186, label %187, label %195

187:                                              ; preds = %184
  %188 = load i32, ptr %18, align 4, !tbaa !11
  %189 = mul nsw i32 %188, 21
  %190 = load i32, ptr %20, align 4, !tbaa !11
  %191 = add nsw i32 %189, %190
  %192 = mul nsw i32 %191, 28
  %193 = add nsw i32 44032, %192
  %194 = load ptr, ptr %10, align 8, !tbaa !5
  store i32 %193, ptr %194, align 4, !tbaa !11
  store ptr null, ptr %12, align 8, !tbaa !5
  store i32 7, ptr %21, align 4
  br label %196

195:                                              ; preds = %184, %179
  store i32 0, ptr %21, align 4
  br label %196

196:                                              ; preds = %195, %187
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #2
  %197 = load i32, ptr %21, align 4
  switch i32 %197, label %342 [
    i32 0, label %198
  ]

198:                                              ; preds = %196
  br label %199

199:                                              ; preds = %198, %176, %170
  %200 = load ptr, ptr %10, align 8, !tbaa !5
  %201 = load i32, ptr %200, align 4, !tbaa !11
  %202 = sub nsw i32 %201, 44032
  store i32 %202, ptr %19, align 4, !tbaa !11
  %203 = load i32, ptr %19, align 4, !tbaa !11
  %204 = icmp sge i32 %203, 0
  br i1 %204, label %205, label %229

205:                                              ; preds = %199
  %206 = load i32, ptr %19, align 4, !tbaa !11
  %207 = icmp slt i32 %206, 11172
  br i1 %207, label %208, label %229

208:                                              ; preds = %205
  %209 = load i32, ptr %19, align 4, !tbaa !11
  %210 = srem i32 %209, 28
  %211 = icmp eq i32 %210, 0
  br i1 %211, label %212, label %229

212:                                              ; preds = %208
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #2
  %213 = load i32, ptr %11, align 4, !tbaa !11
  %214 = sub nsw i32 %213, 4519
  store i32 %214, ptr %22, align 4, !tbaa !11
  %215 = load i32, ptr %22, align 4, !tbaa !11
  %216 = icmp sge i32 %215, 0
  br i1 %216, label %217, label %225

217:                                              ; preds = %212
  %218 = load i32, ptr %22, align 4, !tbaa !11
  %219 = icmp slt i32 %218, 28
  br i1 %219, label %220, label %225

220:                                              ; preds = %217
  %221 = load i32, ptr %22, align 4, !tbaa !11
  %222 = load ptr, ptr %10, align 8, !tbaa !5
  %223 = load i32, ptr %222, align 4, !tbaa !11
  %224 = add nsw i32 %223, %221
  store i32 %224, ptr %222, align 4, !tbaa !11
  store ptr null, ptr %12, align 8, !tbaa !5
  store i32 7, ptr %21, align 4
  br label %226

225:                                              ; preds = %217, %212
  store i32 0, ptr %21, align 4
  br label %226

226:                                              ; preds = %225, %220
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #2
  %227 = load i32, ptr %21, align 4
  switch i32 %227, label %342 [
    i32 0, label %228
  ]

228:                                              ; preds = %226
  br label %229

229:                                              ; preds = %228, %208, %205, %199
  %230 = load ptr, ptr %12, align 8, !tbaa !5
  %231 = icmp ne ptr %230, null
  br i1 %231, label %236, label %232

232:                                              ; preds = %229
  %233 = load ptr, ptr %10, align 8, !tbaa !5
  %234 = load i32, ptr %233, align 4, !tbaa !11
  %235 = call ptr @unsafe_get_property(i32 noundef %234)
  store ptr %235, ptr %12, align 8, !tbaa !5
  br label %236

236:                                              ; preds = %232, %229
  %237 = load ptr, ptr %12, align 8, !tbaa !5
  %238 = getelementptr inbounds %struct.utf8proc_property_struct, ptr %237, i32 0, i32 9
  %239 = load i16, ptr %238, align 2, !tbaa !19
  %240 = zext i16 %239 to i32
  %241 = icmp slt i32 %240, 32768
  br i1 %241, label %242, label %341

242:                                              ; preds = %236
  %243 = load ptr, ptr %13, align 8, !tbaa !5
  %244 = getelementptr inbounds %struct.utf8proc_property_struct, ptr %243, i32 0, i32 9
  %245 = load i16, ptr %244, align 2, !tbaa !19
  %246 = zext i16 %245 to i32
  %247 = icmp ne i32 %246, 65535
  br i1 %247, label %248, label %341

248:                                              ; preds = %242
  %249 = load ptr, ptr %13, align 8, !tbaa !5
  %250 = getelementptr inbounds %struct.utf8proc_property_struct, ptr %249, i32 0, i32 9
  %251 = load i16, ptr %250, align 2, !tbaa !19
  %252 = zext i16 %251 to i32
  %253 = icmp sge i32 %252, 32768
  br i1 %253, label %254, label %341

254:                                              ; preds = %248
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #2
  %255 = load ptr, ptr %12, align 8, !tbaa !5
  %256 = getelementptr inbounds %struct.utf8proc_property_struct, ptr %255, i32 0, i32 9
  %257 = load i16, ptr %256, align 2, !tbaa !19
  %258 = zext i16 %257 to i32
  store i32 %258, ptr %23, align 4, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #2
  %259 = load ptr, ptr %13, align 8, !tbaa !5
  %260 = getelementptr inbounds %struct.utf8proc_property_struct, ptr %259, i32 0, i32 9
  %261 = load i16, ptr %260, align 2, !tbaa !19
  %262 = zext i16 %261 to i32
  %263 = and i32 %262, 16383
  store i32 %263, ptr %24, align 4, !tbaa !11
  %264 = load i32, ptr %24, align 4, !tbaa !11
  %265 = load i32, ptr %23, align 4, !tbaa !11
  %266 = sext i32 %265 to i64
  %267 = getelementptr inbounds [5410 x i16], ptr @utf8proc_combinations, i64 0, i64 %266
  %268 = load i16, ptr %267, align 2, !tbaa !15
  %269 = zext i16 %268 to i32
  %270 = icmp sge i32 %264, %269
  br i1 %270, label %271, label %337

271:                                              ; preds = %254
  %272 = load i32, ptr %24, align 4, !tbaa !11
  %273 = load i32, ptr %23, align 4, !tbaa !11
  %274 = add nsw i32 %273, 1
  %275 = sext i32 %274 to i64
  %276 = getelementptr inbounds [5410 x i16], ptr @utf8proc_combinations, i64 0, i64 %275
  %277 = load i16, ptr %276, align 2, !tbaa !15
  %278 = zext i16 %277 to i32
  %279 = icmp sle i32 %272, %278
  br i1 %279, label %280, label %337

280:                                              ; preds = %271
  %281 = load i32, ptr %23, align 4, !tbaa !11
  %282 = add nsw i32 %281, 2
  %283 = load i32, ptr %23, align 4, !tbaa !11
  %284 = sext i32 %283 to i64
  %285 = getelementptr inbounds [5410 x i16], ptr @utf8proc_combinations, i64 0, i64 %284
  %286 = load i16, ptr %285, align 2, !tbaa !15
  %287 = zext i16 %286 to i32
  %288 = sub nsw i32 %282, %287
  %289 = load i32, ptr %24, align 4, !tbaa !11
  %290 = add nsw i32 %289, %288
  store i32 %290, ptr %24, align 4, !tbaa !11
  %291 = load ptr, ptr %13, align 8, !tbaa !5
  %292 = getelementptr inbounds %struct.utf8proc_property_struct, ptr %291, i32 0, i32 9
  %293 = load i16, ptr %292, align 2, !tbaa !19
  %294 = zext i16 %293 to i32
  %295 = and i32 %294, 16384
  %296 = icmp ne i32 %295, 0
  br i1 %296, label %297, label %311

297:                                              ; preds = %280
  %298 = load i32, ptr %24, align 4, !tbaa !11
  %299 = sext i32 %298 to i64
  %300 = getelementptr inbounds [5410 x i16], ptr @utf8proc_combinations, i64 0, i64 %299
  %301 = load i16, ptr %300, align 2, !tbaa !15
  %302 = zext i16 %301 to i32
  %303 = shl i32 %302, 16
  %304 = load i32, ptr %24, align 4, !tbaa !11
  %305 = add nsw i32 %304, 1
  %306 = sext i32 %305 to i64
  %307 = getelementptr inbounds [5410 x i16], ptr @utf8proc_combinations, i64 0, i64 %306
  %308 = load i16, ptr %307, align 2, !tbaa !15
  %309 = zext i16 %308 to i32
  %310 = or i32 %303, %309
  store i32 %310, ptr %17, align 4, !tbaa !11
  br label %317

311:                                              ; preds = %280
  %312 = load i32, ptr %24, align 4, !tbaa !11
  %313 = sext i32 %312 to i64
  %314 = getelementptr inbounds [5410 x i16], ptr @utf8proc_combinations, i64 0, i64 %313
  %315 = load i16, ptr %314, align 2, !tbaa !15
  %316 = zext i16 %315 to i32
  store i32 %316, ptr %17, align 4, !tbaa !11
  br label %317

317:                                              ; preds = %311, %297
  %318 = load i32, ptr %17, align 4, !tbaa !11
  %319 = icmp sgt i32 %318, 0
  br i1 %319, label %320, label %336

320:                                              ; preds = %317
  %321 = load i32, ptr %6, align 4, !tbaa !11
  %322 = and i32 %321, 2
  %323 = icmp ne i32 %322, 0
  br i1 %323, label %324, label %333

324:                                              ; preds = %320
  %325 = load i32, ptr %17, align 4, !tbaa !11
  %326 = call ptr @unsafe_get_property(i32 noundef %325)
  %327 = getelementptr inbounds %struct.utf8proc_property_struct, ptr %326, i32 0, i32 10
  %328 = load i16, ptr %327, align 4
  %329 = lshr i16 %328, 1
  %330 = and i16 %329, 1
  %331 = zext i16 %330 to i32
  %332 = icmp ne i32 %331, 0
  br i1 %332, label %336, label %333

333:                                              ; preds = %324, %320
  %334 = load i32, ptr %17, align 4, !tbaa !11
  %335 = load ptr, ptr %10, align 8, !tbaa !5
  store i32 %334, ptr %335, align 4, !tbaa !11
  store ptr null, ptr %12, align 8, !tbaa !5
  store i32 7, ptr %21, align 4
  br label %338

336:                                              ; preds = %324, %317
  br label %337

337:                                              ; preds = %336, %271, %254
  store i32 0, ptr %21, align 4
  br label %338

338:                                              ; preds = %337, %333
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #2
  %339 = load i32, ptr %21, align 4
  switch i32 %339, label %342 [
    i32 0, label %340
  ]

340:                                              ; preds = %338
  br label %341

341:                                              ; preds = %340, %248, %242, %236
  store i32 0, ptr %21, align 4
  br label %342

342:                                              ; preds = %341, %338, %226, %196
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #2
  %343 = load i32, ptr %21, align 4
  switch i32 %343, label %381 [
    i32 0, label %344
    i32 7, label %374
  ]

344:                                              ; preds = %342
  br label %345

345:                                              ; preds = %344, %162, %153
  %346 = load i32, ptr %11, align 4, !tbaa !11
  %347 = load ptr, ptr %4, align 8, !tbaa !5
  %348 = load i64, ptr %16, align 8, !tbaa !9
  %349 = getelementptr inbounds i32, ptr %347, i64 %348
  store i32 %346, ptr %349, align 4, !tbaa !11
  %350 = load ptr, ptr %13, align 8, !tbaa !5
  %351 = getelementptr inbounds %struct.utf8proc_property_struct, ptr %350, i32 0, i32 1
  %352 = load i16, ptr %351, align 2, !tbaa !17
  %353 = icmp ne i16 %352, 0
  br i1 %353, label %354, label %367

354:                                              ; preds = %345
  %355 = load ptr, ptr %13, align 8, !tbaa !5
  %356 = getelementptr inbounds %struct.utf8proc_property_struct, ptr %355, i32 0, i32 1
  %357 = load i16, ptr %356, align 2, !tbaa !17
  %358 = sext i16 %357 to i32
  %359 = load i16, ptr %14, align 2, !tbaa !15
  %360 = sext i16 %359 to i32
  %361 = icmp sgt i32 %358, %360
  br i1 %361, label %362, label %366

362:                                              ; preds = %354
  %363 = load ptr, ptr %13, align 8, !tbaa !5
  %364 = getelementptr inbounds %struct.utf8proc_property_struct, ptr %363, i32 0, i32 1
  %365 = load i16, ptr %364, align 2, !tbaa !17
  store i16 %365, ptr %14, align 2, !tbaa !15
  br label %366

366:                                              ; preds = %362, %354
  br label %371

367:                                              ; preds = %345
  %368 = load ptr, ptr %4, align 8, !tbaa !5
  %369 = load i64, ptr %16, align 8, !tbaa !9
  %370 = getelementptr inbounds i32, ptr %368, i64 %369
  store ptr %370, ptr %10, align 8, !tbaa !5
  store ptr null, ptr %12, align 8, !tbaa !5
  store i16 -1, ptr %14, align 2, !tbaa !15
  br label %371

371:                                              ; preds = %367, %366
  %372 = load i64, ptr %16, align 8, !tbaa !9
  %373 = add nsw i64 %372, 1
  store i64 %373, ptr %16, align 8, !tbaa !9
  br label %374

374:                                              ; preds = %371, %342
  %375 = load i64, ptr %15, align 8, !tbaa !9
  %376 = add nsw i64 %375, 1
  store i64 %376, ptr %15, align 8, !tbaa !9
  br label %149, !llvm.loop !20

377:                                              ; preds = %149
  %378 = load i64, ptr %16, align 8, !tbaa !9
  store i64 %378, ptr %5, align 8, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #2
  call void @llvm.lifetime.end.p0(i64 2, ptr %14) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #2
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #2
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #2
  br label %379

379:                                              ; preds = %377, %144
  %380 = load i64, ptr %5, align 8, !tbaa !9
  ret i64 %380

381:                                              ; preds = %342
  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 = { nounwind }

!llvm.module.flags = !{!0, !1, !2, !3}
!llvm.ident = !{!4}

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"long", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"int", !7, i64 0}
!13 = distinct !{!13, !14}
!14 = !{!"llvm.loop.mustprogress"}
!15 = !{!16, !16, i64 0}
!16 = !{!"short", !7, i64 0}
!17 = !{!18, !16, i64 2}
!18 = !{!"utf8proc_property_struct", !16, i64 0, !16, i64 2, !16, i64 4, !16, i64 6, !16, i64 8, !16, i64 10, !16, i64 12, !16, i64 14, !16, i64 16, !16, i64 18, !12, i64 20, !12, i64 20, !12, i64 20, !12, i64 20, !12, i64 20, !12, i64 20, !12, i64 21}
!19 = !{!18, !16, i64 18}
!20 = distinct !{!20, !14}


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

@utf8proc_combinations = external hidden local_unnamed_addr constant [5410 x i16], align 16

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

; Function Attrs: nounwind uwtable
define dso_local i64 @utf8proc_normalize_utf32(ptr noundef %0, i64 noundef %1, i32 noundef %2) local_unnamed_addr #0 {
  %4 = and i32 %2, 896
  %.not = icmp eq i32 %4, 0
  br i1 %.not, label %.loopexit197, label %.preheader196

.preheader196:                                    ; preds = %3
  %5 = icmp sgt i64 %1, 0
  br i1 %5, label %.lr.ph, label %.loopexit

.lr.ph:                                           ; preds = %.preheader196
  %6 = add nsw i64 %1, -1
  %7 = and i32 %2, 512
  %.not164 = icmp ne i32 %7, 0
  %8 = and i32 %2, 128
  %.not165 = icmp eq i32 %8, 0
  %9 = and i32 %2, 256
  %.not167 = icmp eq i32 %9, 0
  br i1 %.not165, label %.lr.ph.split.us, label %.lr.ph.split

.lr.ph.split.us:                                  ; preds = %.lr.ph, %38
  %.0123199.us = phi i64 [ %39, %38 ], [ 0, %.lr.ph ]
  %.0127198.us = phi i64 [ %.1128.us, %38 ], [ 0, %.lr.ph ]
  %10 = getelementptr inbounds i32, ptr %0, i64 %.0123199.us
  %11 = load i32, ptr %10, align 4, !tbaa !5
  %12 = icmp eq i32 %11, 13
  %13 = icmp slt i64 %.0123199.us, %6
  %or.cond.us = select i1 %12, i1 %13, i1 false
  br i1 %or.cond.us, label %.thread.us, label %14

14:                                               ; preds = %.lr.ph.split.us
  switch i32 %11, label %15 [
    i32 133, label %33
    i32 13, label %33
    i32 10, label %33
  ]

15:                                               ; preds = %14
  %16 = add i32 %11, -11
  %or.cond7.us = icmp ult i32 %16, 2
  %or.cond169.us = and i1 %.not164, %or.cond7.us
  br i1 %or.cond169.us, label %33, label %17

17:                                               ; preds = %15
  br i1 %.not164, label %18, label %21

18:                                               ; preds = %17
  %19 = icmp slt i32 %11, 32
  %20 = add nsw i32 %11, -127
  %or.cond9.us = icmp ult i32 %20, 33
  %or.cond170.us = select i1 %19, i1 true, i1 %or.cond9.us
  br i1 %or.cond170.us, label %24, label %21

21:                                               ; preds = %18, %17
  %22 = add nsw i64 %.0127198.us, 1
  %23 = getelementptr inbounds i32, ptr %0, i64 %.0127198.us
  store i32 %11, ptr %23, align 4, !tbaa !5
  br label %38

24:                                               ; preds = %18
  %25 = icmp eq i32 %11, 9
  br i1 %25, label %26, label %38

26:                                               ; preds = %24
  %27 = add nsw i64 %.0127198.us, 1
  %28 = getelementptr inbounds i32, ptr %0, i64 %.0127198.us
  store i32 32, ptr %28, align 4, !tbaa !5
  br label %38

.thread.us:                                       ; preds = %.lr.ph.split.us
  %29 = add nsw i64 %.0123199.us, 1
  %30 = getelementptr inbounds i32, ptr %0, i64 %29
  %31 = load i32, ptr %30, align 4, !tbaa !5
  %32 = icmp eq i32 %31, 10
  %spec.select.us = select i1 %32, i64 %29, i64 %.0123199.us
  br label %33

33:                                               ; preds = %.thread.us, %15, %14, %14, %14
  %.1124176.us = phi i64 [ %spec.select.us, %.thread.us ], [ %.0123199.us, %15 ], [ %.0123199.us, %14 ], [ %.0123199.us, %14 ], [ %.0123199.us, %14 ]
  %34 = add nsw i64 %.0127198.us, 1
  %35 = getelementptr inbounds i32, ptr %0, i64 %.0127198.us
  br i1 %.not167, label %37, label %36

36:                                               ; preds = %33
  store i32 8233, ptr %35, align 4, !tbaa !5
  br label %38

37:                                               ; preds = %33
  store i32 32, ptr %35, align 4, !tbaa !5
  br label %38

38:                                               ; preds = %37, %36, %26, %24, %21
  %.1124175.us = phi i64 [ %.1124176.us, %36 ], [ %.1124176.us, %37 ], [ %.0123199.us, %26 ], [ %.0123199.us, %24 ], [ %.0123199.us, %21 ]
  %.1128.us = phi i64 [ %34, %36 ], [ %34, %37 ], [ %27, %26 ], [ %.0127198.us, %24 ], [ %22, %21 ]
  %39 = add nsw i64 %.1124175.us, 1
  %40 = icmp slt i64 %39, %1
  br i1 %40, label %.lr.ph.split.us, label %.loopexit197, !llvm.loop !9

.lr.ph.split:                                     ; preds = %.lr.ph
  br i1 %.not164, label %.lr.ph.split.split.us, label %.lr.ph.split.split

.lr.ph.split.split.us:                            ; preds = %.lr.ph.split, %68
  %.0123199.us200 = phi i64 [ %69, %68 ], [ 0, %.lr.ph.split ]
  %.0127198.us201 = phi i64 [ %.1128.us211, %68 ], [ 0, %.lr.ph.split ]
  %41 = getelementptr inbounds i32, ptr %0, i64 %.0123199.us200
  %42 = load i32, ptr %41, align 4, !tbaa !5
  %43 = icmp eq i32 %42, 13
  %44 = icmp slt i64 %.0123199.us200, %6
  %or.cond.us202 = select i1 %43, i1 %44, i1 false
  br i1 %or.cond.us202, label %.thread.us207, label %45

45:                                               ; preds = %.lr.ph.split.split.us
  switch i32 %42, label %46 [
    i32 133, label %63
    i32 13, label %63
    i32 10, label %63
  ]

46:                                               ; preds = %45
  %47 = add i32 %42, -11
  %or.cond7.us203 = icmp ult i32 %47, 2
  br i1 %or.cond7.us203, label %63, label %48

48:                                               ; preds = %46
  %49 = icmp slt i32 %42, 32
  %50 = add nsw i32 %42, -127
  %or.cond9.us205 = icmp ult i32 %50, 33
  %or.cond170.us206 = select i1 %49, i1 true, i1 %or.cond9.us205
  br i1 %or.cond170.us206, label %54, label %51

51:                                               ; preds = %48
  %52 = add nsw i64 %.0127198.us201, 1
  %53 = getelementptr inbounds i32, ptr %0, i64 %.0127198.us201
  store i32 %42, ptr %53, align 4, !tbaa !5
  br label %68

54:                                               ; preds = %48
  %55 = icmp eq i32 %42, 9
  br i1 %55, label %56, label %68

56:                                               ; preds = %54
  %57 = add nsw i64 %.0127198.us201, 1
  %58 = getelementptr inbounds i32, ptr %0, i64 %.0127198.us201
  store i32 32, ptr %58, align 4, !tbaa !5
  br label %68

.thread.us207:                                    ; preds = %.lr.ph.split.split.us
  %59 = add nsw i64 %.0123199.us200, 1
  %60 = getelementptr inbounds i32, ptr %0, i64 %59
  %61 = load i32, ptr %60, align 4, !tbaa !5
  %62 = icmp eq i32 %61, 10
  %spec.select.us208 = select i1 %62, i64 %59, i64 %.0123199.us200
  br label %63

63:                                               ; preds = %.thread.us207, %46, %45, %45, %45
  %.1124176.us209 = phi i64 [ %spec.select.us208, %.thread.us207 ], [ %.0123199.us200, %46 ], [ %.0123199.us200, %45 ], [ %.0123199.us200, %45 ], [ %.0123199.us200, %45 ]
  %64 = add nsw i64 %.0127198.us201, 1
  %65 = getelementptr inbounds i32, ptr %0, i64 %.0127198.us201
  br i1 %.not167, label %67, label %66

66:                                               ; preds = %63
  store i32 10, ptr %65, align 4, !tbaa !5
  br label %68

67:                                               ; preds = %63
  store i32 8232, ptr %65, align 4, !tbaa !5
  br label %68

68:                                               ; preds = %67, %66, %56, %54, %51
  %.1124175.us210 = phi i64 [ %.1124176.us209, %66 ], [ %.1124176.us209, %67 ], [ %.0123199.us200, %56 ], [ %.0123199.us200, %54 ], [ %.0123199.us200, %51 ]
  %.1128.us211 = phi i64 [ %64, %66 ], [ %64, %67 ], [ %57, %56 ], [ %.0127198.us201, %54 ], [ %52, %51 ]
  %69 = add nsw i64 %.1124175.us210, 1
  %70 = icmp slt i64 %69, %1
  br i1 %70, label %.lr.ph.split.split.us, label %.loopexit197, !llvm.loop !9

.lr.ph.split.split:                               ; preds = %.lr.ph.split
  br i1 %.not167, label %.lr.ph.split.split.split.us, label %.lr.ph.split.split.split

.lr.ph.split.split.split.us:                      ; preds = %.lr.ph.split.split, %81
  %.0123199.us214 = phi i64 [ %83, %81 ], [ 0, %.lr.ph.split.split ]
  %.0127198.us215 = phi i64 [ %.1128.us221, %81 ], [ 0, %.lr.ph.split.split ]
  %71 = getelementptr inbounds i32, ptr %0, i64 %.0123199.us214
  %72 = load i32, ptr %71, align 4, !tbaa !5
  %73 = icmp eq i32 %72, 13
  %74 = icmp slt i64 %.0123199.us214, %6
  %or.cond.us216 = select i1 %73, i1 %74, i1 false
  br i1 %or.cond.us216, label %.thread.us217, label %75

75:                                               ; preds = %.lr.ph.split.split.split.us
  switch i32 %72, label %81 [
    i32 133, label %80
    i32 13, label %80
    i32 10, label %80
  ]

.thread.us217:                                    ; preds = %.lr.ph.split.split.split.us
  %76 = add nsw i64 %.0123199.us214, 1
  %77 = getelementptr inbounds i32, ptr %0, i64 %76
  %78 = load i32, ptr %77, align 4, !tbaa !5
  %79 = icmp eq i32 %78, 10
  %spec.select.us218 = select i1 %79, i64 %76, i64 %.0123199.us214
  br label %81

80:                                               ; preds = %75, %75, %75
  br label %81

81:                                               ; preds = %.thread.us217, %75, %80
  %.sink = phi i32 [ %72, %75 ], [ 8232, %.thread.us217 ], [ 8232, %80 ]
  %.1124175.us220 = phi i64 [ %.0123199.us214, %75 ], [ %spec.select.us218, %.thread.us217 ], [ %.0123199.us214, %80 ]
  %82 = getelementptr inbounds i32, ptr %0, i64 %.0127198.us215
  store i32 %.sink, ptr %82, align 4, !tbaa !5
  %.1128.us221 = add nuw nsw i64 %.0127198.us215, 1
  %83 = add nsw i64 %.1124175.us220, 1
  %84 = icmp slt i64 %83, %1
  br i1 %84, label %.lr.ph.split.split.split.us, label %.loopexit197, !llvm.loop !9

.lr.ph.split.split.split:                         ; preds = %.lr.ph.split.split, %95
  %.0123199 = phi i64 [ %97, %95 ], [ 0, %.lr.ph.split.split ]
  %.0127198 = phi i64 [ %.1128, %95 ], [ 0, %.lr.ph.split.split ]
  %85 = getelementptr inbounds i32, ptr %0, i64 %.0123199
  %86 = load i32, ptr %85, align 4, !tbaa !5
  %87 = icmp eq i32 %86, 13
  %88 = icmp slt i64 %.0123199, %6
  %or.cond = select i1 %87, i1 %88, i1 false
  br i1 %or.cond, label %.thread, label %93

.thread:                                          ; preds = %.lr.ph.split.split.split
  %89 = add nsw i64 %.0123199, 1
  %90 = getelementptr inbounds i32, ptr %0, i64 %89
  %91 = load i32, ptr %90, align 4, !tbaa !5
  %92 = icmp eq i32 %91, 10
  %spec.select = select i1 %92, i64 %89, i64 %.0123199
  br label %95

93:                                               ; preds = %.lr.ph.split.split.split
  switch i32 %86, label %95 [
    i32 133, label %94
    i32 13, label %94
    i32 10, label %94
  ]

94:                                               ; preds = %93, %93, %93
  br label %95

95:                                               ; preds = %.thread, %93, %94
  %.sink242 = phi i32 [ %86, %93 ], [ 10, %.thread ], [ 10, %94 ]
  %.1124175 = phi i64 [ %.0123199, %93 ], [ %spec.select, %.thread ], [ %.0123199, %94 ]
  %96 = getelementptr inbounds i32, ptr %0, i64 %.0127198
  store i32 %.sink242, ptr %96, align 4, !tbaa !5
  %.1128 = add nuw nsw i64 %.0127198, 1
  %97 = add nsw i64 %.1124175, 1
  %98 = icmp slt i64 %97, %1
  br i1 %98, label %.lr.ph.split.split.split, label %.loopexit197, !llvm.loop !9

.loopexit197:                                     ; preds = %95, %81, %68, %38, %3
  %.0 = phi i64 [ %1, %3 ], [ %.1128.us, %38 ], [ %.1128.us211, %68 ], [ %.1128.us221, %81 ], [ %.1128, %95 ]
  %99 = and i32 %2, 8
  %.not154 = icmp eq i32 %99, 0
  br i1 %.not154, label %.loopexit, label %.preheader

.preheader:                                       ; preds = %.loopexit197
  %100 = icmp sgt i64 %.0, 0
  br i1 %100, label %.lr.ph229, label %.loopexit

.lr.ph229:                                        ; preds = %.preheader
  %101 = and i32 %2, 2
  %.not161 = icmp eq i32 %101, 0
  br label %102

102:                                              ; preds = %.lr.ph229, %180
  %.0129228 = phi ptr [ null, %.lr.ph229 ], [ %.2131, %180 ]
  %.0132227 = phi ptr [ null, %.lr.ph229 ], [ %.11, %180 ]
  %.0137226 = phi i64 [ 0, %.lr.ph229 ], [ %.1138, %180 ]
  %.0139225 = phi i64 [ 0, %.lr.ph229 ], [ %181, %180 ]
  %.0140224 = phi i16 [ -1, %.lr.ph229 ], [ %.2142, %180 ]
  %103 = getelementptr inbounds i32, ptr %0, i64 %.0139225
  %104 = load i32, ptr %103, align 4, !tbaa !5
  %105 = tail call ptr @unsafe_get_property(i32 noundef %104)
  %.not155 = icmp eq ptr %.0129228, null
  br i1 %.not155, label %.thread190, label %106

106:                                              ; preds = %102
  %107 = getelementptr inbounds i8, ptr %105, i64 2
  %108 = load i16, ptr %107, align 2, !tbaa !11
  %109 = icmp sgt i16 %108, %.0140224
  br i1 %109, label %110, label %.thread190

110:                                              ; preds = %106
  %111 = load i32, ptr %.0129228, align 4, !tbaa !5
  %112 = add i32 %111, -4371
  %or.cond11 = icmp ult i32 %112, -19
  %113 = add i32 %104, -4470
  %or.cond13 = icmp ult i32 %113, -21
  %or.cond194 = or i1 %or.cond13, %or.cond11
  br i1 %or.cond194, label %.thread177, label %114

114:                                              ; preds = %110
  %115 = mul nuw nsw i32 %111, 21
  %116 = add nuw nsw i32 %115, %104
  %117 = mul nuw nsw i32 %116, 28
  %118 = add nsw i32 %117, -2639516
  store i32 %118, ptr %.0129228, align 4, !tbaa !5
  br label %180

.thread177:                                       ; preds = %110
  %119 = add i32 %111, -44032
  %or.cond15 = icmp ult i32 %119, 11172
  br i1 %or.cond15, label %120, label %.thread180

120:                                              ; preds = %.thread177
  %.lhs.trunc = trunc nuw i32 %119 to i16
  %121 = urem i16 %.lhs.trunc, 28
  %122 = icmp ne i16 %121, 0
  %123 = add i32 %104, -4547
  %or.cond17 = icmp ult i32 %123, -28
  %or.cond195 = or i1 %or.cond17, %122
  br i1 %or.cond195, label %.thread180, label %124

124:                                              ; preds = %120
  %125 = add nsw i32 %104, -4519
  %126 = add nuw nsw i32 %125, %111
  store i32 %126, ptr %.0129228, align 4, !tbaa !5
  br label %180

.thread180:                                       ; preds = %120, %.thread177
  %.not156 = icmp eq ptr %.0132227, null
  br i1 %.not156, label %127, label %129

127:                                              ; preds = %.thread180
  %128 = tail call ptr @unsafe_get_property(i32 noundef %111)
  br label %129

129:                                              ; preds = %127, %.thread180
  %.5 = phi ptr [ %.0132227, %.thread180 ], [ %128, %127 ]
  %130 = getelementptr inbounds i8, ptr %.5, i64 18
  %131 = load i16, ptr %130, align 2, !tbaa !14
  %132 = zext i16 %131 to i32
  %133 = icmp sgt i16 %131, -1
  br i1 %133, label %134, label %.thread190

134:                                              ; preds = %129
  %135 = getelementptr inbounds i8, ptr %105, i64 18
  %136 = load i16, ptr %135, align 2, !tbaa !14
  %137 = zext i16 %136 to i32
  %or.cond171 = icmp slt i16 %136, -1
  br i1 %or.cond171, label %138, label %.thread190

138:                                              ; preds = %134
  %139 = and i32 %137, 16383
  %140 = zext nneg i16 %131 to i64
  %141 = getelementptr inbounds [5410 x i16], ptr @utf8proc_combinations, i64 0, i64 %140
  %142 = load i16, ptr %141, align 2, !tbaa !15
  %143 = zext i16 %142 to i32
  %.not158 = icmp ult i32 %139, %143
  br i1 %.not158, label %.thread190, label %144

144:                                              ; preds = %138
  %145 = add nuw nsw i32 %132, 1
  %146 = zext nneg i32 %145 to i64
  %147 = getelementptr inbounds [5410 x i16], ptr @utf8proc_combinations, i64 0, i64 %146
  %148 = load i16, ptr %147, align 2, !tbaa !15
  %149 = zext i16 %148 to i32
  %.not159 = icmp ugt i32 %139, %149
  br i1 %.not159, label %.thread190, label %150

150:                                              ; preds = %144
  %151 = add nuw nsw i32 %132, 2
  %152 = add nuw nsw i32 %151, %139
  %153 = sub nsw i32 %152, %143
  %154 = and i32 %137, 16384
  %.not160 = icmp eq i32 %154, 0
  %155 = sext i32 %153 to i64
  %156 = getelementptr inbounds [5410 x i16], ptr @utf8proc_combinations, i64 0, i64 %155
  %157 = load i16, ptr %156, align 2, !tbaa !15
  %158 = zext i16 %157 to i32
  br i1 %.not160, label %167, label %159

159:                                              ; preds = %150
  %160 = shl nuw i32 %158, 16
  %161 = add nsw i32 %153, 1
  %162 = sext i32 %161 to i64
  %163 = getelementptr inbounds [5410 x i16], ptr @utf8proc_combinations, i64 0, i64 %162
  %164 = load i16, ptr %163, align 2, !tbaa !15
  %165 = zext i16 %164 to i32
  %166 = or disjoint i32 %160, %165
  br label %167

167:                                              ; preds = %150, %159
  %.0136 = phi i32 [ %166, %159 ], [ %158, %150 ]
  %168 = icmp sgt i32 %.0136, 0
  br i1 %168, label %169, label %.thread190

169:                                              ; preds = %167
  br i1 %.not161, label %175, label %170

170:                                              ; preds = %169
  %171 = tail call ptr @unsafe_get_property(i32 noundef %.0136)
  %172 = getelementptr inbounds i8, ptr %171, i64 20
  %173 = load i16, ptr %172, align 4
  %174 = and i16 %173, 2
  %.not162 = icmp eq i16 %174, 0
  br i1 %.not162, label %175, label %.thread190

175:                                              ; preds = %169, %170
  store i32 %.0136, ptr %.0129228, align 4, !tbaa !5
  br label %180

.thread190:                                       ; preds = %138, %144, %170, %167, %129, %134, %106, %102
  %.9 = phi ptr [ %.0132227, %106 ], [ %.0132227, %102 ], [ %.5, %134 ], [ %.5, %129 ], [ %.5, %167 ], [ %.5, %170 ], [ %.5, %144 ], [ %.5, %138 ]
  %176 = getelementptr inbounds i32, ptr %0, i64 %.0137226
  store i32 %104, ptr %176, align 4, !tbaa !5
  %177 = getelementptr inbounds i8, ptr %105, i64 2
  %178 = load i16, ptr %177, align 2, !tbaa !11
  %.not163 = icmp eq i16 %178, 0
  %spec.select172 = tail call i16 @llvm.smax.i16(i16 %178, i16 %.0140224)
  %.1141 = select i1 %.not163, i16 -1, i16 %spec.select172
  %.10 = select i1 %.not163, ptr null, ptr %.9
  %.1130 = select i1 %.not163, ptr %176, ptr %.0129228
  %179 = add nsw i64 %.0137226, 1
  br label %180

180:                                              ; preds = %114, %124, %175, %.thread190
  %.2142 = phi i16 [ %.1141, %.thread190 ], [ %.0140224, %175 ], [ %.0140224, %124 ], [ %.0140224, %114 ]
  %.1138 = phi i64 [ %179, %.thread190 ], [ %.0137226, %175 ], [ %.0137226, %124 ], [ %.0137226, %114 ]
  %.11 = phi ptr [ %.10, %.thread190 ], [ null, %175 ], [ null, %124 ], [ null, %114 ]
  %.2131 = phi ptr [ %.1130, %.thread190 ], [ %.0129228, %175 ], [ %.0129228, %124 ], [ %.0129228, %114 ]
  %181 = add nuw nsw i64 %.0139225, 1
  %exitcond.not = icmp eq i64 %181, %.0
  br i1 %exitcond.not, label %.loopexit, label %102, !llvm.loop !16

.loopexit:                                        ; preds = %180, %.preheader196, %.preheader, %.loopexit197
  %.1 = phi i64 [ %.0, %.loopexit197 ], [ 0, %.preheader ], [ 0, %.preheader196 ], [ %.1138, %180 ]
  ret i64 %.1
}

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

attributes #0 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }

!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 = distinct !{!9, !10}
!10 = !{!"llvm.loop.mustprogress"}
!11 = !{!12, !13, i64 2}
!12 = !{!"utf8proc_property_struct", !13, i64 0, !13, i64 2, !13, i64 4, !13, i64 6, !13, i64 8, !13, i64 10, !13, i64 12, !13, i64 14, !13, i64 16, !13, i64 18, !6, i64 20, !6, i64 20, !6, i64 20, !6, i64 20, !6, i64 20, !6, i64 20, !6, i64 21}
!13 = !{!"short", !7, i64 0}
!14 = !{!12, !13, i64 18}
!15 = !{!13, !13, i64 0}
!16 = distinct !{!16, !10}


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