; LLVM IR from mncoppola/rpef :: utilities_src/squashfs2.1/lzma/C/7zip/Compress/LZMA (LZMAEncoder)

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

%class.CLZInWindow = type { ptr, ptr, ptr, i32, i8, ptr, ptr, i32, i32, i32, i32, i32, i32 }
%"class.NPat2::CPatricia" = type { %struct.IMatchFinder, %struct.IMatchFinderSetCallback, %class.CMyUnknownImp, %class.CLZInWindow, i32, i32, ptr, ptr, i32, i32, i32, i32, i8, i32, ptr, %class.CMyComPtr }
%struct.IMatchFinder = type { %struct.IInWindowStream }
%struct.IInWindowStream = type { %struct.IUnknown }
%struct.IUnknown = type { ptr }
%struct.IMatchFinderSetCallback = type { %struct.IUnknown }
%class.CMyUnknownImp = type { i32 }
%class.CMyComPtr = type { ptr }
%"union.NPat2::CDescendant" = type { i32 }
%"struct.NPat2::CNode" = type { i32, i32, %union.anon }
%union.anon = type { [4 x %"union.NPat2::CDescendant"] }

; 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: mustprogress uwtable
declare dso_local void @_ZN5NPat29CPatricia15ChangeLastMatchEj(ptr noundef nonnull align 8 dereferenceable(160), i32 noundef) #1 align 2

; Function Attrs: mustprogress uwtable
define dso_local noundef i32 @_ZN5NPat29CPatricia15GetLongestMatchEPj(ptr noundef nonnull align 8 dereferenceable(160) %0, ptr noundef %1) unnamed_addr #1 align 2 {
  %3 = alloca i32, align 4
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca i32, align 4
  %7 = alloca i32, align 4
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca ptr, align 8
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca i32, align 4
  %17 = alloca ptr, align 8
  %18 = alloca i32, align 4
  %19 = alloca ptr, align 8
  %20 = alloca i32, align 4
  %21 = alloca i8, align 1
  %22 = alloca i8, align 1
  %23 = alloca i8, align 1
  %24 = alloca i8, align 1
  %25 = alloca i32, align 4
  %26 = alloca ptr, align 8
  %27 = alloca ptr, align 8
  %28 = alloca i32, align 4
  %29 = alloca i8, align 1
  %30 = alloca ptr, align 8
  %31 = alloca ptr, align 8
  %32 = alloca ptr, align 8
  %33 = alloca ptr, align 8
  %34 = alloca i32, align 4
  %35 = alloca i32, align 4
  %36 = alloca i32, align 4
  %37 = alloca i8, align 1
  %38 = alloca i32, align 4
  %39 = alloca i32, align 4
  %40 = alloca i32, align 4
  %41 = alloca i32, align 4
  %42 = alloca i32, align 4
  %43 = alloca i32, align 4
  %44 = alloca i8, align 1
  %45 = alloca i32, align 4
  %46 = alloca i8, align 1
  %47 = alloca ptr, align 8
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  %48 = load ptr, ptr %4, align 8
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #3
  %49 = getelementptr inbounds i8, ptr %48, i64 24
  %50 = getelementptr inbounds %class.CLZInWindow, ptr %49, i32 0, i32 8
  %51 = load i32, ptr %50, align 4, !tbaa !9
  %52 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 5
  %53 = load i32, ptr %52, align 4, !tbaa !13
  %54 = add i32 %51, %53
  %55 = getelementptr inbounds i8, ptr %48, i64 24
  %56 = getelementptr inbounds %class.CLZInWindow, ptr %55, i32 0, i32 12
  %57 = load i32, ptr %56, align 4, !tbaa !21
  %58 = icmp ule i32 %54, %57
  br i1 %58, label %59, label %62

59:                                               ; preds = %2
  %60 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 5
  %61 = load i32, ptr %60, align 4, !tbaa !13
  store i32 %61, ptr %6, align 4, !tbaa !22
  br label %74

62:                                               ; preds = %2
  %63 = getelementptr inbounds i8, ptr %48, i64 24
  %64 = getelementptr inbounds %class.CLZInWindow, ptr %63, i32 0, i32 12
  %65 = load i32, ptr %64, align 4, !tbaa !21
  %66 = getelementptr inbounds i8, ptr %48, i64 24
  %67 = getelementptr inbounds %class.CLZInWindow, ptr %66, i32 0, i32 8
  %68 = load i32, ptr %67, align 4, !tbaa !9
  %69 = sub i32 %65, %68
  store i32 %69, ptr %6, align 4, !tbaa !22
  %70 = load i32, ptr %6, align 4, !tbaa !22
  %71 = icmp ult i32 %70, 2
  br i1 %71, label %72, label %73

72:                                               ; preds = %62
  store i32 0, ptr %3, align 4
  store i32 1, ptr %7, align 4
  br label %823

73:                                               ; preds = %62
  br label %74

74:                                               ; preds = %73, %59
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #3
  %75 = getelementptr inbounds i8, ptr %48, i64 24
  %76 = getelementptr inbounds %class.CLZInWindow, ptr %75, i32 0, i32 8
  %77 = load i32, ptr %76, align 4, !tbaa !9
  %78 = add i32 %77, 2
  store i32 %78, ptr %8, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #3
  %79 = load ptr, ptr %48, align 8, !tbaa !23
  %80 = getelementptr inbounds ptr, ptr %79, i64 6
  %81 = load ptr, ptr %80, align 8
  %82 = call noundef zeroext i8 %81(ptr noundef nonnull align 8 dereferenceable(160) %48, i32 noundef 1)
  %83 = zext i8 %82 to i32
  %84 = load ptr, ptr %48, align 8, !tbaa !23
  %85 = getelementptr inbounds ptr, ptr %84, i64 6
  %86 = load ptr, ptr %85, align 8
  %87 = call noundef zeroext i8 %86(ptr noundef nonnull align 8 dereferenceable(160) %48, i32 noundef 0)
  %88 = zext i8 %87 to i32
  %89 = shl i32 %88, 8
  %90 = or i32 %83, %89
  store i32 %90, ptr %9, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #3
  %91 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 6
  %92 = load ptr, ptr %91, align 8, !tbaa !25
  %93 = load i32, ptr %9, align 4, !tbaa !22
  %94 = zext i32 %93 to i64
  %95 = getelementptr inbounds %"union.NPat2::CDescendant", ptr %92, i64 %94
  store ptr %95, ptr %10, align 8, !tbaa !5
  %96 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 12
  %97 = load i8, ptr %96, align 8, !tbaa !26, !range !27, !noundef !28
  %98 = trunc i8 %97 to i1
  br i1 %98, label %99, label %166

99:                                               ; preds = %74
  %100 = load ptr, ptr %10, align 8, !tbaa !5
  %101 = call noundef zeroext i1 @_ZNK5NPat211CDescendant7IsMatchEv(ptr noundef nonnull align 4 dereferenceable(4) %100)
  br i1 %101, label %102, label %104

102:                                              ; preds = %99
  %103 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 13
  store i32 0, ptr %103, align 4, !tbaa !29
  br label %104

104:                                              ; preds = %102, %99
  %105 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 13
  %106 = load i32, ptr %105, align 4, !tbaa !29
  %107 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 4
  %108 = load i32, ptr %107, align 8, !tbaa !30
  %109 = sub i32 %108, 1
  %110 = icmp uge i32 %106, %109
  br i1 %110, label %111, label %114

111:                                              ; preds = %104
  %112 = load i32, ptr %9, align 4, !tbaa !22
  call void @_ZN5NPat29CPatricia15ChangeLastMatchEj(ptr noundef nonnull align 8 dereferenceable(160) %48, i32 noundef %112)
  %113 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 13
  store i32 0, ptr %113, align 4, !tbaa !29
  br label %114

114:                                              ; preds = %111, %104
  %115 = load i32, ptr %6, align 4, !tbaa !22
  %116 = sub i32 %115, 1
  %117 = load ptr, ptr %48, align 8, !tbaa !23
  %118 = getelementptr inbounds ptr, ptr %117, i64 6
  %119 = load ptr, ptr %118, align 8
  %120 = call noundef zeroext i8 %119(ptr noundef nonnull align 8 dereferenceable(160) %48, i32 noundef %116)
  %121 = zext i8 %120 to i32
  %122 = load i32, ptr %6, align 4, !tbaa !22
  %123 = sub i32 %122, 2
  %124 = load ptr, ptr %48, align 8, !tbaa !23
  %125 = getelementptr inbounds ptr, ptr %124, i64 6
  %126 = load ptr, ptr %125, align 8
  %127 = call noundef zeroext i8 %126(ptr noundef nonnull align 8 dereferenceable(160) %48, i32 noundef %123)
  %128 = zext i8 %127 to i32
  %129 = icmp eq i32 %121, %128
  br i1 %129, label %130, label %157

130:                                              ; preds = %114
  %131 = load ptr, ptr %10, align 8, !tbaa !5
  %132 = call noundef zeroext i1 @_ZNK5NPat211CDescendant7IsMatchEv(ptr noundef nonnull align 4 dereferenceable(4) %131)
  br i1 %132, label %133, label %137

133:                                              ; preds = %130
  %134 = load i32, ptr %8, align 4, !tbaa !22
  %135 = add i32 %134, -2147483648
  %136 = load ptr, ptr %10, align 8, !tbaa !5
  store i32 %135, ptr %136, align 4, !tbaa !31
  br label %141

137:                                              ; preds = %130
  %138 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 13
  %139 = load i32, ptr %138, align 4, !tbaa !29
  %140 = add i32 %139, 1
  store i32 %140, ptr %138, align 4, !tbaa !29
  br label %141

141:                                              ; preds = %137, %133
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #3
  store i32 2, ptr %11, align 4, !tbaa !22
  br label %142

142:                                              ; preds = %152, %141
  %143 = load i32, ptr %11, align 4, !tbaa !22
  %144 = load i32, ptr %6, align 4, !tbaa !22
  %145 = icmp ule i32 %143, %144
  br i1 %145, label %147, label %146

146:                                              ; preds = %142
  store i32 2, ptr %7, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #3
  br label %155

147:                                              ; preds = %142
  %148 = load ptr, ptr %5, align 8, !tbaa !5
  %149 = load i32, ptr %11, align 4, !tbaa !22
  %150 = zext i32 %149 to i64
  %151 = getelementptr inbounds i32, ptr %148, i64 %150
  store i32 0, ptr %151, align 4, !tbaa !22
  br label %152

152:                                              ; preds = %147
  %153 = load i32, ptr %11, align 4, !tbaa !22
  %154 = add i32 %153, 1
  store i32 %154, ptr %11, align 4, !tbaa !22
  br label %142, !llvm.loop !32

155:                                              ; preds = %146
  %156 = load i32, ptr %6, align 4, !tbaa !22
  store i32 %156, ptr %3, align 4
  store i32 1, ptr %7, align 4
  br label %822

157:                                              ; preds = %114
  %158 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 13
  %159 = load i32, ptr %158, align 4, !tbaa !29
  %160 = icmp ugt i32 %159, 0
  br i1 %160, label %161, label %163

161:                                              ; preds = %157
  %162 = load i32, ptr %9, align 4, !tbaa !22
  call void @_ZN5NPat29CPatricia15ChangeLastMatchEj(ptr noundef nonnull align 8 dereferenceable(160) %48, i32 noundef %162)
  br label %163

163:                                              ; preds = %161, %157
  br label %164

164:                                              ; preds = %163
  %165 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 12
  store i8 0, ptr %165, align 8, !tbaa !26
  br label %166

166:                                              ; preds = %164, %74
  %167 = load ptr, ptr %10, align 8, !tbaa !5
  %168 = call noundef zeroext i1 @_ZNK5NPat211CDescendant7IsEmptyEv(ptr noundef nonnull align 4 dereferenceable(4) %167)
  br i1 %168, label %169, label %173

169:                                              ; preds = %166
  %170 = load i32, ptr %8, align 4, !tbaa !22
  %171 = add i32 %170, -2147483648
  %172 = load ptr, ptr %10, align 8, !tbaa !5
  store i32 %171, ptr %172, align 4, !tbaa !31
  store i32 0, ptr %3, align 4
  store i32 1, ptr %7, align 4
  br label %822

173:                                              ; preds = %166
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #3
  %174 = load i32, ptr %6, align 4, !tbaa !22
  %175 = sub i32 %174, 2
  store i32 %175, ptr %12, align 4, !tbaa !22
  %176 = load ptr, ptr %10, align 8, !tbaa !5
  %177 = call noundef zeroext i1 @_ZNK5NPat211CDescendant7IsMatchEv(ptr noundef nonnull align 4 dereferenceable(4) %176)
  br i1 %177, label %178, label %357

178:                                              ; preds = %173
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #3
  %179 = load ptr, ptr %10, align 8, !tbaa !5
  %180 = load i32, ptr %179, align 4, !tbaa !31
  store i32 %180, ptr %13, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #3
  %181 = load i32, ptr %8, align 4, !tbaa !22
  %182 = load i32, ptr %13, align 4, !tbaa !22
  %183 = sub i32 %182, -2147483648
  %184 = sub i32 %181, %183
  store i32 %184, ptr %14, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #3
  %185 = load i32, ptr %14, align 4, !tbaa !22
  %186 = sub i32 %185, 1
  store i32 %186, ptr %15, align 4, !tbaa !22
  %187 = load i32, ptr %15, align 4, !tbaa !22
  %188 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 4
  %189 = load i32, ptr %188, align 8, !tbaa !30
  %190 = icmp uge i32 %187, %189
  br i1 %190, label %191, label %195

