; LLVM IR from fcimeson/cbTSP :: cbLKH/SRC (Flip_SSL)

; Unoptimized IR (clang -disable-llvm-passes):
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%struct.Node = type { i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, double, double, double, double, double, double, i8, i8, i8 }
%struct.Segment = type { i8, ptr, ptr, ptr, ptr, i32, i32, ptr }
%struct.SSegment = type { i8, ptr, ptr, ptr, ptr, i32, i32 }
%struct.SwapRecord = type { ptr, ptr, ptr, ptr }

@.str = external hidden unnamed_addr constant [32 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [69 x i8], align 1
@__PRETTY_FUNCTION__.Flip_SSL = external hidden unnamed_addr constant [38 x i8], align 1
@Groups = external dso_local global i32, align 4
@Reversed = external dso_local global i16, align 2
@GroupSize = external dso_local global i32, align 4
@SGroupSize = external dso_local global i32, align 4
@SGroups = external dso_local global i32, align 4
@C = external dso_local global ptr, align 8
@SwapStack = external dso_local global ptr, align 8
@Swaps = external dso_local global i32, align 4
@Rand = external dso_local global ptr, align 8
@Hash = external dso_local global i32, align 4

; Function Attrs: nounwind uwtable
define dso_local void @Flip_SSL(ptr noundef %0, ptr noundef %1, ptr noundef %2) #0 {
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca ptr, align 8
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca ptr, align 8
  %13 = alloca ptr, align 8
  %14 = alloca ptr, align 8
  %15 = alloca ptr, align 8
  %16 = alloca i32, align 4
  %17 = alloca ptr, align 8
  %18 = alloca ptr, align 8
  %19 = alloca ptr, align 8
  %20 = alloca ptr, align 8
  %21 = alloca ptr, align 8
  %22 = alloca ptr, align 8
  %23 = alloca ptr, align 8
  %24 = alloca ptr, align 8
  %25 = alloca ptr, align 8
  %26 = alloca ptr, align 8
  %27 = alloca ptr, align 8
  %28 = alloca ptr, align 8
  %29 = alloca ptr, align 8
  %30 = alloca i32, align 4
  %31 = alloca i32, align 4
  %32 = alloca i32, align 4
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  store ptr %2, ptr %6, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %9) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #5
  %33 = load ptr, ptr %4, align 8, !tbaa !5
  %34 = getelementptr inbounds %struct.Node, ptr %33, i32 0, i32 15
  %35 = load ptr, ptr %34, align 8, !tbaa !9
  %36 = load ptr, ptr %5, align 8, !tbaa !5
  %37 = icmp eq ptr %35, %36
  br i1 %37, label %44, label %38

38:                                               ; preds = %3
  %39 = load ptr, ptr %4, align 8, !tbaa !5
  %40 = getelementptr inbounds %struct.Node, ptr %39, i32 0, i32 16
  %41 = load ptr, ptr %40, align 8, !tbaa !13
  %42 = load ptr, ptr %5, align 8, !tbaa !5
  %43 = icmp eq ptr %41, %42
  br i1 %43, label %44, label %45

44:                                               ; preds = %38, %3
  br label %46

45:                                               ; preds = %38
  call void @__assert_fail(ptr noundef @.str, ptr noundef @.str.1, i32 noundef 35, ptr noundef @__PRETTY_FUNCTION__.Flip_SSL) #6
  unreachable

46:                                               ; preds = %44
  %47 = load ptr, ptr %6, align 8, !tbaa !5
  %48 = load ptr, ptr %5, align 8, !tbaa !5
  %49 = getelementptr inbounds %struct.Node, ptr %48, i32 0, i32 15
  %50 = load ptr, ptr %49, align 8, !tbaa !9
  %51 = icmp eq ptr %47, %50
  br i1 %51, label %58, label %52

52:                                               ; preds = %46
  %53 = load ptr, ptr %6, align 8, !tbaa !5
  %54 = load ptr, ptr %5, align 8, !tbaa !5
  %55 = getelementptr inbounds %struct.Node, ptr %54, i32 0, i32 16
  %56 = load ptr, ptr %55, align 8, !tbaa !13
  %57 = icmp eq ptr %53, %56
  br i1 %57, label %58, label %59

58:                                               ; preds = %52, %46
  store i32 1, ptr %16, align 4
  br label %900

59:                                               ; preds = %52
  %60 = load i32, ptr @Groups, align 4, !tbaa !14
  %61 = icmp eq i32 %60, 1
  br i1 %61, label %62, label %66

62:                                               ; preds = %59
  %63 = load ptr, ptr %4, align 8, !tbaa !5
  %64 = load ptr, ptr %5, align 8, !tbaa !5
  %65 = load ptr, ptr %6, align 8, !tbaa !5
  call void @Flip(ptr noundef %63, ptr noundef %64, ptr noundef %65)
  store i32 1, ptr %16, align 4
  br label %900

66:                                               ; preds = %59
  %67 = load ptr, ptr %5, align 8, !tbaa !5
  %68 = load i16, ptr @Reversed, align 2, !tbaa !15
  %69 = sext i16 %68 to i32
  %70 = load ptr, ptr %4, align 8, !tbaa !5
  %71 = getelementptr inbounds %struct.Node, ptr %70, i32 0, i32 45
  %72 = load ptr, ptr %71, align 8, !tbaa !17
  %73 = getelementptr inbounds %struct.Segment, ptr %72, i32 0, i32 0
  %74 = load i8, ptr %73, align 8, !tbaa !18
  %75 = sext i8 %74 to i32
  %76 = icmp eq i32 %69, %75
  br i1 %76, label %77, label %81

77:                                               ; preds = %66
  %78 = load ptr, ptr %4, align 8, !tbaa !5
  %79 = getelementptr inbounds %struct.Node, ptr %78, i32 0, i32 16
  %80 = load ptr, ptr %79, align 8, !tbaa !13
  br label %85

81:                                               ; preds = %66
  %82 = load ptr, ptr %4, align 8, !tbaa !5
  %83 = getelementptr inbounds %struct.Node, ptr %82, i32 0, i32 15
  %84 = load ptr, ptr %83, align 8, !tbaa !9
  br label %85

85:                                               ; preds = %81, %77
  %86 = phi ptr [ %80, %77 ], [ %84, %81 ]
  %87 = icmp eq ptr %67, %86
  br i1 %87, label %88, label %108

88:                                               ; preds = %85
  %89 = load i16, ptr @Reversed, align 2, !tbaa !15
  %90 = sext i16 %89 to i32
  %91 = load ptr, ptr %6, align 8, !tbaa !5
  %92 = getelementptr inbounds %struct.Node, ptr %91, i32 0, i32 45
  %93 = load ptr, ptr %92, align 8, !tbaa !17
  %94 = getelementptr inbounds %struct.Segment, ptr %93, i32 0, i32 0
  %95 = load i8, ptr %94, align 8, !tbaa !18
  %96 = sext i8 %95 to i32
  %97 = icmp eq i32 %90, %96
  br i1 %97, label %98, label %102

98:                                               ; preds = %88
  %99 = load ptr, ptr %6, align 8, !tbaa !5
  %100 = getelementptr inbounds %struct.Node, ptr %99, i32 0, i32 15
  %101 = load ptr, ptr %100, align 8, !tbaa !9
  br label %106

102:                                              ; preds = %88
  %103 = load ptr, ptr %6, align 8, !tbaa !5
  %104 = getelementptr inbounds %struct.Node, ptr %103, i32 0, i32 16
  %105 = load ptr, ptr %104, align 8, !tbaa !13
  br label %106

106:                                              ; preds = %102, %98
  %107 = phi ptr [ %101, %98 ], [ %105, %102 ]
  br label %128

108:                                              ; preds = %85
  %109 = load i16, ptr @Reversed, align 2, !tbaa !15
  %110 = sext i16 %109 to i32
  %111 = load ptr, ptr %6, align 8, !tbaa !5
  %112 = getelementptr inbounds %struct.Node, ptr %111, i32 0, i32 45
  %113 = load ptr, ptr %112, align 8, !tbaa !17
  %114 = getelementptr inbounds %struct.Segment, ptr %113, i32 0, i32 0
  %115 = load i8, ptr %114, align 8, !tbaa !18
  %116 = sext i8 %115 to i32
  %117 = icmp eq i32 %110, %116
  br i1 %117, label %118, label %122

118:                                              ; preds = %108
  %119 = load ptr, ptr %6, align 8, !tbaa !5
  %120 = getelementptr inbounds %struct.Node, ptr %119, i32 0, i32 16
  %121 = load ptr, ptr %120, align 8, !tbaa !13
  br label %126

122:                                              ; preds = %108
  %123 = load ptr, ptr %6, align 8, !tbaa !5
  %124 = getelementptr inbounds %struct.Node, ptr %123, i32 0, i32 15
  %125 = load ptr, ptr %124, align 8, !tbaa !9
  br label %126

126:                                              ; preds = %122, %118
  %127 = phi ptr [ %121, %118 ], [ %125, %122 ]
  br label %128

128:                                              ; preds = %126, %106
  %129 = phi ptr [ %107, %106 ], [ %127, %126 ]
  store ptr %129, ptr %7, align 8, !tbaa !5
  %130 = load ptr, ptr %4, align 8, !tbaa !5
  %131 = getelementptr inbounds %struct.Node, ptr %130, i32 0, i32 45
  %132 = load ptr, ptr %131, align 8, !tbaa !17
  store ptr %132, ptr %12, align 8, !tbaa !5
  %133 = load ptr, ptr %5, align 8, !tbaa !5
  %134 = getelementptr inbounds %struct.Node, ptr %133, i32 0, i32 45
  %135 = load ptr, ptr %134, align 8, !tbaa !17
  store ptr %135, ptr %13, align 8, !tbaa !5
  %136 = load ptr, ptr %6, align 8, !tbaa !5
  %137 = getelementptr inbounds %struct.Node, ptr %136, i32 0, i32 45
  %138 = load ptr, ptr %137, align 8, !tbaa !17
  store ptr %138, ptr %14, align 8, !tbaa !5
  %139 = load ptr, ptr %7, align 8, !tbaa !5
  %140 = getelementptr inbounds %struct.Node, ptr %139, i32 0, i32 45
  %141 = load ptr, ptr %140, align 8, !tbaa !17
  store ptr %141, ptr %15, align 8, !tbaa !5
  %142 = load ptr, ptr %12, align 8, !tbaa !5
  %143 = load ptr, ptr %14, align 8, !tbaa !5
  %144 = icmp ne ptr %142, %143
  br i1 %144, label %145, label %184

145:                                              ; preds = %128
  %146 = load ptr, ptr %13, align 8, !tbaa !5
  %147 = load ptr, ptr %15, align 8, !tbaa !5
  %148 = icmp ne ptr %146, %147
  br i1 %148, label %149, label %184

149:                                              ; preds = %145
  %150 = load ptr, ptr %12, align 8, !tbaa !5
  %151 = load ptr, ptr %13, align 8, !tbaa !5
  %152 = icmp eq ptr %150, %151
  br i1 %152, label %153, label %162

153:                                              ; preds = %149
  %154 = load ptr, ptr %4, align 8, !tbaa !5
  %155 = load ptr, ptr %5, align 8, !tbaa !5
  call void @SplitSegment(ptr noundef %154, ptr noundef %155)
  %156 = load ptr, ptr %4, align 8, !tbaa !5
  %157 = getelementptr inbounds %struct.Node, ptr %156, i32 0, i32 45
  %158 = load ptr, ptr %157, align 8, !tbaa !17
  store ptr %158, ptr %12, align 8, !tbaa !5
  %159 = load ptr, ptr %5, align 8, !tbaa !5
  %160 = getelementptr inbounds %struct.Node, ptr %159, i32 0, i32 45
  %161 = load ptr, ptr %160, align 8, !tbaa !17
  store ptr %161, ptr %13, align 8, !tbaa !5
  br label %162

162:                                              ; preds = %153, %149
  %163 = load ptr, ptr %14, align 8, !tbaa !5
  %164 = load ptr, ptr %15, align 8, !tbaa !5
  %165 = icmp eq ptr %163, %164
  br i1 %165, label %166, label %183

166:                                              ; preds = %162
  %167 = load ptr, ptr %12, align 8, !tbaa !5
  %168 = load ptr, ptr %14, align 8, !tbaa !5
  %169 = icmp ne ptr %167, %168
  br i1 %169, label %170, label %183

170:                                              ; preds = %166
  %171 = load ptr, ptr %13, align 8, !tbaa !5
  %172 = load ptr, ptr %15, align 8, !tbaa !5
  %173 = icmp ne ptr %171, %172
  br i1 %173, label %174, label %183

174:                                              ; preds = %170
  %175 = load ptr, ptr %6, align 8, !tbaa !5
  %176 = load ptr, ptr %7, align 8, !tbaa !5
  call void @SplitSegment(ptr noundef %175, ptr noundef %176)
  %177 = load ptr, ptr %6, align 8, !tbaa !5
  %178 = getelementptr inbounds %struct.Node, ptr %177, i32 0, i32 45
  %179 = load ptr, ptr %178, align 8, !tbaa !17
  store ptr %179, ptr %14, align 8, !tbaa !5
  %180 = load ptr, ptr %7, align 8, !tbaa !5
  %181 = getelementptr inbounds %struct.Node, ptr %180, i32 0, i32 45
  %182 = load ptr, ptr %181, align 8, !tbaa !17
  store ptr %182, ptr %15, align 8, !tbaa !5
  br label %183

183:                                              ; preds = %174, %170, %166, %162
  br label %260

184:                                              ; preds = %145, %128
  %185 = load ptr, ptr %12, align 8, !tbaa !5
  %186 = load ptr, ptr %14, align 8, !tbaa !5
  %187 = icmp eq ptr %185, %186
  br i1 %187, label %188, label %202

