; LLVM IR from interpretml/interpret :: shared/libebm (sampling)

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

%"class.NAMESPACE_MAIN::RandomDeterministic" = type { i64, i64, i64 }
%"class.NAMESPACE_MAIN::RandomNondeterministic" = type { i64, i64, %"class.std::random_device" }
%"class.std::random_device" = type { %union.anon }
%union.anon = type { %"class.std::mersenne_twister_engine" }
%"class.std::mersenne_twister_engine" = type { [624 x i64], i64 }
%struct.TargetClass = type { i64, i64 }

@g_traceLevel = external global i32, align 4
@_ZTISt9bad_alloc = external constant ptr
@.str = external hidden unnamed_addr constant [82 x i8], align 1
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage = external hidden constant [146 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_0 = external hidden constant [86 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_1 = external hidden constant [88 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_2 = external hidden constant [99 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_3 = external hidden constant [60 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_4 = external hidden constant [110 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_5 = external hidden constant [60 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_6 = external hidden constant [59 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_7 = external hidden constant [70 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_8 = external hidden constant [78 x i8], align 16
@__func__.SampleWithoutReplacementStratified = external hidden unnamed_addr constant [35 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [14 x i8], align 1
@.str.4 = external hidden unnamed_addr constant [17 x i8], align 1
@__PRETTY_FUNCTION__.SampleWithoutReplacementStratified = external hidden unnamed_addr constant [118 x i8], align 1
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_9 = external hidden constant [90 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__10_ = external hidden constant [71 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__11_ = external hidden constant [73 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__12_ = external hidden constant [79 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__13_ = external hidden constant [79 x i8], align 16
@.str.5 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [31 x i8], align 1
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__14_ = external hidden constant [75 x i8], align 16
@.str.7 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [39 x i8], align 1
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__15_ = external hidden constant [64 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__16_ = external hidden constant [68 x i8], align 16
@.str.9 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [40 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [40 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [31 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [34 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [31 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [34 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [49 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [40 x i8], align 1
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__17_ = external hidden constant [92 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__18_ = external hidden constant [82 x i8], align 16
@.str.21 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [60 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [63 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [42 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [16 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.33 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.34 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.35 = external hidden unnamed_addr constant [30 x i8], align 1
@.str.36 = external hidden unnamed_addr constant [33 x i8], align 1
@.str.37 = external hidden unnamed_addr constant [52 x i8], align 1
@.str.38 = external hidden unnamed_addr constant [55 x i8], align 1
@.str.39 = external hidden unnamed_addr constant [44 x i8], align 1
@.str.40 = external hidden unnamed_addr constant [47 x i8], align 1
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__19_ = external hidden constant [42 x i8], align 16

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

declare void @InteralLogWithArguments(i32 noundef, ptr noundef, ...) #1

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare hidden noundef zeroext i1 @_ZN14NAMESPACE_MAINL14IsConvertErrorImlEENSt9enable_ifIXaaaantsr3std9is_signedIT_EE5valuesr3std9is_signedIT0_EE5valueleclsr3std14numeric_limitsIS3_EE3maxEclsr3std14numeric_limitsIS2_EE3maxEEbE4typeES3_(i64 noundef) #2

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

declare void @InteralLogWithoutArguments(i32 noundef, ptr noundef) #1

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare hidden noundef zeroext i1 @_ZN14NAMESPACE_MAINL10IsAddErrorImEEbT_S1_(i64 noundef, i64 noundef) #2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare hidden noundef zeroext i1 @_ZN14NAMESPACE_MAINL15IsMultiplyErrorImEEbT_S1_(i64 noundef, i64 noundef) #2

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare dso_local void @_ZN14NAMESPACE_MAIN19RandomDeterministic10InitializeERKS0_(ptr noundef nonnull align 8 dereferenceable(24), ptr noundef nonnull align 8 dereferenceable(24)) #4 align 2

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local noundef i64 @_ZN14NAMESPACE_MAIN19RandomDeterministic8NextFastImEENSt9enable_ifIXaasr3std11is_unsignedIT_EE5valueltclL_ZNSt14numeric_limitsIjE3maxEvEEclsr3std14numeric_limitsIS3_EE3maxEES3_E4typeES3_(ptr noundef nonnull align 8 dereferenceable(24), i64 noundef) #5 align 2

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local void @_ZN14NAMESPACE_MAIN22RandomNondeterministicImEC2Ev(ptr noundef nonnull align 8 dereferenceable(5016)) unnamed_addr #5 align 2

declare i32 @__gxx_personality_v0(...)

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN14NAMESPACE_MAIN22RandomNondeterministicImED2Ev(ptr noundef nonnull align 8 dereferenceable(5016)) unnamed_addr #2 align 2

; Function Attrs: nounwind memory(none)
declare i32 @llvm.eh.typeid.for.p0(ptr) #6

declare ptr @__cxa_begin_catch(ptr)

declare void @__cxa_end_catch()

; Function Attrs: noinline noreturn nounwind uwtable
declare hidden void @__clang_call_terminate(ptr noundef) #7

declare void @LogAssertFailure(i64 noundef, ptr noundef, ptr noundef, ptr noundef) #1

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

; Function Attrs: mustprogress uwtable
define dso_local i32 @SampleWithoutReplacementStratified(ptr noundef %0, i64 noundef %1, i64 noundef %2, i64 noundef %3, ptr noundef %4, ptr noundef %5) #9 personality ptr @__gxx_personality_v0 {
  %7 = alloca i32, align 4
  %8 = alloca ptr, align 8
  %9 = alloca i64, align 8
  %10 = alloca i64, align 8
  %11 = alloca i64, align 8
  %12 = alloca ptr, align 8
  %13 = alloca ptr, align 8
  %14 = alloca i32, align 4
  %15 = alloca i32, align 4
  %16 = alloca i64, align 8
  %17 = alloca i32, align 4
  %18 = alloca i32, align 4
  %19 = alloca i64, align 8
  %20 = alloca i32, align 4
  %21 = alloca i64, align 8
  %22 = alloca i32, align 4
  %23 = alloca i32, align 4
  %24 = alloca i32, align 4
  %25 = alloca i32, align 4
  %26 = alloca i32, align 4
  %27 = alloca i32, align 4
  %28 = alloca i64, align 8
  %29 = alloca i32, align 4
  %30 = alloca i64, align 8
  %31 = alloca i32, align 4
  %32 = alloca i32, align 4
  %33 = alloca %"class.NAMESPACE_MAIN::RandomDeterministic", align 8
  %34 = alloca i64, align 8
  %35 = alloca %"class.NAMESPACE_MAIN::RandomNondeterministic", align 8
  %36 = alloca ptr, align 8
  %37 = alloca i32, align 4
  %38 = alloca i32, align 4
  %39 = alloca ptr, align 8
  %40 = alloca i32, align 4
  %41 = alloca ptr, align 8
  %42 = alloca ptr, align 8
  %43 = alloca i32, align 4
  %44 = alloca ptr, align 8
  %45 = alloca ptr, align 8
  %46 = alloca ptr, align 8
  %47 = alloca i64, align 8
  %48 = alloca i32, align 4
  %49 = alloca i32, align 4
  %50 = alloca i64, align 8
  %51 = alloca double, align 8
  %52 = alloca i64, align 8
  %53 = alloca ptr, align 8
  %54 = alloca i64, align 8
  %55 = alloca double, align 8
  %56 = alloca i64, align 8
  %57 = alloca i32, align 4
  %58 = alloca ptr, align 8
  %59 = alloca i32, align 4
  %60 = alloca double, align 8
  %61 = alloca ptr, align 8
  %62 = alloca ptr, align 8
  %63 = alloca i64, align 8
  %64 = alloca i64, align 8
  %65 = alloca double, align 8
  %66 = alloca double, align 8
  %67 = alloca i64, align 8
  %68 = alloca double, align 8
  %69 = alloca double, align 8
  %70 = alloca i64, align 8
  %71 = alloca i64, align 8
  %72 = alloca ptr, align 8
  %73 = alloca i64, align 8
  %74 = alloca i64, align 8
  %75 = alloca i64, align 8
  %76 = alloca ptr, align 8
  %77 = alloca ptr, align 8
  %78 = alloca i64, align 8
  %79 = alloca ptr, align 8
  %80 = alloca i64, align 8
  %81 = alloca i8, align 1
  %82 = alloca i64, align 8
  %83 = alloca ptr, align 8
  %84 = alloca i64, align 8
  %85 = alloca i32, align 4
  store ptr %0, ptr %8, align 8, !tbaa !5
  store i64 %1, ptr %9, align 8, !tbaa !9
  store i64 %2, ptr %10, align 8, !tbaa !9
  store i64 %3, ptr %11, align 8, !tbaa !9
  store ptr %4, ptr %12, align 8, !tbaa !5
  store ptr %5, ptr %13, align 8, !tbaa !5
  br label %86

86:                                               ; preds = %6
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #15
  store i32 3, ptr %14, align 4, !tbaa !11
  %87 = load i32, ptr @g_traceLevel, align 4, !tbaa !11
  %88 = icmp sle i32 3, %87
  br i1 %88, label %89, label %96

89:                                               ; preds = %86
  %90 = load ptr, ptr %8, align 8, !tbaa !5
  %91 = load i64, ptr %9, align 8, !tbaa !9
  %92 = load i64, ptr %10, align 8, !tbaa !9
  %93 = load i64, ptr %11, align 8, !tbaa !9
  %94 = load ptr, ptr %12, align 8, !tbaa !5
  %95 = load ptr, ptr %13, align 8, !tbaa !5
  call void (i32, ptr, ...) @InteralLogWithArguments(i32 noundef 3, ptr noundef @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage, ptr noundef %90, i64 noundef %91, i64 noundef %92, i64 noundef %93, ptr noundef %94, ptr noundef %95)
  br label %96

96:                                               ; preds = %89, %86
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #15
  br label %97

97:                                               ; preds = %96
  %98 = load i64, ptr %10, align 8, !tbaa !9
  %99 = call noundef zeroext i1 @_ZN14NAMESPACE_MAINL14IsConvertErrorImlEENSt9enable_ifIXaaaantsr3std9is_signedIT_EE5valuesr3std9is_signedIT0_EE5valueleclsr3std14numeric_limitsIS3_EE3maxEclsr3std14numeric_limitsIS2_EE3maxEEbE4typeES3_(i64 noundef %98) #15
  %100 = xor i1 %99, true
  %101 = xor i1 %100, true
  %102 = zext i1 %101 to i64
  %103 = call i64 @llvm.expect.i64(i64 %102, i64 0)
  %104 = icmp ne i64 %103, 0
  br i1 %104, label %105, label %112

105:                                              ; preds = %97
  br label %106

106:                                              ; preds = %105
  call void @llvm.lifetime.start.p0(i64 4, ptr %15) #15
  store i32 1, ptr %15, align 4, !tbaa !11
  %107 = load i32, ptr @g_traceLevel, align 4, !tbaa !11
  %108 = icmp sle i32 1, %107
  br i1 %108, label %109, label %110

109:                                              ; preds = %106
  call void @InteralLogWithoutArguments(i32 noundef 1, ptr noundef @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_0)
  br label %110

110:                                              ; preds = %109, %106
  call void @llvm.lifetime.end.p0(i64 4, ptr %15) #15
  br label %111

111:                                              ; preds = %110
  store i32 -3, ptr %7, align 4
  br label %856

112:                                              ; preds = %97
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #15
  %113 = load i64, ptr %10, align 8, !tbaa !9
  store i64 %113, ptr %16, align 8, !tbaa !9
  %114 = load i64, ptr %11, align 8, !tbaa !9
  %115 = call noundef zeroext i1 @_ZN14NAMESPACE_MAINL14IsConvertErrorImlEENSt9enable_ifIXaaaantsr3std9is_signedIT_EE5valuesr3std9is_signedIT0_EE5valueleclsr3std14numeric_limitsIS3_EE3maxEclsr3std14numeric_limitsIS2_EE3maxEEbE4typeES3_(i64 noundef %114) #15
  %116 = xor i1 %115, true
  %117 = xor i1 %116, true
  %118 = zext i1 %117 to i64
  %119 = call i64 @llvm.expect.i64(i64 %118, i64 0)
  %120 = icmp ne i64 %119, 0
  br i1 %120, label %121, label %129

121:                                              ; preds = %112
  br label %122

122:                                              ; preds = %121
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #15
  store i32 1, ptr %17, align 4, !tbaa !11
  %123 = load i32, ptr @g_traceLevel, align 4, !tbaa !11
  %124 = icmp sle i32 1, %123
  br i1 %124, label %125, label %126

125:                                              ; preds = %122
  call void @InteralLogWithoutArguments(i32 noundef 1, ptr noundef @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_1)
  br label %126

126:                                              ; preds = %125, %122
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #15
  br label %127

127:                                              ; preds = %126
  br label %128

128:                                              ; preds = %127
  store i32 -3, ptr %7, align 4
  store i32 1, ptr %18, align 4
  br label %855

129:                                              ; preds = %112
  call void @llvm.lifetime.start.p0(i64 8, ptr %19) #15
  %130 = load i64, ptr %11, align 8, !tbaa !9
  store i64 %130, ptr %19, align 8, !tbaa !9
  %131 = load i64, ptr %16, align 8, !tbaa !9
  %132 = load i64, ptr %19, align 8, !tbaa !9
  %133 = call noundef zeroext i1 @_ZN14NAMESPACE_MAINL10IsAddErrorImEEbT_S1_(i64 noundef %131, i64 noundef %132) #15
  %134 = xor i1 %133, true
  %135 = xor i1 %134, true
  %136 = zext i1 %135 to i64
  %137 = call i64 @llvm.expect.i64(i64 %136, i64 0)
  %138 = icmp ne i64 %137, 0
  br i1 %138, label %139, label %147

139:                                              ; preds = %129
  br label %140

140:                                              ; preds = %139
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #15
  store i32 1, ptr %20, align 4, !tbaa !11
  %141 = load i32, ptr @g_traceLevel, align 4, !tbaa !11
  %142 = icmp sle i32 1, %141
  br i1 %142, label %143, label %144

143:                                              ; preds = %140
  call void @InteralLogWithoutArguments(i32 noundef 1, ptr noundef @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_2)
  br label %144

144:                                              ; preds = %143, %140
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #15
  br label %145

145:                                              ; preds = %144
  br label %146

146:                                              ; preds = %145
  store i32 -3, ptr %7, align 4
  store i32 1, ptr %18, align 4
  br label %854

147:                                              ; preds = %129
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #15
  %148 = load i64, ptr %16, align 8, !tbaa !9
  %149 = load i64, ptr %19, align 8, !tbaa !9
  %150 = add i64 %148, %149
  store i64 %150, ptr %21, align 8, !tbaa !9
  %151 = load i64, ptr %21, align 8, !tbaa !9
  %152 = icmp eq i64 0, %151
  %153 = xor i1 %152, true
  %154 = xor i1 %153, true
  %155 = zext i1 %154 to i64
  %156 = call i64 @llvm.expect.i64(i64 %155, i64 0)
  %157 = icmp ne i64 %156, 0
  br i1 %157, label %158, label %166

158:                                              ; preds = %147
  br label %159

159:                                              ; preds = %158
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #15
  store i32 3, ptr %22, align 4, !tbaa !11
  %160 = load i32, ptr @g_traceLevel, align 4, !tbaa !11
  %161 = icmp sle i32 3, %160
  br i1 %161, label %162, label %163

162:                                              ; preds = %159
  call void @InteralLogWithoutArguments(i32 noundef 3, ptr noundef @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_3)
  br label %163

163:                                              ; preds = %162, %159
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #15
  br label %164

164:                                              ; preds = %163
  br label %165

165:                                              ; preds = %164
  store i32 0, ptr %7, align 4
  store i32 1, ptr %18, align 4
  br label %853

166:                                              ; preds = %147
  %167 = call noundef i64 @_ZN14NAMESPACE_MAINL6EbmMaxImEET_S1_S1_(i64 noundef 8, i64 noundef 1) #15
  %168 = load i64, ptr %21, align 8, !tbaa !9
  %169 = call noundef zeroext i1 @_ZN14NAMESPACE_MAINL15IsMultiplyErrorImEEbT_S1_(i64 noundef %167, i64 noundef %168) #15
  %170 = xor i1 %169, true
  %171 = xor i1 %170, true
  %172 = zext i1 %171 to i64
  %173 = call i64 @llvm.expect.i64(i64 %172, i64 0)
  %174 = icmp ne i64 %173, 0
  br i1 %174, label %175, label %183

175:                                              ; preds = %166
  br label %176

176:                                              ; preds = %175
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #15
  store i32 1, ptr %23, align 4, !tbaa !11
  %177 = load i32, ptr @g_traceLevel, align 4, !tbaa !11
  %178 = icmp sle i32 1, %177
  br i1 %178, label %179, label %180

179:                                              ; preds = %176
  call void @InteralLogWithoutArguments(i32 noundef 1, ptr noundef @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_4)
  br label %180

180:                                              ; preds = %179, %176
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #15
  br label %181

181:                                              ; preds = %180
  br label %182

182:                                              ; preds = %181
  store i32 -3, ptr %7, align 4
  store i32 1, ptr %18, align 4
  br label %853

183:                                              ; preds = %166
  %184 = load ptr, ptr %12, align 8, !tbaa !5
  %185 = icmp eq ptr null, %184
  %186 = xor i1 %185, true
  %187 = xor i1 %186, true
  %188 = zext i1 %187 to i64
  %189 = call i64 @llvm.expect.i64(i64 %188, i64 0)
  %190 = icmp ne i64 %189, 0
  br i1 %190, label %191, label %199

191:                                              ; preds = %183
  br label %192

192:                                              ; preds = %191
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #15
  store i32 1, ptr %24, align 4, !tbaa !11
  %193 = load i32, ptr @g_traceLevel, align 4, !tbaa !11
  %194 = icmp sle i32 1, %193
  br i1 %194, label %195, label %196

195:                                              ; preds = %192
  call void @InteralLogWithoutArguments(i32 noundef 1, ptr noundef @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_5)
  br label %196

196:                                              ; preds = %195, %192
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #15
  br label %197

197:                                              ; preds = %196
  br label %198

198:                                              ; preds = %197
  store i32 -3, ptr %7, align 4
  store i32 1, ptr %18, align 4
  br label %853

199:                                              ; preds = %183
  %200 = load ptr, ptr %13, align 8, !tbaa !5
  %201 = icmp eq ptr null, %200
  %202 = xor i1 %201, true
  %203 = xor i1 %202, true
  %204 = zext i1 %203 to i64
  %205 = call i64 @llvm.expect.i64(i64 %204, i64 0)
  %206 = icmp ne i64 %205, 0
  br i1 %206, label %207, label %215

207:                                              ; preds = %199
  br label %208

208:                                              ; preds = %207
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #15
  store i32 1, ptr %25, align 4, !tbaa !11
  %209 = load i32, ptr @g_traceLevel, align 4, !tbaa !11
  %210 = icmp sle i32 1, %209
  br i1 %210, label %211, label %212

211:                                              ; preds = %208
  call void @InteralLogWithoutArguments(i32 noundef 1, ptr noundef @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_6)
  br label %212

212:                                              ; preds = %211, %208
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #15
  br label %213

213:                                              ; preds = %212
  br label %214

214:                                              ; preds = %213
  store i32 -3, ptr %7, align 4
  store i32 1, ptr %18, align 4
  br label %853

215:                                              ; preds = %199
  %216 = load i64, ptr %9, align 8, !tbaa !9
  %217 = icmp sle i64 %216, 0
  %218 = xor i1 %217, true
  %219 = xor i1 %218, true
  %220 = zext i1 %219 to i64
  %221 = call i64 @llvm.expect.i64(i64 %220, i64 0)
  %222 = icmp ne i64 %221, 0
  br i1 %222, label %223, label %231

223:                                              ; preds = %215
  br label %224

224:                                              ; preds = %223
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #15
  store i32 1, ptr %26, align 4, !tbaa !11
  %225 = load i32, ptr @g_traceLevel, align 4, !tbaa !11
  %226 = icmp sle i32 1, %225
  br i1 %226, label %227, label %228

227:                                              ; preds = %224
  call void @InteralLogWithoutArguments(i32 noundef 1, ptr noundef @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_7)
  br label %228

228:                                              ; preds = %227, %224
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #15
  br label %229

229:                                              ; preds = %228
  br label %230

230:                                              ; preds = %229
  store i32 -3, ptr %7, align 4
  store i32 1, ptr %18, align 4
  br label %853

231:                                              ; preds = %215
  %232 = load i64, ptr %9, align 8, !tbaa !9
  %233 = call noundef zeroext i1 @_ZN14NAMESPACE_MAINL14IsConvertErrorImlEENSt9enable_ifIXaaaantsr3std9is_signedIT_EE5valuesr3std9is_signedIT0_EE5valueleclsr3std14numeric_limitsIS3_EE3maxEclsr3std14numeric_limitsIS2_EE3maxEEbE4typeES3_(i64 noundef %232) #15
  br i1 %233, label %234, label %242

234:                                              ; preds = %231
  br label %235

235:                                              ; preds = %234
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #15
  store i32 1, ptr %27, align 4, !tbaa !11
  %236 = load i32, ptr @g_traceLevel, align 4, !tbaa !11
  %237 = icmp sle i32 1, %236
  br i1 %237, label %238, label %239

238:                                              ; preds = %235
  call void @InteralLogWithoutArguments(i32 noundef 1, ptr noundef @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_8)
  br label %239

239:                                              ; preds = %238, %235
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #15
  br label %240

240:                                              ; preds = %239
  br label %241

241:                                              ; preds = %240
  store i32 -3, ptr %7, align 4
  store i32 1, ptr %18, align 4
  br label %853

242:                                              ; preds = %231
  call void @llvm.lifetime.start.p0(i64 8, ptr %28) #15
  %243 = load i64, ptr %9, align 8, !tbaa !9
  store i64 %243, ptr %28, align 8, !tbaa !9
  %244 = load i64, ptr %28, align 8, !tbaa !9
  %245 = icmp ule i64 1, %244
  br i1 %245, label %248, label %246

246:                                              ; preds = %242
  call void @LogAssertFailure(i64 noundef 188, ptr noundef @.str, ptr noundef @__func__.SampleWithoutReplacementStratified, ptr noundef @.str.3)
  call void @__assert_fail(ptr noundef @.str.4, ptr noundef @.str, i32 noundef 188, ptr noundef @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

247:                                              ; No predecessors!
  br label %248

248:                                              ; preds = %247, %242
  %249 = phi i1 [ true, %242 ], [ false, %247 ]
  %250 = load i64, ptr %28, align 8, !tbaa !9
  %251 = call noundef zeroext i1 @_ZN14NAMESPACE_MAINL15IsMultiplyErrorImEEbT_S1_(i64 noundef 16, i64 noundef %250) #15
  %252 = xor i1 %251, true
  %253 = xor i1 %252, true
  %254 = zext i1 %253 to i64
  %255 = call i64 @llvm.expect.i64(i64 %254, i64 0)
  %256 = icmp ne i64 %255, 0
  br i1 %256, label %257, label %265

257:                                              ; preds = %248
  br label %258

258:                                              ; preds = %257
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #15
  store i32 2, ptr %29, align 4, !tbaa !11
  %259 = load i32, ptr @g_traceLevel, align 4, !tbaa !11
  %260 = icmp sle i32 2, %259
  br i1 %260, label %261, label %262

261:                                              ; preds = %258
  call void @InteralLogWithoutArguments(i32 noundef 2, ptr noundef @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_9)
  br label %262

262:                                              ; preds = %261, %258
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #15
  br label %263

263:                                              ; preds = %262
  br label %264

264:                                              ; preds = %263
  store i32 -1, ptr %7, align 4
  store i32 1, ptr %18, align 4
  br label %852

265:                                              ; preds = %248
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #15
  %266 = load i64, ptr %28, align 8, !tbaa !9
  %267 = mul i64 16, %266
  store i64 %267, ptr %30, align 8, !tbaa !9
  %268 = load i64, ptr %16, align 8, !tbaa !9
  %269 = load i64, ptr %28, align 8, !tbaa !9
  %270 = icmp ult i64 %268, %269
  %271 = xor i1 %270, true
  %272 = xor i1 %271, true
  %273 = zext i1 %272 to i64
  %274 = call i64 @llvm.expect.i64(i64 %273, i64 0)
  %275 = icmp ne i64 %274, 0
  br i1 %275, label %276, label %284

276:                                              ; preds = %265
  br label %277

277:                                              ; preds = %276
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #15
  store i32 2, ptr %31, align 4, !tbaa !11
  %278 = load i32, ptr @g_traceLevel, align 4, !tbaa !11
  %279 = icmp sle i32 2, %278
  br i1 %279, label %280, label %281

280:                                              ; preds = %277
  call void @InteralLogWithoutArguments(i32 noundef 2, ptr noundef @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__10_)
  br label %281

281:                                              ; preds = %280, %277
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #15
  br label %282

282:                                              ; preds = %281
  br label %283

283:                                              ; preds = %282
  br label %284

284:                                              ; preds = %283, %265
  %285 = load i64, ptr %19, align 8, !tbaa !9
  %286 = load i64, ptr %28, align 8, !tbaa !9
  %287 = icmp ult i64 %285, %286
  %288 = xor i1 %287, true
  %289 = xor i1 %288, true
  %290 = zext i1 %289 to i64
  %291 = call i64 @llvm.expect.i64(i64 %290, i64 0)
  %292 = icmp ne i64 %291, 0
  br i1 %292, label %293, label %301

293:                                              ; preds = %284
  br label %294

294:                                              ; preds = %293
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #15
  store i32 2, ptr %32, align 4, !tbaa !11
  %295 = load i32, ptr @g_traceLevel, align 4, !tbaa !11
  %296 = icmp sle i32 2, %295
  br i1 %296, label %297, label %298

297:                                              ; preds = %294
  call void @InteralLogWithoutArguments(i32 noundef 2, ptr noundef @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__11_)
  br label %298

298:                                              ; preds = %297, %294
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #15
  br label %299

299:                                              ; preds = %298
  br label %300

300:                                              ; preds = %299
  br label %301

301:                                              ; preds = %300, %284
  call void @llvm.lifetime.start.p0(i64 24, ptr %33) #15
  %302 = load ptr, ptr %8, align 8, !tbaa !5
  %303 = icmp eq ptr null, %302
  br i1 %303, label %304, label %360

304:                                              ; preds = %301
  call void @llvm.lifetime.start.p0(i64 8, ptr %34) #15
  call void @llvm.lifetime.start.p0(i64 5016, ptr %35) #15
  invoke void @_ZN14NAMESPACE_MAIN22RandomNondeterministicImEC2Ev(ptr noundef nonnull align 8 dereferenceable(5016) %35)
          to label %305 unwind label %309

305:                                              ; preds = %304
  %306 = call noundef i64 @_ZNSt14numeric_limitsImE3maxEv() #15
  %307 = invoke noundef i64 @_ZN14NAMESPACE_MAIN22RandomNondeterministicImE4NextEm(ptr noundef nonnull align 8 dereferenceable(5016) %35, i64 noundef %306)
          to label %308 unwind label %313

308:                                              ; preds = %305
  store i64 %307, ptr %34, align 8, !tbaa !9
  call void @_ZN14NAMESPACE_MAIN22RandomNondeterministicImED2Ev(ptr noundef nonnull align 8 dereferenceable(5016) %35) #15
  call void @llvm.lifetime.end.p0(i64 5016, ptr %35) #15
  br label %354

309:                                              ; preds = %304
  %310 = landingpad { ptr, i32 }
          catch ptr @_ZTISt9bad_alloc
          catch ptr null
  %311 = extractvalue { ptr, i32 } %310, 0
  store ptr %311, ptr %36, align 8
  %312 = extractvalue { ptr, i32 } %310, 1
  store i32 %312, ptr %37, align 4
  br label %317

313:                                              ; preds = %305
  %314 = landingpad { ptr, i32 }
          catch ptr @_ZTISt9bad_alloc
          catch ptr null
  %315 = extractvalue { ptr, i32 } %314, 0
  store ptr %315, ptr %36, align 8
  %316 = extractvalue { ptr, i32 } %314, 1
  store i32 %316, ptr %37, align 4
  call void @_ZN14NAMESPACE_MAIN22RandomNondeterministicImED2Ev(ptr noundef nonnull align 8 dereferenceable(5016) %35) #15
  br label %317

317:                                              ; preds = %313, %309
  call void @llvm.lifetime.end.p0(i64 5016, ptr %35) #15
  br label %318

318:                                              ; preds = %317
  %319 = load i32, ptr %37, align 4
  %320 = call i32 @llvm.eh.typeid.for.p0(ptr @_ZTISt9bad_alloc) #15
  %321 = icmp eq i32 %319, %320
  br i1 %321, label %322, label %330

322:                                              ; preds = %318
  call void @llvm.lifetime.start.p0(i64 8, ptr %39) #15
  %323 = load ptr, ptr %36, align 8
  %324 = call ptr @__cxa_begin_catch(ptr %323) #15
  store ptr %324, ptr %39, align 8
  br label %325

325:                                              ; preds = %322
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #15
  store i32 2, ptr %40, align 4, !tbaa !11
  %326 = load i32, ptr @g_traceLevel, align 4, !tbaa !11
  %327 = icmp sle i32 2, %326
  br i1 %327, label %328, label %350

328:                                              ; preds = %325
  invoke void @InteralLogWithoutArguments(i32 noundef 2, ptr noundef @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__13_)
          to label %329 unwind label %346

329:                                              ; preds = %328
  br label %350

330:                                              ; preds = %318
  %331 = load ptr, ptr %36, align 8
  %332 = call ptr @__cxa_begin_catch(ptr %331) #15
  br label %333

333:                                              ; preds = %330
  call void @llvm.lifetime.start.p0(i64 4, ptr %38) #15
  store i32 2, ptr %38, align 4, !tbaa !11
  %334 = load i32, ptr @g_traceLevel, align 4, !tbaa !11
  %335 = icmp sle i32 2, %334
  br i1 %335, label %336, label %342

336:                                              ; preds = %333
  invoke void @InteralLogWithoutArguments(i32 noundef 2, ptr noundef @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__12_)
          to label %337 unwind label %338

337:                                              ; preds = %336
  br label %342

338:                                              ; preds = %336
  %339 = landingpad { ptr, i32 }
          cleanup
  %340 = extractvalue { ptr, i32 } %339, 0
  store ptr %340, ptr %36, align 8
  %341 = extractvalue { ptr, i32 } %339, 1
  store i32 %341, ptr %37, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #15
  invoke void @__cxa_end_catch()
          to label %345 unwind label %863

342:                                              ; preds = %337, %333
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #15
  br label %343

343:                                              ; preds = %342
  br label %344

344:                                              ; preds = %343
  store i32 -2, ptr %7, align 4
  store i32 1, ptr %18, align 4
  call void @__cxa_end_catch()
  br label %356

345:                                              ; preds = %338
  br label %359

346:                                              ; preds = %328
  %347 = landingpad { ptr, i32 }
          cleanup
  %348 = extractvalue { ptr, i32 } %347, 0
  store ptr %348, ptr %36, align 8
  %349 = extractvalue { ptr, i32 } %347, 1
  store i32 %349, ptr %37, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #15
  invoke void @__cxa_end_catch()
          to label %353 unwind label %863

350:                                              ; preds = %329, %325
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #15
  br label %351

351:                                              ; preds = %350
  br label %352

352:                                              ; preds = %351
  store i32 -1, ptr %7, align 4
  store i32 1, ptr %18, align 4
  call void @__cxa_end_catch()
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #15
  br label %356

353:                                              ; preds = %346
  call void @llvm.lifetime.end.p0(i64 8, ptr %39) #15
  br label %359

354:                                              ; preds = %308
  %355 = load i64, ptr %34, align 8, !tbaa !9
  call void @_ZN14NAMESPACE_MAIN19RandomDeterministic10InitializeEm(ptr noundef nonnull align 8 dereferenceable(24) %33, i64 noundef %355)
  store i32 0, ptr %18, align 4
  br label %356

356:                                              ; preds = %354, %352, %344
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #15
  %357 = load i32, ptr %18, align 4
  switch i32 %357, label %851 [
    i32 0, label %358
  ]

358:                                              ; preds = %356
  br label %363

359:                                              ; preds = %353, %345
  call void @llvm.lifetime.end.p0(i64 8, ptr %34) #15
  call void @llvm.lifetime.end.p0(i64 24, ptr %33) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #15
  br label %858

360:                                              ; preds = %301
  call void @llvm.lifetime.start.p0(i64 8, ptr %41) #15
  %361 = load ptr, ptr %8, align 8, !tbaa !5
  store ptr %361, ptr %41, align 8, !tbaa !5
  %362 = load ptr, ptr %41, align 8, !tbaa !5
  call void @_ZN14NAMESPACE_MAIN19RandomDeterministic10InitializeERKS0_(ptr noundef nonnull align 8 dereferenceable(24) %33, ptr noundef nonnull align 8 dereferenceable(24) %362)
  call void @llvm.lifetime.end.p0(i64 8, ptr %41) #15
  br label %363

363:                                              ; preds = %360, %358
  %364 = load i64, ptr %30, align 8, !tbaa !9
  %365 = icmp ule i64 1, %364
  br i1 %365, label %368, label %366

366:                                              ; preds = %363
  call void @LogAssertFailure(i64 noundef 225, ptr noundef @.str, ptr noundef @__func__.SampleWithoutReplacementStratified, ptr noundef @.str.5)
  call void @__assert_fail(ptr noundef @.str.6, ptr noundef @.str, i32 noundef 225, ptr noundef @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

367:                                              ; No predecessors!
  br label %368

368:                                              ; preds = %367, %363
  %369 = phi i1 [ true, %363 ], [ false, %367 ]
  call void @llvm.lifetime.start.p0(i64 8, ptr %42) #15
  %370 = load i64, ptr %30, align 8, !tbaa !9
  %371 = call noalias ptr @malloc(i64 noundef %370) #17
  store ptr %371, ptr %42, align 8, !tbaa !5
  %372 = load ptr, ptr %42, align 8, !tbaa !5
  %373 = icmp eq ptr null, %372
  %374 = xor i1 %373, true
  %375 = xor i1 %374, true
  %376 = zext i1 %375 to i64
  %377 = call i64 @llvm.expect.i64(i64 %376, i64 0)
  %378 = icmp ne i64 %377, 0
  br i1 %378, label %379, label %387

379:                                              ; preds = %368
  br label %380

380:                                              ; preds = %379
  call void @llvm.lifetime.start.p0(i64 4, ptr %43) #15
  store i32 2, ptr %43, align 4, !tbaa !11
  %381 = load i32, ptr @g_traceLevel, align 4, !tbaa !11
  %382 = icmp sle i32 2, %381
  br i1 %382, label %383, label %384

383:                                              ; preds = %380
  call void @InteralLogWithoutArguments(i32 noundef 2, ptr noundef @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__14_)
  br label %384

384:                                              ; preds = %383, %380
  call void @llvm.lifetime.end.p0(i64 4, ptr %43) #15
  br label %385

385:                                              ; preds = %384
  br label %386

386:                                              ; preds = %385
  store i32 -1, ptr %7, align 4
  store i32 1, ptr %18, align 4
  br label %850

387:                                              ; preds = %368
  %388 = load ptr, ptr %42, align 8, !tbaa !5
  %389 = load i64, ptr %30, align 8, !tbaa !9
  call void @llvm.memset.p0.i64(ptr align 8 %388, i8 0, i64 %389, i1 false)
  call void @llvm.lifetime.start.p0(i64 8, ptr %44) #15
  %390 = load ptr, ptr %42, align 8, !tbaa !5
  %391 = load i64, ptr %30, align 8, !tbaa !9
  %392 = call noundef ptr @_ZN14NAMESPACE_MAINL9IndexByteIZ34SampleWithoutReplacementStratifiedE11TargetClassEEPT_S3_m(ptr noundef %390, i64 noundef %391) #15
  store ptr %392, ptr %44, align 8, !tbaa !5
  %393 = load ptr, ptr %44, align 8, !tbaa !5
  %394 = load ptr, ptr %42, align 8, !tbaa !5
  %395 = icmp ne ptr %393, %394
  br i1 %395, label %398, label %396

396:                                              ; preds = %387
  call void @LogAssertFailure(i64 noundef 235, ptr noundef @.str, ptr noundef @__func__.SampleWithoutReplacementStratified, ptr noundef @.str.7)
  call void @__assert_fail(ptr noundef @.str.8, ptr noundef @.str, i32 noundef 235, ptr noundef @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

397:                                              ; No predecessors!
  br label %398

398:                                              ; preds = %397, %387
  %399 = phi i1 [ true, %387 ], [ false, %397 ]
  call void @llvm.lifetime.start.p0(i64 8, ptr %45) #15
  %400 = load ptr, ptr %12, align 8, !tbaa !5
  store ptr %400, ptr %45, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %46) #15
  %401 = load ptr, ptr %12, align 8, !tbaa !5
  %402 = load i64, ptr %21, align 8, !tbaa !9
  %403 = getelementptr inbounds i64, ptr %401, i64 %402
  store ptr %403, ptr %46, align 8, !tbaa !5
  br label %404

404:                                              ; preds = %449, %398
  call void @llvm.lifetime.start.p0(i64 8, ptr %47) #15
  %405 = load ptr, ptr %45, align 8, !tbaa !5
  %406 = load i64, ptr %405, align 8, !tbaa !9
  store i64 %406, ptr %47, align 8, !tbaa !9
  %407 = load i64, ptr %47, align 8, !tbaa !9
  %408 = icmp slt i64 %407, 0
  br i1 %408, label %409, label %418

409:                                              ; preds = %404
  br label %410

410:                                              ; preds = %409
  call void @llvm.lifetime.start.p0(i64 4, ptr %48) #15
  store i32 1, ptr %48, align 4, !tbaa !11
  %411 = load i32, ptr @g_traceLevel, align 4, !tbaa !11
  %412 = icmp sle i32 1, %411
  br i1 %412, label %413, label %414

413:                                              ; preds = %410
  call void @InteralLogWithoutArguments(i32 noundef 1, ptr noundef @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__15_)
  br label %414

414:                                              ; preds = %413, %410
  call void @llvm.lifetime.end.p0(i64 4, ptr %48) #15
  br label %415

415:                                              ; preds = %414
  br label %416

416:                                              ; preds = %415
  %417 = load ptr, ptr %42, align 8, !tbaa !5
  call void @free(ptr noundef %417) #15
  store i32 -3, ptr %7, align 4
  store i32 1, ptr %18, align 4
  br label %446

418:                                              ; preds = %404
  %419 = load i64, ptr %9, align 8, !tbaa !9
  %420 = load i64, ptr %47, align 8, !tbaa !9
  %421 = icmp sle i64 %419, %420
  %422 = xor i1 %421, true
  %423 = xor i1 %422, true
  %424 = zext i1 %423 to i64
  %425 = call i64 @llvm.expect.i64(i64 %424, i64 0)
  %426 = icmp ne i64 %425, 0
  br i1 %426, label %427, label %436

427:                                              ; preds = %418
  br label %428

428:                                              ; preds = %427
  call void @llvm.lifetime.start.p0(i64 4, ptr %49) #15
  store i32 1, ptr %49, align 4, !tbaa !11
  %429 = load i32, ptr @g_traceLevel, align 4, !tbaa !11
  %430 = icmp sle i32 1, %429
  br i1 %430, label %431, label %432

431:                                              ; preds = %428
  call void @InteralLogWithoutArguments(i32 noundef 1, ptr noundef @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__16_)
  br label %432

432:                                              ; preds = %431, %428
  call void @llvm.lifetime.end.p0(i64 4, ptr %49) #15
  br label %433

433:                                              ; preds = %432
  br label %434

434:                                              ; preds = %433
  %435 = load ptr, ptr %42, align 8, !tbaa !5
  call void @free(ptr noundef %435) #15
  store i32 -3, ptr %7, align 4
  store i32 1, ptr %18, align 4
  br label %446

436:                                              ; preds = %418
  call void @llvm.lifetime.start.p0(i64 8, ptr %50) #15
  %437 = load i64, ptr %47, align 8, !tbaa !9
  store i64 %437, ptr %50, align 8, !tbaa !9
  %438 = load ptr, ptr %42, align 8, !tbaa !5
  %439 = load i64, ptr %50, align 8, !tbaa !9
  %440 = getelementptr inbounds %struct.TargetClass, ptr %438, i64 %439
  %441 = getelementptr inbounds %struct.TargetClass, ptr %440, i32 0, i32 1
  %442 = load i64, ptr %441, align 8, !tbaa !13
  %443 = add i64 %442, 1
  store i64 %443, ptr %441, align 8, !tbaa !13
  %444 = load ptr, ptr %45, align 8, !tbaa !5
  %445 = getelementptr inbounds i64, ptr %444, i32 1
  store ptr %445, ptr %45, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr %50) #15
  store i32 0, ptr %18, align 4
  br label %446

446:                                              ; preds = %436, %434, %416
  call void @llvm.lifetime.end.p0(i64 8, ptr %47) #15
  %447 = load i32, ptr %18, align 4
  switch i32 %447, label %849 [
    i32 0, label %448
  ]

448:                                              ; preds = %446
  br label %449

449:                                              ; preds = %448
  %450 = load ptr, ptr %46, align 8, !tbaa !5
  %451 = load ptr, ptr %45, align 8, !tbaa !5
  %452 = icmp ne ptr %450, %451
  br i1 %452, label %404, label %453, !llvm.loop !15

453:                                              ; preds = %449
  call void @llvm.lifetime.start.p0(i64 8, ptr %51) #15
  %454 = load i64, ptr %16, align 8, !tbaa !9
  %455 = uitofp i64 %454 to double
  %456 = load i64, ptr %21, align 8, !tbaa !9
  %457 = uitofp i64 %456 to double
  %458 = fdiv double %455, %457
  store double %458, ptr %51, align 8, !tbaa !17
  %459 = load double, ptr %51, align 8, !tbaa !17
  %460 = call noundef zeroext i1 @_ZSt5isnand(double noundef %459)
  br i1 %460, label %461, label %463

461:                                              ; preds = %453
  call void @LogAssertFailure(i64 noundef 289, ptr noundef @.str, ptr noundef @__func__.SampleWithoutReplacementStratified, ptr noundef @.str.9)
  call void @__assert_fail(ptr noundef @.str.10, ptr noundef @.str, i32 noundef 289, ptr noundef @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

462:                                              ; No predecessors!
  br label %463

463:                                              ; preds = %462, %453
  %464 = phi i1 [ true, %453 ], [ false, %462 ]
  %465 = load double, ptr %51, align 8, !tbaa !17
  %466 = call noundef zeroext i1 @_ZSt5isinfd(double noundef %465)
  br i1 %466, label %467, label %469

467:                                              ; preds = %463
  call void @LogAssertFailure(i64 noundef 290, ptr noundef @.str, ptr noundef @__func__.SampleWithoutReplacementStratified, ptr noundef @.str.11)
  call void @__assert_fail(ptr noundef @.str.12, ptr noundef @.str, i32 noundef 290, ptr noundef @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

468:                                              ; No predecessors!
  br label %469

469:                                              ; preds = %468, %463
  %470 = phi i1 [ true, %463 ], [ false, %468 ]
  %471 = load double, ptr %51, align 8, !tbaa !17
  %472 = fcmp ole double 0.000000e+00, %471
  br i1 %472, label %475, label %473

473:                                              ; preds = %469
  call void @LogAssertFailure(i64 noundef 291, ptr noundef @.str, ptr noundef @__func__.SampleWithoutReplacementStratified, ptr noundef @.str.13)
  call void @__assert_fail(ptr noundef @.str.14, ptr noundef @.str, i32 noundef 291, ptr noundef @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

474:                                              ; No predecessors!
  br label %475

475:                                              ; preds = %474, %469
  %476 = phi i1 [ true, %469 ], [ false, %474 ]
  %477 = load double, ptr %51, align 8, !tbaa !17
  %478 = fcmp ole double %477, 1.000000e+00
  br i1 %478, label %481, label %479

479:                                              ; preds = %475
  call void @LogAssertFailure(i64 noundef 292, ptr noundef @.str, ptr noundef @__func__.SampleWithoutReplacementStratified, ptr noundef @.str.15)
  call void @__assert_fail(ptr noundef @.str.16, ptr noundef @.str, i32 noundef 292, ptr noundef @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

480:                                              ; No predecessors!
  br label %481

481:                                              ; preds = %480, %475
  %482 = phi i1 [ true, %475 ], [ false, %480 ]
  call void @llvm.lifetime.start.p0(i64 8, ptr %52) #15
  %483 = load i64, ptr %16, align 8, !tbaa !9
  store i64 %483, ptr %52, align 8, !tbaa !9
  %484 = load i64, ptr %28, align 8, !tbaa !9
  %485 = load i64, ptr %16, align 8, !tbaa !9
  %486 = icmp ult i64 %484, %485
  br i1 %486, label %487, label %526

487:                                              ; preds = %481
  call void @llvm.lifetime.start.p0(i64 8, ptr %53) #15
  %488 = load ptr, ptr %42, align 8, !tbaa !5
  store ptr %488, ptr %53, align 8, !tbaa !5
  br label %489

489:                                              ; preds = %521, %487
  call void @llvm.lifetime.start.p0(i64 8, ptr %54) #15
  %490 = load ptr, ptr %53, align 8, !tbaa !5
  %491 = getelementptr inbounds %struct.TargetClass, ptr %490, i32 0, i32 1
  %492 = load i64, ptr %491, align 8, !tbaa !13
  store i64 %492, ptr %54, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %55) #15
  %493 = load double, ptr %51, align 8, !tbaa !17
  %494 = load i64, ptr %54, align 8, !tbaa !9
  %495 = uitofp i64 %494 to double
  %496 = fmul double %493, %495
  %497 = call double @llvm.floor.f64(double %496)
  store double %497, ptr %55, align 8, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 8, ptr %56) #15
  %498 = load double, ptr %55, align 8, !tbaa !17
  %499 = fptoui double %498 to i64
  store i64 %499, ptr %56, align 8, !tbaa !9
  %500 = load i64, ptr %56, align 8, !tbaa !9
  %501 = icmp ult i64 0, %500
  br i1 %501, label %502, label %505

502:                                              ; preds = %489
  %503 = load i64, ptr %56, align 8, !tbaa !9
  %504 = add i64 %503, -1
  store i64 %504, ptr %56, align 8, !tbaa !9
  br label %505

505:                                              ; preds = %502, %489
  %506 = load i64, ptr %56, align 8, !tbaa !9
  %507 = load ptr, ptr %53, align 8, !tbaa !5
  %508 = getelementptr inbounds %struct.TargetClass, ptr %507, i32 0, i32 0
  store i64 %506, ptr %508, align 8, !tbaa !19
  %509 = load i64, ptr %56, align 8, !tbaa !9
  %510 = load i64, ptr %52, align 8, !tbaa !9
  %511 = icmp ule i64 %509, %510
  br i1 %511, label %514, label %512

512:                                              ; preds = %505
  call void @LogAssertFailure(i64 noundef 305, ptr noundef @.str, ptr noundef @__func__.SampleWithoutReplacementStratified, ptr noundef @.str.17)
  call void @__assert_fail(ptr noundef @.str.18, ptr noundef @.str, i32 noundef 305, ptr noundef @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

513:                                              ; No predecessors!
  br label %514

514:                                              ; preds = %513, %505
  %515 = phi i1 [ true, %505 ], [ false, %513 ]
  %516 = load i64, ptr %56, align 8, !tbaa !9
  %517 = load i64, ptr %52, align 8, !tbaa !9
  %518 = sub i64 %517, %516
  store i64 %518, ptr %52, align 8, !tbaa !9
  %519 = load ptr, ptr %53, align 8, !tbaa !5
  %520 = getelementptr inbounds %struct.TargetClass, ptr %519, i32 1
  store ptr %520, ptr %53, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr %56) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %55) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %54) #15
  br label %521

521:                                              ; preds = %514
  %522 = load ptr, ptr %44, align 8, !tbaa !5
  %523 = load ptr, ptr %53, align 8, !tbaa !5
  %524 = icmp ne ptr %522, %523
  br i1 %524, label %489, label %525, !llvm.loop !20

525:                                              ; preds = %521
  call void @llvm.lifetime.end.p0(i64 8, ptr %53) #15
  br label %526

526:                                              ; preds = %525, %481
  %527 = load i64, ptr %52, align 8, !tbaa !9
  %528 = load i64, ptr %21, align 8, !tbaa !9
  %529 = icmp ule i64 %527, %528
  br i1 %529, label %532, label %530

530:                                              ; preds = %526
  call void @LogAssertFailure(i64 noundef 310, ptr noundef @.str, ptr noundef @__func__.SampleWithoutReplacementStratified, ptr noundef @.str.19)
  call void @__assert_fail(ptr noundef @.str.20, ptr noundef @.str, i32 noundef 310, ptr noundef @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

531:                                              ; No predecessors!
  br label %532

532:                                              ; preds = %531, %526
  %533 = phi i1 [ true, %526 ], [ false, %531 ]
  %534 = load i64, ptr %28, align 8, !tbaa !9
  %535 = call noundef zeroext i1 @_ZN14NAMESPACE_MAINL15IsMultiplyErrorImEEbT_S1_(i64 noundef 8, i64 noundef %534) #15
  br i1 %535, label %536, label %545

536:                                              ; preds = %532
  br label %537

537:                                              ; preds = %536
  call void @llvm.lifetime.start.p0(i64 4, ptr %57) #15
  store i32 2, ptr %57, align 4, !tbaa !11
  %538 = load i32, ptr @g_traceLevel, align 4, !tbaa !11
  %539 = icmp sle i32 2, %538
  br i1 %539, label %540, label %541

540:                                              ; preds = %537
  call void @InteralLogWithoutArguments(i32 noundef 2, ptr noundef @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__17_)
  br label %541

541:                                              ; preds = %540, %537
  call void @llvm.lifetime.end.p0(i64 4, ptr %57) #15
  br label %542

542:                                              ; preds = %541
  br label %543

543:                                              ; preds = %542
  %544 = load ptr, ptr %42, align 8, !tbaa !5
  call void @free(ptr noundef %544) #15
  store i32 -1, ptr %7, align 4
  store i32 1, ptr %18, align 4
  br label %848

545:                                              ; preds = %532
  call void @llvm.lifetime.start.p0(i64 8, ptr %58) #15
  %546 = load i64, ptr %28, align 8, !tbaa !9
  %547 = mul i64 8, %546
  %548 = call noalias ptr @malloc(i64 noundef %547) #17
  store ptr %548, ptr %58, align 8, !tbaa !5
  %549 = load ptr, ptr %58, align 8, !tbaa !5
  %550 = icmp eq ptr null, %549
  %551 = xor i1 %550, true
  %552 = xor i1 %551, true
  %553 = zext i1 %552 to i64
  %554 = call i64 @llvm.expect.i64(i64 %553, i64 0)
  %555 = icmp ne i64 %554, 0
  br i1 %555, label %556, label %565

556:                                              ; preds = %545
  br label %557

557:                                              ; preds = %556
  call void @llvm.lifetime.start.p0(i64 4, ptr %59) #15
  store i32 2, ptr %59, align 4, !tbaa !11
  %558 = load i32, ptr @g_traceLevel, align 4, !tbaa !11
  %559 = icmp sle i32 2, %558
  br i1 %559, label %560, label %561

560:                                              ; preds = %557
  call void @InteralLogWithoutArguments(i32 noundef 2, ptr noundef @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__18_)
  br label %561

561:                                              ; preds = %560, %557
  call void @llvm.lifetime.end.p0(i64 4, ptr %59) #15
  br label %562

562:                                              ; preds = %561
  br label %563

563:                                              ; preds = %562
  %564 = load ptr, ptr %42, align 8, !tbaa !5
  call void @free(ptr noundef %564) #15
  store i32 -1, ptr %7, align 4
  store i32 1, ptr %18, align 4
  br label %847

565:                                              ; preds = %545
  br label %566

566:                                              ; preds = %677, %565
  %567 = load i64, ptr %52, align 8, !tbaa !9
  %568 = icmp ne i64 0, %567
  br i1 %568, label %569, label %691

569:                                              ; preds = %566
  call void @llvm.lifetime.start.p0(i64 8, ptr %60) #15
  %570 = call noundef double @_ZNSt14numeric_limitsIdE8infinityEv() #15
  %571 = fneg double %570
  store double %571, ptr %60, align 8, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 8, ptr %61) #15
  %572 = load ptr, ptr %58, align 8, !tbaa !5
  store ptr %572, ptr %61, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %62) #15
  %573 = load ptr, ptr %42, align 8, !tbaa !5
  store ptr %573, ptr %62, align 8, !tbaa !5
  br label %574

574:                                              ; preds = %654, %569
  call void @llvm.lifetime.start.p0(i64 8, ptr %63) #15
  %575 = load ptr, ptr %62, align 8, !tbaa !5
  %576 = getelementptr inbounds %struct.TargetClass, ptr %575, i32 0, i32 0
  %577 = load i64, ptr %576, align 8, !tbaa !19
  store i64 %577, ptr %63, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %64) #15
  %578 = load ptr, ptr %62, align 8, !tbaa !5
  %579 = getelementptr inbounds %struct.TargetClass, ptr %578, i32 0, i32 1
  %580 = load i64, ptr %579, align 8, !tbaa !13
  store i64 %580, ptr %64, align 8, !tbaa !9
  %581 = load i64, ptr %63, align 8, !tbaa !9
  %582 = load i64, ptr %64, align 8, !tbaa !9
  %583 = icmp ne i64 %581, %582
  br i1 %583, label %584, label %651

584:                                              ; preds = %574
  %585 = load i64, ptr %64, align 8, !tbaa !9
  %586 = icmp ult i64 0, %585
  br i1 %586, label %589, label %587

587:                                              ; preds = %584
  call void @LogAssertFailure(i64 noundef 334, ptr noundef @.str, ptr noundef @__func__.SampleWithoutReplacementStratified, ptr noundef @.str.21)
  call void @__assert_fail(ptr noundef @.str.22, ptr noundef @.str, i32 noundef 334, ptr noundef @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

588:                                              ; No predecessors!
  br label %589

589:                                              ; preds = %588, %584
  %590 = phi i1 [ true, %584 ], [ false, %588 ]
  call void @llvm.lifetime.start.p0(i64 8, ptr %65) #15
  %591 = load double, ptr %51, align 8, !tbaa !17
  %592 = load i64, ptr %64, align 8, !tbaa !9
  %593 = uitofp i64 %592 to double
  %594 = fmul double %591, %593
  store double %594, ptr %65, align 8, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 8, ptr %66) #15
  %595 = load double, ptr %65, align 8, !tbaa !17
  %596 = load i64, ptr %63, align 8, !tbaa !9
  %597 = uitofp i64 %596 to double
  %598 = fsub double %595, %597
  store double %598, ptr %66, align 8, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 8, ptr %67) #15
  %599 = load i64, ptr %63, align 8, !tbaa !9
  %600 = add i64 %599, 1
  store i64 %600, ptr %67, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %68) #15
  %601 = load double, ptr %65, align 8, !tbaa !17
  %602 = load i64, ptr %67, align 8, !tbaa !9
  %603 = uitofp i64 %602 to double
  %604 = fsub double %601, %603
  store double %604, ptr %68, align 8, !tbaa !17
  call void @llvm.lifetime.start.p0(i64 8, ptr %69) #15
  %605 = load double, ptr %66, align 8, !tbaa !17
  %606 = load double, ptr %66, align 8, !tbaa !17
  %607 = load double, ptr %68, align 8, !tbaa !17
  %608 = load double, ptr %68, align 8, !tbaa !17
  %609 = fmul double %607, %608
  %610 = fneg double %609
  %611 = call double @llvm.fmuladd.f64(double %605, double %606, double %610)
  store double %611, ptr %69, align 8, !tbaa !17
  %612 = load i64, ptr %63, align 8, !tbaa !9
  %613 = icmp eq i64 0, %612
  br i1 %613, label %614, label %617

614:                                              ; preds = %589
  %615 = load double, ptr %69, align 8, !tbaa !17
  %616 = fadd double %615, 3.200000e+01
  store double %616, ptr %69, align 8, !tbaa !17
  br label %626

617:                                              ; preds = %589
  %618 = load i64, ptr %63, align 8, !tbaa !9
  %619 = add i64 %618, 1
  %620 = load i64, ptr %64, align 8, !tbaa !9
  %621 = icmp eq i64 %619, %620
  br i1 %621, label %622, label %625

622:                                              ; preds = %617
  %623 = load double, ptr %69, align 8, !tbaa !17
  %624 = fsub double %623, 3.200000e+01
  store double %624, ptr %69, align 8, !tbaa !17
  br label %625

625:                                              ; preds = %622, %617
  br label %626

626:                                              ; preds = %625, %614
  %627 = load double, ptr %60, align 8, !tbaa !17
  %628 = load double, ptr %69, align 8, !tbaa !17
  %629 = fcmp ole double %627, %628
  br i1 %629, label %630, label %650

630:                                              ; preds = %626
  %631 = load double, ptr %69, align 8, !tbaa !17
  %632 = load double, ptr %60, align 8, !tbaa !17
  %633 = fcmp une double %631, %632
  %634 = xor i1 %633, true
  %635 = xor i1 %634, true
  %636 = zext i1 %635 to i64
  %637 = call i64 @llvm.expect.i64(i64 %636, i64 1)
  %638 = icmp ne i64 %637, 0
  br i1 %638, label %639, label %641

639:                                              ; preds = %630
  %640 = load ptr, ptr %58, align 8, !tbaa !5
  br label %643

641:                                              ; preds = %630
  %642 = load ptr, ptr %61, align 8, !tbaa !5
  br label %643

643:                                              ; preds = %641, %639
  %644 = phi ptr [ %640, %639 ], [ %642, %641 ]
  store ptr %644, ptr %61, align 8, !tbaa !5
  %645 = load ptr, ptr %62, align 8, !tbaa !5
  %646 = load ptr, ptr %61, align 8, !tbaa !5
  store ptr %645, ptr %646, align 8, !tbaa !5
  %647 = load ptr, ptr %61, align 8, !tbaa !5
  %648 = getelementptr inbounds ptr, ptr %647, i32 1
  store ptr %648, ptr %61, align 8, !tbaa !5
  %649 = load double, ptr %69, align 8, !tbaa !17
  store double %649, ptr %60, align 8, !tbaa !17
  br label %650

650:                                              ; preds = %643, %626
  call void @llvm.lifetime.end.p0(i64 8, ptr %69) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %68) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %67) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %66) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %65) #15
  br label %651

651:                                              ; preds = %650, %574
  %652 = load ptr, ptr %62, align 8, !tbaa !5
  %653 = getelementptr inbounds %struct.TargetClass, ptr %652, i32 1
  store ptr %653, ptr %62, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr %64) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %63) #15
  br label %654

654:                                              ; preds = %651
  %655 = load ptr, ptr %44, align 8, !tbaa !5
  %656 = load ptr, ptr %62, align 8, !tbaa !5
  %657 = icmp ne ptr %655, %656
  br i1 %657, label %574, label %658, !llvm.loop !21

658:                                              ; preds = %654
  %659 = call noundef double @_ZNSt14numeric_limitsIdE8infinityEv() #15
  %660 = fneg double %659
  %661 = load double, ptr %60, align 8, !tbaa !17
  %662 = fcmp une double %660, %661
  br i1 %662, label %665, label %663

663:                                              ; preds = %658
  call void @LogAssertFailure(i64 noundef 360, ptr noundef @.str, ptr noundef @__func__.SampleWithoutReplacementStratified, ptr noundef @.str.23)
  call void @__assert_fail(ptr noundef @.str.24, ptr noundef @.str, i32 noundef 360, ptr noundef @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

664:                                              ; No predecessors!
  br label %665

665:                                              ; preds = %664, %658
  %666 = phi i1 [ true, %658 ], [ false, %664 ]
  call void @llvm.lifetime.start.p0(i64 8, ptr %70) #15
  %667 = load ptr, ptr %61, align 8, !tbaa !5
  %668 = load ptr, ptr %58, align 8, !tbaa !5
  %669 = ptrtoint ptr %667 to i64
  %670 = ptrtoint ptr %668 to i64
  %671 = sub i64 %669, %670
  %672 = sdiv exact i64 %671, 8
  store i64 %672, ptr %70, align 8, !tbaa !9
  %673 = load i64, ptr %70, align 8, !tbaa !9
  %674 = icmp ule i64 1, %673
  br i1 %674, label %677, label %675

675:                                              ; preds = %665
  call void @LogAssertFailure(i64 noundef 365, ptr noundef @.str, ptr noundef @__func__.SampleWithoutReplacementStratified, ptr noundef @.str.25)
  call void @__assert_fail(ptr noundef @.str.26, ptr noundef @.str, i32 noundef 365, ptr noundef @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

676:                                              ; No predecessors!
  br label %677

677:                                              ; preds = %676, %665
  %678 = phi i1 [ true, %665 ], [ false, %676 ]
  call void @llvm.lifetime.start.p0(i64 8, ptr %71) #15
  %679 = load i64, ptr %70, align 8, !tbaa !9
  %680 = call noundef i64 @_ZN14NAMESPACE_MAIN19RandomDeterministic8NextFastImEENSt9enable_ifIXaasr3std11is_unsignedIT_EE5valueltclL_ZNSt14numeric_limitsIjE3maxEvEEclsr3std14numeric_limitsIS3_EE3maxEES3_E4typeES3_(ptr noundef nonnull align 8 dereferenceable(24) %33, i64 noundef %679)
  store i64 %680, ptr %71, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %72) #15
  %681 = load ptr, ptr %58, align 8, !tbaa !5
  %682 = load i64, ptr %71, align 8, !tbaa !9
  %683 = getelementptr inbounds ptr, ptr %681, i64 %682
  %684 = load ptr, ptr %683, align 8, !tbaa !5
  store ptr %684, ptr %72, align 8, !tbaa !5
  %685 = load ptr, ptr %72, align 8, !tbaa !5
  %686 = getelementptr inbounds %struct.TargetClass, ptr %685, i32 0, i32 0
  %687 = load i64, ptr %686, align 8, !tbaa !19
  %688 = add i64 %687, 1
  store i64 %688, ptr %686, align 8, !tbaa !19
  %689 = load i64, ptr %52, align 8, !tbaa !9
  %690 = add i64 %689, -1
  store i64 %690, ptr %52, align 8, !tbaa !9
  call void @llvm.lifetime.end.p0(i64 8, ptr %72) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %71) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %70) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %62) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %61) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %60) #15
  br label %566, !llvm.loop !22

691:                                              ; preds = %566
  call void @llvm.lifetime.start.p0(i64 8, ptr %73) #15
  store i64 0, ptr %73, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %74) #15
  store i64 0, ptr %74, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %75) #15
  store i64 0, ptr %75, align 8, !tbaa !9
  br label %692

692:                                              ; preds = %712, %691
  %693 = load i64, ptr %75, align 8, !tbaa !9
  %694 = load i64, ptr %28, align 8, !tbaa !9
  %695 = icmp ult i64 %693, %694
  br i1 %695, label %697, label %696

696:                                              ; preds = %692
  store i32 50, ptr %18, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %75) #15
  br label %715

697:                                              ; preds = %692
  %698 = load ptr, ptr %42, align 8, !tbaa !5
  %699 = load i64, ptr %75, align 8, !tbaa !9
  %700 = getelementptr inbounds %struct.TargetClass, ptr %698, i64 %699
  %701 = getelementptr inbounds %struct.TargetClass, ptr %700, i32 0, i32 0
  %702 = load i64, ptr %701, align 8, !tbaa !19
  %703 = load i64, ptr %73, align 8, !tbaa !9
  %704 = add i64 %703, %702
  store i64 %704, ptr %73, align 8, !tbaa !9
  %705 = load ptr, ptr %42, align 8, !tbaa !5
  %706 = load i64, ptr %75, align 8, !tbaa !9
  %707 = getelementptr inbounds %struct.TargetClass, ptr %705, i64 %706
  %708 = getelementptr inbounds %struct.TargetClass, ptr %707, i32 0, i32 1
  %709 = load i64, ptr %708, align 8, !tbaa !13
  %710 = load i64, ptr %74, align 8, !tbaa !9
  %711 = add i64 %710, %709
  store i64 %711, ptr %74, align 8, !tbaa !9
  br label %712

712:                                              ; preds = %697
  %713 = load i64, ptr %75, align 8, !tbaa !9
  %714 = add i64 %713, 1
  store i64 %714, ptr %75, align 8, !tbaa !9
  br label %692, !llvm.loop !23

715:                                              ; preds = %696
  %716 = load i64, ptr %73, align 8, !tbaa !9
  %717 = load i64, ptr %16, align 8, !tbaa !9
  %718 = icmp eq i64 %716, %717
  br i1 %718, label %721, label %719

719:                                              ; preds = %715
  call void @LogAssertFailure(i64 noundef 380, ptr noundef @.str, ptr noundef @__func__.SampleWithoutReplacementStratified, ptr noundef @.str.27)
  call void @__assert_fail(ptr noundef @.str.28, ptr noundef @.str, i32 noundef 380, ptr noundef @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

720:                                              ; No predecessors!
  br label %721

721:                                              ; preds = %720, %715
  %722 = phi i1 [ true, %715 ], [ false, %720 ]
  %723 = load i64, ptr %74, align 8, !tbaa !9
  %724 = load i64, ptr %21, align 8, !tbaa !9
  %725 = icmp eq i64 %723, %724
  br i1 %725, label %728, label %726

726:                                              ; preds = %721
  call void @LogAssertFailure(i64 noundef 381, ptr noundef @.str, ptr noundef @__func__.SampleWithoutReplacementStratified, ptr noundef @.str.29)
  call void @__assert_fail(ptr noundef @.str.30, ptr noundef @.str, i32 noundef 381, ptr noundef @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

727:                                              ; No predecessors!
  br label %728

728:                                              ; preds = %727, %721
  %729 = phi i1 [ true, %721 ], [ false, %727 ]
  call void @llvm.lifetime.start.p0(i64 8, ptr %76) #15
  %730 = load ptr, ptr %12, align 8, !tbaa !5
  store ptr %730, ptr %76, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %77) #15
  %731 = load ptr, ptr %13, align 8, !tbaa !5
  store ptr %731, ptr %77, align 8, !tbaa !5
  br label %732

732:                                              ; preds = %797, %728
  call void @llvm.lifetime.start.p0(i64 8, ptr %78) #15
  %733 = load ptr, ptr %76, align 8, !tbaa !5
  %734 = load i64, ptr %733, align 8, !tbaa !9
  store i64 %734, ptr %78, align 8, !tbaa !9
  %735 = load i64, ptr %78, align 8, !tbaa !9
  %736 = icmp sle i64 0, %735
  br i1 %736, label %739, label %737

737:                                              ; preds = %732
  call void @LogAssertFailure(i64 noundef 388, ptr noundef @.str, ptr noundef @__func__.SampleWithoutReplacementStratified, ptr noundef @.str.31)
  call void @__assert_fail(ptr noundef @.str.32, ptr noundef @.str, i32 noundef 388, ptr noundef @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

738:                                              ; No predecessors!
  br label %739

739:                                              ; preds = %738, %732
  %740 = phi i1 [ true, %732 ], [ false, %738 ]
  %741 = load i64, ptr %78, align 8, !tbaa !9
  %742 = load i64, ptr %9, align 8, !tbaa !9
  %743 = icmp slt i64 %741, %742
  br i1 %743, label %746, label %744

744:                                              ; preds = %739
  call void @LogAssertFailure(i64 noundef 389, ptr noundef @.str, ptr noundef @__func__.SampleWithoutReplacementStratified, ptr noundef @.str.33)
  call void @__assert_fail(ptr noundef @.str.34, ptr noundef @.str, i32 noundef 389, ptr noundef @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

745:                                              ; No predecessors!
  br label %746

746:                                              ; preds = %745, %739
  %747 = phi i1 [ true, %739 ], [ false, %745 ]
  call void @llvm.lifetime.start.p0(i64 8, ptr %79) #15
  %748 = load ptr, ptr %42, align 8, !tbaa !5
  %749 = load i64, ptr %78, align 8, !tbaa !9
  %750 = getelementptr inbounds %struct.TargetClass, ptr %748, i64 %749
  store ptr %750, ptr %79, align 8, !tbaa !5
  %751 = load ptr, ptr %79, align 8, !tbaa !5
  %752 = getelementptr inbounds %struct.TargetClass, ptr %751, i32 0, i32 1
  %753 = load i64, ptr %752, align 8, !tbaa !13
  %754 = icmp ule i64 1, %753
  br i1 %754, label %757, label %755

755:                                              ; preds = %746
  call void @LogAssertFailure(i64 noundef 392, ptr noundef @.str, ptr noundef @__func__.SampleWithoutReplacementStratified, ptr noundef @.str.35)
  call void @__assert_fail(ptr noundef @.str.36, ptr noundef @.str, i32 noundef 392, ptr noundef @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

756:                                              ; No predecessors!
  br label %757

757:                                              ; preds = %756, %746
  %758 = phi i1 [ true, %746 ], [ false, %756 ]
  call void @llvm.lifetime.start.p0(i64 8, ptr %80) #15
  %759 = load ptr, ptr %79, align 8, !tbaa !5
  %760 = getelementptr inbounds %struct.TargetClass, ptr %759, i32 0, i32 1
  %761 = load i64, ptr %760, align 8, !tbaa !13
  %762 = call noundef i64 @_ZN14NAMESPACE_MAIN19RandomDeterministic8NextFastImEENSt9enable_ifIXaasr3std11is_unsignedIT_EE5valueltclL_ZNSt14numeric_limitsIjE3maxEvEEclsr3std14numeric_limitsIS3_EE3maxEES3_E4typeES3_(ptr noundef nonnull align 8 dereferenceable(24) %33, i64 noundef %761)
  store i64 %762, ptr %80, align 8, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 1, ptr %81) #15
  %763 = load i64, ptr %80, align 8, !tbaa !9
  %764 = load ptr, ptr %79, align 8, !tbaa !5
  %765 = getelementptr inbounds %struct.TargetClass, ptr %764, i32 0, i32 0
  %766 = load i64, ptr %765, align 8, !tbaa !19
  %767 = icmp ult i64 %763, %766
  %768 = xor i1 %767, true
  %769 = xor i1 %768, true
  %770 = zext i1 %769 to i8
  store i8 %770, ptr %81, align 1, !tbaa !24
  %771 = load i8, ptr %81, align 1, !tbaa !24, !range !26, !noundef !27
  %772 = trunc i8 %771 to i1
  %773 = xor i1 %772, true
  %774 = xor i1 %773, true
  %775 = zext i1 %774 to i64
  %776 = select i1 %774, i8 1, i8 -1
  %777 = load ptr, ptr %77, align 8, !tbaa !5
  store i8 %776, ptr %777, align 1, !tbaa !28
  call void @llvm.lifetime.start.p0(i64 8, ptr %82) #15
  %778 = load i8, ptr %81, align 1, !tbaa !24, !range !26, !noundef !27
  %779 = trunc i8 %778 to i1
  %780 = xor i1 %779, true
  %781 = xor i1 %780, true
  %782 = zext i1 %781 to i64
  %783 = select i1 %781, i64 1, i64 0
  store i64 %783, ptr %82, align 8, !tbaa !9
  %784 = load i64, ptr %82, align 8, !tbaa !9
  %785 = load ptr, ptr %79, align 8, !tbaa !5
  %786 = getelementptr inbounds %struct.TargetClass, ptr %785, i32 0, i32 0
  %787 = load i64, ptr %786, align 8, !tbaa !19
  %788 = sub i64 %787, %784
  store i64 %788, ptr %786, align 8, !tbaa !19
  %789 = load ptr, ptr %79, align 8, !tbaa !5
  %790 = getelementptr inbounds %struct.TargetClass, ptr %789, i32 0, i32 1
  %791 = load i64, ptr %790, align 8, !tbaa !13
  %792 = add i64 %791, -1
  store i64 %792, ptr %790, align 8, !tbaa !13
  %793 = load ptr, ptr %77, align 8, !tbaa !5
  %794 = getelementptr inbounds i8, ptr %793, i32 1
  store ptr %794, ptr %77, align 8, !tbaa !5
  %795 = load ptr, ptr %76, align 8, !tbaa !5
  %796 = getelementptr inbounds i64, ptr %795, i32 1
  store ptr %796, ptr %76, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 8, ptr %82) #15
  call void @llvm.lifetime.end.p0(i64 1, ptr %81) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %80) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %79) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %78) #15
  br label %797

797:                                              ; preds = %757
  %798 = load ptr, ptr %46, align 8, !tbaa !5
  %799 = load ptr, ptr %76, align 8, !tbaa !5
  %800 = icmp ne ptr %798, %799
  br i1 %800, label %732, label %801, !llvm.loop !29

801:                                              ; preds = %797
  %802 = load ptr, ptr %8, align 8, !tbaa !5
  %803 = icmp ne ptr null, %802
  br i1 %803, label %804, label %807

804:                                              ; preds = %801
  call void @llvm.lifetime.start.p0(i64 8, ptr %83) #15
  %805 = load ptr, ptr %8, align 8, !tbaa !5
  store ptr %805, ptr %83, align 8, !tbaa !5
  %806 = load ptr, ptr %83, align 8, !tbaa !5
  call void @_ZN14NAMESPACE_MAIN19RandomDeterministic10InitializeERKS0_(ptr noundef nonnull align 8 dereferenceable(24) %806, ptr noundef nonnull align 8 dereferenceable(24) %33)
  call void @llvm.lifetime.end.p0(i64 8, ptr %83) #15
  br label %807

807:                                              ; preds = %804, %801
  call void @llvm.lifetime.start.p0(i64 8, ptr %84) #15
  store i64 0, ptr %84, align 8, !tbaa !9
  br label %808

808:                                              ; preds = %834, %807
  %809 = load i64, ptr %84, align 8, !tbaa !9
  %810 = load i64, ptr %28, align 8, !tbaa !9
  %811 = icmp ult i64 %809, %810
  br i1 %811, label %813, label %812

812:                                              ; preds = %808
  store i32 55, ptr %18, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %84) #15
  br label %837

813:                                              ; preds = %808
  %814 = load ptr, ptr %42, align 8, !tbaa !5
  %815 = load i64, ptr %84, align 8, !tbaa !9
  %816 = getelementptr inbounds %struct.TargetClass, ptr %814, i64 %815
  %817 = getelementptr inbounds %struct.TargetClass, ptr %816, i32 0, i32 0
  %818 = load i64, ptr %817, align 8, !tbaa !19
  %819 = icmp eq i64 0, %818
  br i1 %819, label %822, label %820

820:                                              ; preds = %813
  call void @LogAssertFailure(i64 noundef 412, ptr noundef @.str, ptr noundef @__func__.SampleWithoutReplacementStratified, ptr noundef @.str.37)
  call void @__assert_fail(ptr noundef @.str.38, ptr noundef @.str, i32 noundef 412, ptr noundef @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

821:                                              ; No predecessors!
  br label %822

822:                                              ; preds = %821, %813
  %823 = phi i1 [ true, %813 ], [ false, %821 ]
  %824 = load ptr, ptr %42, align 8, !tbaa !5
  %825 = load i64, ptr %84, align 8, !tbaa !9
  %826 = getelementptr inbounds %struct.TargetClass, ptr %824, i64 %825
  %827 = getelementptr inbounds %struct.TargetClass, ptr %826, i32 0, i32 1
  %828 = load i64, ptr %827, align 8, !tbaa !13
  %829 = icmp eq i64 0, %828
  br i1 %829, label %832, label %830

830:                                              ; preds = %822
  call void @LogAssertFailure(i64 noundef 413, ptr noundef @.str, ptr noundef @__func__.SampleWithoutReplacementStratified, ptr noundef @.str.39)
  call void @__assert_fail(ptr noundef @.str.40, ptr noundef @.str, i32 noundef 413, ptr noundef @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

831:                                              ; No predecessors!
  br label %832

832:                                              ; preds = %831, %822
  %833 = phi i1 [ true, %822 ], [ false, %831 ]
  br label %834

834:                                              ; preds = %832
  %835 = load i64, ptr %84, align 8, !tbaa !9
  %836 = add i64 %835, 1
  store i64 %836, ptr %84, align 8, !tbaa !9
  br label %808, !llvm.loop !30

837:                                              ; preds = %812
  %838 = load ptr, ptr %42, align 8, !tbaa !5
  call void @free(ptr noundef %838) #15
  %839 = load ptr, ptr %58, align 8, !tbaa !5
  call void @free(ptr noundef %839) #15
  br label %840

840:                                              ; preds = %837
  call void @llvm.lifetime.start.p0(i64 4, ptr %85) #15
  store i32 3, ptr %85, align 4, !tbaa !11
  %841 = load i32, ptr @g_traceLevel, align 4, !tbaa !11
  %842 = icmp sle i32 3, %841
  br i1 %842, label %843, label %844

843:                                              ; preds = %840
  call void @InteralLogWithoutArguments(i32 noundef 3, ptr noundef @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__19_)
  br label %844

844:                                              ; preds = %843, %840
  call void @llvm.lifetime.end.p0(i64 4, ptr %85) #15
  br label %845

845:                                              ; preds = %844
  br label %846

846:                                              ; preds = %845
  store i32 0, ptr %7, align 4
  store i32 1, ptr %18, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %77) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %76) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %74) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %73) #15
  br label %847

847:                                              ; preds = %846, %563
  call void @llvm.lifetime.end.p0(i64 8, ptr %58) #15
  br label %848

848:                                              ; preds = %847, %543
  call void @llvm.lifetime.end.p0(i64 8, ptr %52) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %51) #15
  br label %849

849:                                              ; preds = %848, %446
  call void @llvm.lifetime.end.p0(i64 8, ptr %46) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %45) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %44) #15
  br label %850

850:                                              ; preds = %849, %386
  call void @llvm.lifetime.end.p0(i64 8, ptr %42) #15
  br label %851

851:                                              ; preds = %850, %356
  call void @llvm.lifetime.end.p0(i64 24, ptr %33) #15
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #15
  br label %852

852:                                              ; preds = %851, %264
  call void @llvm.lifetime.end.p0(i64 8, ptr %28) #15
  br label %853

853:                                              ; preds = %852, %241, %230, %214, %198, %182, %165
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #15
  br label %854

854:                                              ; preds = %853, %146
  call void @llvm.lifetime.end.p0(i64 8, ptr %19) #15
  br label %855

855:                                              ; preds = %854, %128
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #15
  br label %856

856:                                              ; preds = %855, %111
  %857 = load i32, ptr %7, align 4
  ret i32 %857

858:                                              ; preds = %359
  %859 = load ptr, ptr %36, align 8
  %860 = load i32, ptr %37, align 4
  %861 = insertvalue { ptr, i32 } poison, ptr %859, 0
  %862 = insertvalue { ptr, i32 } %861, i32 %860, 1
  resume { ptr, i32 } %862

863:                                              ; preds = %346, %338
  %864 = landingpad { ptr, i32 }
          catch ptr null
  %865 = extractvalue { ptr, i32 } %864, 0
  call void @__clang_call_terminate(ptr %865) #16
  unreachable
}

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare hidden noundef i64 @_ZN14NAMESPACE_MAINL6EbmMaxImEET_S1_S1_(i64 noundef, i64 noundef) #2

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local noundef i64 @_ZN14NAMESPACE_MAIN22RandomNondeterministicImE4NextEm(ptr noundef nonnull align 8 dereferenceable(5016), i64 noundef) #5 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i64 @_ZNSt14numeric_limitsImE3maxEv() #10 align 2

declare void @_ZN14NAMESPACE_MAIN19RandomDeterministic10InitializeEm(ptr noundef nonnull align 8 dereferenceable(24), i64 noundef) #1

; Function Attrs: nounwind allocsize(0)
declare noalias ptr @malloc(i64 noundef) #11

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare hidden noundef ptr @_ZN14NAMESPACE_MAINL9IndexByteIZ34SampleWithoutReplacementStratifiedE11TargetClassEEPT_S3_m(ptr noundef, i64 noundef) #2

; Function Attrs: nounwind
declare void @free(ptr noundef) #13

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZSt5isnand(double noundef) #10

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZSt5isinfd(double noundef) #10

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.floor.f64(double) #14

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef double @_ZNSt14numeric_limitsIdE8infinityEv() #10 align 2

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fmuladd.f64(double, double, double) #14

attributes #0 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { inlinehint mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nocallback nofree nosync nounwind willreturn memory(none) }
attributes #4 = { alwaysinline mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { alwaysinline mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #6 = { nounwind memory(none) }
attributes #7 = { noinline noreturn nounwind uwtable "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 #8 = { 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 #9 = { mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #10 = { mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #11 = { nounwind allocsize(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 #12 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #13 = { 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 #14 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #15 = { nounwind }
attributes #16 = { noreturn nounwind }
attributes #17 = { nounwind allocsize(0) }

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

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


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

%"class.NAMESPACE_MAIN::RandomDeterministic" = type { i64, i64, i64 }
%"class.NAMESPACE_MAIN::RandomNondeterministic" = type { i64, i64, %"class.std::random_device" }
%"class.std::random_device" = type { %union.anon }
%union.anon = type { %"class.std::mersenne_twister_engine" }
%"class.std::mersenne_twister_engine" = type { [624 x i64], i64 }
%struct.TargetClass = type { i64, i64 }

@g_traceLevel = external local_unnamed_addr global i32, align 4
@_ZTISt9bad_alloc = external constant ptr
@.str = external hidden unnamed_addr constant [82 x i8], align 1
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage = external hidden constant [146 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_0 = external hidden constant [86 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_1 = external hidden constant [88 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_2 = external hidden constant [99 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_3 = external hidden constant [60 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_4 = external hidden constant [110 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_5 = external hidden constant [60 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_6 = external hidden constant [59 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_7 = external hidden constant [70 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_8 = external hidden constant [78 x i8], align 16
@__func__.SampleWithoutReplacementStratified = external hidden unnamed_addr constant [35 x i8], align 1
@__PRETTY_FUNCTION__.SampleWithoutReplacementStratified = external hidden unnamed_addr constant [118 x i8], align 1
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_9 = external hidden constant [90 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__10_ = external hidden constant [71 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__11_ = external hidden constant [73 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__12_ = external hidden constant [79 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__13_ = external hidden constant [79 x i8], align 16
@.str.5 = external hidden unnamed_addr constant [28 x i8], align 1
@.str.6 = external hidden unnamed_addr constant [31 x i8], align 1
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__14_ = external hidden constant [75 x i8], align 16
@.str.7 = external hidden unnamed_addr constant [36 x i8], align 1
@.str.8 = external hidden unnamed_addr constant [39 x i8], align 1
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__15_ = external hidden constant [64 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__16_ = external hidden constant [68 x i8], align 16
@.str.9 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.10 = external hidden unnamed_addr constant [40 x i8], align 1
@.str.11 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.12 = external hidden unnamed_addr constant [40 x i8], align 1
@.str.13 = external hidden unnamed_addr constant [31 x i8], align 1
@.str.14 = external hidden unnamed_addr constant [34 x i8], align 1
@.str.15 = external hidden unnamed_addr constant [31 x i8], align 1
@.str.16 = external hidden unnamed_addr constant [34 x i8], align 1
@.str.17 = external hidden unnamed_addr constant [46 x i8], align 1
@.str.18 = external hidden unnamed_addr constant [49 x i8], align 1
@.str.19 = external hidden unnamed_addr constant [37 x i8], align 1
@.str.20 = external hidden unnamed_addr constant [40 x i8], align 1
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__17_ = external hidden constant [92 x i8], align 16
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__18_ = external hidden constant [82 x i8], align 16
@.str.21 = external hidden unnamed_addr constant [18 x i8], align 1
@.str.22 = external hidden unnamed_addr constant [21 x i8], align 1
@.str.23 = external hidden unnamed_addr constant [60 x i8], align 1
@.str.24 = external hidden unnamed_addr constant [63 x i8], align 1
@.str.25 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.26 = external hidden unnamed_addr constant [22 x i8], align 1
@.str.27 = external hidden unnamed_addr constant [42 x i8], align 1
@.str.28 = external hidden unnamed_addr constant [45 x i8], align 1
@.str.29 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.30 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.31 = external hidden unnamed_addr constant [16 x i8], align 1
@.str.32 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.33 = external hidden unnamed_addr constant [26 x i8], align 1
@.str.34 = external hidden unnamed_addr constant [29 x i8], align 1
@.str.35 = external hidden unnamed_addr constant [30 x i8], align 1
@.str.36 = external hidden unnamed_addr constant [33 x i8], align 1
@.str.37 = external hidden unnamed_addr constant [52 x i8], align 1
@.str.38 = external hidden unnamed_addr constant [55 x i8], align 1
@.str.39 = external hidden unnamed_addr constant [44 x i8], align 1
@.str.40 = external hidden unnamed_addr constant [47 x i8], align 1
@_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__19_ = external hidden constant [42 x i8], align 16

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

declare void @InteralLogWithArguments(i32 noundef, ptr noundef, ...) local_unnamed_addr #1

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

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare hidden noundef zeroext i1 @_ZN14NAMESPACE_MAINL14IsConvertErrorImlEENSt9enable_ifIXaaaantsr3std9is_signedIT_EE5valuesr3std9is_signedIT0_EE5valueleclsr3std14numeric_limitsIS3_EE3maxEclsr3std14numeric_limitsIS2_EE3maxEEbE4typeES3_(i64 noundef) local_unnamed_addr #2

declare void @InteralLogWithoutArguments(i32 noundef, ptr noundef) local_unnamed_addr #1

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare hidden noundef zeroext i1 @_ZN14NAMESPACE_MAINL10IsAddErrorImEEbT_S1_(i64 noundef, i64 noundef) local_unnamed_addr #2

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare hidden noundef zeroext i1 @_ZN14NAMESPACE_MAINL15IsMultiplyErrorImEEbT_S1_(i64 noundef, i64 noundef) local_unnamed_addr #2

; Function Attrs: alwaysinline mustprogress nounwind uwtable
declare dso_local void @_ZN14NAMESPACE_MAIN19RandomDeterministic10InitializeERKS0_(ptr noundef nonnull align 8 dereferenceable(24), ptr noundef nonnull align 8 dereferenceable(24)) local_unnamed_addr #3 align 2

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local noundef i64 @_ZN14NAMESPACE_MAIN19RandomDeterministic8NextFastImEENSt9enable_ifIXaasr3std11is_unsignedIT_EE5valueltclL_ZNSt14numeric_limitsIjE3maxEvEEclsr3std14numeric_limitsIS3_EE3maxEES3_E4typeES3_(ptr noundef nonnull align 8 dereferenceable(24), i64 noundef) local_unnamed_addr #4 align 2

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local void @_ZN14NAMESPACE_MAIN22RandomNondeterministicImEC2Ev(ptr noundef nonnull align 8 dereferenceable(5016)) unnamed_addr #4 align 2

declare i32 @__gxx_personality_v0(...)

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local void @_ZN14NAMESPACE_MAIN22RandomNondeterministicImED2Ev(ptr noundef nonnull align 8 dereferenceable(5016)) unnamed_addr #2 align 2

; Function Attrs: nofree nosync nounwind memory(none)
declare i32 @llvm.eh.typeid.for.p0(ptr) #5

declare ptr @__cxa_begin_catch(ptr) local_unnamed_addr

declare void @__cxa_end_catch() local_unnamed_addr

; Function Attrs: noinline noreturn nounwind uwtable
declare hidden void @__clang_call_terminate(ptr noundef) local_unnamed_addr #6

declare void @LogAssertFailure(i64 noundef, ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

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

; Function Attrs: mustprogress uwtable
define dso_local noundef i32 @SampleWithoutReplacementStratified(ptr noundef %0, i64 noundef %1, i64 noundef %2, i64 noundef %3, ptr noundef %4, ptr noundef %5) local_unnamed_addr #8 personality ptr @__gxx_personality_v0 {
  %7 = alloca %"class.NAMESPACE_MAIN::RandomDeterministic", align 8
  %8 = alloca %"class.NAMESPACE_MAIN::RandomNondeterministic", align 8
  %9 = load i32, ptr @g_traceLevel, align 4, !tbaa !5
  %10 = icmp sgt i32 %9, 2
  br i1 %10, label %11, label %12

11:                                               ; preds = %6
  tail call void (i32, ptr, ...) @InteralLogWithArguments(i32 noundef 3, ptr noundef nonnull @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage, ptr noundef %0, i64 noundef %1, i64 noundef %2, i64 noundef %3, ptr noundef %4, ptr noundef %5)
  br label %12

12:                                               ; preds = %11, %6
  %13 = tail call noundef zeroext i1 @_ZN14NAMESPACE_MAINL14IsConvertErrorImlEENSt9enable_ifIXaaaantsr3std9is_signedIT_EE5valuesr3std9is_signedIT0_EE5valueleclsr3std14numeric_limitsIS3_EE3maxEclsr3std14numeric_limitsIS2_EE3maxEEbE4typeES3_(i64 noundef %2) #15
  br i1 %13, label %14, label %18, !prof !9

14:                                               ; preds = %12
  %15 = load i32, ptr @g_traceLevel, align 4, !tbaa !5
  %16 = icmp sgt i32 %15, 0
  br i1 %16, label %17, label %305

17:                                               ; preds = %14
  tail call void @InteralLogWithoutArguments(i32 noundef 1, ptr noundef nonnull @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_0)
  br label %305

18:                                               ; preds = %12
  %19 = tail call noundef zeroext i1 @_ZN14NAMESPACE_MAINL14IsConvertErrorImlEENSt9enable_ifIXaaaantsr3std9is_signedIT_EE5valuesr3std9is_signedIT0_EE5valueleclsr3std14numeric_limitsIS3_EE3maxEclsr3std14numeric_limitsIS2_EE3maxEEbE4typeES3_(i64 noundef %3) #15
  br i1 %19, label %20, label %24, !prof !9

20:                                               ; preds = %18
  %21 = load i32, ptr @g_traceLevel, align 4, !tbaa !5
  %22 = icmp sgt i32 %21, 0
  br i1 %22, label %23, label %305

23:                                               ; preds = %20
  tail call void @InteralLogWithoutArguments(i32 noundef 1, ptr noundef nonnull @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_1)
  br label %305

24:                                               ; preds = %18
  %25 = tail call noundef zeroext i1 @_ZN14NAMESPACE_MAINL10IsAddErrorImEEbT_S1_(i64 noundef %2, i64 noundef %3) #15
  br i1 %25, label %26, label %30, !prof !9

26:                                               ; preds = %24
  %27 = load i32, ptr @g_traceLevel, align 4, !tbaa !5
  %28 = icmp sgt i32 %27, 0
  br i1 %28, label %29, label %305

29:                                               ; preds = %26
  tail call void @InteralLogWithoutArguments(i32 noundef 1, ptr noundef nonnull @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_2)
  br label %305

30:                                               ; preds = %24
  %31 = add i64 %3, %2
  %32 = icmp eq i64 %31, 0
  br i1 %32, label %33, label %37, !prof !9

33:                                               ; preds = %30
  %34 = load i32, ptr @g_traceLevel, align 4, !tbaa !5
  %35 = icmp sgt i32 %34, 2
  br i1 %35, label %36, label %305

36:                                               ; preds = %33
  tail call void @InteralLogWithoutArguments(i32 noundef 3, ptr noundef nonnull @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_3)
  br label %305

37:                                               ; preds = %30
  %38 = tail call noundef i64 @_ZN14NAMESPACE_MAINL6EbmMaxImEET_S1_S1_(i64 noundef 8, i64 noundef 1) #15
  %39 = tail call noundef zeroext i1 @_ZN14NAMESPACE_MAINL15IsMultiplyErrorImEEbT_S1_(i64 noundef %38, i64 noundef %31) #15
  br i1 %39, label %40, label %44, !prof !9

40:                                               ; preds = %37
  %41 = load i32, ptr @g_traceLevel, align 4, !tbaa !5
  %42 = icmp sgt i32 %41, 0
  br i1 %42, label %43, label %305

43:                                               ; preds = %40
  tail call void @InteralLogWithoutArguments(i32 noundef 1, ptr noundef nonnull @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_4)
  br label %305

44:                                               ; preds = %37
  %45 = icmp eq ptr %4, null
  br i1 %45, label %46, label %50, !prof !9

46:                                               ; preds = %44
  %47 = load i32, ptr @g_traceLevel, align 4, !tbaa !5
  %48 = icmp sgt i32 %47, 0
  br i1 %48, label %49, label %305

49:                                               ; preds = %46
  tail call void @InteralLogWithoutArguments(i32 noundef 1, ptr noundef nonnull @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_5)
  br label %305

50:                                               ; preds = %44
  %51 = icmp eq ptr %5, null
  br i1 %51, label %52, label %56, !prof !9

52:                                               ; preds = %50
  %53 = load i32, ptr @g_traceLevel, align 4, !tbaa !5
  %54 = icmp sgt i32 %53, 0
  br i1 %54, label %55, label %305

55:                                               ; preds = %52
  tail call void @InteralLogWithoutArguments(i32 noundef 1, ptr noundef nonnull @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_6)
  br label %305

56:                                               ; preds = %50
  %57 = icmp slt i64 %1, 1
  br i1 %57, label %58, label %62, !prof !9

58:                                               ; preds = %56
  %59 = load i32, ptr @g_traceLevel, align 4, !tbaa !5
  %60 = icmp sgt i32 %59, 0
  br i1 %60, label %61, label %305

61:                                               ; preds = %58
  tail call void @InteralLogWithoutArguments(i32 noundef 1, ptr noundef nonnull @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_7)
  br label %305

62:                                               ; preds = %56
  %63 = tail call noundef zeroext i1 @_ZN14NAMESPACE_MAINL14IsConvertErrorImlEENSt9enable_ifIXaaaantsr3std9is_signedIT_EE5valuesr3std9is_signedIT0_EE5valueleclsr3std14numeric_limitsIS3_EE3maxEclsr3std14numeric_limitsIS2_EE3maxEEbE4typeES3_(i64 noundef %1) #15
  br i1 %63, label %64, label %68

64:                                               ; preds = %62
  %65 = load i32, ptr @g_traceLevel, align 4, !tbaa !5
  %66 = icmp sgt i32 %65, 0
  br i1 %66, label %67, label %305

67:                                               ; preds = %64
  tail call void @InteralLogWithoutArguments(i32 noundef 1, ptr noundef nonnull @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_8)
  br label %305

68:                                               ; preds = %62
  %69 = tail call noundef zeroext i1 @_ZN14NAMESPACE_MAINL15IsMultiplyErrorImEEbT_S1_(i64 noundef 16, i64 noundef %1) #15
  br i1 %69, label %70, label %74, !prof !9

70:                                               ; preds = %68
  %71 = load i32, ptr @g_traceLevel, align 4, !tbaa !5
  %72 = icmp sgt i32 %71, 1
  br i1 %72, label %73, label %305

73:                                               ; preds = %70
  tail call void @InteralLogWithoutArguments(i32 noundef 2, ptr noundef nonnull @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage_9)
  br label %305

74:                                               ; preds = %68
  %75 = shl i64 %1, 4
  %76 = icmp ult i64 %2, %1
  br i1 %76, label %77, label %81, !prof !9

77:                                               ; preds = %74
  %78 = load i32, ptr @g_traceLevel, align 4, !tbaa !5
  %79 = icmp sgt i32 %78, 1
  br i1 %79, label %80, label %81

80:                                               ; preds = %77
  tail call void @InteralLogWithoutArguments(i32 noundef 2, ptr noundef nonnull @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__10_)
  br label %81

81:                                               ; preds = %77, %80, %74
  %82 = icmp ult i64 %3, %1
  br i1 %82, label %83, label %87, !prof !9

83:                                               ; preds = %81
  %84 = load i32, ptr @g_traceLevel, align 4, !tbaa !5
  %85 = icmp sgt i32 %84, 1
  br i1 %85, label %86, label %87

86:                                               ; preds = %83
  tail call void @InteralLogWithoutArguments(i32 noundef 2, ptr noundef nonnull @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__11_)
  br label %87

87:                                               ; preds = %83, %86, %81
  call void @llvm.lifetime.start.p0(i64 24, ptr nonnull %7) #15
  %88 = icmp eq ptr %0, null
  br i1 %88, label %89, label %115

89:                                               ; preds = %87
  call void @llvm.lifetime.start.p0(i64 5016, ptr nonnull %8) #15
  invoke void @_ZN14NAMESPACE_MAIN22RandomNondeterministicImEC2Ev(ptr noundef nonnull align 8 dereferenceable(5016) %8)
          to label %90 unwind label %93

90:                                               ; preds = %89
  %91 = call noundef i64 @_ZNSt14numeric_limitsImE3maxEv() #15
  %92 = invoke noundef i64 @_ZN14NAMESPACE_MAIN22RandomNondeterministicImE4NextEm(ptr noundef nonnull align 8 dereferenceable(5016) %8, i64 noundef %91)
          to label %113 unwind label %95

93:                                               ; preds = %89
  %94 = landingpad { ptr, i32 }
          catch ptr @_ZTISt9bad_alloc
          catch ptr null
  br label %97

95:                                               ; preds = %90
  %96 = landingpad { ptr, i32 }
          catch ptr @_ZTISt9bad_alloc
          catch ptr null
  call void @_ZN14NAMESPACE_MAIN22RandomNondeterministicImED2Ev(ptr noundef nonnull align 8 dereferenceable(5016) %8) #15
  br label %97

97:                                               ; preds = %95, %93
  %.pn = phi { ptr, i32 } [ %96, %95 ], [ %94, %93 ]
  %.0192 = extractvalue { ptr, i32 } %.pn, 0
  %.0194 = extractvalue { ptr, i32 } %.pn, 1
  call void @llvm.lifetime.end.p0(i64 5016, ptr nonnull %8) #15
  %98 = call i32 @llvm.eh.typeid.for.p0(ptr nonnull @_ZTISt9bad_alloc) #15
  %99 = icmp eq i32 %.0194, %98
  %100 = call ptr @__cxa_begin_catch(ptr %.0192) #15
  %101 = load i32, ptr @g_traceLevel, align 4, !tbaa !5
  %102 = icmp sgt i32 %101, 1
  br i1 %99, label %103, label %105

103:                                              ; preds = %97
  br i1 %102, label %104, label %112

104:                                              ; preds = %103
  invoke void @InteralLogWithoutArguments(i32 noundef 2, ptr noundef nonnull @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__13_)
          to label %112 unwind label %110

105:                                              ; preds = %97
  br i1 %102, label %106, label %109

106:                                              ; preds = %105
  invoke void @InteralLogWithoutArguments(i32 noundef 2, ptr noundef nonnull @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__12_)
          to label %109 unwind label %107

107:                                              ; preds = %106
  %108 = landingpad { ptr, i32 }
          cleanup
  invoke void @__cxa_end_catch()
          to label %114 unwind label %306

109:                                              ; preds = %106, %105
  call void @__cxa_end_catch()
  br label %.thread

110:                                              ; preds = %104
  %111 = landingpad { ptr, i32 }
          cleanup
  invoke void @__cxa_end_catch()
          to label %114 unwind label %306

112:                                              ; preds = %104, %103
  call void @__cxa_end_catch()
  br label %.thread

113:                                              ; preds = %90
  call void @_ZN14NAMESPACE_MAIN22RandomNondeterministicImED2Ev(ptr noundef nonnull align 8 dereferenceable(5016) %8) #15
  call void @llvm.lifetime.end.p0(i64 5016, ptr nonnull %8) #15
  call void @_ZN14NAMESPACE_MAIN19RandomDeterministic10InitializeEm(ptr noundef nonnull align 8 dereferenceable(24) %7, i64 noundef %92)
  br label %116

114:                                              ; preds = %110, %107
  %.pn241 = phi { ptr, i32 } [ %108, %107 ], [ %111, %110 ]
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %7) #15
  resume { ptr, i32 } %.pn241

115:                                              ; preds = %87
  call void @_ZN14NAMESPACE_MAIN19RandomDeterministic10InitializeERKS0_(ptr noundef nonnull align 8 dereferenceable(24) %7, ptr noundef nonnull align 8 dereferenceable(24) %0)
  br label %116

116:                                              ; preds = %113, %115
  %.not = icmp eq i64 %75, 0
  br i1 %.not, label %117, label %118

117:                                              ; preds = %116
  call void @LogAssertFailure(i64 noundef 225, ptr noundef nonnull @.str, ptr noundef nonnull @__func__.SampleWithoutReplacementStratified, ptr noundef nonnull @.str.5)
  call void @__assert_fail(ptr noundef nonnull @.str.6, ptr noundef nonnull @.str, i32 noundef 225, ptr noundef nonnull @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

118:                                              ; preds = %116
  %calloc = call ptr @calloc(i64 1, i64 %75)
  %119 = icmp eq ptr %calloc, null
  br i1 %119, label %120, label %124, !prof !9

120:                                              ; preds = %118
  %121 = load i32, ptr @g_traceLevel, align 4, !tbaa !5
  %122 = icmp sgt i32 %121, 1
  br i1 %122, label %123, label %.thread

123:                                              ; preds = %120
  call void @InteralLogWithoutArguments(i32 noundef 2, ptr noundef nonnull @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__14_)
  br label %.thread

124:                                              ; preds = %118
  %125 = call noundef ptr @_ZN14NAMESPACE_MAINL9IndexByteIZ34SampleWithoutReplacementStratifiedE11TargetClassEEPT_S3_m(ptr noundef nonnull %calloc, i64 noundef %75) #15
  %.not243 = icmp eq ptr %125, %calloc
  br i1 %.not243, label %126, label %127

126:                                              ; preds = %124
  call void @LogAssertFailure(i64 noundef 235, ptr noundef nonnull @.str, ptr noundef nonnull @__func__.SampleWithoutReplacementStratified, ptr noundef nonnull @.str.7)
  call void @__assert_fail(ptr noundef nonnull @.str.8, ptr noundef nonnull @.str, i32 noundef 235, ptr noundef nonnull @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

127:                                              ; preds = %124
  %128 = getelementptr inbounds i64, ptr %4, i64 %31
  br label %129

129:                                              ; preds = %143, %127
  %.0196 = phi ptr [ %4, %127 ], [ %147, %143 ]
  %130 = load i64, ptr %.0196, align 8, !tbaa !10
  %131 = icmp slt i64 %130, 0
  br i1 %131, label %132, label %137

132:                                              ; preds = %129
  %133 = load i32, ptr @g_traceLevel, align 4, !tbaa !5
  %134 = icmp sgt i32 %133, 0
  br i1 %134, label %135, label %136

135:                                              ; preds = %132
  call void @InteralLogWithoutArguments(i32 noundef 1, ptr noundef nonnull @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__15_)
  br label %136

136:                                              ; preds = %135, %132
  call void @free(ptr noundef nonnull %calloc) #15
  br label %.thread

137:                                              ; preds = %129
  %.not244 = icmp slt i64 %130, %1
  br i1 %.not244, label %143, label %138, !prof !12

138:                                              ; preds = %137
  %139 = load i32, ptr @g_traceLevel, align 4, !tbaa !5
  %140 = icmp sgt i32 %139, 0
  br i1 %140, label %141, label %142

141:                                              ; preds = %138
  call void @InteralLogWithoutArguments(i32 noundef 1, ptr noundef nonnull @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__16_)
  br label %142

142:                                              ; preds = %141, %138
  call void @free(ptr noundef %calloc) #15
  br label %.thread

143:                                              ; preds = %137
  %144 = getelementptr inbounds %struct.TargetClass, ptr %calloc, i64 %130, i32 1
  %145 = load i64, ptr %144, align 8, !tbaa !13
  %146 = add i64 %145, 1
  store i64 %146, ptr %144, align 8, !tbaa !13
  %147 = getelementptr inbounds i8, ptr %.0196, i64 8
  %.not245 = icmp eq ptr %128, %147
  br i1 %.not245, label %148, label %129, !llvm.loop !15

148:                                              ; preds = %143
  %149 = uitofp i64 %2 to double
  %150 = uitofp i64 %31 to double
  %151 = fdiv double %149, %150
  %152 = call noundef zeroext i1 @_ZSt5isnand(double noundef %151)
  br i1 %152, label %153, label %154

153:                                              ; preds = %148
  call void @LogAssertFailure(i64 noundef 289, ptr noundef nonnull @.str, ptr noundef nonnull @__func__.SampleWithoutReplacementStratified, ptr noundef nonnull @.str.9)
  call void @__assert_fail(ptr noundef nonnull @.str.10, ptr noundef nonnull @.str, i32 noundef 289, ptr noundef nonnull @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

154:                                              ; preds = %148
  %155 = call noundef zeroext i1 @_ZSt5isinfd(double noundef %151)
  br i1 %155, label %156, label %157

156:                                              ; preds = %154
  call void @LogAssertFailure(i64 noundef 290, ptr noundef nonnull @.str, ptr noundef nonnull @__func__.SampleWithoutReplacementStratified, ptr noundef nonnull @.str.11)
  call void @__assert_fail(ptr noundef nonnull @.str.12, ptr noundef nonnull @.str, i32 noundef 290, ptr noundef nonnull @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

157:                                              ; preds = %154
  %158 = fcmp ult double %151, 0.000000e+00
  br i1 %158, label %159, label %160

159:                                              ; preds = %157
  call void @LogAssertFailure(i64 noundef 291, ptr noundef nonnull @.str, ptr noundef nonnull @__func__.SampleWithoutReplacementStratified, ptr noundef nonnull @.str.13)
  call void @__assert_fail(ptr noundef nonnull @.str.14, ptr noundef nonnull @.str, i32 noundef 291, ptr noundef nonnull @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

160:                                              ; preds = %157
  %161 = fcmp ugt double %151, 1.000000e+00
  br i1 %161, label %162, label %163

162:                                              ; preds = %160
  call void @LogAssertFailure(i64 noundef 292, ptr noundef nonnull @.str, ptr noundef nonnull @__func__.SampleWithoutReplacementStratified, ptr noundef nonnull @.str.15)
  call void @__assert_fail(ptr noundef nonnull @.str.16, ptr noundef nonnull @.str, i32 noundef 292, ptr noundef nonnull @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

163:                                              ; preds = %160
  %164 = icmp ult i64 %1, %2
  br i1 %164, label %.preheader267, label %.loopexit

.preheader267:                                    ; preds = %163, %172
  %.0201 = phi ptr [ %174, %172 ], [ %calloc, %163 ]
  %.0198 = phi i64 [ %173, %172 ], [ %2, %163 ]
  %165 = getelementptr inbounds i8, ptr %.0201, i64 8
  %166 = load i64, ptr %165, align 8, !tbaa !13
  %167 = uitofp i64 %166 to double
  %168 = fmul double %151, %167
  %169 = call double @llvm.floor.f64(double %168)
  %170 = fptoui double %169 to i64
  %spec.select = call i64 @llvm.usub.sat.i64(i64 %170, i64 1)
  store i64 %spec.select, ptr %.0201, align 8, !tbaa !17
  %.not247 = icmp ugt i64 %spec.select, %.0198
  br i1 %.not247, label %171, label %172

171:                                              ; preds = %.preheader267
  call void @LogAssertFailure(i64 noundef 305, ptr noundef nonnull @.str, ptr noundef nonnull @__func__.SampleWithoutReplacementStratified, ptr noundef nonnull @.str.17)
  call void @__assert_fail(ptr noundef nonnull @.str.18, ptr noundef nonnull @.str, i32 noundef 305, ptr noundef nonnull @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

172:                                              ; preds = %.preheader267
  %173 = sub i64 %.0198, %spec.select
  %174 = getelementptr inbounds i8, ptr %.0201, i64 16
  %.not248 = icmp eq ptr %125, %174
  br i1 %.not248, label %.loopexit, label %.preheader267, !llvm.loop !18

.loopexit:                                        ; preds = %172, %163
  %.1199 = phi i64 [ %2, %163 ], [ %173, %172 ]
  %.not249 = icmp ugt i64 %.1199, %31
  br i1 %.not249, label %175, label %176

175:                                              ; preds = %.loopexit
  call void @LogAssertFailure(i64 noundef 310, ptr noundef nonnull @.str, ptr noundef nonnull @__func__.SampleWithoutReplacementStratified, ptr noundef nonnull @.str.19)
  call void @__assert_fail(ptr noundef nonnull @.str.20, ptr noundef nonnull @.str, i32 noundef 310, ptr noundef nonnull @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

176:                                              ; preds = %.loopexit
  %177 = call noundef zeroext i1 @_ZN14NAMESPACE_MAINL15IsMultiplyErrorImEEbT_S1_(i64 noundef 8, i64 noundef %1) #15
  br i1 %177, label %178, label %183

178:                                              ; preds = %176
  %179 = load i32, ptr @g_traceLevel, align 4, !tbaa !5
  %180 = icmp sgt i32 %179, 1
  br i1 %180, label %181, label %182

181:                                              ; preds = %178
  call void @InteralLogWithoutArguments(i32 noundef 2, ptr noundef nonnull @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__17_)
  br label %182

182:                                              ; preds = %181, %178
  call void @free(ptr noundef %calloc) #15
  br label %.thread

183:                                              ; preds = %176
  %184 = shl i64 %1, 3
  %185 = call noalias ptr @malloc(i64 noundef %184) #17
  %186 = icmp eq ptr %185, null
  br i1 %186, label %188, label %.preheader266, !prof !9

.preheader266:                                    ; preds = %183
  %.not250268 = icmp eq i64 %.1199, 0
  br i1 %.not250268, label %.preheader265, label %.lr.ph

.lr.ph:                                           ; preds = %.preheader266
  %187 = ptrtoint ptr %185 to i64
  br label %203

188:                                              ; preds = %183
  %189 = load i32, ptr @g_traceLevel, align 4, !tbaa !5
  %190 = icmp sgt i32 %189, 1
  br i1 %190, label %191, label %192

191:                                              ; preds = %188
  call void @InteralLogWithoutArguments(i32 noundef 2, ptr noundef nonnull @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__18_)
  br label %192

192:                                              ; preds = %191, %188
  call void @free(ptr noundef %calloc) #15
  br label %.thread

.preheader265:                                    ; preds = %244, %.preheader266
  %umax = call i64 @llvm.umax.i64(i64 %1, i64 1)
  %min.iters.check = icmp ult i64 %1, 4
  br i1 %min.iters.check, label %scalar.ph.preheader, label %vector.ph

scalar.ph.preheader:                              ; preds = %middle.block, %.preheader265
  %.0204272.ph = phi i64 [ 0, %.preheader265 ], [ %n.vec, %middle.block ]
  %.0205271.ph = phi i64 [ 0, %.preheader265 ], [ %201, %middle.block ]
  %.0206270.ph = phi i64 [ 0, %.preheader265 ], [ %202, %middle.block ]
  br label %scalar.ph

vector.ph:                                        ; preds = %.preheader265
  %n.vec = and i64 %umax, 9223372036854775804
  br label %vector.body

vector.body:                                      ; preds = %vector.body, %vector.ph
  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
  %vec.phi = phi <2 x i64> [ zeroinitializer, %vector.ph ], [ %198, %vector.body ]
  %vec.phi281 = phi <2 x i64> [ zeroinitializer, %vector.ph ], [ %199, %vector.body ]
  %vec.phi282 = phi <2 x i64> [ zeroinitializer, %vector.ph ], [ %196, %vector.body ]
  %vec.phi283 = phi <2 x i64> [ zeroinitializer, %vector.ph ], [ %197, %vector.body ]
  %193 = or disjoint i64 %index, 2
  %194 = getelementptr inbounds %struct.TargetClass, ptr %calloc, i64 %index
  %195 = getelementptr inbounds %struct.TargetClass, ptr %calloc, i64 %193
  %wide.vec = load <4 x i64>, ptr %194, align 8, !tbaa !10
  %wide.vec284 = load <4 x i64>, ptr %195, align 8, !tbaa !10
  %strided.vec = shufflevector <4 x i64> %wide.vec, <4 x i64> poison, <2 x i32> <i32 0, i32 2>
  %strided.vec285 = shufflevector <4 x i64> %wide.vec284, <4 x i64> poison, <2 x i32> <i32 0, i32 2>
  %strided.vec286 = shufflevector <4 x i64> %wide.vec, <4 x i64> poison, <2 x i32> <i32 1, i32 3>
  %strided.vec287 = shufflevector <4 x i64> %wide.vec284, <4 x i64> poison, <2 x i32> <i32 1, i32 3>
  %196 = add <2 x i64> %strided.vec, %vec.phi282
  %197 = add <2 x i64> %strided.vec285, %vec.phi283
  %198 = add <2 x i64> %strided.vec286, %vec.phi
  %199 = add <2 x i64> %strided.vec287, %vec.phi281
  %index.next = add nuw i64 %index, 4
  %200 = icmp eq i64 %index.next, %n.vec
  br i1 %200, label %middle.block, label %vector.body, !llvm.loop !19

middle.block:                                     ; preds = %vector.body
  %bin.rdx = add <2 x i64> %199, %198
  %201 = call i64 @llvm.vector.reduce.add.v2i64(<2 x i64> %bin.rdx)
  %bin.rdx288 = add <2 x i64> %197, %196
  %202 = call i64 @llvm.vector.reduce.add.v2i64(<2 x i64> %bin.rdx288)
  %cmp.n = icmp eq i64 %n.vec, %1
  br i1 %cmp.n, label %.loopexit290, label %scalar.ph.preheader

203:                                              ; preds = %.lr.ph, %244
  %.2200269 = phi i64 [ %.1199, %.lr.ph ], [ %253, %244 ]
  %204 = call noundef double @_ZNSt14numeric_limitsIdE8infinityEv() #15
  %205 = fneg double %204
  br label %206

206:                                              ; preds = %235, %203
  %.0215 = phi ptr [ %calloc, %203 ], [ %236, %235 ]
  %.0211 = phi ptr [ %185, %203 ], [ %.2213, %235 ]
  %.0208 = phi double [ %205, %203 ], [ %.2210, %235 ]
  %207 = load i64, ptr %.0215, align 8, !tbaa !17
  %208 = getelementptr inbounds i8, ptr %.0215, i64 8
  %209 = load i64, ptr %208, align 8, !tbaa !13
  %.not254 = icmp eq i64 %207, %209
  br i1 %.not254, label %235, label %210

210:                                              ; preds = %206
  %.not255 = icmp eq i64 %209, 0
  br i1 %.not255, label %211, label %212

211:                                              ; preds = %210
  call void @LogAssertFailure(i64 noundef 334, ptr noundef nonnull @.str, ptr noundef nonnull @__func__.SampleWithoutReplacementStratified, ptr noundef nonnull @.str.21)
  call void @__assert_fail(ptr noundef nonnull @.str.22, ptr noundef nonnull @.str, i32 noundef 334, ptr noundef nonnull @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

212:                                              ; preds = %210
  %213 = uitofp i64 %209 to double
  %214 = fmul double %151, %213
  %215 = uitofp i64 %207 to double
  %216 = fsub double %214, %215
  %217 = add i64 %207, 1
  %218 = uitofp i64 %217 to double
  %219 = fsub double %214, %218
  %220 = fneg double %219
  %221 = fmul double %219, %220
  %222 = call double @llvm.fmuladd.f64(double %216, double %216, double %221)
  %223 = icmp eq i64 %207, 0
  br i1 %223, label %224, label %226

224:                                              ; preds = %212
  %225 = fadd double %222, 3.200000e+01
  br label %230

226:                                              ; preds = %212
  %227 = icmp eq i64 %217, %209
  br i1 %227, label %228, label %230

228:                                              ; preds = %226
  %229 = fadd double %222, -3.200000e+01
  br label %230

230:                                              ; preds = %226, %228, %224
  %.0214 = phi double [ %225, %224 ], [ %229, %228 ], [ %222, %226 ]
  %231 = fcmp ugt double %.0208, %.0214
  br i1 %231, label %235, label %232

232:                                              ; preds = %230
  %233 = fcmp une double %.0214, %.0208
  %..0211 = select i1 %233, ptr %185, ptr %.0211, !prof !12
  store ptr %.0215, ptr %..0211, align 8, !tbaa !22
  %234 = getelementptr inbounds i8, ptr %..0211, i64 8
  br label %235

235:                                              ; preds = %230, %232, %206
  %.2213 = phi ptr [ %.0211, %206 ], [ %234, %232 ], [ %.0211, %230 ]
  %.2210 = phi double [ %.0208, %206 ], [ %.0214, %232 ], [ %.0208, %230 ]
  %236 = getelementptr inbounds i8, ptr %.0215, i64 16
  %.not256 = icmp eq ptr %125, %236
  br i1 %.not256, label %237, label %206, !llvm.loop !24

237:                                              ; preds = %235
  %238 = call noundef double @_ZNSt14numeric_limitsIdE8infinityEv() #15
  %239 = fneg double %238
  %240 = fcmp une double %.2210, %239
  br i1 %240, label %242, label %241

241:                                              ; preds = %237
  call void @LogAssertFailure(i64 noundef 360, ptr noundef nonnull @.str, ptr noundef nonnull @__func__.SampleWithoutReplacementStratified, ptr noundef nonnull @.str.23)
  call void @__assert_fail(ptr noundef nonnull @.str.24, ptr noundef nonnull @.str, i32 noundef 360, ptr noundef nonnull @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

242:                                              ; preds = %237
  %.not257 = icmp eq ptr %.2213, %185
  br i1 %.not257, label %243, label %244

243:                                              ; preds = %242
  call void @LogAssertFailure(i64 noundef 365, ptr noundef nonnull @.str, ptr noundef nonnull @__func__.SampleWithoutReplacementStratified, ptr noundef nonnull @.str.25)
  call void @__assert_fail(ptr noundef nonnull @.str.26, ptr noundef nonnull @.str, i32 noundef 365, ptr noundef nonnull @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

244:                                              ; preds = %242
  %245 = ptrtoint ptr %.2213 to i64
  %246 = sub i64 %245, %187
  %247 = ashr exact i64 %246, 3
  %248 = call noundef i64 @_ZN14NAMESPACE_MAIN19RandomDeterministic8NextFastImEENSt9enable_ifIXaasr3std11is_unsignedIT_EE5valueltclL_ZNSt14numeric_limitsIjE3maxEvEEclsr3std14numeric_limitsIS3_EE3maxEES3_E4typeES3_(ptr noundef nonnull align 8 dereferenceable(24) %7, i64 noundef %247)
  %249 = getelementptr inbounds ptr, ptr %185, i64 %248
  %250 = load ptr, ptr %249, align 8, !tbaa !22
  %251 = load i64, ptr %250, align 8, !tbaa !17
  %252 = add i64 %251, 1
  store i64 %252, ptr %250, align 8, !tbaa !17
  %253 = add i64 %.2200269, -1
  %.not250 = icmp eq i64 %253, 0
  br i1 %.not250, label %.preheader265, label %203, !llvm.loop !25

.loopexit290:                                     ; preds = %scalar.ph, %middle.block
  %.lcssa279 = phi i64 [ %202, %middle.block ], [ %257, %scalar.ph ]
  %.lcssa = phi i64 [ %201, %middle.block ], [ %260, %scalar.ph ]
  %254 = icmp eq i64 %.lcssa279, %2
  br i1 %254, label %263, label %262

scalar.ph:                                        ; preds = %scalar.ph.preheader, %scalar.ph
  %.0204272 = phi i64 [ %261, %scalar.ph ], [ %.0204272.ph, %scalar.ph.preheader ]
  %.0205271 = phi i64 [ %260, %scalar.ph ], [ %.0205271.ph, %scalar.ph.preheader ]
  %.0206270 = phi i64 [ %257, %scalar.ph ], [ %.0206270.ph, %scalar.ph.preheader ]
  %255 = getelementptr inbounds %struct.TargetClass, ptr %calloc, i64 %.0204272
  %256 = load i64, ptr %255, align 8, !tbaa !17
  %257 = add i64 %256, %.0206270
  %258 = getelementptr inbounds i8, ptr %255, i64 8
  %259 = load i64, ptr %258, align 8, !tbaa !13
  %260 = add i64 %259, %.0205271
  %261 = add nuw nsw i64 %.0204272, 1
  %exitcond.not = icmp eq i64 %261, %umax
  br i1 %exitcond.not, label %.loopexit290, label %scalar.ph, !llvm.loop !26

262:                                              ; preds = %.loopexit290
  call void @LogAssertFailure(i64 noundef 380, ptr noundef nonnull @.str, ptr noundef nonnull @__func__.SampleWithoutReplacementStratified, ptr noundef nonnull @.str.27)
  call void @__assert_fail(ptr noundef nonnull @.str.28, ptr noundef nonnull @.str, i32 noundef 380, ptr noundef nonnull @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

263:                                              ; preds = %.loopexit290
  %264 = icmp eq i64 %.lcssa, %31
  br i1 %264, label %.preheader, label %265

265:                                              ; preds = %263
  call void @LogAssertFailure(i64 noundef 381, ptr noundef nonnull @.str, ptr noundef nonnull @__func__.SampleWithoutReplacementStratified, ptr noundef nonnull @.str.29)
  call void @__assert_fail(ptr noundef nonnull @.str.30, ptr noundef nonnull @.str, i32 noundef 381, ptr noundef nonnull @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

.preheader:                                       ; preds = %263, %277
  %.0203 = phi ptr [ %286, %277 ], [ %4, %263 ]
  %.0202 = phi ptr [ %285, %277 ], [ %5, %263 ]
  %266 = load i64, ptr %.0203, align 8, !tbaa !10
  %267 = icmp sgt i64 %266, -1
  br i1 %267, label %269, label %268

268:                                              ; preds = %.preheader
  call void @LogAssertFailure(i64 noundef 388, ptr noundef nonnull @.str, ptr noundef nonnull @__func__.SampleWithoutReplacementStratified, ptr noundef nonnull @.str.31)
  call void @__assert_fail(ptr noundef nonnull @.str.32, ptr noundef nonnull @.str, i32 noundef 388, ptr noundef nonnull @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

269:                                              ; preds = %.preheader
  %270 = icmp slt i64 %266, %1
  br i1 %270, label %272, label %271

271:                                              ; preds = %269
  call void @LogAssertFailure(i64 noundef 389, ptr noundef nonnull @.str, ptr noundef nonnull @__func__.SampleWithoutReplacementStratified, ptr noundef nonnull @.str.33)
  call void @__assert_fail(ptr noundef nonnull @.str.34, ptr noundef nonnull @.str, i32 noundef 389, ptr noundef nonnull @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

272:                                              ; preds = %269
  %273 = getelementptr inbounds %struct.TargetClass, ptr %calloc, i64 %266
  %274 = getelementptr inbounds i8, ptr %273, i64 8
  %275 = load i64, ptr %274, align 8, !tbaa !13
  %.not251 = icmp eq i64 %275, 0
  br i1 %.not251, label %276, label %277

276:                                              ; preds = %272
  call void @LogAssertFailure(i64 noundef 392, ptr noundef nonnull @.str, ptr noundef nonnull @__func__.SampleWithoutReplacementStratified, ptr noundef nonnull @.str.35)
  call void @__assert_fail(ptr noundef nonnull @.str.36, ptr noundef nonnull @.str, i32 noundef 392, ptr noundef nonnull @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

277:                                              ; preds = %272
  %278 = call noundef i64 @_ZN14NAMESPACE_MAIN19RandomDeterministic8NextFastImEENSt9enable_ifIXaasr3std11is_unsignedIT_EE5valueltclL_ZNSt14numeric_limitsIjE3maxEvEEclsr3std14numeric_limitsIS3_EE3maxEES3_E4typeES3_(ptr noundef nonnull align 8 dereferenceable(24) %7, i64 noundef %275)
  %279 = load i64, ptr %273, align 8, !tbaa !17
  %280 = icmp ult i64 %278, %279
  %281 = select i1 %280, i8 1, i8 -1
  store i8 %281, ptr %.0202, align 1, !tbaa !27
  %.neg = sext i1 %280 to i64
  %282 = add i64 %279, %.neg
  store i64 %282, ptr %273, align 8, !tbaa !17
  %283 = load i64, ptr %274, align 8, !tbaa !13
  %284 = add i64 %283, -1
  store i64 %284, ptr %274, align 8, !tbaa !13
  %285 = getelementptr inbounds i8, ptr %.0202, i64 1
  %286 = getelementptr inbounds i8, ptr %.0203, i64 8
  %.not252 = icmp eq ptr %128, %286
  br i1 %.not252, label %287, label %.preheader, !llvm.loop !28

287:                                              ; preds = %277
  br i1 %88, label %.preheader291, label %288

288:                                              ; preds = %287
  call void @_ZN14NAMESPACE_MAIN19RandomDeterministic10InitializeERKS0_(ptr noundef nonnull align 8 dereferenceable(24) %0, ptr noundef nonnull align 8 dereferenceable(24) %7)
  br label %.preheader291

.preheader291:                                    ; preds = %288, %287
  br label %294

289:                                              ; preds = %299
  %290 = add nuw i64 %.0189273, 1
  %exitcond276.not = icmp eq i64 %290, %umax
  br i1 %exitcond276.not, label %291, label %294, !llvm.loop !29

291:                                              ; preds = %289
  call void @free(ptr noundef nonnull %calloc) #15
  call void @free(ptr noundef %185) #15
  %292 = load i32, ptr @g_traceLevel, align 4, !tbaa !5
  %293 = icmp sgt i32 %292, 2
  br i1 %293, label %304, label %.thread

294:                                              ; preds = %.preheader291, %289
  %.0189273 = phi i64 [ %290, %289 ], [ 0, %.preheader291 ]
  %295 = getelementptr inbounds %struct.TargetClass, ptr %calloc, i64 %.0189273
  %296 = load i64, ptr %295, align 8, !tbaa !17
  %297 = icmp eq i64 %296, 0
  br i1 %297, label %299, label %298

298:                                              ; preds = %294
  call void @LogAssertFailure(i64 noundef 412, ptr noundef nonnull @.str, ptr noundef nonnull @__func__.SampleWithoutReplacementStratified, ptr noundef nonnull @.str.37)
  call void @__assert_fail(ptr noundef nonnull @.str.38, ptr noundef nonnull @.str, i32 noundef 412, ptr noundef nonnull @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

299:                                              ; preds = %294
  %300 = getelementptr inbounds i8, ptr %295, i64 8
  %301 = load i64, ptr %300, align 8, !tbaa !13
  %302 = icmp eq i64 %301, 0
  br i1 %302, label %289, label %303

303:                                              ; preds = %299
  call void @LogAssertFailure(i64 noundef 413, ptr noundef nonnull @.str, ptr noundef nonnull @__func__.SampleWithoutReplacementStratified, ptr noundef nonnull @.str.39)
  call void @__assert_fail(ptr noundef nonnull @.str.40, ptr noundef nonnull @.str, i32 noundef 413, ptr noundef nonnull @__PRETTY_FUNCTION__.SampleWithoutReplacementStratified) #16
  unreachable

304:                                              ; preds = %291
  call void @InteralLogWithoutArguments(i32 noundef 3, ptr noundef nonnull @_ZZ34SampleWithoutReplacementStratifiedE13LOG__sMessage__19_)
  br label %.thread

.thread:                                          ; preds = %142, %136, %109, %112, %123, %120, %182, %291, %304, %192
  %.8 = phi i32 [ -1, %123 ], [ -1, %120 ], [ -1, %182 ], [ -1, %192 ], [ 0, %304 ], [ 0, %291 ], [ -2, %109 ], [ -1, %112 ], [ -3, %136 ], [ -3, %142 ]
  call void @llvm.lifetime.end.p0(i64 24, ptr nonnull %7) #15
  br label %305

305:                                              ; preds = %23, %20, %36, %33, %43, %40, %49, %46, %55, %52, %61, %58, %67, %64, %70, %73, %.thread, %26, %29, %14, %17
  %.13 = phi i32 [ -3, %17 ], [ -3, %14 ], [ -3, %23 ], [ -3, %20 ], [ -3, %29 ], [ -3, %26 ], [ 0, %36 ], [ 0, %33 ], [ -3, %43 ], [ -3, %40 ], [ -3, %49 ], [ -3, %46 ], [ -3, %55 ], [ -3, %52 ], [ -3, %61 ], [ -3, %58 ], [ -3, %67 ], [ -3, %64 ], [ %.8, %.thread ], [ -1, %73 ], [ -1, %70 ]
  ret i32 %.13

306:                                              ; preds = %110, %107
  %307 = landingpad { ptr, i32 }
          catch ptr null
  %308 = extractvalue { ptr, i32 } %307, 0
  call void @__clang_call_terminate(ptr %308) #16
  unreachable
}

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare hidden noundef i64 @_ZN14NAMESPACE_MAINL6EbmMaxImEET_S1_S1_(i64 noundef, i64 noundef) local_unnamed_addr #2

; Function Attrs: alwaysinline mustprogress uwtable
declare dso_local noundef i64 @_ZN14NAMESPACE_MAIN22RandomNondeterministicImE4NextEm(ptr noundef nonnull align 8 dereferenceable(5016), i64 noundef) local_unnamed_addr #4 align 2

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i64 @_ZNSt14numeric_limitsImE3maxEv() local_unnamed_addr #9 align 2

declare void @_ZN14NAMESPACE_MAIN19RandomDeterministic10InitializeEm(ptr noundef nonnull align 8 dereferenceable(24), i64 noundef) local_unnamed_addr #1

; Function Attrs: mustprogress nofree nounwind willreturn allockind("alloc,uninitialized") allocsize(0) memory(inaccessiblemem: readwrite)
declare noalias noundef ptr @malloc(i64 noundef) local_unnamed_addr #10

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare hidden noundef ptr @_ZN14NAMESPACE_MAINL9IndexByteIZ34SampleWithoutReplacementStratifiedE11TargetClassEEPT_S3_m(ptr noundef, i64 noundef) local_unnamed_addr #2

; Function Attrs: mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite)
declare void @free(ptr allocptr nocapture noundef) local_unnamed_addr #11

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZSt5isnand(double noundef) local_unnamed_addr #9

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef zeroext i1 @_ZSt5isinfd(double noundef) local_unnamed_addr #9

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.floor.f64(double) #12

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef double @_ZNSt14numeric_limitsIdE8infinityEv() local_unnamed_addr #9 align 2

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare double @llvm.fmuladd.f64(double, double, double) #12

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

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

; Function Attrs: nofree nounwind willreturn allockind("alloc,zeroed") allocsize(0,1) memory(inaccessiblemem: readwrite)
declare noalias noundef ptr @calloc(i64 noundef, i64 noundef) local_unnamed_addr #14

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare i64 @llvm.vector.reduce.add.v2i64(<2 x i64>) #13

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { inlinehint mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { alwaysinline mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { alwaysinline mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #5 = { nofree nosync nounwind memory(none) }
attributes #6 = { noinline noreturn nounwind uwtable "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 #7 = { 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 #8 = { mustprogress uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #9 = { mustprogress nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #10 = { mustprogress nofree nounwind willreturn allockind("alloc,uninitialized") allocsize(0) memory(inaccessiblemem: readwrite) "alloc-family"="malloc" "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 #11 = { mustprogress nounwind willreturn allockind("free") memory(argmem: readwrite, inaccessiblemem: readwrite) "alloc-family"="malloc" "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 #12 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #13 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #14 = { nofree nounwind willreturn allockind("alloc,zeroed") allocsize(0,1) memory(inaccessiblemem: readwrite) "alloc-family"="malloc" }
attributes #15 = { nounwind }
attributes #16 = { noreturn nounwind }
attributes #17 = { nounwind allocsize(0) }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"int", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!"branch_weights", !"expected", i32 1, i32 2000}
!10 = !{!11, !11, i64 0}
!11 = !{!"long", !7, i64 0}
!12 = !{!"branch_weights", !"expected", i32 2000, i32 1}
!13 = !{!14, !11, i64 8}
!14 = !{!"_ZTSZ34SampleWithoutReplacementStratifiedE11TargetClass", !11, i64 0, !11, i64 8}
!15 = distinct !{!15, !16}
!16 = !{!"llvm.loop.mustprogress"}
!17 = !{!14, !11, i64 0}
!18 = distinct !{!18, !16}
!19 = distinct !{!19, !16, !20, !21}
!20 = !{!"llvm.loop.isvectorized", i32 1}
!21 = !{!"llvm.loop.unroll.runtime.disable"}
!22 = !{!23, !23, i64 0}
!23 = !{!"any pointer", !7, i64 0}
!24 = distinct !{!24, !16}
!25 = distinct !{!25, !16}
!26 = distinct !{!26, !16, !21, !20}
!27 = !{!7, !7, i64 0}
!28 = distinct !{!28, !16}
!29 = distinct !{!29, !16}


; Effective O3 passes: CorrelatedValuePropagationPass,DSEPass,EarlyCSEPass,GVNPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopLoadEliminationPass,LoopRotatePass,LoopSimplifyPass,LoopUnrollPass,LoopVectorizePass,LowerExpectIntrinsicPass,PostOrderFunctionAttrsPass,ReassociatePass,SROAPass,SimplifyCFGPass,TailCallElimPass