191:                                              ; preds = %178
  %192 = load i32, ptr %8, align 4, !tbaa !22
  %193 = add i32 %192, -2147483648
  %194 = load ptr, ptr %10, align 8, !tbaa !5
  store i32 %193, ptr %194, align 4, !tbaa !31
  store i32 0, ptr %3, align 4
  store i32 1, ptr %7, align 4
  br label %356

195:                                              ; preds = %178
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #3
  %196 = load ptr, ptr %5, align 8, !tbaa !5
  %197 = getelementptr inbounds i32, ptr %196, i64 2
  store ptr %197, ptr %5, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #3
  %198 = getelementptr inbounds i8, ptr %48, i64 24
  %199 = getelementptr inbounds %class.CLZInWindow, ptr %198, i32 0, i32 6
  %200 = load ptr, ptr %199, align 8, !tbaa !34
  %201 = load i32, ptr %8, align 4, !tbaa !22
  %202 = zext i32 %201 to i64
  %203 = getelementptr inbounds i8, ptr %200, i64 %202
  store ptr %203, ptr %17, align 8, !tbaa !5
  store i32 0, ptr %16, align 4, !tbaa !22
  br label %204

204:                                              ; preds = %237, %195
  br i1 true, label %205, label %240

205:                                              ; preds = %204
  %206 = load i32, ptr %15, align 4, !tbaa !22
  %207 = load ptr, ptr %5, align 8, !tbaa !5
  %208 = getelementptr inbounds i32, ptr %207, i32 1
  store ptr %208, ptr %5, align 8, !tbaa !5
  store i32 %206, ptr %207, align 4, !tbaa !22
  %209 = load i32, ptr %16, align 4, !tbaa !22
  %210 = load i32, ptr %12, align 4, !tbaa !22
  %211 = icmp eq i32 %209, %210
  br i1 %211, label %212, label %218

212:                                              ; preds = %205
  %213 = load i32, ptr %8, align 4, !tbaa !22
  %214 = add i32 %213, -2147483648
  %215 = load ptr, ptr %10, align 8, !tbaa !5
  store i32 %214, ptr %215, align 4, !tbaa !31
  %216 = load i32, ptr %16, align 4, !tbaa !22
  %217 = add i32 2, %216
  store i32 %217, ptr %3, align 4
  store i32 1, ptr %7, align 4
  br label %355

218:                                              ; preds = %205
  %219 = load ptr, ptr %17, align 8, !tbaa !5
  %220 = load i32, ptr %16, align 4, !tbaa !22
  %221 = zext i32 %220 to i64
  %222 = getelementptr inbounds i8, ptr %219, i64 %221
  %223 = load i8, ptr %222, align 1, !tbaa !31
  %224 = zext i8 %223 to i32
  %225 = load ptr, ptr %17, align 8, !tbaa !5
  %226 = load i32, ptr %16, align 4, !tbaa !22
  %227 = zext i32 %226 to i64
  %228 = load i32, ptr %14, align 4, !tbaa !22
  %229 = zext i32 %228 to i64
  %230 = sub i64 %227, %229
  %231 = getelementptr inbounds i8, ptr %225, i64 %230
  %232 = load i8, ptr %231, align 1, !tbaa !31
  %233 = zext i8 %232 to i32
  %234 = icmp ne i32 %224, %233
  br i1 %234, label %235, label %236

235:                                              ; preds = %218
  br label %240

236:                                              ; preds = %218
  br label %237

237:                                              ; preds = %236
  %238 = load i32, ptr %16, align 4, !tbaa !22
  %239 = add i32 %238, 1
  store i32 %239, ptr %16, align 4, !tbaa !22
  br label %204, !llvm.loop !35

240:                                              ; preds = %235, %204
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #3
  %241 = load i32, ptr %16, align 4, !tbaa !22
  %242 = add i32 %241, 2
  store i32 %242, ptr %18, align 4, !tbaa !22
  %243 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 8
  %244 = load i32, ptr %243, align 8, !tbaa !36
  %245 = load ptr, ptr %10, align 8, !tbaa !5
  store i32 %244, ptr %245, align 4, !tbaa !31
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #3
  %246 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 7
  %247 = load ptr, ptr %246, align 8, !tbaa !37
  %248 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 8
  %249 = load i32, ptr %248, align 8, !tbaa !36
  %250 = zext i32 %249 to i64
  %251 = getelementptr inbounds %"struct.NPat2::CNode", ptr %247, i64 %250
  store ptr %251, ptr %19, align 8, !tbaa !5
  %252 = load ptr, ptr %19, align 8, !tbaa !5
  %253 = getelementptr inbounds %"struct.NPat2::CNode", ptr %252, i32 0, i32 2
  %254 = load i32, ptr %253, align 4, !tbaa !31
  %255 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 8
  store i32 %254, ptr %255, align 8, !tbaa !36
  %256 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 10
  %257 = load i32, ptr %256, align 8, !tbaa !38
  %258 = add i32 %257, 1
  store i32 %258, ptr %256, align 8, !tbaa !38
  %259 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 8
  %260 = load i32, ptr %259, align 8, !tbaa !36
  %261 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 9
  %262 = load i32, ptr %261, align 4, !tbaa !39
  %263 = icmp ugt i32 %260, %262
  br i1 %263, label %264, label %278

264:                                              ; preds = %240
  %265 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 8
  %266 = load i32, ptr %265, align 8, !tbaa !36
  %267 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 9
  store i32 %266, ptr %267, align 4, !tbaa !39
  %268 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 8
  %269 = load i32, ptr %268, align 8, !tbaa !36
  %270 = add i32 %269, 1
  %271 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 7
  %272 = load ptr, ptr %271, align 8, !tbaa !37
  %273 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 8
  %274 = load i32, ptr %273, align 8, !tbaa !36
  %275 = zext i32 %274 to i64
  %276 = getelementptr inbounds %"struct.NPat2::CNode", ptr %272, i64 %275
  %277 = getelementptr inbounds %"struct.NPat2::CNode", ptr %276, i32 0, i32 2
  store i32 %270, ptr %277, align 4, !tbaa !31
  br label %278

278:                                              ; preds = %264, %240
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #3
  store i32 0, ptr %20, align 4, !tbaa !22
  br label %279

279:                                              ; preds = %289, %278
  %280 = load i32, ptr %20, align 4, !tbaa !22
  %281 = icmp ult i32 %280, 4
  br i1 %281, label %283, label %282

282:                                              ; preds = %279
  store i32 8, ptr %7, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #3
  br label %292

283:                                              ; preds = %279
  %284 = load ptr, ptr %19, align 8, !tbaa !5
  %285 = getelementptr inbounds %"struct.NPat2::CNode", ptr %284, i32 0, i32 2
  %286 = load i32, ptr %20, align 4, !tbaa !22
  %287 = zext i32 %286 to i64
  %288 = getelementptr inbounds [4 x %"union.NPat2::CDescendant"], ptr %285, i64 0, i64 %287
  store i32 2147483647, ptr %288, align 4, !tbaa !31
  br label %289

289:                                              ; preds = %283
  %290 = load i32, ptr %20, align 4, !tbaa !22
  %291 = add i32 %290, 1
  store i32 %291, ptr %20, align 4, !tbaa !22
  br label %279, !llvm.loop !40

292:                                              ; preds = %282
  %293 = load i32, ptr %8, align 4, !tbaa !22
  %294 = load ptr, ptr %19, align 8, !tbaa !5
  %295 = getelementptr inbounds %"struct.NPat2::CNode", ptr %294, i32 0, i32 0
  store i32 %293, ptr %295, align 4, !tbaa !41
  call void @llvm.lifetime.start.p0(i64 1, ptr %21) #3
  %296 = load i32, ptr %18, align 4, !tbaa !22
  %297 = load ptr, ptr %48, align 8, !tbaa !23
  %298 = getelementptr inbounds ptr, ptr %297, i64 6
  %299 = load ptr, ptr %298, align 8
  %300 = call noundef zeroext i8 %299(ptr noundef nonnull align 8 dereferenceable(160) %48, i32 noundef %296)
  store i8 %300, ptr %21, align 1, !tbaa !31
  call void @llvm.lifetime.start.p0(i64 1, ptr %22) #3
  %301 = load i32, ptr %18, align 4, !tbaa !22
  %302 = load i32, ptr %14, align 4, !tbaa !22
  %303 = sub i32 %301, %302
  %304 = load ptr, ptr %48, align 8, !tbaa !23
  %305 = getelementptr inbounds ptr, ptr %304, i64 6
  %306 = load ptr, ptr %305, align 8
  %307 = call noundef zeroext i8 %306(ptr noundef nonnull align 8 dereferenceable(160) %48, i32 noundef %303)
  store i8 %307, ptr %22, align 1, !tbaa !31
  call void @llvm.lifetime.start.p0(i64 1, ptr %23) #3
  call void @llvm.lifetime.start.p0(i64 1, ptr %24) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #3
  %308 = load i32, ptr %16, align 4, !tbaa !22
  %309 = mul i32 %308, 8
  store i32 %309, ptr %25, align 4, !tbaa !22
  br label %310

310:                                              ; preds = %326, %292
  br label %311

311:                                              ; preds = %310
  %312 = load i8, ptr %21, align 1, !tbaa !31
  %313 = zext i8 %312 to i32
  %314 = and i32 %313, 3
  %315 = trunc i32 %314 to i8
  store i8 %315, ptr %23, align 1, !tbaa !31
  %316 = load i8, ptr %22, align 1, !tbaa !31
  %317 = zext i8 %316 to i32
  %318 = and i32 %317, 3
  %319 = trunc i32 %318 to i8
  store i8 %319, ptr %24, align 1, !tbaa !31
  %320 = load i8, ptr %23, align 1, !tbaa !31
  %321 = zext i8 %320 to i32
  %322 = load i8, ptr %24, align 1, !tbaa !31
  %323 = zext i8 %322 to i32
  %324 = icmp ne i32 %321, %323
  br i1 %324, label %325, label %326

325:                                              ; preds = %311
  br label %337

326:                                              ; preds = %311
  %327 = load i8, ptr %21, align 1, !tbaa !31
  %328 = zext i8 %327 to i32
  %329 = ashr i32 %328, 2
  %330 = trunc i32 %329 to i8
  store i8 %330, ptr %21, align 1, !tbaa !31
  %331 = load i8, ptr %22, align 1, !tbaa !31
  %332 = zext i8 %331 to i32
  %333 = ashr i32 %332, 2
  %334 = trunc i32 %333 to i8
  store i8 %334, ptr %22, align 1, !tbaa !31
  %335 = load i32, ptr %25, align 4, !tbaa !22
  %336 = add i32 %335, 2
  store i32 %336, ptr %25, align 4, !tbaa !22
  br label %310, !llvm.loop !43

337:                                              ; preds = %325
  %338 = load i32, ptr %25, align 4, !tbaa !22
  %339 = load ptr, ptr %19, align 8, !tbaa !5
  %340 = getelementptr inbounds %"struct.NPat2::CNode", ptr %339, i32 0, i32 1
  store i32 %338, ptr %340, align 4, !tbaa !44
  %341 = load i32, ptr %8, align 4, !tbaa !22
  %342 = add i32 %341, -2147483648
  %343 = load ptr, ptr %19, align 8, !tbaa !5
  %344 = getelementptr inbounds %"struct.NPat2::CNode", ptr %343, i32 0, i32 2
  %345 = load i8, ptr %23, align 1, !tbaa !31
  %346 = zext i8 %345 to i64
  %347 = getelementptr inbounds [4 x %"union.NPat2::CDescendant"], ptr %344, i64 0, i64 %346
  store i32 %342, ptr %347, align 4, !tbaa !31
  %348 = load i32, ptr %13, align 4, !tbaa !22
  %349 = load ptr, ptr %19, align 8, !tbaa !5
  %350 = getelementptr inbounds %"struct.NPat2::CNode", ptr %349, i32 0, i32 2
  %351 = load i8, ptr %24, align 1, !tbaa !31
  %352 = zext i8 %351 to i64
  %353 = getelementptr inbounds [4 x %"union.NPat2::CDescendant"], ptr %350, i64 0, i64 %352
  store i32 %348, ptr %353, align 4, !tbaa !31
  %354 = load i32, ptr %18, align 4, !tbaa !22
  store i32 %354, ptr %3, align 4
  store i32 1, ptr %7, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #3
  call void @llvm.lifetime.end.p0(i64 1, ptr %24) #3
  call void @llvm.lifetime.end.p0(i64 1, ptr %23) #3
  call void @llvm.lifetime.end.p0(i64 1, ptr %22) #3
  call void @llvm.lifetime.end.p0(i64 1, ptr %21) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #3
  br label %355

355:                                              ; preds = %337, %212
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #3
  br label %356

356:                                              ; preds = %355, %191
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #3
  br label %821