188:                                              ; preds = %184
  %189 = load ptr, ptr %6, align 8, !tbaa !5
  %190 = getelementptr inbounds %struct.Node, ptr %189, i32 0, i32 2
  %191 = load i32, ptr %190, align 8, !tbaa !20
  %192 = load ptr, ptr %4, align 8, !tbaa !5
  %193 = getelementptr inbounds %struct.Node, ptr %192, i32 0, i32 2
  %194 = load i32, ptr %193, align 8, !tbaa !20
  %195 = sub nsw i32 %191, %194
  %196 = call i32 @llvm.abs.i32(i32 %195, i1 true)
  %197 = sitofp i32 %196 to double
  %198 = load i32, ptr @GroupSize, align 4, !tbaa !14
  %199 = sitofp i32 %198 to double
  %200 = fmul double 7.500000e-01, %199
  %201 = fcmp ogt double %197, %200
  br i1 %201, label %220, label %202

202:                                              ; preds = %188, %184
  %203 = load ptr, ptr %13, align 8, !tbaa !5
  %204 = load ptr, ptr %15, align 8, !tbaa !5
  %205 = icmp eq ptr %203, %204
  br i1 %205, label %206, label %259

206:                                              ; preds = %202
  %207 = load ptr, ptr %7, align 8, !tbaa !5
  %208 = getelementptr inbounds %struct.Node, ptr %207, i32 0, i32 2
  %209 = load i32, ptr %208, align 8, !tbaa !20
  %210 = load ptr, ptr %5, align 8, !tbaa !5
  %211 = getelementptr inbounds %struct.Node, ptr %210, i32 0, i32 2
  %212 = load i32, ptr %211, align 8, !tbaa !20
  %213 = sub nsw i32 %209, %212
  %214 = call i32 @llvm.abs.i32(i32 %213, i1 true)
  %215 = sitofp i32 %214 to double
  %216 = load i32, ptr @GroupSize, align 4, !tbaa !14
  %217 = sitofp i32 %216 to double
  %218 = fmul double 7.500000e-01, %217
  %219 = fcmp ogt double %215, %218
  br i1 %219, label %220, label %259

220:                                              ; preds = %206, %188
  %221 = load ptr, ptr %12, align 8, !tbaa !5
  %222 = load ptr, ptr %13, align 8, !tbaa !5
  %223 = icmp eq ptr %221, %222
  br i1 %223, label %224, label %239

224:                                              ; preds = %220
  %225 = load ptr, ptr %4, align 8, !tbaa !5
  %226 = load ptr, ptr %5, align 8, !tbaa !5
  call void @SplitSegment(ptr noundef %225, ptr noundef %226)
  %227 = load ptr, ptr %4, align 8, !tbaa !5
  %228 = getelementptr inbounds %struct.Node, ptr %227, i32 0, i32 45
  %229 = load ptr, ptr %228, align 8, !tbaa !17
  store ptr %229, ptr %12, align 8, !tbaa !5
  %230 = load ptr, ptr %5, align 8, !tbaa !5
  %231 = getelementptr inbounds %struct.Node, ptr %230, i32 0, i32 45
  %232 = load ptr, ptr %231, align 8, !tbaa !17
  store ptr %232, ptr %13, align 8, !tbaa !5
  %233 = load ptr, ptr %6, align 8, !tbaa !5
  %234 = getelementptr inbounds %struct.Node, ptr %233, i32 0, i32 45
  %235 = load ptr, ptr %234, align 8, !tbaa !17
  store ptr %235, ptr %14, align 8, !tbaa !5
  %236 = load ptr, ptr %7, align 8, !tbaa !5
  %237 = getelementptr inbounds %struct.Node, ptr %236, i32 0, i32 45
  %238 = load ptr, ptr %237, align 8, !tbaa !17
  store ptr %238, ptr %15, align 8, !tbaa !5
  br label %239

239:                                              ; preds = %224, %220
  %240 = load ptr, ptr %14, align 8, !tbaa !5
  %241 = load ptr, ptr %15, align 8, !tbaa !5
  %242 = icmp eq ptr %240, %241
  br i1 %242, label %243, label %258

243:                                              ; preds = %239
  %244 = load ptr, ptr %6, align 8, !tbaa !5
  %245 = load ptr, ptr %7, align 8, !tbaa !5
  call void @SplitSegment(ptr noundef %244, ptr noundef %245)
  %246 = load ptr, ptr %4, align 8, !tbaa !5
  %247 = getelementptr inbounds %struct.Node, ptr %246, i32 0, i32 45
  %248 = load ptr, ptr %247, align 8, !tbaa !17
  store ptr %248, ptr %12, align 8, !tbaa !5
  %249 = load ptr, ptr %5, align 8, !tbaa !5
  %250 = getelementptr inbounds %struct.Node, ptr %249, i32 0, i32 45
  %251 = load ptr, ptr %250, align 8, !tbaa !17
  store ptr %251, ptr %13, align 8, !tbaa !5
  %252 = load ptr, ptr %6, align 8, !tbaa !5
  %253 = getelementptr inbounds %struct.Node, ptr %252, i32 0, i32 45
  %254 = load ptr, ptr %253, align 8, !tbaa !17
  store ptr %254, ptr %14, align 8, !tbaa !5
  %255 = load ptr, ptr %7, align 8, !tbaa !5
  %256 = getelementptr inbounds %struct.Node, ptr %255, i32 0, i32 45
  %257 = load ptr, ptr %256, align 8, !tbaa !17
  store ptr %257, ptr %15, align 8, !tbaa !5
  br label %258

258:                                              ; preds = %243, %239
  br label %259

259:                                              ; preds = %258, %206, %202
  br label %260

260:                                              ; preds = %259, %183
  store ptr null, ptr %9, align 8, !tbaa !5
  %261 = load ptr, ptr %12, align 8, !tbaa !5
  %262 = load ptr, ptr %14, align 8, !tbaa !5
  %263 = icmp eq ptr %261, %262
  br i1 %263, label %264, label %327

264:                                              ; preds = %260
  %265 = load ptr, ptr %4, align 8, !tbaa !5
  %266 = getelementptr inbounds %struct.Node, ptr %265, i32 0, i32 2
  %267 = load i32, ptr %266, align 8, !tbaa !20
  %268 = load ptr, ptr %6, align 8, !tbaa !5
  %269 = getelementptr inbounds %struct.Node, ptr %268, i32 0, i32 2
  %270 = load i32, ptr %269, align 8, !tbaa !20
  %271 = icmp slt i32 %267, %270
  br i1 %271, label %272, label %299

272:                                              ; preds = %264
  %273 = load ptr, ptr %12, align 8, !tbaa !5
  %274 = load ptr, ptr %13, align 8, !tbaa !5
  %275 = icmp eq ptr %273, %274
  br i1 %275, label %276, label %293

276:                                              ; preds = %272
  %277 = load ptr, ptr %12, align 8, !tbaa !5
  %278 = load ptr, ptr %15, align 8, !tbaa !5
  %279 = icmp eq ptr %277, %278
  br i1 %279, label %280, label %293

280:                                              ; preds = %276
  %281 = load ptr, ptr %5, align 8, !tbaa !5
  %282 = getelementptr inbounds %struct.Node, ptr %281, i32 0, i32 2
  %283 = load i32, ptr %282, align 8, !tbaa !20
  %284 = load ptr, ptr %4, align 8, !tbaa !5
  %285 = getelementptr inbounds %struct.Node, ptr %284, i32 0, i32 2
  %286 = load i32, ptr %285, align 8, !tbaa !20
  %287 = icmp sgt i32 %283, %286
  br i1 %287, label %288, label %293

288:                                              ; preds = %280
  %289 = load ptr, ptr %4, align 8, !tbaa !5
  store ptr %289, ptr %8, align 8, !tbaa !5
  %290 = load ptr, ptr %5, align 8, !tbaa !5
  store ptr %290, ptr %9, align 8, !tbaa !5
  %291 = load ptr, ptr %6, align 8, !tbaa !5
  store ptr %291, ptr %10, align 8, !tbaa !5
  %292 = load ptr, ptr %7, align 8, !tbaa !5
  store ptr %292, ptr %11, align 8, !tbaa !5
  br label %298

293:                                              ; preds = %280, %276, %272
  %294 = load ptr, ptr %5, align 8, !tbaa !5
  store ptr %294, ptr %8, align 8, !tbaa !5
  %295 = load ptr, ptr %4, align 8, !tbaa !5
  store ptr %295, ptr %9, align 8, !tbaa !5
  %296 = load ptr, ptr %7, align 8, !tbaa !5
  store ptr %296, ptr %10, align 8, !tbaa !5
  %297 = load ptr, ptr %6, align 8, !tbaa !5
  store ptr %297, ptr %11, align 8, !tbaa !5
  br label %298

298:                                              ; preds = %293, %288
  br label %326

299:                                              ; preds = %264
  %300 = load ptr, ptr %12, align 8, !tbaa !5
  %301 = load ptr, ptr %13, align 8, !tbaa !5
  %302 = icmp eq ptr %300, %301
  br i1 %302, label %303, label %320

303:                                              ; preds = %299
  %304 = load ptr, ptr %12, align 8, !tbaa !5
  %305 = load ptr, ptr %15, align 8, !tbaa !5
  %306 = icmp eq ptr %304, %305
  br i1 %306, label %307, label %320

307:                                              ; preds = %303
  %308 = load ptr, ptr %5, align 8, !tbaa !5
  %309 = getelementptr inbounds %struct.Node, ptr %308, i32 0, i32 2
  %310 = load i32, ptr %309, align 8, !tbaa !20
  %311 = load ptr, ptr %4, align 8, !tbaa !5
  %312 = getelementptr inbounds %struct.Node, ptr %311, i32 0, i32 2
  %313 = load i32, ptr %312, align 8, !tbaa !20
  %314 = icmp slt i32 %310, %313
  br i1 %314, label %315, label %320

315:                                              ; preds = %307
  %316 = load ptr, ptr %6, align 8, !tbaa !5
  store ptr %316, ptr %8, align 8, !tbaa !5
  %317 = load ptr, ptr %7, align 8, !tbaa !5
  store ptr %317, ptr %9, align 8, !tbaa !5
  %318 = load ptr, ptr %4, align 8, !tbaa !5
  store ptr %318, ptr %10, align 8, !tbaa !5
  %319 = load ptr, ptr %5, align 8, !tbaa !5
  store ptr %319, ptr %11, align 8, !tbaa !5
  br label %325

320:                                              ; preds = %307, %303, %299
  %321 = load ptr, ptr %7, align 8, !tbaa !5
  store ptr %321, ptr %8, align 8, !tbaa !5
  %322 = load ptr, ptr %6, align 8, !tbaa !5
  store ptr %322, ptr %9, align 8, !tbaa !5
  %323 = load ptr, ptr %5, align 8, !tbaa !5
  store ptr %323, ptr %10, align 8, !tbaa !5
  %324 = load ptr, ptr %4, align 8, !tbaa !5
  store ptr %324, ptr %11, align 8, !tbaa !5
  br label %325

325:                                              ; preds = %320, %315
  br label %326

326:                                              ; preds = %325, %298
  br label %351

327:                                              ; preds = %260
  %328 = load ptr, ptr %13, align 8, !tbaa !5
  %329 = load ptr, ptr %15, align 8, !tbaa !5
  %330 = icmp eq ptr %328, %329
  br i1 %330, label %331, label %350

331:                                              ; preds = %327
  %332 = load ptr, ptr %7, align 8, !tbaa !5
  %333 = getelementptr inbounds %struct.Node, ptr %332, i32 0, i32 2
  %334 = load i32, ptr %333, align 8, !tbaa !20
  %335 = load ptr, ptr %5, align 8, !tbaa !5
  %336 = getelementptr inbounds %struct.Node, ptr %335, i32 0, i32 2
  %337 = load i32, ptr %336, align 8, !tbaa !20
  %338 = icmp slt i32 %334, %337
  br i1 %338, label %339, label %344

339:                                              ; preds = %331
  %340 = load ptr, ptr %6, align 8, !tbaa !5
  store ptr %340, ptr %8, align 8, !tbaa !5
  %341 = load ptr, ptr %7, align 8, !tbaa !5
  store ptr %341, ptr %9, align 8, !tbaa !5
  %342 = load ptr, ptr %4, align 8, !tbaa !5
  store ptr %342, ptr %10, align 8, !tbaa !5
  %343 = load ptr, ptr %5, align 8, !tbaa !5
  store ptr %343, ptr %11, align 8, !tbaa !5
  br label %349

344:                                              ; preds = %331
  %345 = load ptr, ptr %4, align 8, !tbaa !5
  store ptr %345, ptr %8, align 8, !tbaa !5
  %346 = load ptr, ptr %5, align 8, !tbaa !5
  store ptr %346, ptr %9, align 8, !tbaa !5
  %347 = load ptr, ptr %6, align 8, !tbaa !5
  store ptr %347, ptr %10, align 8, !tbaa !5
  %348 = load ptr, ptr %7, align 8, !tbaa !5
  store ptr %348, ptr %11, align 8, !tbaa !5
  br label %349

349:                                              ; preds = %344, %339
  br label %350

350:                                              ; preds = %349, %327
  br label %351

351:                                              ; preds = %350, %326
  %352 = load ptr, ptr %9, align 8, !tbaa !5
  %353 = icmp ne ptr %352, null
  br i1 %353, label %354, label %359

354:                                              ; preds = %351
  %355 = load ptr, ptr %8, align 8, !tbaa !5
  %356 = load ptr, ptr %9, align 8, !tbaa !5
  %357 = load ptr, ptr %10, align 8, !tbaa !5
  %358 = load ptr, ptr %11, align 8, !tbaa !5
  call void @FlipNodes(ptr noundef %355, ptr noundef %356, ptr noundef %357, ptr noundef %358)
  br label %716