357:                                              ; preds = %173
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #3
  %358 = getelementptr inbounds i8, ptr %48, i64 24
  %359 = getelementptr inbounds %class.CLZInWindow, ptr %358, i32 0, i32 6
  %360 = load ptr, ptr %359, align 8, !tbaa !34
  %361 = load i32, ptr %8, align 4, !tbaa !22
  %362 = zext i32 %361 to i64
  %363 = getelementptr inbounds i8, ptr %360, i64 %362
  store ptr %363, ptr %26, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #3
  %364 = load ptr, ptr %26, align 8, !tbaa !5
  store ptr %364, ptr %27, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #3
  store i32 0, ptr %28, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 1, ptr %29) #3
  store i8 0, ptr %29, align 1, !tbaa !31
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #3
  %365 = load ptr, ptr %10, align 8, !tbaa !5
  store ptr %365, ptr %30, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %31) #3
  %366 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 7
  %367 = load ptr, ptr %366, align 8, !tbaa !37
  %368 = load ptr, ptr %30, align 8, !tbaa !5
  %369 = load i32, ptr %368, align 4, !tbaa !22
  %370 = zext i32 %369 to i64
  %371 = getelementptr inbounds %"struct.NPat2::CNode", ptr %367, i64 %370
  store ptr %371, ptr %31, align 8, !tbaa !5
  %372 = load ptr, ptr %5, align 8, !tbaa !5
  %373 = getelementptr inbounds i32, ptr %372, i64 2
  store ptr %373, ptr %5, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %32) #3
  %374 = load ptr, ptr %26, align 8, !tbaa !5
  %375 = load i32, ptr %12, align 4, !tbaa !22
  %376 = zext i32 %375 to i64
  %377 = getelementptr inbounds i8, ptr %374, i64 %376
  store ptr %377, ptr %32, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #3
  %378 = getelementptr inbounds i8, ptr %48, i64 24
  %379 = getelementptr inbounds %class.CLZInWindow, ptr %378, i32 0, i32 6
  %380 = load ptr, ptr %379, align 8, !tbaa !34
  store ptr %380, ptr %33, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #3
  %381 = load i32, ptr %8, align 4, !tbaa !22
  %382 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 4
  %383 = load i32, ptr %382, align 8, !tbaa !30
  %384 = icmp ugt i32 %381, %383
  br i1 %384, label %385, label %390

385:                                              ; preds = %357
  %386 = load i32, ptr %8, align 4, !tbaa !22
  %387 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 4
  %388 = load i32, ptr %387, align 8, !tbaa !30
  %389 = sub i32 %386, %388
  store i32 %389, ptr %34, align 4, !tbaa !22
  br label %391

390:                                              ; preds = %357
  store i32 0, ptr %34, align 4, !tbaa !22
  br label %391

391:                                              ; preds = %390, %385
  br label %392

392:                                              ; preds = %656, %391
  br label %393

393:                                              ; preds = %392
  %394 = load ptr, ptr %31, align 8, !tbaa !5
  %395 = getelementptr inbounds %"struct.NPat2::CNode", ptr %394, i32 0, i32 0
  %396 = load i32, ptr %395, align 4, !tbaa !41
  %397 = load i32, ptr %34, align 4, !tbaa !22
  %398 = icmp ult i32 %396, %397
  br i1 %398, label %399, label %418

399:                                              ; preds = %393
  %400 = load ptr, ptr %30, align 8, !tbaa !5
  %401 = load i32, ptr %400, align 4, !tbaa !22
  call void @_ZN5NPat29CPatricia10RemoveNodeEj(ptr noundef nonnull align 8 dereferenceable(160) %48, i32 noundef %401)
  %402 = load i32, ptr %8, align 4, !tbaa !22
  %403 = add i32 %402, -2147483648
  %404 = load ptr, ptr %30, align 8, !tbaa !5
  store i32 %403, ptr %404, align 4, !tbaa !22
  %405 = load ptr, ptr %27, align 8, !tbaa !5
  %406 = load ptr, ptr %26, align 8, !tbaa !5
  %407 = icmp eq ptr %405, %406
  br i1 %407, label %408, label %409

408:                                              ; preds = %399
  store i32 0, ptr %3, align 4
  store i32 1, ptr %7, align 4
  br label %820

409:                                              ; preds = %399
  %410 = load ptr, ptr %27, align 8, !tbaa !5
  %411 = load ptr, ptr %26, align 8, !tbaa !5
  %412 = ptrtoint ptr %410 to i64
  %413 = ptrtoint ptr %411 to i64
  %414 = sub i64 %412, %413
  %415 = sub nsw i64 %414, 1
  %416 = trunc i64 %415 to i32
  %417 = add i32 2, %416
  store i32 %417, ptr %3, align 4
  store i32 1, ptr %7, align 4
  br label %820

418:                                              ; preds = %393
  %419 = load i32, ptr %28, align 4, !tbaa !22
  %420 = icmp eq i32 %419, 0
  br i1 %420, label %421, label %462

421:                                              ; preds = %418
  %422 = load i32, ptr %8, align 4, !tbaa !22
  %423 = load ptr, ptr %31, align 8, !tbaa !5
  %424 = getelementptr inbounds %"struct.NPat2::CNode", ptr %423, i32 0, i32 0
  %425 = load i32, ptr %424, align 4, !tbaa !41
  %426 = sub i32 %422, %425
  %427 = sub i32 %426, 1
  %428 = load ptr, ptr %5, align 8, !tbaa !5
  %429 = getelementptr inbounds i32, ptr %428, i32 1
  store ptr %429, ptr %5, align 8, !tbaa !5
  store i32 %427, ptr %428, align 4, !tbaa !22
  %430 = load ptr, ptr %27, align 8, !tbaa !5
  %431 = load ptr, ptr %32, align 8, !tbaa !5
  %432 = icmp uge ptr %430, %431
  br i1 %432, label %433, label %456

433:                                              ; preds = %421
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #3
  store i32 0, ptr %35, align 4, !tbaa !22
  br label %434

434:                                              ; preds = %446, %433
  %435 = load i32, ptr %35, align 4, !tbaa !22
  %436 = icmp ult i32 %435, 4
  br i1 %436, label %438, label %437

437:                                              ; preds = %434
  store i32 15, ptr %7, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #3
  br label %449

438:                                              ; preds = %434
  %439 = load i32, ptr %8, align 4, !tbaa !22
  %440 = add i32 %439, -2147483648
  %441 = load ptr, ptr %31, align 8, !tbaa !5
  %442 = getelementptr inbounds %"struct.NPat2::CNode", ptr %441, i32 0, i32 2
  %443 = load i32, ptr %35, align 4, !tbaa !22
  %444 = zext i32 %443 to i64
  %445 = getelementptr inbounds [4 x %"union.NPat2::CDescendant"], ptr %442, i64 0, i64 %444
  store i32 %440, ptr %445, align 4, !tbaa !31
  br label %446

446:                                              ; preds = %438
  %447 = load i32, ptr %35, align 4, !tbaa !22
  %448 = add i32 %447, 1
  store i32 %448, ptr %35, align 4, !tbaa !22
  br label %434, !llvm.loop !45

449:                                              ; preds = %437
  %450 = load i32, ptr %8, align 4, !tbaa !22
  %451 = load ptr, ptr %31, align 8, !tbaa !5
  %452 = getelementptr inbounds %"struct.NPat2::CNode", ptr %451, i32 0, i32 0
  store i32 %450, ptr %452, align 4, !tbaa !41
  %453 = load ptr, ptr %31, align 8, !tbaa !5
  %454 = getelementptr inbounds %"struct.NPat2::CNode", ptr %453, i32 0, i32 1
  store i32 0, ptr %454, align 4, !tbaa !44
  %455 = load i32, ptr %6, align 4, !tbaa !22
  store i32 %455, ptr %3, align 4
  store i32 1, ptr %7, align 4
  br label %820

456:                                              ; preds = %421
  %457 = load ptr, ptr %27, align 8, !tbaa !5
  %458 = getelementptr inbounds i8, ptr %457, i32 1
  store ptr %458, ptr %27, align 8, !tbaa !5
  %459 = load i8, ptr %457, align 1, !tbaa !31
  store i8 %459, ptr %29, align 1, !tbaa !31
  %460 = load ptr, ptr %33, align 8, !tbaa !5
  %461 = getelementptr inbounds i8, ptr %460, i32 1
  store ptr %461, ptr %33, align 8, !tbaa !5
  store i32 8, ptr %28, align 4, !tbaa !22
  br label %462

462:                                              ; preds = %456, %418
  call void @llvm.lifetime.start.p0(i64 4, ptr %36) #3
  %463 = load ptr, ptr %31, align 8, !tbaa !5
  %464 = getelementptr inbounds %"struct.NPat2::CNode", ptr %463, i32 0, i32 1
  %465 = load i32, ptr %464, align 4, !tbaa !44
  store i32 %465, ptr %36, align 4, !tbaa !22
  %466 = load i32, ptr %36, align 4, !tbaa !22
  %467 = icmp ugt i32 %466, 0
  br i1 %467, label %468, label %604

468:                                              ; preds = %462
  call void @llvm.lifetime.start.p0(i64 1, ptr %37) #3
  %469 = load ptr, ptr %33, align 8, !tbaa !5
  %470 = load ptr, ptr %31, align 8, !tbaa !5
  %471 = getelementptr inbounds %"struct.NPat2::CNode", ptr %470, i32 0, i32 0
  %472 = load i32, ptr %471, align 4, !tbaa !41
  %473 = zext i32 %472 to i64
  %474 = getelementptr inbounds i8, ptr %469, i64 %473
  %475 = getelementptr inbounds i8, ptr %474, i64 -1
  %476 = load i8, ptr %475, align 1, !tbaa !31
  %477 = zext i8 %476 to i32
  %478 = load i32, ptr %28, align 4, !tbaa !22
  %479 = sub i32 8, %478
  %480 = ashr i32 %477, %479
  %481 = load i8, ptr %29, align 1, !tbaa !31
  %482 = zext i8 %481 to i32
  %483 = xor i32 %480, %482
  %484 = trunc i32 %483 to i8
  store i8 %484, ptr %37, align 1, !tbaa !31
  br label %485

485:                                              ; preds = %551, %468
  %486 = load i32, ptr %28, align 4, !tbaa !22
  %487 = load i32, ptr %36, align 4, !tbaa !22
  %488 = icmp ule i32 %486, %487
  br i1 %488, label %489, label %569

489:                                              ; preds = %485
  %490 = load i8, ptr %37, align 1, !tbaa !31
  %491 = zext i8 %490 to i32
  %492 = icmp ne i32 %491, 0
  br i1 %492, label %493, label %508

493:                                              ; preds = %489
  %494 = load ptr, ptr %31, align 8, !tbaa !5
  %495 = load ptr, ptr %30, align 8, !tbaa !5
  %496 = load i8, ptr %29, align 1, !tbaa !31
  %497 = load i8, ptr %37, align 1, !tbaa !31
  %498 = load i32, ptr %36, align 4, !tbaa !22
  %499 = load i32, ptr %8, align 4, !tbaa !22
  call void @_ZN5NPat29CPatricia15AddInternalNodeEPNS_5CNodeEPjhhjj(ptr noundef nonnull align 8 dereferenceable(160) %48, ptr noundef %494, ptr noundef %495, i8 noundef zeroext %496, i8 noundef zeroext %497, i32 noundef %498, i32 noundef %499)
  %500 = load ptr, ptr %27, align 8, !tbaa !5
  %501 = load ptr, ptr %26, align 8, !tbaa !5
  %502 = ptrtoint ptr %500 to i64
  %503 = ptrtoint ptr %501 to i64
  %504 = sub i64 %502, %503
  %505 = sub nsw i64 %504, 1
  %506 = trunc i64 %505 to i32
  %507 = add i32 2, %506
  store i32 %507, ptr %3, align 4
  store i32 1, ptr %7, align 4
  br label %601

508:                                              ; preds = %489
  %509 = load i32, ptr %8, align 4, !tbaa !22
  %510 = load ptr, ptr %31, align 8, !tbaa !5
  %511 = getelementptr inbounds %"struct.NPat2::CNode", ptr %510, i32 0, i32 0
  %512 = load i32, ptr %511, align 4, !tbaa !41
  %513 = sub i32 %509, %512
  %514 = sub i32 %513, 1
  %515 = load ptr, ptr %5, align 8, !tbaa !5
  %516 = getelementptr inbounds i32, ptr %515, i32 1
  store ptr %516, ptr %5, align 8, !tbaa !5
  store i32 %514, ptr %515, align 4, !tbaa !22
  %517 = load i32, ptr %28, align 4, !tbaa !22
  %518 = load i32, ptr %36, align 4, !tbaa !22
  %519 = sub i32 %518, %517
  store i32 %519, ptr %36, align 4, !tbaa !22
  %520 = load ptr, ptr %27, align 8, !tbaa !5
  %521 = load ptr, ptr %32, align 8, !tbaa !5
  %522 = icmp uge ptr %520, %521
  br i1 %522, label %523, label %551

523:                                              ; preds = %508
  call void @llvm.lifetime.start.p0(i64 4, ptr %38) #3
  store i32 0, ptr %38, align 4, !tbaa !22
  br label %524

524:                                              ; preds = %536, %523
  %525 = load i32, ptr %38, align 4, !tbaa !22
  %526 = icmp ult i32 %525, 4
  br i1 %526, label %528, label %527

527:                                              ; preds = %524
  store i32 20, ptr %7, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #3
  br label %539

528:                                              ; preds = %524
  %529 = load i32, ptr %8, align 4, !tbaa !22
  %530 = add i32 %529, -2147483648
  %531 = load ptr, ptr %31, align 8, !tbaa !5
  %532 = getelementptr inbounds %"struct.NPat2::CNode", ptr %531, i32 0, i32 2
  %533 = load i32, ptr %38, align 4, !tbaa !22
  %534 = zext i32 %533 to i64
  %535 = getelementptr inbounds [4 x %"union.NPat2::CDescendant"], ptr %532, i64 0, i64 %534
  store i32 %530, ptr %535, align 4, !tbaa !31
  br label %536

536:                                              ; preds = %528
  %537 = load i32, ptr %38, align 4, !tbaa !22
  %538 = add i32 %537, 1
  store i32 %538, ptr %38, align 4, !tbaa !22
  br label %524, !llvm.loop !46

539:                                              ; preds = %527
  %540 = load i32, ptr %8, align 4, !tbaa !22
  %541 = load ptr, ptr %31, align 8, !tbaa !5
  %542 = getelementptr inbounds %"struct.NPat2::CNode", ptr %541, i32 0, i32 0
  store i32 %540, ptr %542, align 4, !tbaa !41
  %543 = load ptr, ptr %31, align 8, !tbaa !5
  %544 = getelementptr inbounds %"struct.NPat2::CNode", ptr %543, i32 0, i32 1
  %545 = load i32, ptr %544, align 4, !tbaa !44
  %546 = load i32, ptr %36, align 4, !tbaa !22
  %547 = sub i32 %545, %546
  %548 = load ptr, ptr %31, align 8, !tbaa !5
  %549 = getelementptr inbounds %"struct.NPat2::CNode", ptr %548, i32 0, i32 1
  store i32 %547, ptr %549, align 4, !tbaa !44
  %550 = load i32, ptr %6, align 4, !tbaa !22
  store i32 %550, ptr %3, align 4
  store i32 1, ptr %7, align 4
  br label %601

551:                                              ; preds = %508
  store i32 8, ptr %28, align 4, !tbaa !22
  %552 = load ptr, ptr %27, align 8, !tbaa !5
  %553 = getelementptr inbounds i8, ptr %552, i32 1
  store ptr %553, ptr %27, align 8, !tbaa !5
  %554 = load i8, ptr %552, align 1, !tbaa !31
  store i8 %554, ptr %29, align 1, !tbaa !31
  %555 = load i8, ptr %29, align 1, !tbaa !31
  %556 = zext i8 %555 to i32
  %557 = load ptr, ptr %33, align 8, !tbaa !5
  %558 = load ptr, ptr %31, align 8, !tbaa !5
  %559 = getelementptr inbounds %"struct.NPat2::CNode", ptr %558, i32 0, i32 0
  %560 = load i32, ptr %559, align 4, !tbaa !41
  %561 = zext i32 %560 to i64
  %562 = getelementptr inbounds i8, ptr %557, i64 %561
  %563 = load i8, ptr %562, align 1, !tbaa !31
  %564 = zext i8 %563 to i32
  %565 = xor i32 %556, %564
  %566 = trunc i32 %565 to i8
  store i8 %566, ptr %37, align 1, !tbaa !31
  %567 = load ptr, ptr %33, align 8, !tbaa !5
  %568 = getelementptr inbounds i8, ptr %567, i32 1
  store ptr %568, ptr %33, align 8, !tbaa !5
  br label %485, !llvm.loop !47

569:                                              ; preds = %485
  %570 = load i8, ptr %37, align 1, !tbaa !31
  %571 = zext i8 %570 to i32
  %572 = load i32, ptr %36, align 4, !tbaa !22
  %573 = shl i32 1, %572
  %574 = sub nsw i32 %573, 1
  %575 = and i32 %571, %574
  %576 = icmp ne i32 %575, 0
  br i1 %576, label %577, label %592

577:                                              ; preds = %569
  %578 = load ptr, ptr %31, align 8, !tbaa !5
  %579 = load ptr, ptr %30, align 8, !tbaa !5
  %580 = load i8, ptr %29, align 1, !tbaa !31
  %581 = load i8, ptr %37, align 1, !tbaa !31
  %582 = load i32, ptr %36, align 4, !tbaa !22
  %583 = load i32, ptr %8, align 4, !tbaa !22
  call void @_ZN5NPat29CPatricia15AddInternalNodeEPNS_5CNodeEPjhhjj(ptr noundef nonnull align 8 dereferenceable(160) %48, ptr noundef %578, ptr noundef %579, i8 noundef zeroext %580, i8 noundef zeroext %581, i32 noundef %582, i32 noundef %583)
  %584 = load ptr, ptr %27, align 8, !tbaa !5
  %585 = load ptr, ptr %26, align 8, !tbaa !5
  %586 = ptrtoint ptr %584 to i64
  %587 = ptrtoint ptr %585 to i64
  %588 = sub i64 %586, %587
  %589 = sub nsw i64 %588, 1
  %590 = trunc i64 %589 to i32
  %591 = add i32 2, %590
  store i32 %591, ptr %3, align 4
  store i32 1, ptr %7, align 4
  br label %601

592:                                              ; preds = %569
  %593 = load i32, ptr %36, align 4, !tbaa !22
  %594 = load i8, ptr %29, align 1, !tbaa !31
  %595 = zext i8 %594 to i32
  %596 = ashr i32 %595, %593
  %597 = trunc i32 %596 to i8
  store i8 %597, ptr %29, align 1, !tbaa !31
  %598 = load i32, ptr %36, align 4, !tbaa !22
  %599 = load i32, ptr %28, align 4, !tbaa !22
  %600 = sub i32 %599, %598
  store i32 %600, ptr %28, align 4, !tbaa !22
  store i32 0, ptr %7, align 4
  br label %601

601:                                              ; preds = %592, %577, %539, %493
  call void @llvm.lifetime.end.p0(i64 1, ptr %37) #3
  %602 = load i32, ptr %7, align 4
  switch i32 %602, label %654 [
    i32 0, label %603
  ]

603:                                              ; preds = %601
  br label %604

604:                                              ; preds = %603, %462
  call void @llvm.lifetime.start.p0(i64 4, ptr %39) #3
  %605 = load i8, ptr %29, align 1, !tbaa !31
  %606 = zext i8 %605 to i32
  %607 = and i32 %606, 3
  store i32 %607, ptr %39, align 4, !tbaa !22
  %608 = load i32, ptr %28, align 4, !tbaa !22
  %609 = sub i32 %608, 2
  store i32 %609, ptr %28, align 4, !tbaa !22
  %610 = load ptr, ptr %31, align 8, !tbaa !5
  %611 = getelementptr inbounds %"struct.NPat2::CNode", ptr %610, i32 0, i32 2
  %612 = load i32, ptr %39, align 4, !tbaa !22
  %613 = zext i32 %612 to i64
  %614 = getelementptr inbounds [4 x %"union.NPat2::CDescendant"], ptr %611, i64 0, i64 %613
  store ptr %614, ptr %30, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #3
  %615 = load ptr, ptr %30, align 8, !tbaa !5
  %616 = load i32, ptr %615, align 4, !tbaa !22
  store i32 %616, ptr %40, align 4, !tbaa !22
  %617 = load i32, ptr %8, align 4, !tbaa !22
  %618 = load ptr, ptr %31, align 8, !tbaa !5
  %619 = getelementptr inbounds %"struct.NPat2::CNode", ptr %618, i32 0, i32 0
  store i32 %617, ptr %619, align 4, !tbaa !41
  %620 = load i32, ptr %40, align 4, !tbaa !22
  %621 = icmp ult i32 %620, 2147483647
  br i1 %621, label %622, label %632

622:                                              ; preds = %604
  %623 = load i8, ptr %29, align 1, !tbaa !31
  %624 = zext i8 %623 to i32
  %625 = ashr i32 %624, 2
  %626 = trunc i32 %625 to i8
  store i8 %626, ptr %29, align 1, !tbaa !31
  %627 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 7
  %628 = load ptr, ptr %627, align 8, !tbaa !37
  %629 = load i32, ptr %40, align 4, !tbaa !22
  %630 = zext i32 %629 to i64
  %631 = getelementptr inbounds %"struct.NPat2::CNode", ptr %628, i64 %630
  store ptr %631, ptr %31, align 8, !tbaa !5
  br label %652

632:                                              ; preds = %604
  %633 = load i32, ptr %40, align 4, !tbaa !22
  %634 = icmp eq i32 %633, 2147483647
  br i1 %634, label %635, label %651

635:                                              ; preds = %632
  %636 = load i32, ptr %8, align 4, !tbaa !22
  %637 = add i32 %636, -2147483648
  %638 = load ptr, ptr %31, align 8, !tbaa !5
  %639 = getelementptr inbounds %"struct.NPat2::CNode", ptr %638, i32 0, i32 2
  %640 = load i32, ptr %39, align 4, !tbaa !22
  %641 = zext i32 %640 to i64
  %642 = getelementptr inbounds [4 x %"union.NPat2::CDescendant"], ptr %639, i64 0, i64 %641
  store i32 %637, ptr %642, align 4, !tbaa !31
  %643 = load ptr, ptr %27, align 8, !tbaa !5
  %644 = load ptr, ptr %26, align 8, !tbaa !5
  %645 = ptrtoint ptr %643 to i64
  %646 = ptrtoint ptr %644 to i64
  %647 = sub i64 %645, %646
  %648 = sub nsw i64 %647, 1
  %649 = trunc i64 %648 to i32
  %650 = add i32 2, %649
  store i32 %650, ptr %3, align 4
  store i32 1, ptr %7, align 4
  br label %653

651:                                              ; preds = %632
  store i32 14, ptr %7, align 4
  br label %653

652:                                              ; preds = %622
  store i32 0, ptr %7, align 4
  br label %653

653:                                              ; preds = %652, %651, %635
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %39) #3
  br label %654

654:                                              ; preds = %653, %601
  call void @llvm.lifetime.end.p0(i64 4, ptr %36) #3
  %655 = load i32, ptr %7, align 4
  switch i32 %655, label %820 [
    i32 0, label %656
    i32 14, label %657
  ]

656:                                              ; preds = %654
  br label %392, !llvm.loop !48

657:                                              ; preds = %654
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #3
  %658 = load i8, ptr %29, align 1, !tbaa !31
  %659 = zext i8 %658 to i32
  %660 = and i32 %659, 3
  store i32 %660, ptr %41, align 4, !tbaa !22
  %661 = load i8, ptr %29, align 1, !tbaa !31
  %662 = zext i8 %661 to i32
  %663 = ashr i32 %662, 2
  %664 = trunc i32 %663 to i8
  store i8 %664, ptr %29, align 1, !tbaa !31
  call void @llvm.lifetime.start.p0(i64 4, ptr %42) #3
  %665 = load ptr, ptr %31, align 8, !tbaa !5
  %666 = getelementptr inbounds %"struct.NPat2::CNode", ptr %665, i32 0, i32 2
  %667 = load i32, ptr %41, align 4, !tbaa !22
  %668 = zext i32 %667 to i64
  %669 = getelementptr inbounds [4 x %"union.NPat2::CDescendant"], ptr %666, i64 0, i64 %668
  %670 = load i32, ptr %669, align 4, !tbaa !31
  store i32 %670, ptr %42, align 4, !tbaa !22
  call void @llvm.lifetime.start.p0(i64 4, ptr %43) #3
  %671 = load i32, ptr %42, align 4, !tbaa !22
  %672 = sub i32 %671, -2147483648
  store i32 %672, ptr %43, align 4, !tbaa !22
  %673 = load i32, ptr %43, align 4, !tbaa !22
  %674 = load i32, ptr %34, align 4, !tbaa !22
  %675 = icmp ult i32 %673, %674
  br i1 %675, label %676, label %692

676:                                              ; preds = %657
  %677 = load i32, ptr %8, align 4, !tbaa !22
  %678 = add i32 %677, -2147483648
  %679 = load ptr, ptr %31, align 8, !tbaa !5
  %680 = getelementptr inbounds %"struct.NPat2::CNode", ptr %679, i32 0, i32 2
  %681 = load i32, ptr %41, align 4, !tbaa !22
  %682 = zext i32 %681 to i64
  %683 = getelementptr inbounds [4 x %"union.NPat2::CDescendant"], ptr %680, i64 0, i64 %682
  store i32 %678, ptr %683, align 4, !tbaa !31
  %684 = load ptr, ptr %27, align 8, !tbaa !5
  %685 = load ptr, ptr %26, align 8, !tbaa !5
  %686 = ptrtoint ptr %684 to i64
  %687 = ptrtoint ptr %685 to i64
  %688 = sub i64 %686, %687
  %689 = sub nsw i64 %688, 1
  %690 = trunc i64 %689 to i32
  %691 = add i32 2, %690
  store i32 %691, ptr %3, align 4
  store i32 1, ptr %7, align 4
  br label %819

692:                                              ; preds = %657
  call void @llvm.lifetime.start.p0(i64 1, ptr %44) #3
  call void @llvm.lifetime.start.p0(i64 4, ptr %45) #3
  store i32 0, ptr %45, align 4, !tbaa !22
  %693 = load i32, ptr %28, align 4, !tbaa !22
  %694 = icmp ne i32 %693, 0
  br i1 %694, label %695, label %739

695:                                              ; preds = %692
  call void @llvm.lifetime.start.p0(i64 1, ptr %46) #3
  %696 = load ptr, ptr %33, align 8, !tbaa !5
  %697 = load i32, ptr %43, align 4, !tbaa !22
  %698 = zext i32 %697 to i64
  %699 = getelementptr inbounds i8, ptr %696, i64 %698
  %700 = getelementptr inbounds i8, ptr %699, i64 -1
  %701 = load i8, ptr %700, align 1, !tbaa !31
  store i8 %701, ptr %46, align 1, !tbaa !31
  %702 = load i32, ptr %28, align 4, !tbaa !22
  %703 = sub i32 8, %702
  %704 = load i8, ptr %46, align 1, !tbaa !31
  %705 = zext i8 %704 to i32
  %706 = ashr i32 %705, %703
  %707 = trunc i32 %706 to i8
  store i8 %707, ptr %46, align 1, !tbaa !31
  %708 = load i8, ptr %46, align 1, !tbaa !31
  %709 = zext i8 %708 to i32
  %710 = load i8, ptr %29, align 1, !tbaa !31
  %711 = zext i8 %710 to i32
  %712 = xor i32 %709, %711
  %713 = trunc i32 %712 to i8
  store i8 %713, ptr %44, align 1, !tbaa !31
  %714 = load i8, ptr %44, align 1, !tbaa !31
  %715 = zext i8 %714 to i32
  %716 = icmp ne i32 %715, 0
  br i1 %716, label %717, label %732