359:                                              ; preds = %351
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #5
  %360 = load ptr, ptr %12, align 8, !tbaa !5
  store ptr %360, ptr %21, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %22) #5
  %361 = load ptr, ptr %13, align 8, !tbaa !5
  store ptr %361, ptr %22, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #5
  %362 = load ptr, ptr %14, align 8, !tbaa !5
  store ptr %362, ptr %23, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #5
  %363 = load ptr, ptr %15, align 8, !tbaa !5
  store ptr %363, ptr %24, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %25) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %26) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %27) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #5
  call void @llvm.lifetime.start.p0(i64 8, ptr %29) #5
  %364 = load ptr, ptr %21, align 8, !tbaa !5
  %365 = getelementptr inbounds %struct.Segment, ptr %364, i32 0, i32 7
  %366 = load ptr, ptr %365, align 8, !tbaa !21
  store ptr %366, ptr %25, align 8, !tbaa !5
  %367 = load ptr, ptr %22, align 8, !tbaa !5
  %368 = getelementptr inbounds %struct.Segment, ptr %367, i32 0, i32 7
  %369 = load ptr, ptr %368, align 8, !tbaa !21
  store ptr %369, ptr %26, align 8, !tbaa !5
  %370 = load ptr, ptr %23, align 8, !tbaa !5
  %371 = getelementptr inbounds %struct.Segment, ptr %370, i32 0, i32 7
  %372 = load ptr, ptr %371, align 8, !tbaa !21
  store ptr %372, ptr %27, align 8, !tbaa !5
  %373 = load ptr, ptr %24, align 8, !tbaa !5
  %374 = getelementptr inbounds %struct.Segment, ptr %373, i32 0, i32 7
  %375 = load ptr, ptr %374, align 8, !tbaa !21
  store ptr %375, ptr %28, align 8, !tbaa !5
  %376 = load ptr, ptr %25, align 8, !tbaa !5
  %377 = load ptr, ptr %27, align 8, !tbaa !5
  %378 = icmp ne ptr %376, %377
  br i1 %378, label %379, label %418

379:                                              ; preds = %359
  %380 = load ptr, ptr %26, align 8, !tbaa !5
  %381 = load ptr, ptr %28, align 8, !tbaa !5
  %382 = icmp ne ptr %380, %381
  br i1 %382, label %383, label %418

383:                                              ; preds = %379
  %384 = load ptr, ptr %25, align 8, !tbaa !5
  %385 = load ptr, ptr %26, align 8, !tbaa !5
  %386 = icmp eq ptr %384, %385
  br i1 %386, label %387, label %396

387:                                              ; preds = %383
  %388 = load ptr, ptr %21, align 8, !tbaa !5
  %389 = load ptr, ptr %22, align 8, !tbaa !5
  call void @SplitSSegment(ptr noundef %388, ptr noundef %389)
  %390 = load ptr, ptr %21, align 8, !tbaa !5
  %391 = getelementptr inbounds %struct.Segment, ptr %390, i32 0, i32 7
  %392 = load ptr, ptr %391, align 8, !tbaa !21
  store ptr %392, ptr %25, align 8, !tbaa !5
  %393 = load ptr, ptr %22, align 8, !tbaa !5
  %394 = getelementptr inbounds %struct.Segment, ptr %393, i32 0, i32 7
  %395 = load ptr, ptr %394, align 8, !tbaa !21
  store ptr %395, ptr %26, align 8, !tbaa !5
  br label %396

396:                                              ; preds = %387, %383
  %397 = load ptr, ptr %27, align 8, !tbaa !5
  %398 = load ptr, ptr %28, align 8, !tbaa !5
  %399 = icmp eq ptr %397, %398
  br i1 %399, label %400, label %417

400:                                              ; preds = %396
  %401 = load ptr, ptr %25, align 8, !tbaa !5
  %402 = load ptr, ptr %27, align 8, !tbaa !5
  %403 = icmp ne ptr %401, %402
  br i1 %403, label %404, label %417

404:                                              ; preds = %400
  %405 = load ptr, ptr %26, align 8, !tbaa !5
  %406 = load ptr, ptr %28, align 8, !tbaa !5
  %407 = icmp ne ptr %405, %406
  br i1 %407, label %408, label %417

408:                                              ; preds = %404
  %409 = load ptr, ptr %23, align 8, !tbaa !5
  %410 = load ptr, ptr %24, align 8, !tbaa !5
  call void @SplitSSegment(ptr noundef %409, ptr noundef %410)
  %411 = load ptr, ptr %23, align 8, !tbaa !5
  %412 = getelementptr inbounds %struct.Segment, ptr %411, i32 0, i32 7
  %413 = load ptr, ptr %412, align 8, !tbaa !21
  store ptr %413, ptr %27, align 8, !tbaa !5
  %414 = load ptr, ptr %24, align 8, !tbaa !5
  %415 = getelementptr inbounds %struct.Segment, ptr %414, i32 0, i32 7
  %416 = load ptr, ptr %415, align 8, !tbaa !21
  store ptr %416, ptr %28, align 8, !tbaa !5
  br label %417

417:                                              ; preds = %408, %404, %400, %396
  br label %494

418:                                              ; preds = %379, %359
  %419 = load ptr, ptr %25, align 8, !tbaa !5
  %420 = load ptr, ptr %27, align 8, !tbaa !5
  %421 = icmp eq ptr %419, %420
  br i1 %421, label %422, label %436

422:                                              ; preds = %418
  %423 = load ptr, ptr %23, align 8, !tbaa !5
  %424 = getelementptr inbounds %struct.Segment, ptr %423, i32 0, i32 5
  %425 = load i32, ptr %424, align 8, !tbaa !22
  %426 = load ptr, ptr %21, align 8, !tbaa !5
  %427 = getelementptr inbounds %struct.Segment, ptr %426, i32 0, i32 5
  %428 = load i32, ptr %427, align 8, !tbaa !22
  %429 = sub nsw i32 %425, %428
  %430 = call i32 @llvm.abs.i32(i32 %429, i1 true)
  %431 = sitofp i32 %430 to double
  %432 = load i32, ptr @SGroupSize, align 4, !tbaa !14
  %433 = sitofp i32 %432 to double
  %434 = fmul double 7.500000e-01, %433
  %435 = fcmp ogt double %431, %434
  br i1 %435, label %454, label %436

436:                                              ; preds = %422, %418
  %437 = load ptr, ptr %26, align 8, !tbaa !5
  %438 = load ptr, ptr %28, align 8, !tbaa !5
  %439 = icmp eq ptr %437, %438
  br i1 %439, label %440, label %493

440:                                              ; preds = %436
  %441 = load ptr, ptr %24, align 8, !tbaa !5
  %442 = getelementptr inbounds %struct.Segment, ptr %441, i32 0, i32 5
  %443 = load i32, ptr %442, align 8, !tbaa !22
  %444 = load ptr, ptr %22, align 8, !tbaa !5
  %445 = getelementptr inbounds %struct.Segment, ptr %444, i32 0, i32 5
  %446 = load i32, ptr %445, align 8, !tbaa !22
  %447 = sub nsw i32 %443, %446
  %448 = call i32 @llvm.abs.i32(i32 %447, i1 true)
  %449 = sitofp i32 %448 to double
  %450 = load i32, ptr @SGroupSize, align 4, !tbaa !14
  %451 = sitofp i32 %450 to double
  %452 = fmul double 7.500000e-01, %451
  %453 = fcmp ogt double %449, %452
  br i1 %453, label %454, label %493

454:                                              ; preds = %440, %422
  %455 = load ptr, ptr %25, align 8, !tbaa !5
  %456 = load ptr, ptr %26, align 8, !tbaa !5
  %457 = icmp eq ptr %455, %456
  br i1 %457, label %458, label %473

458:                                              ; preds = %454
  %459 = load ptr, ptr %21, align 8, !tbaa !5
  %460 = load ptr, ptr %22, align 8, !tbaa !5
  call void @SplitSSegment(ptr noundef %459, ptr noundef %460)
  %461 = load ptr, ptr %21, align 8, !tbaa !5
  %462 = getelementptr inbounds %struct.Segment, ptr %461, i32 0, i32 7
  %463 = load ptr, ptr %462, align 8, !tbaa !21
  store ptr %463, ptr %25, align 8, !tbaa !5
  %464 = load ptr, ptr %22, align 8, !tbaa !5
  %465 = getelementptr inbounds %struct.Segment, ptr %464, i32 0, i32 7
  %466 = load ptr, ptr %465, align 8, !tbaa !21
  store ptr %466, ptr %26, align 8, !tbaa !5
  %467 = load ptr, ptr %23, align 8, !tbaa !5
  %468 = getelementptr inbounds %struct.Segment, ptr %467, i32 0, i32 7
  %469 = load ptr, ptr %468, align 8, !tbaa !21
  store ptr %469, ptr %27, align 8, !tbaa !5
  %470 = load ptr, ptr %24, align 8, !tbaa !5
  %471 = getelementptr inbounds %struct.Segment, ptr %470, i32 0, i32 7
  %472 = load ptr, ptr %471, align 8, !tbaa !21
  store ptr %472, ptr %28, align 8, !tbaa !5
  br label %473

473:                                              ; preds = %458, %454
  %474 = load ptr, ptr %27, align 8, !tbaa !5
  %475 = load ptr, ptr %28, align 8, !tbaa !5
  %476 = icmp eq ptr %474, %475
  br i1 %476, label %477, label %492

477:                                              ; preds = %473
  %478 = load ptr, ptr %23, align 8, !tbaa !5
  %479 = load ptr, ptr %24, align 8, !tbaa !5
  call void @SplitSSegment(ptr noundef %478, ptr noundef %479)
  %480 = load ptr, ptr %21, align 8, !tbaa !5
  %481 = getelementptr inbounds %struct.Segment, ptr %480, i32 0, i32 7
  %482 = load ptr, ptr %481, align 8, !tbaa !21
  store ptr %482, ptr %25, align 8, !tbaa !5
  %483 = load ptr, ptr %22, align 8, !tbaa !5
  %484 = getelementptr inbounds %struct.Segment, ptr %483, i32 0, i32 7
  %485 = load ptr, ptr %484, align 8, !tbaa !21
  store ptr %485, ptr %26, align 8, !tbaa !5
  %486 = load ptr, ptr %23, align 8, !tbaa !5
  %487 = getelementptr inbounds %struct.Segment, ptr %486, i32 0, i32 7
  %488 = load ptr, ptr %487, align 8, !tbaa !21
  store ptr %488, ptr %27, align 8, !tbaa !5
  %489 = load ptr, ptr %24, align 8, !tbaa !5
  %490 = getelementptr inbounds %struct.Segment, ptr %489, i32 0, i32 7
  %491 = load ptr, ptr %490, align 8, !tbaa !21
  store ptr %491, ptr %28, align 8, !tbaa !5
  br label %492

492:                                              ; preds = %477, %473
  br label %493

493:                                              ; preds = %492, %440, %436
  br label %494

494:                                              ; preds = %493, %417
  store ptr null, ptr %18, align 8, !tbaa !5
  %495 = load ptr, ptr %25, align 8, !tbaa !5
  %496 = load ptr, ptr %27, align 8, !tbaa !5
  %497 = icmp eq ptr %495, %496
  br i1 %497, label %498, label %572

498:                                              ; preds = %494
  %499 = load ptr, ptr %21, align 8, !tbaa !5
  %500 = getelementptr inbounds %struct.Segment, ptr %499, i32 0, i32 5
  %501 = load i32, ptr %500, align 8, !tbaa !22
  %502 = load ptr, ptr %23, align 8, !tbaa !5
  %503 = getelementptr inbounds %struct.Segment, ptr %502, i32 0, i32 5
  %504 = load i32, ptr %503, align 8, !tbaa !22
  %505 = icmp slt i32 %501, %504
  br i1 %505, label %506, label %533

506:                                              ; preds = %498
  %507 = load ptr, ptr %25, align 8, !tbaa !5
  %508 = load ptr, ptr %26, align 8, !tbaa !5
  %509 = icmp eq ptr %507, %508
  br i1 %509, label %510, label %527

510:                                              ; preds = %506
  %511 = load ptr, ptr %25, align 8, !tbaa !5
  %512 = load ptr, ptr %28, align 8, !tbaa !5
  %513 = icmp eq ptr %511, %512
  br i1 %513, label %514, label %527

514:                                              ; preds = %510
  %515 = load ptr, ptr %22, align 8, !tbaa !5
  %516 = getelementptr inbounds %struct.Segment, ptr %515, i32 0, i32 5
  %517 = load i32, ptr %516, align 8, !tbaa !22
  %518 = load ptr, ptr %21, align 8, !tbaa !5
  %519 = getelementptr inbounds %struct.Segment, ptr %518, i32 0, i32 5
  %520 = load i32, ptr %519, align 8, !tbaa !22
  %521 = icmp sgt i32 %517, %520
  br i1 %521, label %522, label %527

522:                                              ; preds = %514
  %523 = load ptr, ptr %21, align 8, !tbaa !5
  store ptr %523, ptr %17, align 8, !tbaa !5
  %524 = load ptr, ptr %22, align 8, !tbaa !5
  store ptr %524, ptr %18, align 8, !tbaa !5
  %525 = load ptr, ptr %23, align 8, !tbaa !5
  store ptr %525, ptr %19, align 8, !tbaa !5
  %526 = load ptr, ptr %24, align 8, !tbaa !5
  store ptr %526, ptr %20, align 8, !tbaa !5
  br label %532

527:                                              ; preds = %514, %510, %506
  %528 = load ptr, ptr %22, align 8, !tbaa !5
  store ptr %528, ptr %17, align 8, !tbaa !5
  %529 = load ptr, ptr %21, align 8, !tbaa !5
  store ptr %529, ptr %18, align 8, !tbaa !5
  %530 = load ptr, ptr %24, align 8, !tbaa !5
  store ptr %530, ptr %19, align 8, !tbaa !5
  %531 = load ptr, ptr %23, align 8, !tbaa !5
  store ptr %531, ptr %20, align 8, !tbaa !5
  br label %532

532:                                              ; preds = %527, %522
  br label %571

533:                                              ; preds = %498
  %534 = load ptr, ptr %25, align 8, !tbaa !5
  %535 = load ptr, ptr %26, align 8, !tbaa !5
  %536 = icmp eq ptr %534, %535
  br i1 %536, label %537, label %565

537:                                              ; preds = %533
  %538 = load ptr, ptr %25, align 8, !tbaa !5
  %539 = load ptr, ptr %28, align 8, !tbaa !5
  %540 = icmp eq ptr %538, %539
  br i1 %540, label %541, label %565

541:                                              ; preds = %537
  %542 = load ptr, ptr %22, align 8, !tbaa !5
  %543 = getelementptr inbounds %struct.Segment, ptr %542, i32 0, i32 5
  %544 = load i32, ptr %543, align 8, !tbaa !22
  %545 = load ptr, ptr %21, align 8, !tbaa !5
  %546 = getelementptr inbounds %struct.Segment, ptr %545, i32 0, i32 5
  %547 = load i32, ptr %546, align 8, !tbaa !22
  %548 = icmp slt i32 %544, %547
  br i1 %548, label %549, label %565

549:                                              ; preds = %541
  %550 = load ptr, ptr %21, align 8, !tbaa !5
  %551 = getelementptr inbounds %struct.Segment, ptr %550, i32 0, i32 5
  %552 = load i32, ptr %551, align 8, !tbaa !22
  %553 = load ptr, ptr %22, align 8, !tbaa !5
  %554 = getelementptr inbounds %struct.Segment, ptr %553, i32 0, i32 5
  %555 = load i32, ptr %554, align 8, !tbaa !22
  %556 = sub nsw i32 %552, %555
  %557 = add nsw i32 %556, 1
  %558 = load i32, ptr @Groups, align 4, !tbaa !14
  %559 = icmp slt i32 %557, %558
  br i1 %559, label %560, label %565

560:                                              ; preds = %549
  %561 = load ptr, ptr %23, align 8, !tbaa !5
  store ptr %561, ptr %17, align 8, !tbaa !5
  %562 = load ptr, ptr %24, align 8, !tbaa !5
  store ptr %562, ptr %18, align 8, !tbaa !5
  %563 = load ptr, ptr %21, align 8, !tbaa !5
  store ptr %563, ptr %19, align 8, !tbaa !5
  %564 = load ptr, ptr %22, align 8, !tbaa !5
  store ptr %564, ptr %20, align 8, !tbaa !5
  br label %570

565:                                              ; preds = %549, %541, %537, %533
  %566 = load ptr, ptr %24, align 8, !tbaa !5
  store ptr %566, ptr %17, align 8, !tbaa !5
  %567 = load ptr, ptr %23, align 8, !tbaa !5
  store ptr %567, ptr %18, align 8, !tbaa !5
  %568 = load ptr, ptr %22, align 8, !tbaa !5
  store ptr %568, ptr %19, align 8, !tbaa !5
  %569 = load ptr, ptr %21, align 8, !tbaa !5
  store ptr %569, ptr %20, align 8, !tbaa !5
  br label %570

570:                                              ; preds = %565, %560
  br label %571

571:                                              ; preds = %570, %532
  br label %596

572:                                              ; preds = %494
  %573 = load ptr, ptr %26, align 8, !tbaa !5
  %574 = load ptr, ptr %28, align 8, !tbaa !5
  %575 = icmp eq ptr %573, %574
  br i1 %575, label %576, label %595

576:                                              ; preds = %572
  %577 = load ptr, ptr %24, align 8, !tbaa !5
  %578 = getelementptr inbounds %struct.Segment, ptr %577, i32 0, i32 5
  %579 = load i32, ptr %578, align 8, !tbaa !22
  %580 = load ptr, ptr %22, align 8, !tbaa !5
  %581 = getelementptr inbounds %struct.Segment, ptr %580, i32 0, i32 5
  %582 = load i32, ptr %581, align 8, !tbaa !22
  %583 = icmp slt i32 %579, %582
  br i1 %583, label %584, label %589

584:                                              ; preds = %576
  %585 = load ptr, ptr %23, align 8, !tbaa !5
  store ptr %585, ptr %17, align 8, !tbaa !5
  %586 = load ptr, ptr %24, align 8, !tbaa !5
  store ptr %586, ptr %18, align 8, !tbaa !5
  %587 = load ptr, ptr %21, align 8, !tbaa !5
  store ptr %587, ptr %19, align 8, !tbaa !5
  %588 = load ptr, ptr %22, align 8, !tbaa !5
  store ptr %588, ptr %20, align 8, !tbaa !5
  br label %594

589:                                              ; preds = %576
  %590 = load ptr, ptr %21, align 8, !tbaa !5
  store ptr %590, ptr %17, align 8, !tbaa !5
  %591 = load ptr, ptr %22, align 8, !tbaa !5
  store ptr %591, ptr %18, align 8, !tbaa !5
  %592 = load ptr, ptr %23, align 8, !tbaa !5
  store ptr %592, ptr %19, align 8, !tbaa !5
  %593 = load ptr, ptr %24, align 8, !tbaa !5
  store ptr %593, ptr %20, align 8, !tbaa !5
  br label %594

594:                                              ; preds = %589, %584
  br label %595

595:                                              ; preds = %594, %572
  br label %596

596:                                              ; preds = %595, %571
  %597 = load ptr, ptr %18, align 8, !tbaa !5
  %598 = icmp ne ptr %597, null
  br i1 %598, label %599, label %604

599:                                              ; preds = %596
  %600 = load ptr, ptr %17, align 8, !tbaa !5
  %601 = load ptr, ptr %18, align 8, !tbaa !5
  %602 = load ptr, ptr %19, align 8, !tbaa !5
  %603 = load ptr, ptr %20, align 8, !tbaa !5
  call void @FlipSegments(ptr noundef %600, ptr noundef %601, ptr noundef %602, ptr noundef %603)
  br label %715

604:                                              ; preds = %596
  call void @llvm.lifetime.start.p0(i64 4, ptr %30) #5
  %605 = load ptr, ptr %25, align 8, !tbaa !5
  %606 = getelementptr inbounds %struct.SSegment, ptr %605, i32 0, i32 4
  %607 = load ptr, ptr %606, align 8, !tbaa !23
  %608 = load ptr, ptr %26, align 8, !tbaa !5
  %609 = icmp ne ptr %607, %608
  br i1 %609, label %610, label %623

610:                                              ; preds = %604
  %611 = load ptr, ptr %21, align 8, !tbaa !5
  store ptr %611, ptr %17, align 8, !tbaa !5
  %612 = load ptr, ptr %22, align 8, !tbaa !5
  store ptr %612, ptr %21, align 8, !tbaa !5
  %613 = load ptr, ptr %17, align 8, !tbaa !5
  store ptr %613, ptr %22, align 8, !tbaa !5
  %614 = load ptr, ptr %23, align 8, !tbaa !5
  store ptr %614, ptr %17, align 8, !tbaa !5
  %615 = load ptr, ptr %24, align 8, !tbaa !5
  store ptr %615, ptr %23, align 8, !tbaa !5
  %616 = load ptr, ptr %17, align 8, !tbaa !5
  store ptr %616, ptr %24, align 8, !tbaa !5
  %617 = load ptr, ptr %25, align 8, !tbaa !5
  store ptr %617, ptr %29, align 8, !tbaa !5
  %618 = load ptr, ptr %26, align 8, !tbaa !5
  store ptr %618, ptr %25, align 8, !tbaa !5
  %619 = load ptr, ptr %29, align 8, !tbaa !5
  store ptr %619, ptr %26, align 8, !tbaa !5
  %620 = load ptr, ptr %27, align 8, !tbaa !5
  store ptr %620, ptr %29, align 8, !tbaa !5
  %621 = load ptr, ptr %28, align 8, !tbaa !5
  store ptr %621, ptr %27, align 8, !tbaa !5
  %622 = load ptr, ptr %29, align 8, !tbaa !5
  store ptr %622, ptr %28, align 8, !tbaa !5
  br label %623

623:                                              ; preds = %610, %604
  %624 = load ptr, ptr %26, align 8, !tbaa !5
  %625 = getelementptr inbounds %struct.SSegment, ptr %624, i32 0, i32 5
  %626 = load i32, ptr %625, align 8, !tbaa !25
  %627 = load ptr, ptr %27, align 8, !tbaa !5
  %628 = getelementptr inbounds %struct.SSegment, ptr %627, i32 0, i32 5
  %629 = load i32, ptr %628, align 8, !tbaa !25
  %630 = sub nsw i32 %626, %629
  store i32 %630, ptr %30, align 4, !tbaa !14
  %631 = icmp sle i32 %630, 0
  br i1 %631, label %632, label %636

632:                                              ; preds = %623
  %633 = load i32, ptr @SGroups, align 4, !tbaa !14
  %634 = load i32, ptr %30, align 4, !tbaa !14
  %635 = add nsw i32 %634, %633
  store i32 %635, ptr %30, align 4, !tbaa !14
  br label %636

636:                                              ; preds = %632, %623
  %637 = load i32, ptr %30, align 4, !tbaa !14
  %638 = mul nsw i32 2, %637
  %639 = load i32, ptr @SGroups, align 4, !tbaa !14
  %640 = icmp sgt i32 %638, %639
  br i1 %640, label %641, label %654

641:                                              ; preds = %636
  %642 = load ptr, ptr %23, align 8, !tbaa !5
  store ptr %642, ptr %17, align 8, !tbaa !5
  %643 = load ptr, ptr %22, align 8, !tbaa !5
  store ptr %643, ptr %23, align 8, !tbaa !5
  %644 = load ptr, ptr %17, align 8, !tbaa !5
  store ptr %644, ptr %22, align 8, !tbaa !5
  %645 = load ptr, ptr %21, align 8, !tbaa !5
  store ptr %645, ptr %17, align 8, !tbaa !5
  %646 = load ptr, ptr %24, align 8, !tbaa !5
  store ptr %646, ptr %21, align 8, !tbaa !5
  %647 = load ptr, ptr %17, align 8, !tbaa !5
  store ptr %647, ptr %24, align 8, !tbaa !5
  %648 = load ptr, ptr %27, align 8, !tbaa !5
  store ptr %648, ptr %29, align 8, !tbaa !5
  %649 = load ptr, ptr %26, align 8, !tbaa !5
  store ptr %649, ptr %27, align 8, !tbaa !5
  %650 = load ptr, ptr %29, align 8, !tbaa !5
  store ptr %650, ptr %26, align 8, !tbaa !5
  %651 = load ptr, ptr %25, align 8, !tbaa !5
  store ptr %651, ptr %29, align 8, !tbaa !5
  %652 = load ptr, ptr %28, align 8, !tbaa !5
  store ptr %652, ptr %25, align 8, !tbaa !5
  %653 = load ptr, ptr %29, align 8, !tbaa !5
  store ptr %653, ptr %28, align 8, !tbaa !5
  br label %654

654:                                              ; preds = %641, %636
  %655 = load ptr, ptr %28, align 8, !tbaa !5
  %656 = load ptr, ptr %27, align 8, !tbaa !5
  %657 = load ptr, ptr %26, align 8, !tbaa !5
  %658 = load ptr, ptr %25, align 8, !tbaa !5
  call void @FlipSSegments(ptr noundef %655, ptr noundef %656, ptr noundef %657, ptr noundef %658)
  %659 = load ptr, ptr %23, align 8, !tbaa !5
  %660 = getelementptr inbounds %struct.Segment, ptr %659, i32 0, i32 4
  %661 = load ptr, ptr %660, align 8, !tbaa !26
  %662 = load ptr, ptr %24, align 8, !tbaa !5
  %663 = icmp eq ptr %661, %662
  br i1 %663, label %664, label %668

664:                                              ; preds = %654
  %665 = load ptr, ptr %22, align 8, !tbaa !5
  %666 = load ptr, ptr %23, align 8, !tbaa !5
  %667 = getelementptr inbounds %struct.Segment, ptr %666, i32 0, i32 4
  store ptr %665, ptr %667, align 8, !tbaa !26
  br label %672

668:                                              ; preds = %654
  %669 = load ptr, ptr %22, align 8, !tbaa !5
  %670 = load ptr, ptr %23, align 8, !tbaa !5
  %671 = getelementptr inbounds %struct.Segment, ptr %670, i32 0, i32 3
  store ptr %669, ptr %671, align 8, !tbaa !27
  br label %672

672:                                              ; preds = %668, %664
  %673 = load ptr, ptr %22, align 8, !tbaa !5
  %674 = getelementptr inbounds %struct.Segment, ptr %673, i32 0, i32 4
  %675 = load ptr, ptr %674, align 8, !tbaa !26
  %676 = load ptr, ptr %21, align 8, !tbaa !5
  %677 = icmp eq ptr %675, %676
  br i1 %677, label %678, label %682

678:                                              ; preds = %672
  %679 = load ptr, ptr %23, align 8, !tbaa !5
  %680 = load ptr, ptr %22, align 8, !tbaa !5
  %681 = getelementptr inbounds %struct.Segment, ptr %680, i32 0, i32 4
  store ptr %679, ptr %681, align 8, !tbaa !26
  br label %686

682:                                              ; preds = %672
  %683 = load ptr, ptr %23, align 8, !tbaa !5
  %684 = load ptr, ptr %22, align 8, !tbaa !5
  %685 = getelementptr inbounds %struct.Segment, ptr %684, i32 0, i32 3
  store ptr %683, ptr %685, align 8, !tbaa !27
  br label %686

686:                                              ; preds = %682, %678
  %687 = load ptr, ptr %21, align 8, !tbaa !5
  %688 = getelementptr inbounds %struct.Segment, ptr %687, i32 0, i32 3
  %689 = load ptr, ptr %688, align 8, !tbaa !27
  %690 = load ptr, ptr %22, align 8, !tbaa !5
  %691 = icmp eq ptr %689, %690
  br i1 %691, label %692, label %696

692:                                              ; preds = %686
  %693 = load ptr, ptr %24, align 8, !tbaa !5
  %694 = load ptr, ptr %21, align 8, !tbaa !5
  %695 = getelementptr inbounds %struct.Segment, ptr %694, i32 0, i32 3
  store ptr %693, ptr %695, align 8, !tbaa !27
  br label %700