717:                                              ; preds = %695
  %718 = load ptr, ptr %31, align 8, !tbaa !5
  %719 = load i8, ptr %29, align 1, !tbaa !31
  %720 = load i8, ptr %44, align 1, !tbaa !31
  %721 = load i32, ptr %45, align 4, !tbaa !22
  %722 = load i32, ptr %8, align 4, !tbaa !22
  %723 = load i32, ptr %41, align 4, !tbaa !22
  call void @_ZN5NPat29CPatricia11AddLeafNodeEPNS_5CNodeEhhjjj(ptr noundef nonnull align 8 dereferenceable(160) %48, ptr noundef %718, i8 noundef zeroext %719, i8 noundef zeroext %720, i32 noundef %721, i32 noundef %722, i32 noundef %723)
  %724 = load ptr, ptr %27, align 8, !tbaa !5
  %725 = load ptr, ptr %26, align 8, !tbaa !5
  %726 = ptrtoint ptr %724 to i64
  %727 = ptrtoint ptr %725 to i64
  %728 = sub i64 %726, %727
  %729 = sub nsw i64 %728, 1
  %730 = trunc i64 %729 to i32
  %731 = add i32 2, %730
  store i32 %731, ptr %3, align 4
  store i32 1, ptr %7, align 4
  br label %736

732:                                              ; preds = %695
  %733 = load i32, ptr %28, align 4, !tbaa !22
  %734 = load i32, ptr %45, align 4, !tbaa !22
  %735 = add i32 %734, %733
  store i32 %735, ptr %45, align 4, !tbaa !22
  store i32 0, ptr %7, align 4
  br label %736

736:                                              ; preds = %732, %717
  call void @llvm.lifetime.end.p0(i64 1, ptr %46) #3
  %737 = load i32, ptr %7, align 4
  switch i32 %737, label %818 [
    i32 0, label %738
  ]

738:                                              ; preds = %736
  br label %739

739:                                              ; preds = %738, %692
  call void @llvm.lifetime.start.p0(i64 8, ptr %47) #3
  %740 = getelementptr inbounds i8, ptr %48, i64 24
  %741 = getelementptr inbounds %class.CLZInWindow, ptr %740, i32 0, i32 6
  %742 = load ptr, ptr %741, align 8, !tbaa !34
  %743 = load i32, ptr %43, align 4, !tbaa !22
  %744 = zext i32 %743 to i64
  %745 = getelementptr inbounds i8, ptr %742, i64 %744
  %746 = load ptr, ptr %27, align 8, !tbaa !5
  %747 = load ptr, ptr %26, align 8, !tbaa !5
  %748 = ptrtoint ptr %746 to i64
  %749 = ptrtoint ptr %747 to i64
  %750 = sub i64 %748, %749
  %751 = getelementptr inbounds i8, ptr %745, i64 %750
  store ptr %751, ptr %47, align 8, !tbaa !5
  br label %752

752:                                              ; preds = %793, %739
  %753 = load ptr, ptr %27, align 8, !tbaa !5
  %754 = load ptr, ptr %32, align 8, !tbaa !5
  %755 = icmp ult ptr %753, %754
  br i1 %755, label %756, label %796

756:                                              ; preds = %752
  %757 = load ptr, ptr %27, align 8, !tbaa !5
  %758 = getelementptr inbounds i8, ptr %757, i32 1
  store ptr %758, ptr %27, align 8, !tbaa !5
  %759 = load i8, ptr %757, align 1, !tbaa !31
  store i8 %759, ptr %29, align 1, !tbaa !31
  %760 = load i32, ptr %8, align 4, !tbaa !22
  %761 = load i32, ptr %43, align 4, !tbaa !22
  %762 = sub i32 %760, %761
  %763 = sub i32 %762, 1
  %764 = load ptr, ptr %5, align 8, !tbaa !5
  %765 = getelementptr inbounds i32, ptr %764, i32 1
  store ptr %765, ptr %5, align 8, !tbaa !5
  store i32 %763, ptr %764, align 4, !tbaa !22
  %766 = load i8, ptr %29, align 1, !tbaa !31
  %767 = zext i8 %766 to i32
  %768 = load ptr, ptr %47, align 8, !tbaa !5
  %769 = getelementptr inbounds i8, ptr %768, i32 1
  store ptr %769, ptr %47, align 8, !tbaa !5
  %770 = load i8, ptr %768, align 1, !tbaa !31
  %771 = zext i8 %770 to i32
  %772 = xor i32 %767, %771
  %773 = trunc i32 %772 to i8
  store i8 %773, ptr %44, align 1, !tbaa !31
  %774 = load i8, ptr %44, align 1, !tbaa !31
  %775 = zext i8 %774 to i32
  %776 = icmp ne i32 %775, 0
  br i1 %776, label %777, label %792

777:                                              ; preds = %756
  %778 = load ptr, ptr %31, align 8, !tbaa !5
  %779 = load i8, ptr %29, align 1, !tbaa !31
  %780 = load i8, ptr %44, align 1, !tbaa !31
  %781 = load i32, ptr %45, align 4, !tbaa !22
  %782 = load i32, ptr %8, align 4, !tbaa !22
  %783 = load i32, ptr %41, align 4, !tbaa !22
  call void @_ZN5NPat29CPatricia11AddLeafNodeEPNS_5CNodeEhhjjj(ptr noundef nonnull align 8 dereferenceable(160) %48, ptr noundef %778, i8 noundef zeroext %779, i8 noundef zeroext %780, i32 noundef %781, i32 noundef %782, i32 noundef %783)
  %784 = load ptr, ptr %27, align 8, !tbaa !5
  %785 = load ptr, ptr %26, align 8, !tbaa !5
  %786 = ptrtoint ptr %784 to i64
  %787 = ptrtoint ptr %785 to i64
  %788 = sub i64 %786, %787
  %789 = sub nsw i64 %788, 1
  %790 = trunc i64 %789 to i32
  %791 = add i32 2, %790
  store i32 %791, ptr %3, align 4
  store i32 1, ptr %7, align 4
  br label %817

792:                                              ; preds = %756
  br label %793

793:                                              ; preds = %792
  %794 = load i32, ptr %45, align 4, !tbaa !22
  %795 = add i32 %794, 8
  store i32 %795, ptr %45, align 4, !tbaa !22
  br label %752, !llvm.loop !49

796:                                              ; preds = %752
  %797 = load i32, ptr %8, align 4, !tbaa !22
  %798 = load i32, ptr %43, align 4, !tbaa !22
  %799 = sub i32 %797, %798
  %800 = sub i32 %799, 1
  %801 = load ptr, ptr %5, align 8, !tbaa !5
  store i32 %800, ptr %801, align 4, !tbaa !22
  %802 = load i32, ptr %8, align 4, !tbaa !22
  %803 = add i32 %802, -2147483648
  %804 = load ptr, ptr %31, align 8, !tbaa !5
  %805 = getelementptr inbounds %"struct.NPat2::CNode", ptr %804, i32 0, i32 2
  %806 = load i32, ptr %41, align 4, !tbaa !22
  %807 = zext i32 %806 to i64
  %808 = getelementptr inbounds [4 x %"union.NPat2::CDescendant"], ptr %805, i64 0, i64 %807
  store i32 %803, ptr %808, align 4, !tbaa !31
  %809 = load ptr, ptr %5, align 8, !tbaa !5
  %810 = load i32, ptr %809, align 4, !tbaa !22
  %811 = icmp eq i32 %810, 0
  br i1 %811, label %812, label %815

812:                                              ; preds = %796
  %813 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 12
  store i8 1, ptr %813, align 8, !tbaa !26
  %814 = getelementptr inbounds %"class.NPat2::CPatricia", ptr %48, i32 0, i32 13
  store i32 0, ptr %814, align 4, !tbaa !29
  br label %815

815:                                              ; preds = %812, %796
  %816 = load i32, ptr %6, align 4, !tbaa !22
  store i32 %816, ptr %3, align 4
  store i32 1, ptr %7, align 4
  br label %817

817:                                              ; preds = %815, %777
  call void @llvm.lifetime.end.p0(i64 8, ptr %47) #3
  br label %818

818:                                              ; preds = %817, %736
  call void @llvm.lifetime.end.p0(i64 4, ptr %45) #3
  call void @llvm.lifetime.end.p0(i64 1, ptr %44) #3
  br label %819

819:                                              ; preds = %818, %676
  call void @llvm.lifetime.end.p0(i64 4, ptr %43) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %42) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #3
  br label %820

820:                                              ; preds = %819, %654, %449, %409, %408
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %32) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %31) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #3
  call void @llvm.lifetime.end.p0(i64 1, ptr %29) #3
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #3
  br label %821

821:                                              ; preds = %820, %356
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #3
  br label %822

822:                                              ; preds = %821, %169, %155
  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 4, ptr %8) #3
  br label %823