696:                                              ; preds = %686
  %697 = load ptr, ptr %24, align 8, !tbaa !5
  %698 = load ptr, ptr %21, align 8, !tbaa !5
  %699 = getelementptr inbounds %struct.Segment, ptr %698, i32 0, i32 4
  store ptr %697, ptr %699, align 8, !tbaa !26
  br label %700

700:                                              ; preds = %696, %692
  %701 = load ptr, ptr %24, align 8, !tbaa !5
  %702 = getelementptr inbounds %struct.Segment, ptr %701, i32 0, i32 3
  %703 = load ptr, ptr %702, align 8, !tbaa !27
  %704 = load ptr, ptr %23, align 8, !tbaa !5
  %705 = icmp eq ptr %703, %704
  br i1 %705, label %706, label %710

706:                                              ; preds = %700
  %707 = load ptr, ptr %21, align 8, !tbaa !5
  %708 = load ptr, ptr %24, align 8, !tbaa !5
  %709 = getelementptr inbounds %struct.Segment, ptr %708, i32 0, i32 3
  store ptr %707, ptr %709, align 8, !tbaa !27
  br label %714

710:                                              ; preds = %700
  %711 = load ptr, ptr %21, align 8, !tbaa !5
  %712 = load ptr, ptr %24, align 8, !tbaa !5
  %713 = getelementptr inbounds %struct.Segment, ptr %712, i32 0, i32 4
  store ptr %711, ptr %713, align 8, !tbaa !26
  br label %714

714:                                              ; preds = %710, %706
  call void @llvm.lifetime.end.p0(i64 4, ptr %30) #5
  br label %715

715:                                              ; preds = %714, %599
  call void @llvm.lifetime.end.p0(i64 8, ptr %29) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %27) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %26) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %25) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %22) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #5
  br label %716

716:                                              ; preds = %715, %354
  %717 = load ptr, ptr %9, align 8, !tbaa !5
  %718 = icmp ne ptr %717, null
  br i1 %718, label %808, label %719

719:                                              ; preds = %716
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #5
  %720 = load ptr, ptr @C, align 8, !tbaa !5
  %721 = load ptr, ptr %5, align 8, !tbaa !5
  %722 = load ptr, ptr %6, align 8, !tbaa !5
  %723 = call i32 %720(ptr noundef %721, ptr noundef %722)
  store i32 %723, ptr %31, align 4, !tbaa !14
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #5
  %724 = load ptr, ptr @C, align 8, !tbaa !5
  %725 = load ptr, ptr %7, align 8, !tbaa !5
  %726 = load ptr, ptr %4, align 8, !tbaa !5
  %727 = call i32 %724(ptr noundef %725, ptr noundef %726)
  store i32 %727, ptr %32, align 4, !tbaa !14
  %728 = load ptr, ptr %6, align 8, !tbaa !5
  %729 = getelementptr inbounds %struct.Node, ptr %728, i32 0, i32 16
  %730 = load ptr, ptr %729, align 8, !tbaa !13
  %731 = load ptr, ptr %7, align 8, !tbaa !5
  %732 = icmp eq ptr %730, %731
  br i1 %732, label %733, label %740

733:                                              ; preds = %719
  %734 = load ptr, ptr %5, align 8, !tbaa !5
  %735 = load ptr, ptr %6, align 8, !tbaa !5
  %736 = getelementptr inbounds %struct.Node, ptr %735, i32 0, i32 16
  store ptr %734, ptr %736, align 8, !tbaa !13
  %737 = load i32, ptr %31, align 4, !tbaa !14
  %738 = load ptr, ptr %6, align 8, !tbaa !5
  %739 = getelementptr inbounds %struct.Node, ptr %738, i32 0, i32 8
  store i32 %737, ptr %739, align 8, !tbaa !28
  br label %747

740:                                              ; preds = %719
  %741 = load ptr, ptr %5, align 8, !tbaa !5
  %742 = load ptr, ptr %6, align 8, !tbaa !5
  %743 = getelementptr inbounds %struct.Node, ptr %742, i32 0, i32 15
  store ptr %741, ptr %743, align 8, !tbaa !9
  %744 = load i32, ptr %31, align 4, !tbaa !14
  %745 = load ptr, ptr %6, align 8, !tbaa !5
  %746 = getelementptr inbounds %struct.Node, ptr %745, i32 0, i32 7
  store i32 %744, ptr %746, align 4, !tbaa !29
  br label %747

747:                                              ; preds = %740, %733
  %748 = load ptr, ptr %5, align 8, !tbaa !5
  %749 = getelementptr inbounds %struct.Node, ptr %748, i32 0, i32 16
  %750 = load ptr, ptr %749, align 8, !tbaa !13
  %751 = load ptr, ptr %4, align 8, !tbaa !5
  %752 = icmp eq ptr %750, %751
  br i1 %752, label %753, label %760

753:                                              ; preds = %747
  %754 = load ptr, ptr %6, align 8, !tbaa !5
  %755 = load ptr, ptr %5, align 8, !tbaa !5
  %756 = getelementptr inbounds %struct.Node, ptr %755, i32 0, i32 16
  store ptr %754, ptr %756, align 8, !tbaa !13
  %757 = load i32, ptr %31, align 4, !tbaa !14
  %758 = load ptr, ptr %5, align 8, !tbaa !5
  %759 = getelementptr inbounds %struct.Node, ptr %758, i32 0, i32 8
  store i32 %757, ptr %759, align 8, !tbaa !28
  br label %767

760:                                              ; preds = %747
  %761 = load ptr, ptr %6, align 8, !tbaa !5
  %762 = load ptr, ptr %5, align 8, !tbaa !5
  %763 = getelementptr inbounds %struct.Node, ptr %762, i32 0, i32 15
  store ptr %761, ptr %763, align 8, !tbaa !9
  %764 = load i32, ptr %31, align 4, !tbaa !14
  %765 = load ptr, ptr %5, align 8, !tbaa !5
  %766 = getelementptr inbounds %struct.Node, ptr %765, i32 0, i32 7
  store i32 %764, ptr %766, align 4, !tbaa !29
  br label %767

767:                                              ; preds = %760, %753
  %768 = load ptr, ptr %4, align 8, !tbaa !5
  %769 = getelementptr inbounds %struct.Node, ptr %768, i32 0, i32 15
  %770 = load ptr, ptr %769, align 8, !tbaa !9
  %771 = load ptr, ptr %5, align 8, !tbaa !5
  %772 = icmp eq ptr %770, %771
  br i1 %772, label %773, label %780

773:                                              ; preds = %767
  %774 = load ptr, ptr %7, align 8, !tbaa !5
  %775 = load ptr, ptr %4, align 8, !tbaa !5
  %776 = getelementptr inbounds %struct.Node, ptr %775, i32 0, i32 15
  store ptr %774, ptr %776, align 8, !tbaa !9
  %777 = load i32, ptr %32, align 4, !tbaa !14
  %778 = load ptr, ptr %4, align 8, !tbaa !5
  %779 = getelementptr inbounds %struct.Node, ptr %778, i32 0, i32 7
  store i32 %777, ptr %779, align 4, !tbaa !29
  br label %787

780:                                              ; preds = %767
  %781 = load ptr, ptr %7, align 8, !tbaa !5
  %782 = load ptr, ptr %4, align 8, !tbaa !5
  %783 = getelementptr inbounds %struct.Node, ptr %782, i32 0, i32 16
  store ptr %781, ptr %783, align 8, !tbaa !13
  %784 = load i32, ptr %32, align 4, !tbaa !14
  %785 = load ptr, ptr %4, align 8, !tbaa !5
  %786 = getelementptr inbounds %struct.Node, ptr %785, i32 0, i32 8
  store i32 %784, ptr %786, align 8, !tbaa !28
  br label %787

787:                                              ; preds = %780, %773
  %788 = load ptr, ptr %7, align 8, !tbaa !5
  %789 = getelementptr inbounds %struct.Node, ptr %788, i32 0, i32 15
  %790 = load ptr, ptr %789, align 8, !tbaa !9
  %791 = load ptr, ptr %6, align 8, !tbaa !5
  %792 = icmp eq ptr %790, %791
  br i1 %792, label %793, label %800

793:                                              ; preds = %787
  %794 = load ptr, ptr %4, align 8, !tbaa !5
  %795 = load ptr, ptr %7, align 8, !tbaa !5
  %796 = getelementptr inbounds %struct.Node, ptr %795, i32 0, i32 15
  store ptr %794, ptr %796, align 8, !tbaa !9
  %797 = load i32, ptr %32, align 4, !tbaa !14
  %798 = load ptr, ptr %7, align 8, !tbaa !5
  %799 = getelementptr inbounds %struct.Node, ptr %798, i32 0, i32 7
  store i32 %797, ptr %799, align 4, !tbaa !29
  br label %807

800:                                              ; preds = %787
  %801 = load ptr, ptr %4, align 8, !tbaa !5
  %802 = load ptr, ptr %7, align 8, !tbaa !5
  %803 = getelementptr inbounds %struct.Node, ptr %802, i32 0, i32 16
  store ptr %801, ptr %803, align 8, !tbaa !13
  %804 = load i32, ptr %32, align 4, !tbaa !14
  %805 = load ptr, ptr %7, align 8, !tbaa !5
  %806 = getelementptr inbounds %struct.Node, ptr %805, i32 0, i32 8
  store i32 %804, ptr %806, align 8, !tbaa !28
  br label %807

807:                                              ; preds = %800, %793
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #5
  br label %808

808:                                              ; preds = %807, %716
  %809 = load ptr, ptr %4, align 8, !tbaa !5
  %810 = load ptr, ptr @SwapStack, align 8, !tbaa !5
  %811 = load i32, ptr @Swaps, align 4, !tbaa !14
  %812 = sext i32 %811 to i64
  %813 = getelementptr inbounds %struct.SwapRecord, ptr %810, i64 %812
  %814 = getelementptr inbounds %struct.SwapRecord, ptr %813, i32 0, i32 0
  store ptr %809, ptr %814, align 8, !tbaa !30
  %815 = load ptr, ptr %5, align 8, !tbaa !5
  %816 = load ptr, ptr @SwapStack, align 8, !tbaa !5
  %817 = load i32, ptr @Swaps, align 4, !tbaa !14
  %818 = sext i32 %817 to i64
  %819 = getelementptr inbounds %struct.SwapRecord, ptr %816, i64 %818
  %820 = getelementptr inbounds %struct.SwapRecord, ptr %819, i32 0, i32 1
  store ptr %815, ptr %820, align 8, !tbaa !32
  %821 = load ptr, ptr %6, align 8, !tbaa !5
  %822 = load ptr, ptr @SwapStack, align 8, !tbaa !5
  %823 = load i32, ptr @Swaps, align 4, !tbaa !14
  %824 = sext i32 %823 to i64
  %825 = getelementptr inbounds %struct.SwapRecord, ptr %822, i64 %824
  %826 = getelementptr inbounds %struct.SwapRecord, ptr %825, i32 0, i32 2
  store ptr %821, ptr %826, align 8, !tbaa !33
  %827 = load ptr, ptr %7, align 8, !tbaa !5
  %828 = load ptr, ptr @SwapStack, align 8, !tbaa !5
  %829 = load i32, ptr @Swaps, align 4, !tbaa !14
  %830 = sext i32 %829 to i64
  %831 = getelementptr inbounds %struct.SwapRecord, ptr %828, i64 %830
  %832 = getelementptr inbounds %struct.SwapRecord, ptr %831, i32 0, i32 3
  store ptr %827, ptr %832, align 8, !tbaa !34
  %833 = load i32, ptr @Swaps, align 4, !tbaa !14
  %834 = add nsw i32 %833, 1
  store i32 %834, ptr @Swaps, align 4, !tbaa !14
  %835 = load ptr, ptr @Rand, align 8, !tbaa !5
  %836 = load ptr, ptr %4, align 8, !tbaa !5
  %837 = getelementptr inbounds %struct.Node, ptr %836, i32 0, i32 0
  %838 = load i32, ptr %837, align 8, !tbaa !35
  %839 = sext i32 %838 to i64
  %840 = getelementptr inbounds i32, ptr %835, i64 %839
  %841 = load i32, ptr %840, align 4, !tbaa !14
  %842 = load ptr, ptr @Rand, align 8, !tbaa !5
  %843 = load ptr, ptr %5, align 8, !tbaa !5
  %844 = getelementptr inbounds %struct.Node, ptr %843, i32 0, i32 0
  %845 = load i32, ptr %844, align 8, !tbaa !35
  %846 = sext i32 %845 to i64
  %847 = getelementptr inbounds i32, ptr %842, i64 %846
  %848 = load i32, ptr %847, align 4, !tbaa !14
  %849 = mul i32 %841, %848
  %850 = load ptr, ptr @Rand, align 8, !tbaa !5
  %851 = load ptr, ptr %6, align 8, !tbaa !5
  %852 = getelementptr inbounds %struct.Node, ptr %851, i32 0, i32 0
  %853 = load i32, ptr %852, align 8, !tbaa !35
  %854 = sext i32 %853 to i64
  %855 = getelementptr inbounds i32, ptr %850, i64 %854
  %856 = load i32, ptr %855, align 4, !tbaa !14
  %857 = load ptr, ptr @Rand, align 8, !tbaa !5
  %858 = load ptr, ptr %7, align 8, !tbaa !5
  %859 = getelementptr inbounds %struct.Node, ptr %858, i32 0, i32 0
  %860 = load i32, ptr %859, align 8, !tbaa !35
  %861 = sext i32 %860 to i64
  %862 = getelementptr inbounds i32, ptr %857, i64 %861
  %863 = load i32, ptr %862, align 4, !tbaa !14
  %864 = mul i32 %856, %863
  %865 = xor i32 %849, %864
  %866 = load ptr, ptr @Rand, align 8, !tbaa !5
  %867 = load ptr, ptr %5, align 8, !tbaa !5
  %868 = getelementptr inbounds %struct.Node, ptr %867, i32 0, i32 0
  %869 = load i32, ptr %868, align 8, !tbaa !35
  %870 = sext i32 %869 to i64
  %871 = getelementptr inbounds i32, ptr %866, i64 %870
  %872 = load i32, ptr %871, align 4, !tbaa !14
  %873 = load ptr, ptr @Rand, align 8, !tbaa !5
  %874 = load ptr, ptr %6, align 8, !tbaa !5
  %875 = getelementptr inbounds %struct.Node, ptr %874, i32 0, i32 0
  %876 = load i32, ptr %875, align 8, !tbaa !35
  %877 = sext i32 %876 to i64
  %878 = getelementptr inbounds i32, ptr %873, i64 %877
  %879 = load i32, ptr %878, align 4, !tbaa !14
  %880 = mul i32 %872, %879
  %881 = xor i32 %865, %880
  %882 = load ptr, ptr @Rand, align 8, !tbaa !5
  %883 = load ptr, ptr %7, align 8, !tbaa !5
  %884 = getelementptr inbounds %struct.Node, ptr %883, i32 0, i32 0
  %885 = load i32, ptr %884, align 8, !tbaa !35
  %886 = sext i32 %885 to i64
  %887 = getelementptr inbounds i32, ptr %882, i64 %886
  %888 = load i32, ptr %887, align 4, !tbaa !14
  %889 = load ptr, ptr @Rand, align 8, !tbaa !5
  %890 = load ptr, ptr %4, align 8, !tbaa !5
  %891 = getelementptr inbounds %struct.Node, ptr %890, i32 0, i32 0
  %892 = load i32, ptr %891, align 8, !tbaa !35
  %893 = sext i32 %892 to i64
  %894 = getelementptr inbounds i32, ptr %889, i64 %893
  %895 = load i32, ptr %894, align 4, !tbaa !14
  %896 = mul i32 %888, %895
  %897 = xor i32 %881, %896
  %898 = load i32, ptr @Hash, align 4, !tbaa !14
  %899 = xor i32 %898, %897
  store i32 %899, ptr @Hash, align 4, !tbaa !14
  store i32 0, ptr %16, align 4
  br label %900

900:                                              ; preds = %808, %62, %58
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #5
  %901 = load i32, ptr %16, align 4
  switch i32 %901, label %903 [
    i32 0, label %902
    i32 1, label %902
  ]

902:                                              ; preds = %900, %900
  ret void

903:                                              ; preds = %900
  unreachable
}

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

; Function Attrs: noreturn nounwind
declare void @__assert_fail(ptr noundef, ptr noundef, i32 noundef, ptr noundef) #2

declare void @Flip(ptr noundef, ptr noundef, ptr noundef) #3

; Function Attrs: nounwind uwtable
declare hidden void @SplitSegment(ptr noundef, ptr noundef) #0

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

; Function Attrs: nounwind uwtable
declare hidden void @FlipNodes(ptr noundef, ptr noundef, ptr noundef, ptr noundef) #0

; Function Attrs: nounwind uwtable
declare hidden void @SplitSSegment(ptr noundef, ptr noundef) #0

; Function Attrs: nounwind uwtable
declare hidden void @FlipSegments(ptr noundef, ptr noundef, ptr noundef, ptr noundef) #0

; Function Attrs: nounwind uwtable
declare hidden void @FlipSSegments(ptr noundef, ptr noundef, ptr noundef, ptr noundef) #0

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !6, i64 64}
!10 = !{!"Node", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !11, i64 24, !11, i64 28, !11, i64 32, !11, i64 36, !11, i64 40, !11, i64 44, !11, i64 48, !11, i64 52, !6, i64 56, !6, i64 64, !6, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !6, i64 112, !6, i64 120, !6, i64 128, !6, i64 136, !6, i64 144, !6, i64 152, !6, i64 160, !6, i64 168, !6, i64 176, !6, i64 184, !6, i64 192, !6, i64 200, !6, i64 208, !6, i64 216, !6, i64 224, !6, i64 232, !6, i64 240, !6, i64 248, !6, i64 256, !6, i64 264, !6, i64 272, !6, i64 280, !6, i64 288, !6, i64 296, !6, i64 304, !12, i64 312, !12, i64 320, !12, i64 328, !12, i64 336, !12, i64 344, !12, i64 352, !7, i64 360, !7, i64 361, !7, i64 362}
!11 = !{!"int", !7, i64 0}
!12 = !{!"double", !7, i64 0}
!13 = !{!10, !6, i64 72}
!14 = !{!11, !11, i64 0}
!15 = !{!16, !16, i64 0}
!16 = !{!"short", !7, i64 0}
!17 = !{!10, !6, i64 304}
!18 = !{!19, !7, i64 0}
!19 = !{!"Segment", !7, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !11, i64 40, !11, i64 44, !6, i64 48}
!20 = !{!10, !11, i64 8}
!21 = !{!19, !6, i64 48}
!22 = !{!19, !11, i64 40}
!23 = !{!24, !6, i64 32}
!24 = !{!"SSegment", !7, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !6, i64 32, !11, i64 40, !11, i64 44}
!25 = !{!24, !11, i64 40}
!26 = !{!19, !6, i64 32}
!27 = !{!19, !6, i64 24}
!28 = !{!10, !11, i64 32}
!29 = !{!10, !11, i64 28}
!30 = !{!31, !6, i64 0}
!31 = !{!"SwapRecord", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24}
!32 = !{!31, !6, i64 8}
!33 = !{!31, !6, i64 16}
!34 = !{!31, !6, i64 24}
!35 = !{!10, !11, i64 0}


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

%struct.SwapRecord = type { ptr, ptr, ptr, ptr }