823:                                              ; preds = %822, %72
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #3
  %824 = load i32, ptr %3, align 4
  ret i32 %824
}

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZNK5NPat211CDescendant7IsMatchEv(ptr noundef nonnull align 4 dereferenceable(4)) #2 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZNK5NPat211CDescendant7IsEmptyEv(ptr noundef nonnull align 4 dereferenceable(4)) #2 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN5NPat29CPatricia10RemoveNodeEj(ptr noundef nonnull align 8 dereferenceable(160), i32 noundef) #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN5NPat29CPatricia15AddInternalNodeEPNS_5CNodeEPjhhjj(ptr noundef nonnull align 8 dereferenceable(160), ptr noundef, ptr noundef, i8 noundef zeroext, i8 noundef zeroext, i32 noundef, i32 noundef) #2 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN5NPat29CPatricia11AddLeafNodeEPNS_5CNodeEhhjjj(ptr noundef nonnull align 8 dereferenceable(160), ptr noundef, i8 noundef zeroext, i8 noundef zeroext, i32 noundef, i32 noundef, i32 noundef) #2 align 2

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { mustprogress 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 = { mustprogress 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++ TBAA"}
!9 = !{!10, !11, i64 52}
!10 = !{!"_ZTS11CLZInWindow", !6, i64 8, !6, i64 16, !11, i64 24, !12, i64 28, !6, i64 32, !6, i64 40, !11, i64 48, !11, i64 52, !11, i64 56, !11, i64 60, !11, i64 64, !11, i64 68}
!11 = !{!"int", !7, i64 0}
!12 = !{!"bool", !7, i64 0}
!13 = !{!14, !11, i64 100}
!14 = !{!"_ZTSN5NPat29CPatriciaE", !15, i64 0, !18, i64 8, !19, i64 16, !10, i64 24, !11, i64 96, !11, i64 100, !6, i64 104, !6, i64 112, !11, i64 120, !11, i64 124, !11, i64 128, !11, i64 132, !12, i64 136, !11, i64 140, !6, i64 144, !20, i64 152}
!15 = !{!"_ZTS12IMatchFinder", !16, i64 0}
!16 = !{!"_ZTS15IInWindowStream", !17, i64 0}
!17 = !{!"_ZTS8IUnknown"}
!18 = !{!"_ZTS23IMatchFinderSetCallback", !17, i64 0}
!19 = !{!"_ZTS13CMyUnknownImp", !11, i64 0}
!20 = !{!"_ZTS9CMyComPtrI20IMatchFinderCallbackE", !6, i64 0}
!21 = !{!10, !11, i64 68}
!22 = !{!11, !11, i64 0}
!23 = !{!24, !24, i64 0}
!24 = !{!"vtable pointer", !8, i64 0}
!25 = !{!14, !6, i64 104}
!26 = !{!14, !12, i64 136}
!27 = !{i8 0, i8 2}
!28 = !{}
!29 = !{!14, !11, i64 140}
!30 = !{!14, !11, i64 96}
!31 = !{!7, !7, i64 0}
!32 = distinct !{!32, !33}
!33 = !{!"llvm.loop.mustprogress"}
!34 = !{!10, !6, i64 40}
!35 = distinct !{!35, !33}
!36 = !{!14, !11, i64 120}
!37 = !{!14, !6, i64 112}
!38 = !{!14, !11, i64 128}
!39 = !{!14, !11, i64 124}
!40 = distinct !{!40, !33}
!41 = !{!42, !11, i64 0}
!42 = !{!"_ZTSN5NPat25CNodeE", !11, i64 0, !11, i64 4, !7, i64 8}
!43 = distinct !{!43, !33}
!44 = !{!42, !11, i64 4}
!45 = distinct !{!45, !33}
!46 = distinct !{!46, !33}
!47 = distinct !{!47, !33}
!48 = distinct !{!48, !33}
!49 = distinct !{!49, !33}


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

%"union.NPat2::CDescendant" = type { i32 }
%"struct.NPat2::CNode" = type { i32, i32, %union.anon }
%union.anon = type { [4 x %"union.NPat2::CDescendant"] }

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN5NPat29CPatricia15ChangeLastMatchEj(ptr noundef nonnull align 8 dereferenceable(160), i32 noundef) local_unnamed_addr #0 align 2

; Function Attrs: mustprogress uwtable
define dso_local noundef i32 @_ZN5NPat29CPatricia15GetLongestMatchEPj(ptr noundef nonnull align 8 dereferenceable(160) %0, ptr nocapture noundef %1) unnamed_addr #0 align 2 {
  %3 = getelementptr inbounds i8, ptr %0, i64 76
  %4 = load i32, ptr %3, align 4, !tbaa !5
  %5 = getelementptr inbounds i8, ptr %0, i64 100
  %6 = load i32, ptr %5, align 4, !tbaa !12
  %7 = add i32 %6, %4
  %8 = getelementptr inbounds i8, ptr %0, i64 92
  %9 = load i32, ptr %8, align 4, !tbaa !20
  %.not = icmp ugt i32 %7, %9
  br i1 %.not, label %10, label %13

10:                                               ; preds = %2
  %11 = sub i32 %9, %4
  %12 = icmp ult i32 %11, 2
  br i1 %12, label %.thread331, label %13

13:                                               ; preds = %2, %10
  %.0253 = phi i32 [ %11, %10 ], [ %6, %2 ]
  %14 = add i32 %4, 2
  %15 = load ptr, ptr %0, align 8, !tbaa !21
  %16 = getelementptr inbounds i8, ptr %15, i64 48
  %17 = load ptr, ptr %16, align 8
  %18 = tail call noundef zeroext i8 %17(ptr noundef nonnull align 8 dereferenceable(160) %0, i32 noundef 1)
  %19 = zext i8 %18 to i32
  %20 = load ptr, ptr %0, align 8, !tbaa !21
  %21 = getelementptr inbounds i8, ptr %20, i64 48
  %22 = load ptr, ptr %21, align 8
  %23 = tail call noundef zeroext i8 %22(ptr noundef nonnull align 8 dereferenceable(160) %0, i32 noundef 0)
  %24 = zext i8 %23 to i32
  %25 = shl nuw nsw i32 %24, 8
  %26 = or disjoint i32 %25, %19
  %27 = getelementptr inbounds i8, ptr %0, i64 104
  %28 = load ptr, ptr %27, align 8, !tbaa !23
  %29 = zext nneg i32 %26 to i64
  %30 = getelementptr inbounds %"union.NPat2::CDescendant", ptr %28, i64 %29
  %31 = getelementptr inbounds i8, ptr %0, i64 136
  %32 = load i8, ptr %31, align 8, !tbaa !24, !range !25, !noundef !26
  %33 = trunc nuw i8 %32 to i1
  br i1 %33, label %34, label %74

34:                                               ; preds = %13
  %35 = tail call noundef zeroext i1 @_ZNK5NPat211CDescendant7IsMatchEv(ptr noundef nonnull align 4 dereferenceable(4) %30)
  %36 = getelementptr inbounds i8, ptr %0, i64 140
  br i1 %35, label %37, label %._crit_edge528

._crit_edge528:                                   ; preds = %34
  %.pre = load i32, ptr %36, align 4, !tbaa !27
  br label %38

37:                                               ; preds = %34
  store i32 0, ptr %36, align 4, !tbaa !27
  br label %38

38:                                               ; preds = %._crit_edge528, %37
  %39 = phi i32 [ %.pre, %._crit_edge528 ], [ 0, %37 ]
  %40 = getelementptr inbounds i8, ptr %0, i64 140
  %41 = getelementptr inbounds i8, ptr %0, i64 96
  %42 = load i32, ptr %41, align 8, !tbaa !28
  %43 = add i32 %42, -1
  %.not310 = icmp ult i32 %39, %43
  br i1 %.not310, label %45, label %44

44:                                               ; preds = %38
  tail call void @_ZN5NPat29CPatricia15ChangeLastMatchEj(ptr noundef nonnull align 8 dereferenceable(160) %0, i32 noundef %26)
  store i32 0, ptr %40, align 4, !tbaa !27
  br label %45

45:                                               ; preds = %44, %38
  %46 = add i32 %.0253, -1
  %47 = load ptr, ptr %0, align 8, !tbaa !21
  %48 = getelementptr inbounds i8, ptr %47, i64 48
  %49 = load ptr, ptr %48, align 8
  %50 = tail call noundef zeroext i8 %49(ptr noundef nonnull align 8 dereferenceable(160) %0, i32 noundef %46)
  %51 = add i32 %.0253, -2
  %52 = load ptr, ptr %0, align 8, !tbaa !21
  %53 = getelementptr inbounds i8, ptr %52, i64 48
  %54 = load ptr, ptr %53, align 8
  %55 = tail call noundef zeroext i8 %54(ptr noundef nonnull align 8 dereferenceable(160) %0, i32 noundef %51)
  %56 = icmp eq i8 %50, %55
  br i1 %56, label %57, label %70

57:                                               ; preds = %45
  %58 = tail call noundef zeroext i1 @_ZNK5NPat211CDescendant7IsMatchEv(ptr noundef nonnull align 4 dereferenceable(4) %30)
  br i1 %58, label %59, label %61

59:                                               ; preds = %57
  %60 = add i32 %4, -2147483646
  store i32 %60, ptr %30, align 4, !tbaa !29
  br label %64

61:                                               ; preds = %57
  %62 = load i32, ptr %40, align 4, !tbaa !27
  %63 = add i32 %62, 1
  store i32 %63, ptr %40, align 4, !tbaa !27
  br label %64

64:                                               ; preds = %61, %59
  %.not324460 = icmp ult i32 %.0253, 2
  br i1 %.not324460, label %.thread331, label %.lr.ph463.preheader

.lr.ph463.preheader:                              ; preds = %64
  %scevgep = getelementptr i8, ptr %1, i64 8
  %umin = tail call i32 @llvm.umin.i32(i32 %9, i32 %7)
  %65 = add i32 %umin, 1
  %66 = sub i32 %65, %4
  %umax = tail call i32 @llvm.umax.i32(i32 %66, i32 3)
  %67 = add i32 %umax, -2
  %68 = zext i32 %67 to i64
  %69 = shl nuw nsw i64 %68, 2
  tail call void @llvm.memset.p0.i64(ptr align 4 %scevgep, i8 0, i64 %69, i1 false), !tbaa !30
  br label %.thread331

70:                                               ; preds = %45
  %71 = load i32, ptr %40, align 4, !tbaa !27
  %.not311 = icmp eq i32 %71, 0
  br i1 %.not311, label %73, label %72

72:                                               ; preds = %70
  tail call void @_ZN5NPat29CPatricia15ChangeLastMatchEj(ptr noundef nonnull align 8 dereferenceable(160) %0, i32 noundef %26)
  br label %73

73:                                               ; preds = %70, %72
  store i8 0, ptr %31, align 8, !tbaa !24
  br label %74

74:                                               ; preds = %73, %13
  %75 = tail call noundef zeroext i1 @_ZNK5NPat211CDescendant7IsEmptyEv(ptr noundef nonnull align 4 dereferenceable(4) %30)
  br i1 %75, label %76, label %78

76:                                               ; preds = %74
  %77 = add i32 %4, -2147483646
  store i32 %77, ptr %30, align 4, !tbaa !29
  br label %.thread331

78:                                               ; preds = %74
  %79 = add i32 %.0253, -2
  %80 = tail call noundef zeroext i1 @_ZNK5NPat211CDescendant7IsMatchEv(ptr noundef nonnull align 4 dereferenceable(4) %30)
  br i1 %80, label %81, label %156

81:                                               ; preds = %78
  %82 = load i32, ptr %30, align 4, !tbaa !29
  %83 = xor i32 %82, -2147483648
  %84 = sub i32 %14, %83
  %85 = add i32 %84, -1
  %86 = getelementptr inbounds i8, ptr %0, i64 96
  %87 = load i32, ptr %86, align 8, !tbaa !28
  %.not321 = icmp ult i32 %85, %87
  br i1 %.not321, label %90, label %88

88:                                               ; preds = %81
  %89 = add i32 %4, -2147483646
  store i32 %89, ptr %30, align 4, !tbaa !29
  br label %.thread331

90:                                               ; preds = %81
  %91 = getelementptr inbounds i8, ptr %1, i64 8
  %92 = getelementptr inbounds i8, ptr %0, i64 64
  %93 = load ptr, ptr %92, align 8, !tbaa !31
  %94 = zext i32 %14 to i64
  %95 = getelementptr inbounds i8, ptr %93, i64 %94
  store i32 %85, ptr %91, align 4, !tbaa !30
  %96 = icmp eq i32 %79, 0
  br i1 %96, label %._crit_edge447, label %.lr.ph446

.lr.ph446:                                        ; preds = %90
  %97 = getelementptr inbounds i8, ptr %1, i64 12
  %98 = zext i32 %84 to i64
  br label %100

._crit_edge447:                                   ; preds = %108, %90
  %99 = add i32 %4, -2147483646
  store i32 %99, ptr %30, align 4, !tbaa !29
  br label %.thread331

100:                                              ; preds = %.lr.ph446, %108
  %101 = phi ptr [ %97, %.lr.ph446 ], [ %110, %108 ]
  %.0259444 = phi i32 [ 0, %.lr.ph446 ], [ %109, %108 ]
  %102 = zext i32 %.0259444 to i64
  %103 = getelementptr inbounds i8, ptr %95, i64 %102
  %104 = load i8, ptr %103, align 1, !tbaa !29
  %105 = sub nsw i64 %102, %98
  %106 = getelementptr inbounds i8, ptr %95, i64 %105
  %107 = load i8, ptr %106, align 1, !tbaa !29
  %.not322 = icmp eq i8 %104, %107
  br i1 %.not322, label %108, label %112

108:                                              ; preds = %100
  %109 = add nuw i32 %.0259444, 1
  %110 = getelementptr inbounds i8, ptr %101, i64 4
  store i32 %85, ptr %101, align 4, !tbaa !30
  %111 = icmp eq i32 %109, %79
  br i1 %111, label %._crit_edge447, label %100, !llvm.loop !32

112:                                              ; preds = %100
  %113 = add i32 %.0259444, 2
  %114 = getelementptr inbounds i8, ptr %0, i64 120
  %115 = load i32, ptr %114, align 8, !tbaa !34
  store i32 %115, ptr %30, align 4, !tbaa !29
  %116 = getelementptr inbounds i8, ptr %0, i64 112
  %117 = load ptr, ptr %116, align 8, !tbaa !35
  %118 = zext i32 %115 to i64
  %119 = getelementptr inbounds %"struct.NPat2::CNode", ptr %117, i64 %118
  %120 = getelementptr inbounds i8, ptr %119, i64 8
  %121 = load i32, ptr %120, align 4, !tbaa !29
  store i32 %121, ptr %114, align 8, !tbaa !34
  %122 = getelementptr inbounds i8, ptr %0, i64 128
  %123 = load i32, ptr %122, align 8, !tbaa !36
  %124 = add i32 %123, 1
  store i32 %124, ptr %122, align 8, !tbaa !36
  %125 = getelementptr inbounds i8, ptr %0, i64 124
  %126 = load i32, ptr %125, align 4, !tbaa !37
  %127 = icmp ugt i32 %121, %126
  br i1 %127, label %128, label %132

128:                                              ; preds = %112
  store i32 %121, ptr %125, align 4, !tbaa !37
  %129 = add i32 %121, 1
  %130 = zext i32 %121 to i64
  %131 = getelementptr inbounds %"struct.NPat2::CNode", ptr %117, i64 %130, i32 2
  store i32 %129, ptr %131, align 4, !tbaa !29
  br label %132

132:                                              ; preds = %128, %112
  store <4 x i32> <i32 2147483647, i32 2147483647, i32 2147483647, i32 2147483647>, ptr %120, align 4, !tbaa !29
  store i32 %14, ptr %119, align 4, !tbaa !38
  %133 = load ptr, ptr %0, align 8, !tbaa !21
  %134 = getelementptr inbounds i8, ptr %133, i64 48
  %135 = load ptr, ptr %134, align 8
  %136 = tail call noundef zeroext i8 %135(ptr noundef nonnull align 8 dereferenceable(160) %0, i32 noundef %113)
  %137 = sub i32 %113, %84
  %138 = load ptr, ptr %0, align 8, !tbaa !21
  %139 = getelementptr inbounds i8, ptr %138, i64 48
  %140 = load ptr, ptr %139, align 8
  %141 = tail call noundef zeroext i8 %140(ptr noundef nonnull align 8 dereferenceable(160) %0, i32 noundef %137)
  %142 = shl i32 %.0259444, 3
  %143 = and i8 %136, 3
  %144 = and i8 %141, 3
  %.not323450 = icmp eq i8 %143, %144
  br i1 %.not323450, label %.lr.ph455, label %._crit_edge456

.lr.ph455:                                        ; preds = %132, %.lr.ph455
  %.0295453 = phi i8 [ %145, %.lr.ph455 ], [ %136, %132 ]
  %.0296452 = phi i32 [ %147, %.lr.ph455 ], [ %142, %132 ]
  %.0297451 = phi i8 [ %146, %.lr.ph455 ], [ %141, %132 ]
  %145 = lshr i8 %.0295453, 2
  %146 = lshr i8 %.0297451, 2
  %147 = add i32 %.0296452, 2
  %148 = and i8 %145, 3
  %149 = and i8 %146, 3
  %.not323 = icmp eq i8 %148, %149
  br i1 %.not323, label %.lr.ph455, label %._crit_edge456, !llvm.loop !40

._crit_edge456:                                   ; preds = %.lr.ph455, %132
  %.0296.lcssa = phi i32 [ %142, %132 ], [ %147, %.lr.ph455 ]
  %.lcssa364 = phi i8 [ %143, %132 ], [ %148, %.lr.ph455 ]
  %.lcssa = phi i8 [ %144, %132 ], [ %149, %.lr.ph455 ]
  %150 = getelementptr inbounds i8, ptr %119, i64 4
  store i32 %.0296.lcssa, ptr %150, align 4, !tbaa !41
  %151 = add i32 %4, -2147483646
  %152 = zext nneg i8 %.lcssa364 to i64
  %153 = getelementptr inbounds [4 x %"union.NPat2::CDescendant"], ptr %120, i64 0, i64 %152
  store i32 %151, ptr %153, align 4, !tbaa !29
  %154 = zext nneg i8 %.lcssa to i64
  %155 = getelementptr inbounds [4 x %"union.NPat2::CDescendant"], ptr %120, i64 0, i64 %154
  store i32 %82, ptr %155, align 4, !tbaa !29
  br label %.thread331

156:                                              ; preds = %78
  %157 = getelementptr inbounds i8, ptr %0, i64 64
  %158 = load ptr, ptr %157, align 8, !tbaa !31
  %159 = zext i32 %14 to i64
  %160 = getelementptr inbounds i8, ptr %158, i64 %159
  %161 = getelementptr inbounds i8, ptr %0, i64 112
  %162 = load ptr, ptr %161, align 8
  %163 = load i32, ptr %30, align 4, !tbaa !30
  %164 = zext i32 %163 to i64
  %165 = getelementptr inbounds %"struct.NPat2::CNode", ptr %162, i64 %164
  %166 = zext i32 %79 to i64
  %167 = getelementptr inbounds i8, ptr %160, i64 %166
  %168 = getelementptr inbounds i8, ptr %0, i64 96
  %169 = load i32, ptr %168, align 8, !tbaa !28
  %.0264 = tail call i32 @llvm.usub.sat.i32(i32 %14, i32 %169)
  %170 = load i32, ptr %165, align 4, !tbaa !38
  %171 = icmp ult i32 %170, %.0264
  br i1 %171, label %._crit_edge432, label %.lr.ph431

.lr.ph431:                                        ; preds = %156
  %172 = getelementptr inbounds i8, ptr %1, i64 8
  br label %183

._crit_edge432:                                   ; preds = %288, %156
  %173 = phi i32 [ %163, %156 ], [ %276, %288 ]
  %.0289.lcssa = phi ptr [ %160, %156 ], [ %.3292, %288 ]
  %.0274.lcssa = phi ptr [ %30, %156 ], [ %275, %288 ]
  tail call void @_ZN5NPat29CPatricia10RemoveNodeEj(ptr noundef nonnull align 8 dereferenceable(160) %0, i32 noundef %173)
  %174 = add i32 %4, -2147483646
  store i32 %174, ptr %.0274.lcssa, align 4, !tbaa !30
  %175 = icmp eq ptr %.0289.lcssa, %160
  br i1 %175, label %.thread331, label %176

176:                                              ; preds = %._crit_edge432
  %177 = ptrtoint ptr %.0289.lcssa to i64
  %178 = ptrtoint ptr %160 to i64
  %179 = xor i64 %178, -1
  %180 = add i64 %177, %179
  %181 = trunc i64 %180 to i32
  %182 = add i32 %181, 2
  br label %.thread331

183:                                              ; preds = %.lr.ph431, %288
  %184 = phi i32 [ %170, %.lr.ph431 ], [ %292, %288 ]
  %.1246429 = phi ptr [ %172, %.lr.ph431 ], [ %.5250, %288 ]
  %.0265428 = phi ptr [ %158, %.lr.ph431 ], [ %.3268, %288 ]
  %.0271426 = phi ptr [ %165, %.lr.ph431 ], [ %291, %288 ]
  %.0274425 = phi ptr [ %30, %.lr.ph431 ], [ %275, %288 ]
  %.0276424 = phi i8 [ 0, %.lr.ph431 ], [ %289, %288 ]
  %.0283423 = phi i32 [ 0, %.lr.ph431 ], [ %272, %288 ]
  %.0289422 = phi ptr [ %160, %.lr.ph431 ], [ %.3292, %288 ]
  %185 = icmp eq i32 %.0283423, 0
  br i1 %185, label %186, label %199

186:                                              ; preds = %183
  %187 = xor i32 %184, -1
  %188 = add i32 %14, %187
  store i32 %188, ptr %.1246429, align 4, !tbaa !30
  %.not312 = icmp ult ptr %.0289422, %167
  br i1 %.not312, label %194, label %.preheader363

.preheader363:                                    ; preds = %186
  %189 = add i32 %4, -2147483646
  %190 = getelementptr inbounds i8, ptr %.0271426, i64 8
  %191 = insertelement <4 x i32> poison, i32 %189, i64 0
  %192 = shufflevector <4 x i32> %191, <4 x i32> poison, <4 x i32> zeroinitializer
  store <4 x i32> %192, ptr %190, align 4, !tbaa !29
  store i32 %14, ptr %.0271426, align 4, !tbaa !38
  %193 = getelementptr inbounds i8, ptr %.0271426, i64 4
  store i32 0, ptr %193, align 4, !tbaa !41
  br label %.thread331

194:                                              ; preds = %186
  %195 = getelementptr inbounds i8, ptr %.1246429, i64 4
  %196 = getelementptr inbounds i8, ptr %.0289422, i64 1
  %197 = load i8, ptr %.0289422, align 1, !tbaa !29
  %198 = getelementptr inbounds i8, ptr %.0265428, i64 1
  br label %199

199:                                              ; preds = %194, %183
  %.1290 = phi ptr [ %196, %194 ], [ %.0289422, %183 ]
  %.1284 = phi i32 [ 8, %194 ], [ %.0283423, %183 ]
  %.1277 = phi i8 [ %197, %194 ], [ %.0276424, %183 ]
  %.1266 = phi ptr [ %198, %194 ], [ %.0265428, %183 ]
  %.2247 = phi ptr [ %195, %194 ], [ %.1246429, %183 ]
  %200 = getelementptr inbounds i8, ptr %.0271426, i64 4
  %201 = load i32, ptr %200, align 4, !tbaa !41
  %.not313 = icmp eq i32 %201, 0
  br i1 %.not313, label %270, label %202

202:                                              ; preds = %199
  %203 = load i32, ptr %.0271426, align 4, !tbaa !38
  %204 = zext i32 %203 to i64
  %205 = getelementptr inbounds i8, ptr %.1266, i64 %204
  %206 = getelementptr inbounds i8, ptr %205, i64 -1
  %207 = load i8, ptr %206, align 1, !tbaa !29
  %208 = zext i8 %207 to i32
  %209 = sub i32 8, %.1284
  %210 = lshr i32 %208, %209
  %211 = trunc nuw i32 %210 to i8
  %212 = xor i8 %.1277, %211
  %.not314408 = icmp ugt i32 %.1284, %201
  br i1 %.not314408, label %._crit_edge, label %.lr.ph.preheader

.lr.ph.preheader:                                 ; preds = %202
  %.not316.peel = icmp eq i8 %.1277, %211
  br i1 %.not316.peel, label %213, label %.loopexit

213:                                              ; preds = %.lr.ph.preheader
  %214 = xor i32 %203, -1
  %215 = add i32 %14, %214
  store i32 %215, ptr %.2247, align 4, !tbaa !30
  %216 = sub i32 %201, %.1284
  %.not317.peel = icmp ult ptr %.1290, %167
  br i1 %.not317.peel, label %217, label %.preheader

217:                                              ; preds = %213
  %218 = getelementptr inbounds i8, ptr %.2247, i64 4
  %219 = getelementptr inbounds i8, ptr %.1290, i64 1
  %220 = load i8, ptr %.1290, align 1, !tbaa !29
  %221 = load i32, ptr %.0271426, align 4, !tbaa !38
  %222 = zext i32 %221 to i64
  %223 = getelementptr inbounds i8, ptr %.1266, i64 %222
  %224 = load i8, ptr %223, align 1, !tbaa !29
  %225 = xor i8 %224, %220
  %226 = getelementptr inbounds i8, ptr %.1266, i64 1
  %.not314.peel = icmp ult i32 %216, 8
  br i1 %.not314.peel, label %._crit_edge, label %.lr.ph.preheader631

.lr.ph.preheader631:                              ; preds = %217
  %.not316722 = icmp eq i8 %224, %220
  br i1 %.not316722, label %.lr.ph727, label %.loopexit

.lr.ph:                                           ; preds = %245
  %.not316 = icmp eq i8 %252, %248
  br i1 %.not316, label %.lr.ph727, label %.loopexit.loopexit, !llvm.loop !42

.loopexit.loopexit:                               ; preds = %.lr.ph
  %227 = xor i8 %252, %248
  br label %.loopexit

.loopexit:                                        ; preds = %.lr.ph.preheader, %.lr.ph.preheader631, %.loopexit.loopexit
  %.0261414.lcssa = phi i8 [ %227, %.loopexit.loopexit ], [ %212, %.lr.ph.preheader ], [ %225, %.lr.ph.preheader631 ]
  %.0262413.lcssa = phi i32 [ %237, %.loopexit.loopexit ], [ %201, %.lr.ph.preheader ], [ %216, %.lr.ph.preheader631 ]
  %.2278411.lcssa = phi i8 [ %248, %.loopexit.loopexit ], [ %.1277, %.lr.ph.preheader ], [ %220, %.lr.ph.preheader631 ]
  %.2291409.lcssa = phi ptr [ %247, %.loopexit.loopexit ], [ %.1290, %.lr.ph.preheader ], [ %219, %.lr.ph.preheader631 ]
  tail call void @_ZN5NPat29CPatricia15AddInternalNodeEPNS_5CNodeEPjhhjj(ptr noundef nonnull align 8 dereferenceable(160) %0, ptr noundef nonnull %.0271426, ptr noundef nonnull %.0274425, i8 noundef zeroext %.2278411.lcssa, i8 noundef zeroext %.0261414.lcssa, i32 noundef %.0262413.lcssa, i32 noundef %14)
  %228 = ptrtoint ptr %.2291409.lcssa to i64
  %229 = ptrtoint ptr %160 to i64
  %230 = xor i64 %229, -1
  %231 = add i64 %228, %230
  %232 = trunc i64 %231 to i32
  %233 = add i32 %232, 2
  br label %.thread331

.lr.ph727:                                        ; preds = %.lr.ph.preheader631, %.lr.ph
  %.2291409726 = phi ptr [ %247, %.lr.ph ], [ %219, %.lr.ph.preheader631 ]
  %.2267412725 = phi ptr [ %253, %.lr.ph ], [ %226, %.lr.ph.preheader631 ]
  %.0262413724 = phi i32 [ %237, %.lr.ph ], [ %216, %.lr.ph.preheader631 ]
  %.3248415723 = phi ptr [ %246, %.lr.ph ], [ %218, %.lr.ph.preheader631 ]
  %234 = phi i32 [ %249, %.lr.ph ], [ %221, %.lr.ph.preheader631 ]
  %235 = xor i32 %234, -1
  %236 = add i32 %14, %235
  store i32 %236, ptr %.3248415723, align 4, !tbaa !30
  %237 = add i32 %.0262413724, -8
  %.not317 = icmp ult ptr %.2291409726, %167
  br i1 %.not317, label %245, label %.preheader

.preheader:                                       ; preds = %213, %.lr.ph727
  %.lcssa485 = phi i32 [ %237, %.lr.ph727 ], [ %216, %213 ]
  %238 = getelementptr inbounds i8, ptr %.0271426, i64 4
  %239 = add i32 %4, -2147483646
  %240 = getelementptr inbounds i8, ptr %.0271426, i64 8
  %241 = insertelement <4 x i32> poison, i32 %239, i64 0
  %242 = shufflevector <4 x i32> %241, <4 x i32> poison, <4 x i32> zeroinitializer
  store <4 x i32> %242, ptr %240, align 4, !tbaa !29
  store i32 %14, ptr %.0271426, align 4, !tbaa !38
  %243 = load i32, ptr %238, align 4, !tbaa !41
  %244 = sub i32 %243, %.lcssa485
  store i32 %244, ptr %238, align 4, !tbaa !41
  br label %.thread331

245:                                              ; preds = %.lr.ph727
  %246 = getelementptr inbounds i8, ptr %.3248415723, i64 4
  %247 = getelementptr inbounds i8, ptr %.2291409726, i64 1
  %248 = load i8, ptr %.2291409726, align 1, !tbaa !29
  %249 = load i32, ptr %.0271426, align 4, !tbaa !38
  %250 = zext i32 %249 to i64
  %251 = getelementptr inbounds i8, ptr %.2267412725, i64 %250
  %252 = load i8, ptr %251, align 1, !tbaa !29
  %253 = getelementptr inbounds i8, ptr %.2267412725, i64 1
  %.not314 = icmp ult i32 %237, 8
  br i1 %.not314, label %._crit_edge.loopexit, label %.lr.ph, !llvm.loop !42

._crit_edge.loopexit:                             ; preds = %245
  %254 = xor i8 %252, %248
  br label %._crit_edge

._crit_edge:                                      ; preds = %._crit_edge.loopexit, %217, %202
  %.2291.lcssa = phi ptr [ %.1290, %202 ], [ %219, %217 ], [ %247, %._crit_edge.loopexit ]
  %.2285.lcssa = phi i32 [ %.1284, %202 ], [ 8, %217 ], [ 8, %._crit_edge.loopexit ]
  %.2278.lcssa = phi i8 [ %.1277, %202 ], [ %220, %217 ], [ %248, %._crit_edge.loopexit ]
  %.2267.lcssa = phi ptr [ %.1266, %202 ], [ %226, %217 ], [ %253, %._crit_edge.loopexit ]
  %.0262.lcssa = phi i32 [ %201, %202 ], [ %216, %217 ], [ %237, %._crit_edge.loopexit ]
  %.0261.lcssa = phi i8 [ %212, %202 ], [ %225, %217 ], [ %254, %._crit_edge.loopexit ]
  %.3248.lcssa = phi ptr [ %.2247, %202 ], [ %218, %217 ], [ %246, %._crit_edge.loopexit ]
  %255 = zext i8 %.0261.lcssa to i32
  %notmask = shl nsw i32 -1, %.0262.lcssa
  %256 = xor i32 %notmask, -1
  %257 = and i32 %255, %256
  %.not315 = icmp eq i32 %257, 0
  br i1 %.not315, label %265, label %258

258:                                              ; preds = %._crit_edge
  tail call void @_ZN5NPat29CPatricia15AddInternalNodeEPNS_5CNodeEPjhhjj(ptr noundef nonnull align 8 dereferenceable(160) %0, ptr noundef nonnull %.0271426, ptr noundef nonnull %.0274425, i8 noundef zeroext %.2278.lcssa, i8 noundef zeroext %.0261.lcssa, i32 noundef %.0262.lcssa, i32 noundef %14)
  %259 = ptrtoint ptr %.2291.lcssa to i64
  %260 = ptrtoint ptr %160 to i64
  %261 = xor i64 %260, -1
  %262 = add i64 %259, %261
  %263 = trunc i64 %262 to i32
  %264 = add i32 %263, 2
  br label %.thread331

265:                                              ; preds = %._crit_edge
  %266 = zext i8 %.2278.lcssa to i32
  %267 = lshr i32 %266, %.0262.lcssa
  %268 = trunc nuw i32 %267 to i8
  %269 = sub i32 %.2285.lcssa, %.0262.lcssa
  br label %270

270:                                              ; preds = %265, %199
  %.3292 = phi ptr [ %.2291.lcssa, %265 ], [ %.1290, %199 ]
  %.4287 = phi i32 [ %269, %265 ], [ %.1284, %199 ]
  %.4280 = phi i8 [ %268, %265 ], [ %.1277, %199 ]
  %.3268 = phi ptr [ %.2267.lcssa, %265 ], [ %.1266, %199 ]
  %.5250 = phi ptr [ %.3248.lcssa, %265 ], [ %.2247, %199 ]
  %271 = and i8 %.4280, 3
  %272 = add i32 %.4287, -2
  %273 = getelementptr inbounds i8, ptr %.0271426, i64 8
  %274 = zext nneg i8 %271 to i64
  %275 = getelementptr inbounds [4 x %"union.NPat2::CDescendant"], ptr %273, i64 0, i64 %274
  %276 = load i32, ptr %275, align 4, !tbaa !29
  store i32 %14, ptr %.0271426, align 4, !tbaa !38
  %277 = icmp ult i32 %276, 2147483647
  br i1 %277, label %288, label %278

278:                                              ; preds = %270
  %279 = icmp eq i32 %276, 2147483647
  br i1 %279, label %280, label %294

280:                                              ; preds = %278
  %281 = add i32 %4, -2147483646
  store i32 %281, ptr %275, align 4, !tbaa !29
  %282 = ptrtoint ptr %.3292 to i64
  %283 = ptrtoint ptr %160 to i64
  %284 = xor i64 %283, -1
  %285 = add i64 %282, %284
  %286 = trunc i64 %285 to i32
  %287 = add i32 %286, 2
  br label %.thread331

288:                                              ; preds = %270
  %289 = lshr i8 %.4280, 2
  %290 = zext nneg i32 %276 to i64
  %291 = getelementptr inbounds %"struct.NPat2::CNode", ptr %162, i64 %290
  %292 = load i32, ptr %291, align 4, !tbaa !38
  %293 = icmp ult i32 %292, %.0264
  br i1 %293, label %._crit_edge432, label %183

294:                                              ; preds = %278
  %295 = zext nneg i8 %271 to i32
  %296 = lshr i8 %.4280, 2
  %297 = xor i32 %276, -2147483648
  %298 = icmp ult i32 %297, %.0264
  br i1 %298, label %299, label %307

299:                                              ; preds = %294
  %300 = add i32 %4, -2147483646
  store i32 %300, ptr %275, align 4, !tbaa !29
  %301 = ptrtoint ptr %.3292 to i64
  %302 = ptrtoint ptr %160 to i64
  %303 = xor i64 %302, -1
  %304 = add i64 %301, %303
  %305 = trunc i64 %304 to i32
  %306 = add i32 %305, 2
  br label %.thread331

307:                                              ; preds = %294
  %.not318 = icmp eq i32 %272, 0
  br i1 %.not318, label %.thread360, label %308

308:                                              ; preds = %307
  %309 = zext nneg i32 %297 to i64
  %310 = getelementptr inbounds i8, ptr %.3268, i64 %309
  %311 = getelementptr inbounds i8, ptr %310, i64 -1
  %312 = load i8, ptr %311, align 1, !tbaa !29
  %313 = sub i32 10, %.4287
  %314 = zext i8 %312 to i32
  %315 = lshr i32 %314, %313
  %316 = trunc nuw i32 %315 to i8
  %.not319 = icmp eq i8 %296, %316
  br i1 %.not319, label %.thread360, label %317

317:                                              ; preds = %308
  %318 = xor i8 %296, %316
  tail call void @_ZN5NPat29CPatricia11AddLeafNodeEPNS_5CNodeEhhjjj(ptr noundef nonnull align 8 dereferenceable(160) %0, ptr noundef nonnull %.0271426, i8 noundef zeroext %296, i8 noundef zeroext %318, i32 noundef 0, i32 noundef %14, i32 noundef %295)
  %319 = ptrtoint ptr %.3292 to i64
  %320 = ptrtoint ptr %160 to i64
  %321 = xor i64 %320, -1
  %322 = add i64 %319, %321
  %323 = trunc i64 %322 to i32
  %324 = add i32 %323, 2
  br label %.thread331

.thread360:                                       ; preds = %308, %307
  %325 = ptrtoint ptr %160 to i64
  %326 = icmp ult ptr %.3292, %167
  br i1 %326, label %.lr.ph441, label %.thread360.._crit_edge442_crit_edge

.thread360.._crit_edge442_crit_edge:              ; preds = %.thread360
  %.pre529 = xor i32 %276, 2147483647
  %.pre530 = add i32 %.pre529, %14
  br label %._crit_edge442

.lr.ph441:                                        ; preds = %.thread360
  %327 = zext nneg i32 %297 to i64
  %328 = getelementptr inbounds i8, ptr %158, i64 %327
  %329 = ptrtoint ptr %.3292 to i64
  %330 = sub i64 %329, %325
  %331 = getelementptr inbounds i8, ptr %328, i64 %330
  %332 = xor i32 %276, 2147483647
  %333 = add i32 %332, %14
  br label %334

334:                                              ; preds = %.lr.ph441, %345
  %.0440 = phi ptr [ %331, %.lr.ph441 ], [ %346, %345 ]
  %.2244439 = phi i32 [ %272, %.lr.ph441 ], [ %348, %345 ]
  %.7252438 = phi ptr [ %.5250, %.lr.ph441 ], [ %347, %345 ]
  %.5294437 = phi ptr [ %.3292, %.lr.ph441 ], [ %335, %345 ]
  %335 = getelementptr inbounds i8, ptr %.5294437, i64 1
  %336 = load i8, ptr %.5294437, align 1, !tbaa !29
  store i32 %333, ptr %.7252438, align 4, !tbaa !30
  %337 = load i8, ptr %.0440, align 1, !tbaa !29
  %.not320 = icmp eq i8 %336, %337
  br i1 %.not320, label %345, label %338

338:                                              ; preds = %334
  %339 = xor i8 %337, %336
  tail call void @_ZN5NPat29CPatricia11AddLeafNodeEPNS_5CNodeEhhjjj(ptr noundef nonnull align 8 dereferenceable(160) %0, ptr noundef nonnull %.0271426, i8 noundef zeroext %336, i8 noundef zeroext %339, i32 noundef %.2244439, i32 noundef %14, i32 noundef %295)
  %340 = ptrtoint ptr %335 to i64
  %341 = xor i64 %325, -1
  %342 = add i64 %340, %341
  %343 = trunc i64 %342 to i32
  %344 = add i32 %343, 2
  br label %.thread331

345:                                              ; preds = %334
  %346 = getelementptr inbounds i8, ptr %.0440, i64 1
  %347 = getelementptr inbounds i8, ptr %.7252438, i64 4
  %348 = add i32 %.2244439, 8
  %349 = icmp ult ptr %335, %167
  br i1 %349, label %334, label %._crit_edge442, !llvm.loop !44

._crit_edge442:                                   ; preds = %345, %.thread360.._crit_edge442_crit_edge
  %.pre-phi531 = phi i32 [ %.pre530, %.thread360.._crit_edge442_crit_edge ], [ %333, %345 ]
  %.7252.lcssa = phi ptr [ %.5250, %.thread360.._crit_edge442_crit_edge ], [ %347, %345 ]
  store i32 %.pre-phi531, ptr %.7252.lcssa, align 4, !tbaa !30
  %350 = add i32 %4, -2147483646
  store i32 %350, ptr %275, align 4, !tbaa !29
  %351 = load i32, ptr %.7252.lcssa, align 4, !tbaa !30
  %352 = icmp eq i32 %351, 0
  br i1 %352, label %353, label %.thread331

353:                                              ; preds = %._crit_edge442
  store i8 1, ptr %31, align 8, !tbaa !24
  %354 = getelementptr inbounds i8, ptr %0, i64 140
  store i32 0, ptr %354, align 4, !tbaa !27
  br label %.thread331

.thread331:                                       ; preds = %.lr.ph463.preheader, %64, %258, %.preheader, %.loopexit, %280, %317, %76, %176, %.preheader363, %._crit_edge432, %._crit_edge442, %353, %338, %299, %88, %._crit_edge456, %._crit_edge447, %10
  %.14 = phi i32 [ 0, %10 ], [ 0, %76 ], [ 0, %88 ], [ %.0253, %._crit_edge447 ], [ %113, %._crit_edge456 ], [ %182, %176 ], [ %.0253, %.preheader363 ], [ 0, %._crit_edge432 ], [ %306, %299 ], [ %324, %317 ], [ %344, %338 ], [ %.0253, %353 ], [ %.0253, %._crit_edge442 ], [ %287, %280 ], [ %264, %258 ], [ %.0253, %.preheader ], [ %233, %.loopexit ], [ %.0253, %64 ], [ %.0253, %.lr.ph463.preheader ]
  ret i32 %.14
}

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZNK5NPat211CDescendant7IsMatchEv(ptr noundef nonnull align 4 dereferenceable(4)) local_unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZNK5NPat211CDescendant7IsEmptyEv(ptr noundef nonnull align 4 dereferenceable(4)) local_unnamed_addr #1 align 2

; Function Attrs: mustprogress uwtable
declare dso_local void @_ZN5NPat29CPatricia10RemoveNodeEj(ptr noundef nonnull align 8 dereferenceable(160), i32 noundef) local_unnamed_addr #0 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN5NPat29CPatricia15AddInternalNodeEPNS_5CNodeEPjhhjj(ptr noundef nonnull align 8 dereferenceable(160), ptr noundef, ptr noundef, i8 noundef zeroext, i8 noundef zeroext, i32 noundef, i32 noundef) local_unnamed_addr #1 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local void @_ZN5NPat29CPatricia11AddLeafNodeEPNS_5CNodeEhhjjj(ptr noundef nonnull align 8 dereferenceable(160), ptr noundef, i8 noundef zeroext, i8 noundef zeroext, i32 noundef, i32 noundef, i32 noundef) local_unnamed_addr #1 align 2

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

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

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

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #3

attributes #0 = { mustprogress 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 = { mustprogress 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 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #3 = { nocallback nofree nounwind willreturn memory(argmem: write) }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !10, i64 52}
!6 = !{!"_ZTS11CLZInWindow", !7, i64 8, !7, i64 16, !10, i64 24, !11, i64 28, !7, i64 32, !7, i64 40, !10, i64 48, !10, i64 52, !10, i64 56, !10, i64 60, !10, i64 64, !10, i64 68}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C++ TBAA"}
!10 = !{!"int", !8, i64 0}
!11 = !{!"bool", !8, i64 0}
!12 = !{!13, !10, i64 100}
!13 = !{!"_ZTSN5NPat29CPatriciaE", !14, i64 0, !17, i64 8, !18, i64 16, !6, i64 24, !10, i64 96, !10, i64 100, !7, i64 104, !7, i64 112, !10, i64 120, !10, i64 124, !10, i64 128, !10, i64 132, !11, i64 136, !10, i64 140, !7, i64 144, !19, i64 152}
!14 = !{!"_ZTS12IMatchFinder", !15, i64 0}
!15 = !{!"_ZTS15IInWindowStream", !16, i64 0}
!16 = !{!"_ZTS8IUnknown"}
!17 = !{!"_ZTS23IMatchFinderSetCallback", !16, i64 0}
!18 = !{!"_ZTS13CMyUnknownImp", !10, i64 0}
!19 = !{!"_ZTS9CMyComPtrI20IMatchFinderCallbackE", !7, i64 0}
!20 = !{!6, !10, i64 68}
!21 = !{!22, !22, i64 0}
!22 = !{!"vtable pointer", !9, i64 0}
!23 = !{!13, !7, i64 104}
!24 = !{!13, !11, i64 136}
!25 = !{i8 0, i8 2}
!26 = !{}
!27 = !{!13, !10, i64 140}
!28 = !{!13, !10, i64 96}
!29 = !{!8, !8, i64 0}
!30 = !{!10, !10, i64 0}
!31 = !{!6, !7, i64 40}
!32 = distinct !{!32, !33}
!33 = !{!"llvm.loop.mustprogress"}
!34 = !{!13, !10, i64 120}
!35 = !{!13, !7, i64 112}
!36 = !{!13, !10, i64 128}
!37 = !{!13, !10, i64 124}
!38 = !{!39, !10, i64 0}
!39 = !{!"_ZTSN5NPat25CNodeE", !10, i64 0, !10, i64 4, !8, i64 8}
!40 = distinct !{!40, !33}
!41 = !{!39, !10, i64 4}
!42 = distinct !{!42, !33, !43}
!43 = !{!"llvm.loop.peeled.count", i32 1}
!44 = distinct !{!44, !33}


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