@.str = external hidden unnamed_addr constant [32 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [69 x i8], align 1
@__PRETTY_FUNCTION__.Flip_SSL = external hidden unnamed_addr constant [38 x i8], align 1
@Groups = external dso_local local_unnamed_addr global i32, align 4
@Reversed = external dso_local local_unnamed_addr global i16, align 2
@GroupSize = external dso_local local_unnamed_addr global i32, align 4
@SGroupSize = external dso_local local_unnamed_addr global i32, align 4
@SGroups = external dso_local local_unnamed_addr global i32, align 4
@C = external dso_local local_unnamed_addr global ptr, align 8
@SwapStack = external dso_local local_unnamed_addr global ptr, align 8
@Swaps = external dso_local local_unnamed_addr global i32, align 4
@Rand = external dso_local local_unnamed_addr global ptr, align 8
@Hash = external dso_local local_unnamed_addr global i32, align 4

; Function Attrs: nounwind uwtable
define dso_local void @Flip_SSL(ptr noundef %0, ptr noundef %1, ptr noundef %2) local_unnamed_addr #0 {
  %4 = getelementptr inbounds i8, ptr %0, i64 64
  %5 = load ptr, ptr %4, align 8, !tbaa !5
  %6 = icmp eq ptr %5, %1
  br i1 %6, label %12, label %7

7:                                                ; preds = %3
  %8 = getelementptr inbounds i8, ptr %0, i64 72
  %9 = load ptr, ptr %8, align 8, !tbaa !12
  %10 = icmp eq ptr %9, %1
  br i1 %10, label %12, label %11

11:                                               ; preds = %7
  tail call void @__assert_fail(ptr noundef nonnull @.str, ptr noundef nonnull @.str.1, i32 noundef 35, ptr noundef nonnull @__PRETTY_FUNCTION__.Flip_SSL) #4
  unreachable

12:                                               ; preds = %3, %7
  %13 = getelementptr inbounds i8, ptr %1, i64 64
  %14 = load ptr, ptr %13, align 8, !tbaa !5
  %15 = icmp eq ptr %14, %2
  br i1 %15, label %327, label %16

16:                                               ; preds = %12
  %17 = getelementptr inbounds i8, ptr %1, i64 72
  %18 = load ptr, ptr %17, align 8, !tbaa !12
  %19 = icmp eq ptr %18, %2
  br i1 %19, label %327, label %20

20:                                               ; preds = %16
  %21 = load i32, ptr @Groups, align 4, !tbaa !13
  %22 = icmp eq i32 %21, 1
  br i1 %22, label %23, label %24

23:                                               ; preds = %20
  tail call void @Flip(ptr noundef nonnull %0, ptr noundef nonnull %1, ptr noundef %2) #5
  br label %327

24:                                               ; preds = %20
  %25 = load i16, ptr @Reversed, align 2, !tbaa !14
  %26 = getelementptr inbounds i8, ptr %0, i64 304
  %27 = load ptr, ptr %26, align 8, !tbaa !16
  %28 = load i8, ptr %27, align 8, !tbaa !17
  %29 = sext i8 %28 to i16
  %30 = icmp eq i16 %25, %29
  %31 = getelementptr inbounds i8, ptr %0, i64 72
  %.in = select i1 %30, ptr %31, ptr %4
  %32 = load ptr, ptr %.in, align 8, !tbaa !19
  %33 = icmp eq ptr %32, %1
  %34 = getelementptr inbounds i8, ptr %2, i64 304
  %35 = load ptr, ptr %34, align 8, !tbaa !16
  %36 = load i8, ptr %35, align 8, !tbaa !17
  %37 = sext i8 %36 to i16
  %38 = icmp eq i16 %25, %37
  %39 = xor i1 %38, %33
  %.sink = select i1 %39, i64 72, i64 64
  %40 = getelementptr inbounds i8, ptr %2, i64 %.sink
  %41 = load ptr, ptr %40, align 8, !tbaa !19
  %42 = getelementptr inbounds i8, ptr %1, i64 304
  %43 = load ptr, ptr %42, align 8, !tbaa !16
  %44 = getelementptr inbounds i8, ptr %2, i64 304
  %45 = getelementptr inbounds i8, ptr %41, i64 304
  %46 = load ptr, ptr %45, align 8, !tbaa !16
  %.not = icmp eq ptr %27, %35
  %.not404 = icmp eq ptr %43, %46
  %or.cond = select i1 %.not, i1 true, i1 %.not404
  br i1 %or.cond, label %55, label %47

47:                                               ; preds = %24
  %48 = icmp eq ptr %27, %43
  br i1 %48, label %49, label %52

49:                                               ; preds = %47
  tail call void @SplitSegment(ptr noundef nonnull %0, ptr noundef nonnull %1)
  %50 = load ptr, ptr %26, align 8, !tbaa !16
  %51 = load ptr, ptr %42, align 8, !tbaa !16
  br label %52

52:                                               ; preds = %49, %47
  %.0370 = phi ptr [ %50, %49 ], [ %27, %47 ]
  %.0367 = phi ptr [ %51, %49 ], [ %43, %47 ]
  %53 = icmp ne ptr %35, %46
  %.not405 = icmp eq ptr %.0370, %35
  %or.cond414 = select i1 %53, i1 true, i1 %.not405
  %.not406 = icmp eq ptr %.0367, %46
  %or.cond415 = select i1 %or.cond414, i1 true, i1 %.not406
  br i1 %or.cond415, label %95, label %54

54:                                               ; preds = %52
  tail call void @SplitSegment(ptr noundef nonnull %2, ptr noundef nonnull %41)
  br label %.sink.split

55:                                               ; preds = %24
  br i1 %.not, label %56, label %68

56:                                               ; preds = %55
  %57 = getelementptr inbounds i8, ptr %2, i64 8
  %58 = load i32, ptr %57, align 8, !tbaa !20
  %59 = getelementptr inbounds i8, ptr %0, i64 8
  %60 = load i32, ptr %59, align 8, !tbaa !20
  %61 = sub nsw i32 %58, %60
  %62 = tail call i32 @llvm.abs.i32(i32 %61, i1 true)
  %63 = uitofp nneg i32 %62 to double
  %64 = load i32, ptr @GroupSize, align 4, !tbaa !13
  %65 = sitofp i32 %64 to double
  %66 = fmul double %65, 7.500000e-01
  %67 = fcmp olt double %66, %63
  br i1 %67, label %81, label %68

68:                                               ; preds = %56, %55
  br i1 %.not404, label %69, label %95

69:                                               ; preds = %68
  %70 = getelementptr inbounds i8, ptr %41, i64 8
  %71 = load i32, ptr %70, align 8, !tbaa !20
  %72 = getelementptr inbounds i8, ptr %1, i64 8
  %73 = load i32, ptr %72, align 8, !tbaa !20
  %74 = sub nsw i32 %71, %73
  %75 = tail call i32 @llvm.abs.i32(i32 %74, i1 true)
  %76 = uitofp nneg i32 %75 to double
  %77 = load i32, ptr @GroupSize, align 4, !tbaa !13
  %78 = sitofp i32 %77 to double
  %79 = fmul double %78, 7.500000e-01
  %80 = fcmp olt double %79, %76
  br i1 %80, label %81, label %95

81:                                               ; preds = %69, %56
  %82 = icmp eq ptr %27, %43
  br i1 %82, label %83, label %88

83:                                               ; preds = %81
  tail call void @SplitSegment(ptr noundef nonnull %0, ptr noundef nonnull %1)
  %84 = load ptr, ptr %26, align 8, !tbaa !16
  %85 = load ptr, ptr %42, align 8, !tbaa !16
  %86 = load ptr, ptr %44, align 8, !tbaa !16
  %87 = load ptr, ptr %45, align 8, !tbaa !16
  br label %88

88:                                               ; preds = %83, %81
  %.1371 = phi ptr [ %84, %83 ], [ %27, %81 ]
  %.1368 = phi ptr [ %85, %83 ], [ %43, %81 ]
  %.0365 = phi ptr [ %86, %83 ], [ %35, %81 ]
  %.0363 = phi ptr [ %87, %83 ], [ %46, %81 ]
  %89 = icmp eq ptr %.0365, %.0363
  br i1 %89, label %90, label %95

90:                                               ; preds = %88
  tail call void @SplitSegment(ptr noundef nonnull %2, ptr noundef nonnull %41)
  %91 = load ptr, ptr %26, align 8, !tbaa !16
  %92 = load ptr, ptr %42, align 8, !tbaa !16
  br label %.sink.split

.sink.split:                                      ; preds = %54, %90
  %.2372.ph = phi ptr [ %91, %90 ], [ %.0370, %54 ]
  %.2369.ph = phi ptr [ %92, %90 ], [ %.0367, %54 ]
  %93 = load ptr, ptr %44, align 8, !tbaa !16
  %94 = load ptr, ptr %45, align 8, !tbaa !16
  br label %95

95:                                               ; preds = %.sink.split, %68, %69, %88, %52
  %.2372 = phi ptr [ %.0370, %52 ], [ %.1371, %88 ], [ %27, %69 ], [ %27, %68 ], [ %.2372.ph, %.sink.split ]
  %.2369 = phi ptr [ %.0367, %52 ], [ %.1368, %88 ], [ %43, %69 ], [ %43, %68 ], [ %.2369.ph, %.sink.split ]
  %.1366 = phi ptr [ %35, %52 ], [ %.0365, %88 ], [ %35, %69 ], [ %35, %68 ], [ %93, %.sink.split ]
  %.1364 = phi ptr [ %46, %52 ], [ %.0363, %88 ], [ %46, %69 ], [ %46, %68 ], [ %94, %.sink.split ]
  %96 = icmp eq ptr %.2372, %.1366
  br i1 %96, label %97, label %117

97:                                               ; preds = %95
  %98 = getelementptr inbounds i8, ptr %0, i64 8
  %99 = load i32, ptr %98, align 8, !tbaa !20
  %100 = getelementptr inbounds i8, ptr %2, i64 8
  %101 = load i32, ptr %100, align 8, !tbaa !20
  %102 = icmp slt i32 %99, %101
  %103 = icmp eq ptr %.2372, %.2369
  %104 = icmp eq ptr %.2372, %.1364
  %or.cond416 = select i1 %103, i1 %104, i1 false
  br i1 %102, label %105, label %111

105:                                              ; preds = %97
  br i1 %or.cond416, label %106, label %110

106:                                              ; preds = %105
  %107 = getelementptr inbounds i8, ptr %1, i64 8
  %108 = load i32, ptr %107, align 8, !tbaa !20
  %109 = icmp sgt i32 %108, %99
  br i1 %109, label %252, label %110

110:                                              ; preds = %106, %105
  br label %252

111:                                              ; preds = %97
  br i1 %or.cond416, label %112, label %116

112:                                              ; preds = %111
  %113 = getelementptr inbounds i8, ptr %1, i64 8
  %114 = load i32, ptr %113, align 8, !tbaa !20
  %115 = icmp slt i32 %114, %99
  br i1 %115, label %252, label %116

116:                                              ; preds = %112, %111
  br label %252

117:                                              ; preds = %95
  %118 = icmp eq ptr %.2369, %.1364
  br i1 %118, label %119, label %125

119:                                              ; preds = %117
  %120 = getelementptr inbounds i8, ptr %41, i64 8
  %121 = load i32, ptr %120, align 8, !tbaa !20
  %122 = getelementptr inbounds i8, ptr %1, i64 8
  %123 = load i32, ptr %122, align 8, !tbaa !20
  %124 = icmp slt i32 %121, %123
  %. = select i1 %124, ptr %0, ptr %2
  %.418 = select i1 %124, ptr %1, ptr %41
  %.419 = select i1 %124, ptr %41, ptr %1
  %.420 = select i1 %124, ptr %2, ptr %0
  br label %252

125:                                              ; preds = %117
  %126 = getelementptr inbounds i8, ptr %.2372, i64 48
  %127 = load ptr, ptr %126, align 8, !tbaa !21
  %128 = getelementptr inbounds i8, ptr %.2369, i64 48
  %129 = load ptr, ptr %128, align 8, !tbaa !21
  %130 = getelementptr inbounds i8, ptr %.1366, i64 48
  %131 = load ptr, ptr %130, align 8, !tbaa !21
  %132 = getelementptr inbounds i8, ptr %.1364, i64 48
  %133 = load ptr, ptr %132, align 8, !tbaa !21
  %.not408 = icmp eq ptr %127, %131
  %.not409 = icmp eq ptr %129, %133
  %or.cond421 = select i1 %.not408, i1 true, i1 %.not409
  br i1 %or.cond421, label %142, label %134

134:                                              ; preds = %125
  %135 = icmp eq ptr %127, %129
  br i1 %135, label %136, label %139

136:                                              ; preds = %134
  tail call void @SplitSSegment(ptr noundef nonnull %.2372, ptr noundef nonnull %.2369)
  %137 = load ptr, ptr %126, align 8, !tbaa !21
  %138 = load ptr, ptr %128, align 8, !tbaa !21
  br label %139

139:                                              ; preds = %136, %134
  %.0346 = phi ptr [ %137, %136 ], [ %127, %134 ]
  %.0342 = phi ptr [ %138, %136 ], [ %129, %134 ]
  %140 = icmp ne ptr %131, %133
  %.not410 = icmp eq ptr %.0346, %131
  %or.cond422 = select i1 %140, i1 true, i1 %.not410
  %.not411 = icmp eq ptr %.0342, %133
  %or.cond423 = select i1 %or.cond422, i1 true, i1 %.not411
  br i1 %or.cond423, label %182, label %141

141:                                              ; preds = %139
  tail call void @SplitSSegment(ptr noundef nonnull %.1366, ptr noundef nonnull %.1364)
  br label %.sink.split451

142:                                              ; preds = %125
  br i1 %.not408, label %143, label %155

143:                                              ; preds = %142
  %144 = getelementptr inbounds i8, ptr %.1366, i64 40
  %145 = load i32, ptr %144, align 8, !tbaa !22
  %146 = getelementptr inbounds i8, ptr %.2372, i64 40
  %147 = load i32, ptr %146, align 8, !tbaa !22
  %148 = sub nsw i32 %145, %147
  %149 = tail call i32 @llvm.abs.i32(i32 %148, i1 true)
  %150 = uitofp nneg i32 %149 to double
  %151 = load i32, ptr @SGroupSize, align 4, !tbaa !13
  %152 = sitofp i32 %151 to double
  %153 = fmul double %152, 7.500000e-01
  %154 = fcmp olt double %153, %150
  br i1 %154, label %168, label %155

155:                                              ; preds = %143, %142
  br i1 %.not409, label %156, label %182

156:                                              ; preds = %155
  %157 = getelementptr inbounds i8, ptr %.1364, i64 40
  %158 = load i32, ptr %157, align 8, !tbaa !22
  %159 = getelementptr inbounds i8, ptr %.2369, i64 40
  %160 = load i32, ptr %159, align 8, !tbaa !22
  %161 = sub nsw i32 %158, %160
  %162 = tail call i32 @llvm.abs.i32(i32 %161, i1 true)
  %163 = uitofp nneg i32 %162 to double
  %164 = load i32, ptr @SGroupSize, align 4, !tbaa !13
  %165 = sitofp i32 %164 to double
  %166 = fmul double %165, 7.500000e-01
  %167 = fcmp olt double %166, %163
  br i1 %167, label %168, label %182

168:                                              ; preds = %156, %143
  %169 = icmp eq ptr %127, %129
  br i1 %169, label %170, label %175

170:                                              ; preds = %168
  tail call void @SplitSSegment(ptr noundef nonnull %.2372, ptr noundef nonnull %.2369)
  %171 = load ptr, ptr %126, align 8, !tbaa !21
  %172 = load ptr, ptr %128, align 8, !tbaa !21
  %173 = load ptr, ptr %130, align 8, !tbaa !21
  %174 = load ptr, ptr %132, align 8, !tbaa !21
  br label %175

175:                                              ; preds = %170, %168
  %.1347 = phi ptr [ %171, %170 ], [ %127, %168 ]
  %.1343 = phi ptr [ %172, %170 ], [ %129, %168 ]
  %.0338 = phi ptr [ %173, %170 ], [ %131, %168 ]
  %.0337 = phi ptr [ %174, %170 ], [ %133, %168 ]
  %176 = icmp eq ptr %.0338, %.0337
  br i1 %176, label %177, label %182

177:                                              ; preds = %175
  tail call void @SplitSSegment(ptr noundef nonnull %.1366, ptr noundef nonnull %.1364)
  %178 = load ptr, ptr %126, align 8, !tbaa !21
  %179 = load ptr, ptr %128, align 8, !tbaa !21
  br label %.sink.split451

.sink.split451:                                   ; preds = %141, %177
  %.2348.ph = phi ptr [ %178, %177 ], [ %.0346, %141 ]
  %.2344.ph = phi ptr [ %179, %177 ], [ %.0342, %141 ]
  %180 = load ptr, ptr %130, align 8, !tbaa !21
  %181 = load ptr, ptr %132, align 8, !tbaa !21
  br label %182

182:                                              ; preds = %.sink.split451, %155, %156, %175, %139
  %.2348 = phi ptr [ %.0346, %139 ], [ %.1347, %175 ], [ %127, %156 ], [ %127, %155 ], [ %.2348.ph, %.sink.split451 ]
  %.2344 = phi ptr [ %.0342, %139 ], [ %.1343, %175 ], [ %129, %156 ], [ %129, %155 ], [ %.2344.ph, %.sink.split451 ]
  %.1339 = phi ptr [ %131, %139 ], [ %.0338, %175 ], [ %131, %156 ], [ %131, %155 ], [ %180, %.sink.split451 ]
  %.1 = phi ptr [ %133, %139 ], [ %.0337, %175 ], [ %133, %156 ], [ %133, %155 ], [ %181, %.sink.split451 ]
  %183 = icmp eq ptr %.2348, %.1339
  br i1 %183, label %184, label %209

184:                                              ; preds = %182
  %185 = getelementptr inbounds i8, ptr %.2372, i64 40
  %186 = load i32, ptr %185, align 8, !tbaa !22
  %187 = getelementptr inbounds i8, ptr %.1366, i64 40
  %188 = load i32, ptr %187, align 8, !tbaa !22
  %189 = icmp slt i32 %186, %188
  %190 = icmp eq ptr %.2348, %.2344
  %191 = icmp eq ptr %.2348, %.1
  %or.cond424 = select i1 %190, i1 %191, i1 false
  br i1 %189, label %192, label %198

192:                                              ; preds = %184
  br i1 %or.cond424, label %193, label %197

193:                                              ; preds = %192
  %194 = getelementptr inbounds i8, ptr %.2369, i64 40
  %195 = load i32, ptr %194, align 8, !tbaa !22
  %196 = icmp sgt i32 %195, %186
  br i1 %196, label %217, label %197

197:                                              ; preds = %193, %192
  br label %217

198:                                              ; preds = %184
  br i1 %or.cond424, label %199, label %208

199:                                              ; preds = %198
  %200 = getelementptr inbounds i8, ptr %.2369, i64 40
  %201 = load i32, ptr %200, align 8, !tbaa !22
  %202 = icmp slt i32 %201, %186
  br i1 %202, label %203, label %208

203:                                              ; preds = %199
  %204 = add i32 %186, 1
  %205 = sub i32 %204, %201
  %206 = load i32, ptr @Groups, align 4, !tbaa !13
  %207 = icmp slt i32 %205, %206
  br i1 %207, label %217, label %208

208:                                              ; preds = %203, %199, %198
  br label %217

209:                                              ; preds = %182
  %210 = icmp eq ptr %.2344, %.1
  br i1 %210, label %211, label %218

211:                                              ; preds = %209
  %212 = getelementptr inbounds i8, ptr %.1364, i64 40
  %213 = load i32, ptr %212, align 8, !tbaa !22
  %214 = getelementptr inbounds i8, ptr %.2369, i64 40
  %215 = load i32, ptr %214, align 8, !tbaa !22
  %216 = icmp slt i32 %213, %215
  %.1366..2372 = select i1 %216, ptr %.1366, ptr %.2372
  %.1364..2369 = select i1 %216, ptr %.1364, ptr %.2369
  %.2372..1366 = select i1 %216, ptr %.2372, ptr %.1366
  %.2369..1364 = select i1 %216, ptr %.2369, ptr %.1364
  br label %217

217:                                              ; preds = %197, %208, %193, %203, %211
  %.0362.ph = phi ptr [ %.1366..2372, %211 ], [ %.1366, %203 ], [ %.2372, %193 ], [ %.1364, %208 ], [ %.2369, %197 ]
  %.0361.ph = phi ptr [ %.1364..2369, %211 ], [ %.1364, %203 ], [ %.2369, %193 ], [ %.1366, %208 ], [ %.2372, %197 ]
  %.0360.ph = phi ptr [ %.2372..1366, %211 ], [ %.2372, %203 ], [ %.1366, %193 ], [ %.2369, %208 ], [ %.1364, %197 ]
  %.0359.ph = phi ptr [ %.2369..1364, %211 ], [ %.2369, %203 ], [ %.1364, %193 ], [ %.2372, %208 ], [ %.1366, %197 ]
  tail call void @FlipSegments(ptr noundef nonnull %.0362.ph, ptr noundef nonnull %.0361.ph, ptr noundef nonnull %.0360.ph, ptr noundef nonnull %.0359.ph)
  br label %253

218:                                              ; preds = %209
  %219 = getelementptr inbounds i8, ptr %.2348, i64 32
  %220 = load ptr, ptr %219, align 8, !tbaa !23
  %.not413 = icmp eq ptr %220, %.2344
  br i1 %.not413, label %222, label %221

221:                                              ; preds = %218
  br label %222

222:                                              ; preds = %221, %218
  %.0357 = phi ptr [ %.2369, %221 ], [ %.2372, %218 ]
  %.0355 = phi ptr [ %.2372, %221 ], [ %.2369, %218 ]
  %.0353 = phi ptr [ %.1364, %221 ], [ %.1366, %218 ]
  %.0351 = phi ptr [ %.1366, %221 ], [ %.1364, %218 ]
  %.3349 = phi ptr [ %.2344, %221 ], [ %.2348, %218 ]
  %.3345 = phi ptr [ %.2348, %221 ], [ %.2344, %218 ]
  %.2340 = phi ptr [ %.1, %221 ], [ %.1339, %218 ]
  %.2 = phi ptr [ %.1339, %221 ], [ %.1, %218 ]
  %223 = getelementptr inbounds i8, ptr %.3345, i64 40
  %224 = load i32, ptr %223, align 8, !tbaa !25
  %225 = getelementptr inbounds i8, ptr %.2340, i64 40
  %226 = load i32, ptr %225, align 8, !tbaa !25
  %227 = sub nsw i32 %224, %226
  %228 = load i32, ptr @SGroups, align 4
  %.inv = icmp sgt i32 %227, 0
  %229 = select i1 %.inv, i32 0, i32 %228
  %.0336 = add nsw i32 %229, %227
  %230 = shl nsw i32 %.0336, 1
  %231 = icmp sgt i32 %230, %228
  br i1 %231, label %232, label %233

232:                                              ; preds = %222
  br label %233

233:                                              ; preds = %232, %222
  %.1358 = phi ptr [ %.0351, %232 ], [ %.0357, %222 ]
  %.1356 = phi ptr [ %.0353, %232 ], [ %.0355, %222 ]
  %.1354 = phi ptr [ %.0355, %232 ], [ %.0353, %222 ]
  %.1352 = phi ptr [ %.0357, %232 ], [ %.0351, %222 ]
  %.4350 = phi ptr [ %.2, %232 ], [ %.3349, %222 ]
  %.4 = phi ptr [ %.2340, %232 ], [ %.3345, %222 ]
  %.3341 = phi ptr [ %.3345, %232 ], [ %.2340, %222 ]
  %.3 = phi ptr [ %.3349, %232 ], [ %.2, %222 ]
  tail call void @FlipSSegments(ptr noundef %.3, ptr noundef nonnull %.3341, ptr noundef nonnull %.4, ptr noundef %.4350)
  %234 = getelementptr inbounds i8, ptr %.1354, i64 32
  %235 = load ptr, ptr %234, align 8, !tbaa !26
  %236 = icmp eq ptr %235, %.1352
  %237 = getelementptr inbounds i8, ptr %.1354, i64 24
  %.sink452 = select i1 %236, ptr %234, ptr %237
  store ptr %.1356, ptr %.sink452, align 8, !tbaa !19
  %238 = getelementptr inbounds i8, ptr %.1356, i64 32
  %239 = load ptr, ptr %238, align 8, !tbaa !26
  %240 = icmp eq ptr %239, %.1358
  %241 = getelementptr inbounds i8, ptr %.1356, i64 24
  %.sink453 = select i1 %240, ptr %238, ptr %241
  store ptr %.1354, ptr %.sink453, align 8, !tbaa !19
  %242 = getelementptr inbounds i8, ptr %.1358, i64 24
  %243 = load ptr, ptr %242, align 8, !tbaa !27
  %244 = icmp eq ptr %243, %.1356
  %245 = getelementptr inbounds i8, ptr %.1358, i64 32
  %.sink454 = select i1 %244, ptr %242, ptr %245
  store ptr %.1352, ptr %.sink454, align 8, !tbaa !19
  %246 = getelementptr inbounds i8, ptr %.1352, i64 24
  %247 = load ptr, ptr %246, align 8, !tbaa !27
  %248 = icmp eq ptr %247, %.1354
  br i1 %248, label %249, label %250

249:                                              ; preds = %233
  store ptr %.1358, ptr %246, align 8, !tbaa !27
  br label %253

250:                                              ; preds = %233
  %251 = getelementptr inbounds i8, ptr %.1352, i64 32
  store ptr %.1358, ptr %251, align 8, !tbaa !26
  br label %253

252:                                              ; preds = %119, %112, %106, %116, %110
  %.0374.ph = phi ptr [ %., %119 ], [ %0, %112 ], [ %2, %106 ], [ %1, %116 ], [ %41, %110 ]
  %.0373.ph = phi ptr [ %.418, %119 ], [ %1, %112 ], [ %41, %106 ], [ %0, %116 ], [ %2, %110 ]
  %.0335.ph = phi ptr [ %.419, %119 ], [ %41, %112 ], [ %1, %106 ], [ %2, %116 ], [ %0, %110 ]
  %.0.ph = phi ptr [ %.420, %119 ], [ %2, %112 ], [ %0, %106 ], [ %41, %116 ], [ %1, %110 ]
  tail call void @FlipNodes(ptr noundef nonnull %.0.ph, ptr noundef nonnull %.0335.ph, ptr noundef nonnull %.0374.ph, ptr noundef nonnull %.0373.ph)
  br label %289

253:                                              ; preds = %217, %250, %249
  %254 = load ptr, ptr @C, align 8, !tbaa !19
  %255 = tail call i32 %254(ptr noundef nonnull %1, ptr noundef nonnull %2) #5
  %256 = load ptr, ptr @C, align 8, !tbaa !19
  %257 = tail call i32 %256(ptr noundef nonnull %41, ptr noundef nonnull %0) #5
  %258 = getelementptr inbounds i8, ptr %2, i64 72
  %259 = load ptr, ptr %258, align 8, !tbaa !12
  %260 = icmp eq ptr %259, %41
  br i1 %260, label %261, label %263

261:                                              ; preds = %253
  store ptr %1, ptr %258, align 8, !tbaa !12
  %262 = getelementptr inbounds i8, ptr %2, i64 32
  store i32 %255, ptr %262, align 8, !tbaa !28
  br label %266

263:                                              ; preds = %253
  %264 = getelementptr inbounds i8, ptr %2, i64 64
  store ptr %1, ptr %264, align 8, !tbaa !5
  %265 = getelementptr inbounds i8, ptr %2, i64 28
  store i32 %255, ptr %265, align 4, !tbaa !29
  br label %266

266:                                              ; preds = %263, %261
  %267 = load ptr, ptr %17, align 8, !tbaa !12
  %268 = icmp eq ptr %267, %0
  br i1 %268, label %269, label %271

269:                                              ; preds = %266
  store ptr %2, ptr %17, align 8, !tbaa !12
  %270 = getelementptr inbounds i8, ptr %1, i64 32
  store i32 %255, ptr %270, align 8, !tbaa !28
  br label %273

271:                                              ; preds = %266
  store ptr %2, ptr %13, align 8, !tbaa !5
  %272 = getelementptr inbounds i8, ptr %1, i64 28
  store i32 %255, ptr %272, align 4, !tbaa !29
  br label %273

273:                                              ; preds = %271, %269
  %274 = load ptr, ptr %4, align 8, !tbaa !5
  %275 = icmp eq ptr %274, %1
  br i1 %275, label %276, label %278

276:                                              ; preds = %273
  store ptr %41, ptr %4, align 8, !tbaa !5
  %277 = getelementptr inbounds i8, ptr %0, i64 28
  store i32 %257, ptr %277, align 4, !tbaa !29
  br label %280

278:                                              ; preds = %273
  store ptr %41, ptr %31, align 8, !tbaa !12
  %279 = getelementptr inbounds i8, ptr %0, i64 32
  store i32 %257, ptr %279, align 8, !tbaa !28
  br label %280

280:                                              ; preds = %278, %276
  %281 = getelementptr inbounds i8, ptr %41, i64 64
  %282 = load ptr, ptr %281, align 8, !tbaa !5
  %283 = icmp eq ptr %282, %2
  br i1 %283, label %284, label %286

284:                                              ; preds = %280
  store ptr %0, ptr %281, align 8, !tbaa !5
  %285 = getelementptr inbounds i8, ptr %41, i64 28
  store i32 %257, ptr %285, align 4, !tbaa !29
  br label %289

286:                                              ; preds = %280
  %287 = getelementptr inbounds i8, ptr %41, i64 72
  store ptr %0, ptr %287, align 8, !tbaa !12
  %288 = getelementptr inbounds i8, ptr %41, i64 32
  store i32 %257, ptr %288, align 8, !tbaa !28
  br label %289

289:                                              ; preds = %252, %284, %286
  %290 = load ptr, ptr @SwapStack, align 8, !tbaa !19
  %291 = load i32, ptr @Swaps, align 4, !tbaa !13
  %292 = sext i32 %291 to i64
  %293 = getelementptr inbounds %struct.SwapRecord, ptr %290, i64 %292
  store ptr %0, ptr %293, align 8, !tbaa !30
  %294 = load ptr, ptr @SwapStack, align 8, !tbaa !19
  %295 = getelementptr inbounds %struct.SwapRecord, ptr %294, i64 %292, i32 1
  store ptr %1, ptr %295, align 8, !tbaa !32
  %296 = load ptr, ptr @SwapStack, align 8, !tbaa !19
  %297 = getelementptr inbounds %struct.SwapRecord, ptr %296, i64 %292, i32 2
  store ptr %2, ptr %297, align 8, !tbaa !33
  %298 = load ptr, ptr @SwapStack, align 8, !tbaa !19
  %299 = getelementptr inbounds %struct.SwapRecord, ptr %298, i64 %292, i32 3
  store ptr %41, ptr %299, align 8, !tbaa !34
  %300 = add nsw i32 %291, 1
  store i32 %300, ptr @Swaps, align 4, !tbaa !13
  %301 = load ptr, ptr @Rand, align 8, !tbaa !19
  %302 = load i32, ptr %0, align 8, !tbaa !35
  %303 = sext i32 %302 to i64
  %304 = getelementptr inbounds i32, ptr %301, i64 %303
  %305 = load i32, ptr %304, align 4, !tbaa !13
  %306 = load i32, ptr %1, align 8, !tbaa !35
  %307 = sext i32 %306 to i64
  %308 = getelementptr inbounds i32, ptr %301, i64 %307
  %309 = load i32, ptr %308, align 4, !tbaa !13
  %310 = mul i32 %309, %305
  %311 = load i32, ptr %2, align 8, !tbaa !35
  %312 = sext i32 %311 to i64
  %313 = getelementptr inbounds i32, ptr %301, i64 %312
  %314 = load i32, ptr %313, align 4, !tbaa !13
  %315 = load i32, ptr %41, align 8, !tbaa !35
  %316 = sext i32 %315 to i64
  %317 = getelementptr inbounds i32, ptr %301, i64 %316
  %318 = load i32, ptr %317, align 4, !tbaa !13
  %319 = mul i32 %318, %314
  %320 = mul i32 %314, %309
  %321 = mul i32 %318, %305
  %322 = load i32, ptr @Hash, align 4, !tbaa !13
  %323 = xor i32 %320, %310
  %324 = xor i32 %323, %319
  %325 = xor i32 %324, %321
  %326 = xor i32 %325, %322
  store i32 %326, ptr @Hash, align 4, !tbaa !13
  br label %327

327:                                              ; preds = %12, %16, %289, %23
  ret void
}

; Function Attrs: noreturn nounwind
declare void @__assert_fail(ptr noundef, ptr noundef, i32 noundef, ptr noundef) local_unnamed_addr #1

declare void @Flip(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
declare hidden void @SplitSegment(ptr noundef, ptr noundef) local_unnamed_addr #0

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i32 @llvm.abs.i32(i32, i1 immarg) #3

; Function Attrs: nounwind uwtable
declare hidden void @FlipNodes(ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
declare hidden void @SplitSSegment(ptr noundef, ptr noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
declare hidden void @FlipSegments(ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #0

; Function Attrs: nounwind uwtable
declare hidden void @FlipSSegments(ptr noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #0

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !10, i64 64}
!6 = !{!"Node", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !7, i64 16, !7, i64 20, !7, i64 24, !7, i64 28, !7, i64 32, !7, i64 36, !7, i64 40, !7, i64 44, !7, i64 48, !7, i64 52, !10, i64 56, !10, i64 64, !10, i64 72, !10, i64 80, !10, i64 88, !10, i64 96, !10, i64 104, !10, i64 112, !10, i64 120, !10, i64 128, !10, i64 136, !10, i64 144, !10, i64 152, !10, i64 160, !10, i64 168, !10, i64 176, !10, i64 184, !10, i64 192, !10, i64 200, !10, i64 208, !10, i64 216, !10, i64 224, !10, i64 232, !10, i64 240, !10, i64 248, !10, i64 256, !10, i64 264, !10, i64 272, !10, i64 280, !10, i64 288, !10, i64 296, !10, i64 304, !11, i64 312, !11, i64 320, !11, i64 328, !11, i64 336, !11, i64 344, !11, i64 352, !8, i64 360, !8, i64 361, !8, i64 362}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"any pointer", !8, i64 0}
!11 = !{!"double", !8, i64 0}
!12 = !{!6, !10, i64 72}
!13 = !{!7, !7, i64 0}
!14 = !{!15, !15, i64 0}
!15 = !{!"short", !8, i64 0}
!16 = !{!6, !10, i64 304}
!17 = !{!18, !8, i64 0}
!18 = !{!"Segment", !8, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !7, i64 40, !7, i64 44, !10, i64 48}
!19 = !{!10, !10, i64 0}
!20 = !{!6, !7, i64 8}
!21 = !{!18, !10, i64 48}
!22 = !{!18, !7, i64 40}
!23 = !{!24, !10, i64 32}
!24 = !{!"SSegment", !8, i64 0, !10, i64 8, !10, i64 16, !10, i64 24, !10, i64 32, !7, i64 40, !7, i64 44}
!25 = !{!24, !7, i64 40}
!26 = !{!18, !10, i64 32}
!27 = !{!18, !10, i64 24}
!28 = !{!6, !7, i64 32}
!29 = !{!6, !7, i64 28}
!30 = !{!31, !10, i64 0}
!31 = !{!"SwapRecord", !10, i64 0, !10, i64 8, !10, i64 16, !10, i64 24}
!32 = !{!31, !10, i64 8}
!33 = !{!31, !10, i64 16}
!34 = !{!31, !10, i64 24}
!35 = !{!6, !7, i64 0}


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