; LLVM IR from kylewray/nova :: src/pomdp/utilities (pomdp_expand_cpu)

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

%"struct.nova::NovaPOMDP" = type { i32, i32, i32, i32, i32, i32, float, i32, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr }
%"struct.nova::NovaPOMDPAlphaVectors" = type { i32, i32, i32, ptr, ptr }

@stderr = external global ptr, align 8
@.str.1 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [34 x i8], align 1

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i32 @_ZN4nova33pomdp_expand_construct_belief_cpuEPKNS_9NovaPOMDPEjPf(ptr noundef, i32 noundef, ptr noundef) #0

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

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

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

; Function Attrs: nounwind
declare i32 @fprintf(ptr noundef, ptr noundef, ...) #3

; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare { i64, i1 } @llvm.umul.with.overflow.i64(i64, i64) #2

; Function Attrs: nobuiltin allocsize(0)
declare noundef nonnull ptr @_Znam(i64 noundef) #4

declare i32 @pomdp_belief_update_cpu(ptr noundef, ptr noundef, i32 noundef, i32 noundef, ptr noundef nonnull align 8 dereferenceable(8)) #5

; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #6

; Function Attrs: nobuiltin nounwind
declare void @_ZdaPv(ptr noundef) #7

declare i32 @pomdp_add_new_raw_beliefs_cpu(ptr noundef, i32 noundef, ptr noundef) #5

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef float @_ZSt4fabsf(float noundef) #8

; Function Attrs: mustprogress uwtable
define dso_local i32 @pomdp_expand_pema_cpu(ptr noundef %0, ptr noundef %1) #9 {
  %3 = alloca i32, align 4
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca i32, align 4
  %7 = alloca ptr, align 8
  %8 = alloca i32, align 4
  %9 = alloca float, align 4
  %10 = alloca float, align 4
  %11 = alloca float, align 4
  %12 = alloca i32, align 4
  %13 = alloca i32, align 4
  %14 = alloca i32, align 4
  %15 = alloca ptr, align 8
  %16 = alloca ptr, align 8
  %17 = alloca ptr, align 8
  %18 = alloca i32, align 4
  %19 = alloca i32, align 4
  %20 = alloca float, align 4
  %21 = alloca i32, align 4
  %22 = alloca i32, align 4
  %23 = alloca float, align 4
  %24 = alloca i32, align 4
  %25 = alloca float, align 4
  %26 = alloca i32, align 4
  %27 = alloca i32, align 4
  %28 = alloca i32, align 4
  %29 = alloca i32, align 4
  %30 = alloca ptr, align 8
  %31 = alloca i32, align 4
  %32 = alloca i32, align 4
  %33 = alloca ptr, align 8
  %34 = alloca float, align 4
  %35 = alloca i32, align 4
  %36 = alloca ptr, align 8
  %37 = alloca float, align 4
  %38 = alloca i32, align 4
  %39 = alloca float, align 4
  %40 = alloca i32, align 4
  %41 = alloca i32, align 4
  %42 = alloca float, align 4
  %43 = alloca i32, align 4
  %44 = alloca float, align 4
  %45 = alloca i32, align 4
  %46 = alloca ptr, align 8
  %47 = alloca i32, align 4
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  %48 = load ptr, ptr %4, align 8, !tbaa !5
  %49 = icmp eq ptr %48, null
  br i1 %49, label %110, label %50

50:                                               ; preds = %2
  %51 = load ptr, ptr %4, align 8, !tbaa !5
  %52 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %51, i32 0, i32 0
  %53 = load i32, ptr %52, align 8, !tbaa !9
  %54 = icmp eq i32 %53, 0
  br i1 %54, label %110, label %55

55:                                               ; preds = %50
  %56 = load ptr, ptr %4, align 8, !tbaa !5
  %57 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %56, i32 0, i32 1
  %58 = load i32, ptr %57, align 4, !tbaa !13
  %59 = icmp eq i32 %58, 0
  br i1 %59, label %110, label %60

60:                                               ; preds = %55
  %61 = load ptr, ptr %4, align 8, !tbaa !5
  %62 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %61, i32 0, i32 2
  %63 = load i32, ptr %62, align 8, !tbaa !14
  %64 = icmp eq i32 %63, 0
  br i1 %64, label %110, label %65

65:                                               ; preds = %60
  %66 = load ptr, ptr %4, align 8, !tbaa !5
  %67 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %66, i32 0, i32 3
  %68 = load i32, ptr %67, align 4, !tbaa !15
  %69 = icmp eq i32 %68, 0
  br i1 %69, label %110, label %70

70:                                               ; preds = %65
  %71 = load ptr, ptr %4, align 8, !tbaa !5
  %72 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %71, i32 0, i32 4
  %73 = load i32, ptr %72, align 8, !tbaa !16
  %74 = icmp eq i32 %73, 0
  br i1 %74, label %110, label %75

75:                                               ; preds = %70
  %76 = load ptr, ptr %4, align 8, !tbaa !5
  %77 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %76, i32 0, i32 5
  %78 = load i32, ptr %77, align 4, !tbaa !17
  %79 = icmp eq i32 %78, 0
  br i1 %79, label %110, label %80

80:                                               ; preds = %75
  %81 = load ptr, ptr %4, align 8, !tbaa !5
  %82 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %81, i32 0, i32 8
  %83 = load ptr, ptr %82, align 8, !tbaa !18
  %84 = icmp eq ptr %83, null
  br i1 %84, label %110, label %85

85:                                               ; preds = %80
  %86 = load ptr, ptr %4, align 8, !tbaa !5
  %87 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %86, i32 0, i32 9
  %88 = load ptr, ptr %87, align 8, !tbaa !19
  %89 = icmp eq ptr %88, null
  br i1 %89, label %110, label %90

90:                                               ; preds = %85
  %91 = load ptr, ptr %4, align 8, !tbaa !5
  %92 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %91, i32 0, i32 10
  %93 = load ptr, ptr %92, align 8, !tbaa !20
  %94 = icmp eq ptr %93, null
  br i1 %94, label %110, label %95

95:                                               ; preds = %90
  %96 = load ptr, ptr %4, align 8, !tbaa !5
  %97 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %96, i32 0, i32 11
  %98 = load ptr, ptr %97, align 8, !tbaa !21
  %99 = icmp eq ptr %98, null
  br i1 %99, label %110, label %100

100:                                              ; preds = %95
  %101 = load ptr, ptr %4, align 8, !tbaa !5
  %102 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %101, i32 0, i32 12
  %103 = load ptr, ptr %102, align 8, !tbaa !22
  %104 = icmp eq ptr %103, null
  br i1 %104, label %110, label %105

105:                                              ; preds = %100
  %106 = load ptr, ptr %4, align 8, !tbaa !5
  %107 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %106, i32 0, i32 13
  %108 = load ptr, ptr %107, align 8, !tbaa !23
  %109 = icmp eq ptr %108, null
  br i1 %109, label %110, label %113

110:                                              ; preds = %105, %100, %95, %90, %85, %80, %75, %70, %65, %60, %55, %50, %2
  %111 = load ptr, ptr @stderr, align 8, !tbaa !5
  %112 = call i32 (ptr, ptr, ...) @fprintf(ptr noundef %111, ptr noundef @.str.3, ptr noundef @.str.1) #10
  store i32 1, ptr %3, align 4
  br label %808

113:                                              ; preds = %105
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #10
  store i32 1, ptr %6, align 4, !tbaa !24
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #10
  %114 = load i32, ptr %6, align 4, !tbaa !24
  %115 = load ptr, ptr %4, align 8, !tbaa !5
  %116 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %115, i32 0, i32 0
  %117 = load i32, ptr %116, align 8, !tbaa !9
  %118 = mul i32 %114, %117
  %119 = zext i32 %118 to i64
  %120 = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %119, i64 4)
  %121 = extractvalue { i64, i1 } %120, 1
  %122 = extractvalue { i64, i1 } %120, 0
  %123 = select i1 %121, i64 -1, i64 %122
  %124 = call noalias noundef nonnull ptr @_Znam(i64 noundef %123) #11
  store ptr %124, ptr %7, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #10
  store i32 0, ptr %8, align 4, !tbaa !24
  br label %125

125:                                              ; preds = %139, %113
  %126 = load i32, ptr %8, align 4, !tbaa !24
  %127 = load i32, ptr %6, align 4, !tbaa !24
  %128 = load ptr, ptr %4, align 8, !tbaa !5
  %129 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %128, i32 0, i32 0
  %130 = load i32, ptr %129, align 8, !tbaa !9
  %131 = mul i32 %127, %130
  %132 = icmp ult i32 %126, %131
  br i1 %132, label %134, label %133

133:                                              ; preds = %125
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #10
  br label %142

134:                                              ; preds = %125
  %135 = load ptr, ptr %7, align 8, !tbaa !5
  %136 = load i32, ptr %8, align 4, !tbaa !24
  %137 = zext i32 %136 to i64
  %138 = getelementptr inbounds float, ptr %135, i64 %137
  store float 0.000000e+00, ptr %138, align 4, !tbaa !25
  br label %139

139:                                              ; preds = %134
  %140 = load i32, ptr %8, align 4, !tbaa !24
  %141 = add i32 %140, 1
  store i32 %141, ptr %8, align 4, !tbaa !24
  br label %125, !llvm.loop !26

142:                                              ; preds = %133
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #10
  store float -1.000000e+10, ptr %9, align 4, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 4, ptr %10) #10
  store float -1.000000e+10, ptr %10, align 4, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #10
  store float 1.000000e+10, ptr %11, align 4, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #10
  store i32 0, ptr %12, align 4, !tbaa !24
  br label %143

143:                                              ; preds = %223, %142
  %144 = load i32, ptr %12, align 4, !tbaa !24
  %145 = load ptr, ptr %4, align 8, !tbaa !5
  %146 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %145, i32 0, i32 0
  %147 = load i32, ptr %146, align 8, !tbaa !9
  %148 = icmp ult i32 %144, %147
  br i1 %148, label %150, label %149

149:                                              ; preds = %143
  store i32 5, ptr %13, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #10
  br label %226

150:                                              ; preds = %143
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #10
  store i32 0, ptr %14, align 4, !tbaa !24
  br label %151

151:                                              ; preds = %219, %150
  %152 = load i32, ptr %14, align 4, !tbaa !24
  %153 = load ptr, ptr %4, align 8, !tbaa !5
  %154 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %153, i32 0, i32 2
  %155 = load i32, ptr %154, align 8, !tbaa !14
  %156 = icmp ult i32 %152, %155
  br i1 %156, label %158, label %157

157:                                              ; preds = %151
  store i32 8, ptr %13, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #10
  br label %222

158:                                              ; preds = %151
  %159 = load float, ptr %10, align 4, !tbaa !25
  %160 = load ptr, ptr %4, align 8, !tbaa !5
  %161 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %160, i32 0, i32 11
  %162 = load ptr, ptr %161, align 8, !tbaa !21
  %163 = load i32, ptr %12, align 4, !tbaa !24
  %164 = load ptr, ptr %4, align 8, !tbaa !5
  %165 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %164, i32 0, i32 2
  %166 = load i32, ptr %165, align 8, !tbaa !14
  %167 = mul i32 %163, %166
  %168 = load i32, ptr %14, align 4, !tbaa !24
  %169 = add i32 %167, %168
  %170 = zext i32 %169 to i64
  %171 = getelementptr inbounds float, ptr %162, i64 %170
  %172 = load float, ptr %171, align 4, !tbaa !25
  %173 = fcmp olt float %159, %172
  br i1 %173, label %174, label %188

174:                                              ; preds = %158
  %175 = load ptr, ptr %4, align 8, !tbaa !5
  %176 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %175, i32 0, i32 11
  %177 = load ptr, ptr %176, align 8, !tbaa !21
  %178 = load i32, ptr %12, align 4, !tbaa !24
  %179 = load ptr, ptr %4, align 8, !tbaa !5
  %180 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %179, i32 0, i32 2
  %181 = load i32, ptr %180, align 8, !tbaa !14
  %182 = mul i32 %178, %181
  %183 = load i32, ptr %14, align 4, !tbaa !24
  %184 = add i32 %182, %183
  %185 = zext i32 %184 to i64
  %186 = getelementptr inbounds float, ptr %177, i64 %185
  %187 = load float, ptr %186, align 4, !tbaa !25
  store float %187, ptr %10, align 4, !tbaa !25
  br label %188

188:                                              ; preds = %174, %158
  %189 = load float, ptr %11, align 4, !tbaa !25
  %190 = load ptr, ptr %4, align 8, !tbaa !5
  %191 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %190, i32 0, i32 11
  %192 = load ptr, ptr %191, align 8, !tbaa !21
  %193 = load i32, ptr %12, align 4, !tbaa !24
  %194 = load ptr, ptr %4, align 8, !tbaa !5
  %195 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %194, i32 0, i32 2
  %196 = load i32, ptr %195, align 8, !tbaa !14
  %197 = mul i32 %193, %196
  %198 = load i32, ptr %14, align 4, !tbaa !24
  %199 = add i32 %197, %198
  %200 = zext i32 %199 to i64
  %201 = getelementptr inbounds float, ptr %192, i64 %200
  %202 = load float, ptr %201, align 4, !tbaa !25
  %203 = fcmp ogt float %189, %202
  br i1 %203, label %204, label %218

204:                                              ; preds = %188
  %205 = load ptr, ptr %4, align 8, !tbaa !5
  %206 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %205, i32 0, i32 11
  %207 = load ptr, ptr %206, align 8, !tbaa !21
  %208 = load i32, ptr %12, align 4, !tbaa !24
  %209 = load ptr, ptr %4, align 8, !tbaa !5
  %210 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %209, i32 0, i32 2
  %211 = load i32, ptr %210, align 8, !tbaa !14
  %212 = mul i32 %208, %211
  %213 = load i32, ptr %14, align 4, !tbaa !24
  %214 = add i32 %212, %213
  %215 = zext i32 %214 to i64
  %216 = getelementptr inbounds float, ptr %207, i64 %215
  %217 = load float, ptr %216, align 4, !tbaa !25
  store float %217, ptr %11, align 4, !tbaa !25
  br label %218

218:                                              ; preds = %204, %188
  br label %219

219:                                              ; preds = %218
  %220 = load i32, ptr %14, align 4, !tbaa !24
  %221 = add i32 %220, 1
  store i32 %221, ptr %14, align 4, !tbaa !24
  br label %151, !llvm.loop !28

222:                                              ; preds = %157
  br label %223

223:                                              ; preds = %222
  %224 = load i32, ptr %12, align 4, !tbaa !24
  %225 = add i32 %224, 1
  store i32 %225, ptr %12, align 4, !tbaa !24
  br label %143, !llvm.loop !29

226:                                              ; preds = %149
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #10
  %227 = load ptr, ptr %4, align 8, !tbaa !5
  %228 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %227, i32 0, i32 0
  %229 = load i32, ptr %228, align 8, !tbaa !9
  %230 = zext i32 %229 to i64
  %231 = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %230, i64 4)
  %232 = extractvalue { i64, i1 } %231, 1
  %233 = extractvalue { i64, i1 } %231, 0
  %234 = select i1 %232, i64 -1, i64 %233
  %235 = call noalias noundef nonnull ptr @_Znam(i64 noundef %234) #11
  store ptr %235, ptr %15, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #10
  %236 = load ptr, ptr %4, align 8, !tbaa !5
  %237 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %236, i32 0, i32 2
  %238 = load i32, ptr %237, align 8, !tbaa !14
  %239 = zext i32 %238 to i64
  %240 = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %239, i64 4)
  %241 = extractvalue { i64, i1 } %240, 1
  %242 = extractvalue { i64, i1 } %240, 0
  %243 = select i1 %241, i64 -1, i64 %242
  %244 = call noalias noundef nonnull ptr @_Znam(i64 noundef %243) #11
  store ptr %244, ptr %16, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %17) #10
  %245 = load ptr, ptr %4, align 8, !tbaa !5
  %246 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %245, i32 0, i32 2
  %247 = load i32, ptr %246, align 8, !tbaa !14
  %248 = zext i32 %247 to i64
  %249 = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %248, i64 4)
  %250 = extractvalue { i64, i1 } %249, 1
  %251 = extractvalue { i64, i1 } %249, 0
  %252 = select i1 %250, i64 -1, i64 %251
  %253 = call noalias noundef nonnull ptr @_Znam(i64 noundef %252) #11
  store ptr %253, ptr %17, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %18) #10
  store i32 0, ptr %18, align 4, !tbaa !24
  br label %254

254:                                              ; preds = %784, %226
  %255 = load i32, ptr %18, align 4, !tbaa !24
  %256 = load ptr, ptr %4, align 8, !tbaa !5
  %257 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %256, i32 0, i32 4
  %258 = load i32, ptr %257, align 8, !tbaa !16
  %259 = icmp ult i32 %255, %258
  br i1 %259, label %261, label %260

260:                                              ; preds = %254
  store i32 11, ptr %13, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %18) #10
  br label %787

261:                                              ; preds = %254
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #10
  store i32 0, ptr %19, align 4, !tbaa !24
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #10
  store float -1.000000e+10, ptr %20, align 4, !tbaa !25
  %262 = load ptr, ptr %4, align 8, !tbaa !5
  %263 = load i32, ptr %18, align 4, !tbaa !24
  %264 = load ptr, ptr %15, align 8, !tbaa !5
  %265 = call noundef i32 @_ZN4nova33pomdp_expand_construct_belief_cpuEPKNS_9NovaPOMDPEjPf(ptr noundef %262, i32 noundef %263, ptr noundef %264)
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #10
  store i32 0, ptr %21, align 4, !tbaa !24
  br label %266

266:                                              ; preds = %282, %261
  %267 = load i32, ptr %21, align 4, !tbaa !24
  %268 = load ptr, ptr %4, align 8, !tbaa !5
  %269 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %268, i32 0, i32 2
  %270 = load i32, ptr %269, align 8, !tbaa !14
  %271 = icmp ult i32 %267, %270
  br i1 %271, label %273, label %272

272:                                              ; preds = %266
  store i32 14, ptr %13, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #10
  br label %285

273:                                              ; preds = %266
  %274 = load ptr, ptr %16, align 8, !tbaa !5
  %275 = load i32, ptr %21, align 4, !tbaa !24
  %276 = zext i32 %275 to i64
  %277 = getelementptr inbounds i32, ptr %274, i64 %276
  store i32 0, ptr %277, align 4, !tbaa !24
  %278 = load ptr, ptr %17, align 8, !tbaa !5
  %279 = load i32, ptr %21, align 4, !tbaa !24
  %280 = zext i32 %279 to i64
  %281 = getelementptr inbounds float, ptr %278, i64 %280
  store float -1.000000e+10, ptr %281, align 4, !tbaa !25
  br label %282

282:                                              ; preds = %273
  %283 = load i32, ptr %21, align 4, !tbaa !24
  %284 = add i32 %283, 1
  store i32 %284, ptr %21, align 4, !tbaa !24
  br label %266, !llvm.loop !30

285:                                              ; preds = %272
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #10
  store i32 0, ptr %22, align 4, !tbaa !24
  br label %286

286:                                              ; preds = %726, %285
  %287 = load i32, ptr %22, align 4, !tbaa !24
  %288 = load ptr, ptr %4, align 8, !tbaa !5
  %289 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %288, i32 0, i32 2
  %290 = load i32, ptr %289, align 8, !tbaa !14
  %291 = icmp ult i32 %287, %290
  br i1 %291, label %293, label %292

292:                                              ; preds = %286
  store i32 17, ptr %13, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #10
  br label %729

293:                                              ; preds = %286
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #10
  store float 0.000000e+00, ptr %23, align 4, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #10
  store i32 0, ptr %24, align 4, !tbaa !24
  br label %294

294:                                              ; preds = %715, %293
  %295 = load i32, ptr %24, align 4, !tbaa !24
  %296 = load ptr, ptr %4, align 8, !tbaa !5
  %297 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %296, i32 0, i32 3
  %298 = load i32, ptr %297, align 4, !tbaa !15
  %299 = icmp ult i32 %295, %298
  br i1 %299, label %301, label %300

300:                                              ; preds = %294
  store i32 20, ptr %13, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #10
  br label %718

301:                                              ; preds = %294
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #10
  store float 0.000000e+00, ptr %25, align 4, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 4, ptr %26) #10
  store i32 0, ptr %26, align 4, !tbaa !24
  br label %302

302:                                              ; preds = %435, %301
  %303 = load i32, ptr %26, align 4, !tbaa !24
  %304 = load ptr, ptr %4, align 8, !tbaa !5
  %305 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %304, i32 0, i32 5
  %306 = load i32, ptr %305, align 4, !tbaa !17
  %307 = icmp ult i32 %303, %306
  br i1 %307, label %309, label %308

308:                                              ; preds = %302
  store i32 23, ptr %13, align 4
  br label %438

309:                                              ; preds = %302
  call void @llvm.lifetime.start.p0(i64 4, ptr %27) #10
  %310 = load ptr, ptr %4, align 8, !tbaa !5
  %311 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %310, i32 0, i32 12
  %312 = load ptr, ptr %311, align 8, !tbaa !22
  %313 = load i32, ptr %18, align 4, !tbaa !24
  %314 = load ptr, ptr %4, align 8, !tbaa !5
  %315 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %314, i32 0, i32 5
  %316 = load i32, ptr %315, align 4, !tbaa !17
  %317 = mul i32 %313, %316
  %318 = load i32, ptr %26, align 4, !tbaa !24
  %319 = add i32 %317, %318
  %320 = zext i32 %319 to i64
  %321 = getelementptr inbounds i32, ptr %312, i64 %320
  %322 = load i32, ptr %321, align 4, !tbaa !24
  store i32 %322, ptr %27, align 4, !tbaa !24
  %323 = load i32, ptr %27, align 4, !tbaa !24
  %324 = icmp slt i32 %323, 0
  br i1 %324, label %325, label %326

325:                                              ; preds = %309
  store i32 23, ptr %13, align 4
  br label %432

326:                                              ; preds = %309
  call void @llvm.lifetime.start.p0(i64 4, ptr %28) #10
  store i32 0, ptr %28, align 4, !tbaa !24
  br label %327

327:                                              ; preds = %427, %326
  %328 = load i32, ptr %28, align 4, !tbaa !24
  %329 = load ptr, ptr %4, align 8, !tbaa !5
  %330 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %329, i32 0, i32 1
  %331 = load i32, ptr %330, align 4, !tbaa !13
  %332 = icmp ult i32 %328, %331
  br i1 %332, label %334, label %333

333:                                              ; preds = %327
  store i32 26, ptr %13, align 4
  br label %430

334:                                              ; preds = %327
  call void @llvm.lifetime.start.p0(i64 4, ptr %29) #10
  %335 = load ptr, ptr %4, align 8, !tbaa !5
  %336 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %335, i32 0, i32 8
  %337 = load ptr, ptr %336, align 8, !tbaa !18
  %338 = load i32, ptr %27, align 4, !tbaa !24
  %339 = load ptr, ptr %4, align 8, !tbaa !5
  %340 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %339, i32 0, i32 2
  %341 = load i32, ptr %340, align 8, !tbaa !14
  %342 = mul i32 %338, %341
  %343 = load ptr, ptr %4, align 8, !tbaa !5
  %344 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %343, i32 0, i32 1
  %345 = load i32, ptr %344, align 4, !tbaa !13
  %346 = mul i32 %342, %345
  %347 = load i32, ptr %22, align 4, !tbaa !24
  %348 = load ptr, ptr %4, align 8, !tbaa !5
  %349 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %348, i32 0, i32 1
  %350 = load i32, ptr %349, align 4, !tbaa !13
  %351 = mul i32 %347, %350
  %352 = add i32 %346, %351
  %353 = load i32, ptr %28, align 4, !tbaa !24
  %354 = add i32 %352, %353
  %355 = zext i32 %354 to i64
  %356 = getelementptr inbounds i32, ptr %337, i64 %355
  %357 = load i32, ptr %356, align 4, !tbaa !24
  store i32 %357, ptr %29, align 4, !tbaa !24
  %358 = load i32, ptr %29, align 4, !tbaa !24
  %359 = icmp slt i32 %358, 0
  br i1 %359, label %360, label %361

360:                                              ; preds = %334
  store i32 26, ptr %13, align 4
  br label %424

361:                                              ; preds = %334
  %362 = load ptr, ptr %4, align 8, !tbaa !5
  %363 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %362, i32 0, i32 9
  %364 = load ptr, ptr %363, align 8, !tbaa !19
  %365 = load i32, ptr %27, align 4, !tbaa !24
  %366 = load ptr, ptr %4, align 8, !tbaa !5
  %367 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %366, i32 0, i32 2
  %368 = load i32, ptr %367, align 8, !tbaa !14
  %369 = mul i32 %365, %368
  %370 = load ptr, ptr %4, align 8, !tbaa !5
  %371 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %370, i32 0, i32 1
  %372 = load i32, ptr %371, align 4, !tbaa !13
  %373 = mul i32 %369, %372
  %374 = load i32, ptr %22, align 4, !tbaa !24
  %375 = load ptr, ptr %4, align 8, !tbaa !5
  %376 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %375, i32 0, i32 1
  %377 = load i32, ptr %376, align 4, !tbaa !13
  %378 = mul i32 %374, %377
  %379 = add i32 %373, %378
  %380 = load i32, ptr %28, align 4, !tbaa !24
  %381 = add i32 %379, %380
  %382 = zext i32 %381 to i64
  %383 = getelementptr inbounds float, ptr %364, i64 %382
  %384 = load float, ptr %383, align 4, !tbaa !25
  %385 = load ptr, ptr %4, align 8, !tbaa !5
  %386 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %385, i32 0, i32 10
  %387 = load ptr, ptr %386, align 8, !tbaa !20
  %388 = load i32, ptr %22, align 4, !tbaa !24
  %389 = load ptr, ptr %4, align 8, !tbaa !5
  %390 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %389, i32 0, i32 0
  %391 = load i32, ptr %390, align 8, !tbaa !9
  %392 = mul i32 %388, %391
  %393 = load ptr, ptr %4, align 8, !tbaa !5
  %394 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %393, i32 0, i32 3
  %395 = load i32, ptr %394, align 4, !tbaa !15
  %396 = mul i32 %392, %395
  %397 = load i32, ptr %29, align 4, !tbaa !24
  %398 = load ptr, ptr %4, align 8, !tbaa !5
  %399 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %398, i32 0, i32 3
  %400 = load i32, ptr %399, align 4, !tbaa !15
  %401 = mul i32 %397, %400
  %402 = add i32 %396, %401
  %403 = load i32, ptr %24, align 4, !tbaa !24
  %404 = add i32 %402, %403
  %405 = zext i32 %404 to i64
  %406 = getelementptr inbounds float, ptr %387, i64 %405
  %407 = load float, ptr %406, align 4, !tbaa !25
  %408 = fmul float %384, %407
  %409 = load ptr, ptr %4, align 8, !tbaa !5
  %410 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %409, i32 0, i32 13
  %411 = load ptr, ptr %410, align 8, !tbaa !23
  %412 = load i32, ptr %18, align 4, !tbaa !24
  %413 = load ptr, ptr %4, align 8, !tbaa !5
  %414 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %413, i32 0, i32 5
  %415 = load i32, ptr %414, align 4, !tbaa !17
  %416 = mul i32 %412, %415
  %417 = load i32, ptr %26, align 4, !tbaa !24
  %418 = add i32 %416, %417
  %419 = zext i32 %418 to i64
  %420 = getelementptr inbounds float, ptr %411, i64 %419
  %421 = load float, ptr %420, align 4, !tbaa !25
  %422 = load float, ptr %25, align 4, !tbaa !25
  %423 = call float @llvm.fmuladd.f32(float %408, float %421, float %422)
  store float %423, ptr %25, align 4, !tbaa !25
  store i32 0, ptr %13, align 4
  br label %424

424:                                              ; preds = %361, %360
  call void @llvm.lifetime.end.p0(i64 4, ptr %29) #10
  %425 = load i32, ptr %13, align 4
  switch i32 %425, label %430 [
    i32 0, label %426
  ]

426:                                              ; preds = %424
  br label %427

427:                                              ; preds = %426
  %428 = load i32, ptr %28, align 4, !tbaa !24
  %429 = add i32 %428, 1
  store i32 %429, ptr %28, align 4, !tbaa !24
  br label %327, !llvm.loop !31

430:                                              ; preds = %424, %333
  call void @llvm.lifetime.end.p0(i64 4, ptr %28) #10
  br label %431

431:                                              ; preds = %430
  store i32 0, ptr %13, align 4
  br label %432

432:                                              ; preds = %431, %325
  call void @llvm.lifetime.end.p0(i64 4, ptr %27) #10
  %433 = load i32, ptr %13, align 4
  switch i32 %433, label %438 [
    i32 0, label %434
  ]

434:                                              ; preds = %432
  br label %435

435:                                              ; preds = %434
  %436 = load i32, ptr %26, align 4, !tbaa !24
  %437 = add i32 %436, 1
  store i32 %437, ptr %26, align 4, !tbaa !24
  br label %302, !llvm.loop !32

438:                                              ; preds = %432, %308
  call void @llvm.lifetime.end.p0(i64 4, ptr %26) #10
  br label %439

439:                                              ; preds = %438
  call void @llvm.lifetime.start.p0(i64 8, ptr %30) #10
  store ptr null, ptr %30, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %31) #10
  %440 = load ptr, ptr %4, align 8, !tbaa !5
  %441 = load ptr, ptr %15, align 8, !tbaa !5
  %442 = load i32, ptr %22, align 4, !tbaa !24
  %443 = load i32, ptr %24, align 4, !tbaa !24
  %444 = call i32 @pomdp_belief_update_cpu(ptr noundef %440, ptr noundef %441, i32 noundef %442, i32 noundef %443, ptr noundef nonnull align 8 dereferenceable(8) %30)
  store i32 %444, ptr %31, align 4, !tbaa !24
  %445 = load i32, ptr %31, align 4, !tbaa !24
  %446 = icmp ne i32 %445, 0
  br i1 %446, label %447, label %456

447:                                              ; preds = %439
  %448 = load ptr, ptr %30, align 8, !tbaa !5
  %449 = icmp ne ptr %448, null
  br i1 %449, label %450, label %455

450:                                              ; preds = %447
  %451 = load ptr, ptr %30, align 8, !tbaa !5
  %452 = icmp eq ptr %451, null
  br i1 %452, label %454, label %453

453:                                              ; preds = %450
  call void @_ZdaPv(ptr noundef %451) #12
  br label %454

454:                                              ; preds = %453, %450
  br label %455

455:                                              ; preds = %454, %447
  store i32 22, ptr %13, align 4
  br label %712

456:                                              ; preds = %439
  call void @llvm.lifetime.start.p0(i64 4, ptr %32) #10
  store i32 0, ptr %32, align 4, !tbaa !24
  call void @llvm.lifetime.start.p0(i64 8, ptr %33) #10
  %457 = load ptr, ptr %4, align 8, !tbaa !5
  %458 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %457, i32 0, i32 0
  %459 = load i32, ptr %458, align 8, !tbaa !9
  %460 = zext i32 %459 to i64
  %461 = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %460, i64 4)
  %462 = extractvalue { i64, i1 } %461, 1
  %463 = extractvalue { i64, i1 } %461, 0
  %464 = select i1 %462, i64 -1, i64 %463
  %465 = call noalias noundef nonnull ptr @_Znam(i64 noundef %464) #11
  store ptr %465, ptr %33, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %34) #10
  store float 1.000000e+10, ptr %34, align 4, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 4, ptr %35) #10
  store i32 0, ptr %35, align 4, !tbaa !24
  br label %466

466:                                              ; preds = %531, %456
  %467 = load i32, ptr %35, align 4, !tbaa !24
  %468 = load ptr, ptr %4, align 8, !tbaa !5
  %469 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %468, i32 0, i32 4
  %470 = load i32, ptr %469, align 8, !tbaa !16
  %471 = icmp ult i32 %467, %470
  br i1 %471, label %473, label %472

472:                                              ; preds = %466
  store i32 29, ptr %13, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %35) #10
  br label %534

473:                                              ; preds = %466
  call void @llvm.lifetime.start.p0(i64 8, ptr %36) #10
  %474 = load ptr, ptr %4, align 8, !tbaa !5
  %475 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %474, i32 0, i32 0
  %476 = load i32, ptr %475, align 8, !tbaa !9
  %477 = zext i32 %476 to i64
  %478 = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 %477, i64 4)
  %479 = extractvalue { i64, i1 } %478, 1
  %480 = extractvalue { i64, i1 } %478, 0
  %481 = select i1 %479, i64 -1, i64 %480
  %482 = call noalias noundef nonnull ptr @_Znam(i64 noundef %481) #11
  store ptr %482, ptr %36, align 8, !tbaa !5
  %483 = load ptr, ptr %4, align 8, !tbaa !5
  %484 = load i32, ptr %35, align 4, !tbaa !24
  %485 = load ptr, ptr %36, align 8, !tbaa !5
  %486 = call noundef i32 @_ZN4nova33pomdp_expand_construct_belief_cpuEPKNS_9NovaPOMDPEjPf(ptr noundef %483, i32 noundef %484, ptr noundef %485)
  call void @llvm.lifetime.start.p0(i64 4, ptr %37) #10
  store float 0.000000e+00, ptr %37, align 4, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 4, ptr %38) #10
  store i32 0, ptr %38, align 4, !tbaa !24
  br label %487

487:                                              ; preds = %509, %473
  %488 = load i32, ptr %38, align 4, !tbaa !24
  %489 = load ptr, ptr %4, align 8, !tbaa !5
  %490 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %489, i32 0, i32 0
  %491 = load i32, ptr %490, align 8, !tbaa !9
  %492 = icmp ult i32 %488, %491
  br i1 %492, label %494, label %493

493:                                              ; preds = %487
  store i32 32, ptr %13, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %38) #10
  br label %512

494:                                              ; preds = %487
  %495 = load ptr, ptr %30, align 8, !tbaa !5
  %496 = load i32, ptr %38, align 4, !tbaa !24
  %497 = zext i32 %496 to i64
  %498 = getelementptr inbounds float, ptr %495, i64 %497
  %499 = load float, ptr %498, align 4, !tbaa !25
  %500 = load ptr, ptr %36, align 8, !tbaa !5
  %501 = load i32, ptr %38, align 4, !tbaa !24
  %502 = zext i32 %501 to i64
  %503 = getelementptr inbounds float, ptr %500, i64 %502
  %504 = load float, ptr %503, align 4, !tbaa !25
  %505 = fsub float %499, %504
  %506 = call noundef float @_ZSt4fabsf(float noundef %505)
  %507 = load float, ptr %37, align 4, !tbaa !25
  %508 = fadd float %507, %506
  store float %508, ptr %37, align 4, !tbaa !25
  br label %509

509:                                              ; preds = %494
  %510 = load i32, ptr %38, align 4, !tbaa !24
  %511 = add i32 %510, 1
  store i32 %511, ptr %38, align 4, !tbaa !24
  br label %487, !llvm.loop !33

512:                                              ; preds = %493
  %513 = load float, ptr %37, align 4, !tbaa !25
  %514 = load float, ptr %34, align 4, !tbaa !25
  %515 = fcmp olt float %513, %514
  br i1 %515, label %516, label %526

516:                                              ; preds = %512
  %517 = load i32, ptr %35, align 4, !tbaa !24
  store i32 %517, ptr %32, align 4, !tbaa !24
  %518 = load ptr, ptr %33, align 8, !tbaa !5
  %519 = load ptr, ptr %36, align 8, !tbaa !5
  %520 = load ptr, ptr %4, align 8, !tbaa !5
  %521 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %520, i32 0, i32 0
  %522 = load i32, ptr %521, align 8, !tbaa !9
  %523 = zext i32 %522 to i64
  %524 = mul i64 %523, 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %518, ptr align 4 %519, i64 %524, i1 false)
  %525 = load float, ptr %37, align 4, !tbaa !25
  store float %525, ptr %34, align 4, !tbaa !25
  br label %526

526:                                              ; preds = %516, %512
  %527 = load ptr, ptr %36, align 8, !tbaa !5
  %528 = icmp eq ptr %527, null
  br i1 %528, label %530, label %529

529:                                              ; preds = %526
  call void @_ZdaPv(ptr noundef %527) #12
  br label %530

530:                                              ; preds = %529, %526
  call void @llvm.lifetime.end.p0(i64 4, ptr %37) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %36) #10
  br label %531

531:                                              ; preds = %530
  %532 = load i32, ptr %35, align 4, !tbaa !24
  %533 = add i32 %532, 1
  store i32 %533, ptr %35, align 4, !tbaa !24
  br label %466, !llvm.loop !34

534:                                              ; preds = %472
  call void @llvm.lifetime.start.p0(i64 4, ptr %39) #10
  store float -1.000000e+10, ptr %39, align 4, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 4, ptr %40) #10
  store i32 0, ptr %40, align 4, !tbaa !24
  call void @llvm.lifetime.start.p0(i64 4, ptr %41) #10
  store i32 0, ptr %41, align 4, !tbaa !24
  br label %535

535:                                              ; preds = %581, %534
  %536 = load i32, ptr %41, align 4, !tbaa !24
  %537 = load ptr, ptr %5, align 8, !tbaa !5
  %538 = getelementptr inbounds %"struct.nova::NovaPOMDPAlphaVectors", ptr %537, i32 0, i32 2
  %539 = load i32, ptr %538, align 8, !tbaa !35
  %540 = icmp ult i32 %536, %539
  br i1 %540, label %542, label %541

541:                                              ; preds = %535
  store i32 35, ptr %13, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %41) #10
  br label %584

542:                                              ; preds = %535
  call void @llvm.lifetime.start.p0(i64 4, ptr %42) #10
  store float 0.000000e+00, ptr %42, align 4, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 4, ptr %43) #10
  store i32 0, ptr %43, align 4, !tbaa !24
  br label %543

543:                                              ; preds = %577, %542
  %544 = load i32, ptr %43, align 4, !tbaa !24
  %545 = load ptr, ptr %5, align 8, !tbaa !5
  %546 = getelementptr inbounds %"struct.nova::NovaPOMDPAlphaVectors", ptr %545, i32 0, i32 0
  %547 = load i32, ptr %546, align 8, !tbaa !37
  %548 = icmp ult i32 %544, %547
  br i1 %548, label %550, label %549

549:                                              ; preds = %543
  store i32 38, ptr %13, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %43) #10
  br label %580

550:                                              ; preds = %543
  %551 = load ptr, ptr %5, align 8, !tbaa !5
  %552 = getelementptr inbounds %"struct.nova::NovaPOMDPAlphaVectors", ptr %551, i32 0, i32 3
  %553 = load ptr, ptr %552, align 8, !tbaa !38
  %554 = load i32, ptr %41, align 4, !tbaa !24
  %555 = load ptr, ptr %5, align 8, !tbaa !5
  %556 = getelementptr inbounds %"struct.nova::NovaPOMDPAlphaVectors", ptr %555, i32 0, i32 0
  %557 = load i32, ptr %556, align 8, !tbaa !37
  %558 = mul i32 %554, %557
  %559 = load i32, ptr %43, align 4, !tbaa !24
  %560 = add i32 %558, %559
  %561 = zext i32 %560 to i64
  %562 = getelementptr inbounds float, ptr %553, i64 %561
  %563 = load float, ptr %562, align 4, !tbaa !25
  %564 = load ptr, ptr %33, align 8, !tbaa !5
  %565 = load i32, ptr %43, align 4, !tbaa !24
  %566 = zext i32 %565 to i64
  %567 = getelementptr inbounds float, ptr %564, i64 %566
  %568 = load float, ptr %567, align 4, !tbaa !25
  %569 = fmul float %563, %568
  store float %569, ptr %42, align 4, !tbaa !25
  %570 = load float, ptr %42, align 4, !tbaa !25
  %571 = load float, ptr %39, align 4, !tbaa !25
  %572 = fcmp olt float %570, %571
  br i1 %572, label %573, label %576

573:                                              ; preds = %550
  %574 = load float, ptr %39, align 4, !tbaa !25
  store float %574, ptr %42, align 4, !tbaa !25
  %575 = load i32, ptr %41, align 4, !tbaa !24
  store i32 %575, ptr %40, align 4, !tbaa !24
  br label %576

576:                                              ; preds = %573, %550
  br label %577

577:                                              ; preds = %576
  %578 = load i32, ptr %43, align 4, !tbaa !24
  %579 = add i32 %578, 1
  store i32 %579, ptr %43, align 4, !tbaa !24
  br label %543, !llvm.loop !39

580:                                              ; preds = %549
  call void @llvm.lifetime.end.p0(i64 4, ptr %42) #10
  br label %581

581:                                              ; preds = %580
  %582 = load i32, ptr %41, align 4, !tbaa !24
  %583 = add i32 %582, 1
  store i32 %583, ptr %41, align 4, !tbaa !24
  br label %535, !llvm.loop !40

584:                                              ; preds = %541
  call void @llvm.lifetime.start.p0(i64 4, ptr %44) #10
  store float 0.000000e+00, ptr %44, align 4, !tbaa !25
  call void @llvm.lifetime.start.p0(i64 4, ptr %45) #10
  store i32 0, ptr %45, align 4, !tbaa !24
  br label %585

585:                                              ; preds = %673, %584
  %586 = load i32, ptr %45, align 4, !tbaa !24
  %587 = load ptr, ptr %4, align 8, !tbaa !5
  %588 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %587, i32 0, i32 0
  %589 = load i32, ptr %588, align 8, !tbaa !9
  %590 = icmp ult i32 %586, %589
  br i1 %590, label %592, label %591

591:                                              ; preds = %585
  store i32 41, ptr %13, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %45) #10
  br label %676

592:                                              ; preds = %585
  %593 = load ptr, ptr %30, align 8, !tbaa !5
  %594 = load i32, ptr %45, align 4, !tbaa !24
  %595 = zext i32 %594 to i64
  %596 = getelementptr inbounds float, ptr %593, i64 %595
  %597 = load float, ptr %596, align 4, !tbaa !25
  %598 = load ptr, ptr %15, align 8, !tbaa !5
  %599 = load i32, ptr %45, align 4, !tbaa !24
  %600 = zext i32 %599 to i64
  %601 = getelementptr inbounds float, ptr %598, i64 %600
  %602 = load float, ptr %601, align 4, !tbaa !25
  %603 = fcmp oge float %597, %602
  br i1 %603, label %604, label %638

604:                                              ; preds = %592
  %605 = load float, ptr %10, align 4, !tbaa !25
  %606 = load ptr, ptr %4, align 8, !tbaa !5
  %607 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %606, i32 0, i32 6
  %608 = load float, ptr %607, align 8, !tbaa !41
  %609 = fsub float 1.000000e+00, %608
  %610 = fdiv float %605, %609
  %611 = load ptr, ptr %5, align 8, !tbaa !5
  %612 = getelementptr inbounds %"struct.nova::NovaPOMDPAlphaVectors", ptr %611, i32 0, i32 3
  %613 = load ptr, ptr %612, align 8, !tbaa !38
  %614 = load i32, ptr %40, align 4, !tbaa !24
  %615 = load ptr, ptr %4, align 8, !tbaa !5
  %616 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %615, i32 0, i32 0
  %617 = load i32, ptr %616, align 8, !tbaa !9
  %618 = mul i32 %614, %617
  %619 = load i32, ptr %45, align 4, !tbaa !24
  %620 = add i32 %618, %619
  %621 = zext i32 %620 to i64
  %622 = getelementptr inbounds float, ptr %613, i64 %621
  %623 = load float, ptr %622, align 4, !tbaa !25
  %624 = fsub float %610, %623
  %625 = load ptr, ptr %30, align 8, !tbaa !5
  %626 = load i32, ptr %45, align 4, !tbaa !24
  %627 = zext i32 %626 to i64
  %628 = getelementptr inbounds float, ptr %625, i64 %627
  %629 = load float, ptr %628, align 4, !tbaa !25
  %630 = load ptr, ptr %33, align 8, !tbaa !5
  %631 = load i32, ptr %45, align 4, !tbaa !24
  %632 = zext i32 %631 to i64
  %633 = getelementptr inbounds float, ptr %630, i64 %632
  %634 = load float, ptr %633, align 4, !tbaa !25
  %635 = fsub float %629, %634
  %636 = load float, ptr %44, align 4, !tbaa !25
  %637 = call float @llvm.fmuladd.f32(float %624, float %635, float %636)
  store float %637, ptr %44, align 4, !tbaa !25
  br label %672

638:                                              ; preds = %592
  %639 = load float, ptr %11, align 4, !tbaa !25
  %640 = load ptr, ptr %4, align 8, !tbaa !5
  %641 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %640, i32 0, i32 6
  %642 = load float, ptr %641, align 8, !tbaa !41
  %643 = fsub float 1.000000e+00, %642
  %644 = fdiv float %639, %643
  %645 = load ptr, ptr %5, align 8, !tbaa !5
  %646 = getelementptr inbounds %"struct.nova::NovaPOMDPAlphaVectors", ptr %645, i32 0, i32 3
  %647 = load ptr, ptr %646, align 8, !tbaa !38
  %648 = load i32, ptr %40, align 4, !tbaa !24
  %649 = load ptr, ptr %4, align 8, !tbaa !5
  %650 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %649, i32 0, i32 0
  %651 = load i32, ptr %650, align 8, !tbaa !9
  %652 = mul i32 %648, %651
  %653 = load i32, ptr %45, align 4, !tbaa !24
  %654 = add i32 %652, %653
  %655 = zext i32 %654 to i64
  %656 = getelementptr inbounds float, ptr %647, i64 %655
  %657 = load float, ptr %656, align 4, !tbaa !25
  %658 = fsub float %644, %657
  %659 = load ptr, ptr %30, align 8, !tbaa !5
  %660 = load i32, ptr %45, align 4, !tbaa !24
  %661 = zext i32 %660 to i64
  %662 = getelementptr inbounds float, ptr %659, i64 %661
  %663 = load float, ptr %662, align 4, !tbaa !25
  %664 = load ptr, ptr %33, align 8, !tbaa !5
  %665 = load i32, ptr %45, align 4, !tbaa !24
  %666 = zext i32 %665 to i64
  %667 = getelementptr inbounds float, ptr %664, i64 %666
  %668 = load float, ptr %667, align 4, !tbaa !25
  %669 = fsub float %663, %668
  %670 = load float, ptr %44, align 4, !tbaa !25
  %671 = call float @llvm.fmuladd.f32(float %658, float %669, float %670)
  store float %671, ptr %44, align 4, !tbaa !25
  br label %672

672:                                              ; preds = %638, %604
  br label %673

673:                                              ; preds = %672
  %674 = load i32, ptr %45, align 4, !tbaa !24
  %675 = add i32 %674, 1
  store i32 %675, ptr %45, align 4, !tbaa !24
  br label %585, !llvm.loop !42

676:                                              ; preds = %591
  %677 = load float, ptr %25, align 4, !tbaa !25
  %678 = load float, ptr %44, align 4, !tbaa !25
  %679 = fmul float %677, %678
  %680 = load ptr, ptr %17, align 8, !tbaa !5
  %681 = load i32, ptr %22, align 4, !tbaa !24
  %682 = zext i32 %681 to i64
  %683 = getelementptr inbounds float, ptr %680, i64 %682
  %684 = load float, ptr %683, align 4, !tbaa !25
  %685 = fcmp ogt float %679, %684
  br i1 %685, label %686, label %699

686:                                              ; preds = %676
  %687 = load i32, ptr %24, align 4, !tbaa !24
  %688 = load ptr, ptr %16, align 8, !tbaa !5
  %689 = load i32, ptr %22, align 4, !tbaa !24
  %690 = zext i32 %689 to i64
  %691 = getelementptr inbounds i32, ptr %688, i64 %690
  store i32 %687, ptr %691, align 4, !tbaa !24
  %692 = load float, ptr %25, align 4, !tbaa !25
  %693 = load float, ptr %44, align 4, !tbaa !25
  %694 = fmul float %692, %693
  %695 = load ptr, ptr %17, align 8, !tbaa !5
  %696 = load i32, ptr %22, align 4, !tbaa !24
  %697 = zext i32 %696 to i64
  %698 = getelementptr inbounds float, ptr %695, i64 %697
  store float %694, ptr %698, align 4, !tbaa !25
  br label %699

699:                                              ; preds = %686, %676
  %700 = load float, ptr %25, align 4, !tbaa !25
  %701 = load float, ptr %44, align 4, !tbaa !25
  %702 = load float, ptr %23, align 4, !tbaa !25
  %703 = call float @llvm.fmuladd.f32(float %700, float %701, float %702)
  store float %703, ptr %23, align 4, !tbaa !25
  %704 = load ptr, ptr %30, align 8, !tbaa !5
  %705 = icmp eq ptr %704, null
  br i1 %705, label %707, label %706

706:                                              ; preds = %699
  call void @_ZdaPv(ptr noundef %704) #12
  br label %707

707:                                              ; preds = %706, %699
  %708 = load ptr, ptr %33, align 8, !tbaa !5
  %709 = icmp eq ptr %708, null
  br i1 %709, label %711, label %710

710:                                              ; preds = %707
  call void @_ZdaPv(ptr noundef %708) #12
  br label %711

711:                                              ; preds = %710, %707
  call void @llvm.lifetime.end.p0(i64 4, ptr %44) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %40) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %39) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %34) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %33) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %32) #10
  store i32 0, ptr %13, align 4
  br label %712

712:                                              ; preds = %711, %455
  call void @llvm.lifetime.end.p0(i64 4, ptr %31) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %30) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #10
  %713 = load i32, ptr %13, align 4
  switch i32 %713, label %810 [
    i32 0, label %714
    i32 22, label %715
  ]

714:                                              ; preds = %712
  br label %715

715:                                              ; preds = %714, %712
  %716 = load i32, ptr %24, align 4, !tbaa !24
  %717 = add i32 %716, 1
  store i32 %717, ptr %24, align 4, !tbaa !24
  br label %294, !llvm.loop !43

718:                                              ; preds = %300
  %719 = load float, ptr %23, align 4, !tbaa !25
  %720 = load float, ptr %20, align 4, !tbaa !25
  %721 = fcmp ogt float %719, %720
  br i1 %721, label %722, label %725

722:                                              ; preds = %718
  %723 = load i32, ptr %22, align 4, !tbaa !24
  store i32 %723, ptr %19, align 4, !tbaa !24
  %724 = load float, ptr %23, align 4, !tbaa !25
  store float %724, ptr %20, align 4, !tbaa !25
  br label %725

725:                                              ; preds = %722, %718
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #10
  br label %726

726:                                              ; preds = %725
  %727 = load i32, ptr %22, align 4, !tbaa !24
  %728 = add i32 %727, 1
  store i32 %728, ptr %22, align 4, !tbaa !24
  br label %286, !llvm.loop !44

729:                                              ; preds = %292
  %730 = load float, ptr %20, align 4, !tbaa !25
  %731 = load float, ptr %9, align 4, !tbaa !25
  %732 = fcmp ogt float %730, %731
  br i1 %732, label %733, label %783

733:                                              ; preds = %729
  call void @llvm.lifetime.start.p0(i64 8, ptr %46) #10
  store ptr null, ptr %46, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %47) #10
  %734 = load ptr, ptr %4, align 8, !tbaa !5
  %735 = load ptr, ptr %15, align 8, !tbaa !5
  %736 = load i32, ptr %19, align 4, !tbaa !24
  %737 = load ptr, ptr %16, align 8, !tbaa !5
  %738 = load i32, ptr %19, align 4, !tbaa !24
  %739 = zext i32 %738 to i64
  %740 = getelementptr inbounds i32, ptr %737, i64 %739
  %741 = load i32, ptr %740, align 4, !tbaa !24
  %742 = call i32 @pomdp_belief_update_cpu(ptr noundef %734, ptr noundef %735, i32 noundef %736, i32 noundef %741, ptr noundef nonnull align 8 dereferenceable(8) %46)
  store i32 %742, ptr %47, align 4, !tbaa !24
  %743 = load i32, ptr %47, align 4, !tbaa !24
  %744 = icmp eq i32 %743, 0
  br i1 %744, label %745, label %759

745:                                              ; preds = %733
  %746 = load ptr, ptr %7, align 8, !tbaa !5
  %747 = load ptr, ptr %4, align 8, !tbaa !5
  %748 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %747, i32 0, i32 0
  %749 = load i32, ptr %748, align 8, !tbaa !9
  %750 = mul i32 0, %749
  %751 = zext i32 %750 to i64
  %752 = getelementptr inbounds float, ptr %746, i64 %751
  %753 = load ptr, ptr %46, align 8, !tbaa !5
  %754 = load ptr, ptr %4, align 8, !tbaa !5
  %755 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %754, i32 0, i32 0
  %756 = load i32, ptr %755, align 8, !tbaa !9
  %757 = zext i32 %756 to i64
  %758 = mul i64 %757, 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %752, ptr align 4 %753, i64 %758, i1 false)
  br label %773

759:                                              ; preds = %733
  %760 = load ptr, ptr %7, align 8, !tbaa !5
  %761 = load ptr, ptr %4, align 8, !tbaa !5
  %762 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %761, i32 0, i32 0
  %763 = load i32, ptr %762, align 8, !tbaa !9
  %764 = mul i32 0, %763
  %765 = zext i32 %764 to i64
  %766 = getelementptr inbounds float, ptr %760, i64 %765
  %767 = load ptr, ptr %15, align 8, !tbaa !5
  %768 = load ptr, ptr %4, align 8, !tbaa !5
  %769 = getelementptr inbounds %"struct.nova::NovaPOMDP", ptr %768, i32 0, i32 0
  %770 = load i32, ptr %769, align 8, !tbaa !9
  %771 = zext i32 %770 to i64
  %772 = mul i64 %771, 4
  call void @llvm.memcpy.p0.p0.i64(ptr align 4 %766, ptr align 4 %767, i64 %772, i1 false)
  br label %773

773:                                              ; preds = %759, %745
  %774 = load ptr, ptr %46, align 8, !tbaa !5
  %775 = icmp ne ptr %774, null
  br i1 %775, label %776, label %781

776:                                              ; preds = %773
  %777 = load ptr, ptr %46, align 8, !tbaa !5
  %778 = icmp eq ptr %777, null
  br i1 %778, label %780, label %779

779:                                              ; preds = %776
  call void @_ZdaPv(ptr noundef %777) #12
  br label %780

780:                                              ; preds = %779, %776
  br label %781

781:                                              ; preds = %780, %773
  %782 = load float, ptr %20, align 4, !tbaa !25
  store float %782, ptr %9, align 4, !tbaa !25
  call void @llvm.lifetime.end.p0(i64 4, ptr %47) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %46) #10
  br label %783

783:                                              ; preds = %781, %729
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #10
  br label %784

784:                                              ; preds = %783
  %785 = load i32, ptr %18, align 4, !tbaa !24
  %786 = add i32 %785, 1
  store i32 %786, ptr %18, align 4, !tbaa !24
  br label %254, !llvm.loop !45

787:                                              ; preds = %260
  %788 = load ptr, ptr %15, align 8, !tbaa !5
  %789 = icmp eq ptr %788, null
  br i1 %789, label %791, label %790

790:                                              ; preds = %787
  call void @_ZdaPv(ptr noundef %788) #12
  br label %791

791:                                              ; preds = %790, %787
  %792 = load ptr, ptr %16, align 8, !tbaa !5
  %793 = icmp eq ptr %792, null
  br i1 %793, label %795, label %794

794:                                              ; preds = %791
  call void @_ZdaPv(ptr noundef %792) #12
  br label %795

795:                                              ; preds = %794, %791
  %796 = load ptr, ptr %17, align 8, !tbaa !5
  %797 = icmp eq ptr %796, null
  br i1 %797, label %799, label %798

798:                                              ; preds = %795
  call void @_ZdaPv(ptr noundef %796) #12
  br label %799

799:                                              ; preds = %798, %795
  %800 = load ptr, ptr %4, align 8, !tbaa !5
  %801 = load i32, ptr %6, align 4, !tbaa !24
  %802 = load ptr, ptr %7, align 8, !tbaa !5
  %803 = call i32 @pomdp_add_new_raw_beliefs_cpu(ptr noundef %800, i32 noundef %801, ptr noundef %802)
  %804 = load ptr, ptr %7, align 8, !tbaa !5
  %805 = icmp eq ptr %804, null
  br i1 %805, label %807, label %806

806:                                              ; preds = %799
  call void @_ZdaPv(ptr noundef %804) #12
  br label %807

807:                                              ; preds = %806, %799
  store i32 0, ptr %3, align 4
  store i32 1, ptr %13, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %17) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #10
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #10
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #10
  br label %808

808:                                              ; preds = %807, %110
  %809 = load i32, ptr %3, align 4
  ret i32 %809

810:                                              ; preds = %712
  unreachable
}

attributes #0 = { 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 #1 = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #3 = { 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 #4 = { nobuiltin 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 #5 = { "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 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #7 = { nobuiltin 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 = { 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 #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 = { nounwind }
attributes #11 = { builtin allocsize(0) }
attributes #12 = { builtin nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C++ TBAA"}
!9 = !{!10, !11, i64 0}
!10 = !{!"_ZTSN4nova9NovaPOMDPE", !11, i64 0, !11, i64 4, !11, i64 8, !11, i64 12, !11, i64 16, !11, i64 20, !12, i64 24, !11, i64 28, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !6, i64 64, !6, i64 72, !6, i64 80, !6, i64 88, !6, i64 96, !6, i64 104, !6, i64 112, !6, i64 120}
!11 = !{!"int", !7, i64 0}
!12 = !{!"float", !7, i64 0}
!13 = !{!10, !11, i64 4}
!14 = !{!10, !11, i64 8}
!15 = !{!10, !11, i64 12}
!16 = !{!10, !11, i64 16}
!17 = !{!10, !11, i64 20}
!18 = !{!10, !6, i64 32}
!19 = !{!10, !6, i64 40}
!20 = !{!10, !6, i64 48}
!21 = !{!10, !6, i64 56}
!22 = !{!10, !6, i64 64}
!23 = !{!10, !6, i64 72}
!24 = !{!11, !11, i64 0}
!25 = !{!12, !12, i64 0}
!26 = distinct !{!26, !27}
!27 = !{!"llvm.loop.mustprogress"}
!28 = distinct !{!28, !27}
!29 = distinct !{!29, !27}
!30 = distinct !{!30, !27}
!31 = distinct !{!31, !27}
!32 = distinct !{!32, !27}
!33 = distinct !{!33, !27}
!34 = distinct !{!34, !27}
!35 = !{!36, !11, i64 8}
!36 = !{!"_ZTSN4nova21NovaPOMDPAlphaVectorsE", !11, i64 0, !11, i64 4, !11, i64 8, !6, i64 16, !6, i64 24}
!37 = !{!36, !11, i64 0}
!38 = !{!36, !6, i64 16}
!39 = distinct !{!39, !27}
!40 = distinct !{!40, !27}
!41 = !{!10, !12, i64 24}
!42 = distinct !{!42, !27}
!43 = distinct !{!43, !27}
!44 = distinct !{!44, !27}
!45 = distinct !{!45, !27}


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

@stderr = external local_unnamed_addr global ptr, align 8
@.str.1 = external hidden unnamed_addr constant [19 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [34 x i8], align 1

; Function Attrs: mustprogress nounwind uwtable
declare dso_local noundef i32 @_ZN4nova33pomdp_expand_construct_belief_cpuEPKNS_9NovaPOMDPEjPf(ptr noundef, i32 noundef, ptr noundef) local_unnamed_addr #0

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

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

; Function Attrs: mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none)
declare float @llvm.fmuladd.f32(float, float, float) #2

; Function Attrs: nofree nounwind
declare noundef i32 @fprintf(ptr nocapture noundef, ptr nocapture noundef readonly, ...) local_unnamed_addr #3

; Function Attrs: nobuiltin allocsize(0)
declare noundef nonnull ptr @_Znam(i64 noundef) local_unnamed_addr #4

declare i32 @pomdp_belief_update_cpu(ptr noundef, ptr noundef, i32 noundef, i32 noundef, ptr noundef nonnull align 8 dereferenceable(8)) local_unnamed_addr #5

; Function Attrs: mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite)
declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #6

; Function Attrs: nobuiltin nounwind
declare void @_ZdaPv(ptr noundef) local_unnamed_addr #7

declare i32 @pomdp_add_new_raw_beliefs_cpu(ptr noundef, i32 noundef, ptr noundef) local_unnamed_addr #5

; Function Attrs: inlinehint mustprogress nounwind uwtable
declare dso_local noundef float @_ZSt4fabsf(float noundef) local_unnamed_addr #8

; Function Attrs: mustprogress uwtable
define dso_local range(i32 0, 2) i32 @pomdp_expand_pema_cpu(ptr noundef %0, ptr nocapture noundef readonly %1) local_unnamed_addr #9 {
  %3 = alloca ptr, align 8
  %4 = alloca ptr, align 8
  %5 = icmp eq ptr %0, null
  br i1 %5, label %53, label %6

6:                                                ; preds = %2
  %7 = load i32, ptr %0, align 8, !tbaa !5
  %8 = icmp eq i32 %7, 0
  br i1 %8, label %53, label %9

9:                                                ; preds = %6
  %10 = getelementptr inbounds i8, ptr %0, i64 4
  %11 = load i32, ptr %10, align 4, !tbaa !12
  %12 = icmp eq i32 %11, 0
  br i1 %12, label %53, label %13

13:                                               ; preds = %9
  %14 = getelementptr inbounds i8, ptr %0, i64 8
  %15 = load i32, ptr %14, align 8, !tbaa !13
  %16 = icmp eq i32 %15, 0
  br i1 %16, label %53, label %17

17:                                               ; preds = %13
  %18 = getelementptr inbounds i8, ptr %0, i64 12
  %19 = load i32, ptr %18, align 4, !tbaa !14
  %20 = icmp eq i32 %19, 0
  br i1 %20, label %53, label %21

21:                                               ; preds = %17
  %22 = getelementptr inbounds i8, ptr %0, i64 16
  %23 = load i32, ptr %22, align 8, !tbaa !15
  %24 = icmp eq i32 %23, 0
  br i1 %24, label %53, label %25

25:                                               ; preds = %21
  %26 = getelementptr inbounds i8, ptr %0, i64 20
  %27 = load i32, ptr %26, align 4, !tbaa !16
  %28 = icmp eq i32 %27, 0
  br i1 %28, label %53, label %29

29:                                               ; preds = %25
  %30 = getelementptr inbounds i8, ptr %0, i64 32
  %31 = load ptr, ptr %30, align 8, !tbaa !17
  %32 = icmp eq ptr %31, null
  br i1 %32, label %53, label %33

33:                                               ; preds = %29
  %34 = getelementptr inbounds i8, ptr %0, i64 40
  %35 = load ptr, ptr %34, align 8, !tbaa !18
  %36 = icmp eq ptr %35, null
  br i1 %36, label %53, label %37

37:                                               ; preds = %33
  %38 = getelementptr inbounds i8, ptr %0, i64 48
  %39 = load ptr, ptr %38, align 8, !tbaa !19
  %40 = icmp eq ptr %39, null
  br i1 %40, label %53, label %41

41:                                               ; preds = %37
  %42 = getelementptr inbounds i8, ptr %0, i64 56
  %43 = load ptr, ptr %42, align 8, !tbaa !20
  %44 = icmp eq ptr %43, null
  br i1 %44, label %53, label %45

45:                                               ; preds = %41
  %46 = getelementptr inbounds i8, ptr %0, i64 64
  %47 = load ptr, ptr %46, align 8, !tbaa !21
  %48 = icmp eq ptr %47, null
  br i1 %48, label %53, label %49

49:                                               ; preds = %45
  %50 = getelementptr inbounds i8, ptr %0, i64 72
  %51 = load ptr, ptr %50, align 8, !tbaa !22
  %52 = icmp eq ptr %51, null
  br i1 %52, label %53, label %.preheader290.preheader

53:                                               ; preds = %49, %45, %41, %37, %33, %29, %25, %21, %17, %13, %9, %6, %2
  %54 = load ptr, ptr @stderr, align 8, !tbaa !23
  %55 = tail call i32 (ptr, ptr, ...) @fprintf(ptr noundef %54, ptr noundef nonnull @.str.3, ptr noundef nonnull @.str.1) #11
  br label %311

.preheader290.preheader:                          ; preds = %49
  %56 = zext i32 %7 to i64
  %57 = shl nuw nsw i64 %56, 2
  %58 = tail call noalias noundef nonnull ptr @_Znam(i64 noundef %57) #12
  tail call void @llvm.memset.p0.i64(ptr nonnull align 4 %58, i8 0, i64 %57, i1 false), !tbaa !24
  %wide.trip.count = zext i32 %15 to i64
  %xtraiter = and i64 %wide.trip.count, 1
  %59 = icmp eq i32 %15, 1
  %unroll_iter = and i64 %wide.trip.count, 4294967294
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br label %.preheader290

.preheader290:                                    ; preds = %.preheader290.preheader, %75
  %.0234298 = phi float [ %.2236.lcssa, %75 ], [ -1.000000e+10, %.preheader290.preheader ]
  %.0237297 = phi float [ %.2239.lcssa, %75 ], [ 1.000000e+10, %.preheader290.preheader ]
  %.0240296 = phi i32 [ %76, %75 ], [ 0, %.preheader290.preheader ]
  %60 = mul i32 %.0240296, %15
  br i1 %59, label %.unr-lcssa, label %.preheader290.new

.lr.ph351:                                        ; preds = %75
  %61 = tail call noalias noundef nonnull ptr @_Znam(i64 noundef %57) #12
  %62 = shl nuw nsw i64 %wide.trip.count, 2
  %63 = tail call noalias noundef nonnull ptr @_Znam(i64 noundef %62) #12
  %64 = tail call noalias noundef nonnull ptr @_Znam(i64 noundef %62) #12
  %65 = getelementptr inbounds i8, ptr %1, i64 8
  %66 = getelementptr inbounds i8, ptr %1, i64 16
  %67 = getelementptr inbounds i8, ptr %0, i64 24
  br label %92

.unr-lcssa:                                       ; preds = %.preheader290.new, %.preheader290
  %.2236.lcssa.ph = phi float [ poison, %.preheader290 ], [ %.2236.1, %.preheader290.new ]
  %.2239.lcssa.ph = phi float [ poison, %.preheader290 ], [ %.2239.1, %.preheader290.new ]
  %indvars.iv.unr = phi i64 [ 0, %.preheader290 ], [ %indvars.iv.next.1, %.preheader290.new ]
  %.1235295.unr = phi float [ %.0234298, %.preheader290 ], [ %.2236.1, %.preheader290.new ]
  %.1238294.unr = phi float [ %.0237297, %.preheader290 ], [ %.2239.1, %.preheader290.new ]
  br i1 %lcmp.mod.not, label %75, label %.epilog-lcssa

.epilog-lcssa:                                    ; preds = %.unr-lcssa
  %68 = trunc nuw i64 %indvars.iv.unr to i32
  %69 = add i32 %60, %68
  %70 = zext i32 %69 to i64
  %71 = getelementptr inbounds float, ptr %43, i64 %70
  %72 = load float, ptr %71, align 4, !tbaa !24
  %73 = fcmp olt float %.1235295.unr, %72
  %.2236.epil = select i1 %73, float %72, float %.1235295.unr
  %74 = fcmp ogt float %.1238294.unr, %72
  %.2239.epil = select i1 %74, float %72, float %.1238294.unr
  br label %75

75:                                               ; preds = %.unr-lcssa, %.epilog-lcssa
  %.2236.lcssa = phi float [ %.2236.lcssa.ph, %.unr-lcssa ], [ %.2236.epil, %.epilog-lcssa ]
  %.2239.lcssa = phi float [ %.2239.lcssa.ph, %.unr-lcssa ], [ %.2239.epil, %.epilog-lcssa ]
  %76 = add nuw i32 %.0240296, 1
  %exitcond371.not = icmp eq i32 %76, %7
  br i1 %exitcond371.not, label %.lr.ph351, label %.preheader290, !llvm.loop !25

.preheader290.new:                                ; preds = %.preheader290, %.preheader290.new
  %indvars.iv = phi i64 [ %indvars.iv.next.1, %.preheader290.new ], [ 0, %.preheader290 ]
  %.1235295 = phi float [ %.2236.1, %.preheader290.new ], [ %.0234298, %.preheader290 ]
  %.1238294 = phi float [ %.2239.1, %.preheader290.new ], [ %.0237297, %.preheader290 ]
  %niter = phi i64 [ %niter.next.1, %.preheader290.new ], [ 0, %.preheader290 ]
  %77 = trunc nuw i64 %indvars.iv to i32
  %78 = add i32 %60, %77
  %79 = zext i32 %78 to i64
  %80 = getelementptr inbounds float, ptr %43, i64 %79
  %81 = load float, ptr %80, align 4, !tbaa !24
  %82 = fcmp olt float %.1235295, %81
  %.2236 = select i1 %82, float %81, float %.1235295
  %83 = fcmp ogt float %.1238294, %81
  %.2239 = select i1 %83, float %81, float %.1238294
  %84 = trunc i64 %indvars.iv to i32
  %85 = or disjoint i32 %84, 1
  %86 = add i32 %60, %85
  %87 = zext i32 %86 to i64
  %88 = getelementptr inbounds float, ptr %43, i64 %87
  %89 = load float, ptr %88, align 4, !tbaa !24
  %90 = fcmp olt float %.2236, %89
  %.2236.1 = select i1 %90, float %89, float %.2236
  %91 = fcmp ogt float %.2239, %89
  %.2239.1 = select i1 %91, float %89, float %.2239
  %indvars.iv.next.1 = add nuw nsw i64 %indvars.iv, 2
  %niter.next.1 = add i64 %niter, 2
  %niter.ncmp.1 = icmp eq i64 %niter.next.1, %unroll_iter
  br i1 %niter.ncmp.1, label %.unr-lcssa, label %.preheader290.new, !llvm.loop !27

92:                                               ; preds = %.lr.ph351, %306
  %.0229349 = phi float [ -1.000000e+10, %.lr.ph351 ], [ %.1230, %306 ]
  %.0257347 = phi i32 [ 0, %.lr.ph351 ], [ %307, %306 ]
  %93 = call noundef i32 @_ZN4nova33pomdp_expand_construct_belief_cpuEPKNS_9NovaPOMDPEjPf(ptr noundef nonnull %0, i32 noundef %.0257347, ptr noundef nonnull %61)
  %94 = load i32, ptr %14, align 8, !tbaa !13
  %.not354 = icmp eq i32 %94, 0
  br i1 %.not354, label %._crit_edge342, label %.lr.ph.preheader

.lr.ph.preheader:                                 ; preds = %92
  %95 = zext i32 %94 to i64
  %96 = shl nuw nsw i64 %95, 2
  call void @llvm.memset.p0.i64(ptr nonnull align 4 %63, i8 0, i64 %96, i1 false), !tbaa !28
  %min.iters.check423 = icmp ult i32 %94, 8
  br i1 %min.iters.check423, label %.lr.ph.preheader434, label %vector.ph424

.lr.ph.preheader434:                              ; preds = %middle.block421, %.lr.ph.preheader
  %indvars.iv372.ph = phi i64 [ 0, %.lr.ph.preheader ], [ %n.vec426, %middle.block421 ]
  br label %.lr.ph

vector.ph424:                                     ; preds = %.lr.ph.preheader
  %n.vec426 = and i64 %95, 4294967288
  br label %vector.body428

vector.body428:                                   ; preds = %vector.body428, %vector.ph424
  %index429 = phi i64 [ 0, %vector.ph424 ], [ %index.next430, %vector.body428 ]
  %97 = getelementptr inbounds float, ptr %64, i64 %index429
  %98 = getelementptr inbounds i8, ptr %97, i64 16
  store <4 x float> <float -1.000000e+10, float -1.000000e+10, float -1.000000e+10, float -1.000000e+10>, ptr %97, align 4, !tbaa !24
  store <4 x float> <float -1.000000e+10, float -1.000000e+10, float -1.000000e+10, float -1.000000e+10>, ptr %98, align 4, !tbaa !24
  %index.next430 = add nuw i64 %index429, 8
  %99 = icmp eq i64 %index.next430, %n.vec426
  br i1 %99, label %middle.block421, label %vector.body428, !llvm.loop !29

middle.block421:                                  ; preds = %vector.body428
  %cmp.n431 = icmp eq i64 %n.vec426, %95
  br i1 %cmp.n431, label %.preheader289, label %.lr.ph.preheader434

.preheader289:                                    ; preds = %.lr.ph, %middle.block421
  br i1 %.not354, label %._crit_edge342, label %.preheader288.lr.ph

.preheader288.lr.ph:                              ; preds = %.preheader289
  %100 = load i32, ptr %18, align 4, !tbaa !14
  %.not356 = icmp eq i32 %100, 0
  br i1 %.not356, label %.preheader288.us.preheader, label %.preheader288

.preheader288.us.preheader:                       ; preds = %.preheader288.lr.ph
  %xtraiter446 = and i32 %94, 3
  %101 = icmp ult i32 %94, 4
  br i1 %101, label %._crit_edge342.loopexit.unr-lcssa, label %.preheader288.us.preheader.new

.preheader288.us.preheader.new:                   ; preds = %.preheader288.us.preheader
  %unroll_iter450 = and i32 %94, -4
  br label %.preheader288.us

.preheader288.us:                                 ; preds = %.preheader288.us, %.preheader288.us.preheader.new
  %.0251341.us = phi i32 [ 0, %.preheader288.us.preheader.new ], [ %103, %.preheader288.us ]
  %.0253340.us = phi float [ -1.000000e+10, %.preheader288.us.preheader.new ], [ %.1254.us, %.preheader288.us ]
  %.0255339.us = phi i32 [ 0, %.preheader288.us.preheader.new ], [ %.1256.us, %.preheader288.us ]
  %niter451 = phi i32 [ 0, %.preheader288.us.preheader.new ], [ %niter451.next.3, %.preheader288.us ]
  %102 = fcmp olt float %.0253340.us, 0.000000e+00
  %.1256.us = select i1 %102, i32 %.0251341.us, i32 %.0255339.us
  %.1254.us = select i1 %102, float 0.000000e+00, float %.0253340.us
  %103 = add nuw i32 %.0251341.us, 4
  %niter451.next.3 = add i32 %niter451, 4
  %niter451.ncmp.3 = icmp eq i32 %niter451.next.3, %unroll_iter450
  br i1 %niter451.ncmp.3, label %._crit_edge342.loopexit.unr-lcssa, label %.preheader288.us, !llvm.loop !32

.lr.ph:                                           ; preds = %.lr.ph.preheader434, %.lr.ph
  %indvars.iv372 = phi i64 [ %indvars.iv.next373, %.lr.ph ], [ %indvars.iv372.ph, %.lr.ph.preheader434 ]
  %104 = getelementptr inbounds float, ptr %64, i64 %indvars.iv372
  store float -1.000000e+10, ptr %104, align 4, !tbaa !24
  %indvars.iv.next373 = add nuw nsw i64 %indvars.iv372, 1
  %exitcond376.not = icmp eq i64 %indvars.iv.next373, %95
  br i1 %exitcond376.not, label %.preheader289, label %.lr.ph, !llvm.loop !33

.preheader288:                                    ; preds = %.preheader288.lr.ph, %._crit_edge337
  %105 = phi i32 [ %118, %._crit_edge337 ], [ %94, %.preheader288.lr.ph ]
  %106 = phi i32 [ %119, %._crit_edge337 ], [ %100, %.preheader288.lr.ph ]
  %indvars.iv401 = phi i64 [ %indvars.iv.next402, %._crit_edge337 ], [ 0, %.preheader288.lr.ph ]
  %.0253340 = phi float [ %.1254, %._crit_edge337 ], [ -1.000000e+10, %.preheader288.lr.ph ]
  %.0255339 = phi i32 [ %.1256, %._crit_edge337 ], [ 0, %.preheader288.lr.ph ]
  %.not357 = icmp eq i32 %106, 0
  br i1 %.not357, label %.preheader288.._crit_edge337_crit_edge, label %.preheader287.lr.ph

.preheader288.._crit_edge337_crit_edge:           ; preds = %.preheader288
  %.pre405 = trunc nuw i64 %indvars.iv401 to i32
  br label %._crit_edge337

.preheader287.lr.ph:                              ; preds = %.preheader288
  %107 = getelementptr inbounds float, ptr %64, i64 %indvars.iv401
  %108 = getelementptr inbounds i32, ptr %63, i64 %indvars.iv401
  %109 = trunc nuw i64 %indvars.iv401 to i32
  %110 = trunc nuw i64 %indvars.iv401 to i32
  br label %.preheader287

._crit_edge342.loopexit.unr-lcssa:                ; preds = %.preheader288.us, %.preheader288.us.preheader
  %.1256.us.lcssa.ph = phi i32 [ poison, %.preheader288.us.preheader ], [ %.1256.us, %.preheader288.us ]
  %.1254.us.lcssa.ph = phi float [ poison, %.preheader288.us.preheader ], [ %.1254.us, %.preheader288.us ]
  %.0251341.us.unr = phi i32 [ 0, %.preheader288.us.preheader ], [ %103, %.preheader288.us ]
  %.0253340.us.unr = phi float [ -1.000000e+10, %.preheader288.us.preheader ], [ %.1254.us, %.preheader288.us ]
  %.0255339.us.unr = phi i32 [ 0, %.preheader288.us.preheader ], [ %.1256.us, %.preheader288.us ]
  %lcmp.mod447.not = icmp eq i32 %xtraiter446, 0
  br i1 %lcmp.mod447.not, label %._crit_edge342, label %.preheader288.us.epil

.preheader288.us.epil:                            ; preds = %._crit_edge342.loopexit.unr-lcssa, %.preheader288.us.epil
  %.0251341.us.epil = phi i32 [ %112, %.preheader288.us.epil ], [ %.0251341.us.unr, %._crit_edge342.loopexit.unr-lcssa ]
  %.0253340.us.epil = phi float [ %.1254.us.epil, %.preheader288.us.epil ], [ %.0253340.us.unr, %._crit_edge342.loopexit.unr-lcssa ]
  %.0255339.us.epil = phi i32 [ %.1256.us.epil, %.preheader288.us.epil ], [ %.0255339.us.unr, %._crit_edge342.loopexit.unr-lcssa ]
  %epil.iter = phi i32 [ %epil.iter.next, %.preheader288.us.epil ], [ 0, %._crit_edge342.loopexit.unr-lcssa ]
  %111 = fcmp olt float %.0253340.us.epil, 0.000000e+00
  %.1256.us.epil = select i1 %111, i32 %.0251341.us.epil, i32 %.0255339.us.epil
  %.1254.us.epil = select i1 %111, float 0.000000e+00, float %.0253340.us.epil
  %112 = add nuw i32 %.0251341.us.epil, 1
  %epil.iter.next = add i32 %epil.iter, 1
  %epil.iter.cmp.not = icmp eq i32 %epil.iter.next, %xtraiter446
  br i1 %epil.iter.cmp.not, label %._crit_edge342, label %.preheader288.us.epil, !llvm.loop !34

._crit_edge342:                                   ; preds = %._crit_edge337, %._crit_edge342.loopexit.unr-lcssa, %.preheader288.us.epil, %92, %.preheader289
  %.0255.lcssa = phi i32 [ 0, %.preheader289 ], [ 0, %92 ], [ %.1256.us.lcssa.ph, %._crit_edge342.loopexit.unr-lcssa ], [ %.1256.us.epil, %.preheader288.us.epil ], [ %.1256, %._crit_edge337 ]
  %.0253.lcssa = phi float [ -1.000000e+10, %.preheader289 ], [ -1.000000e+10, %92 ], [ %.1254.us.lcssa.ph, %._crit_edge342.loopexit.unr-lcssa ], [ %.1254.us.epil, %.preheader288.us.epil ], [ %.1254, %._crit_edge337 ]
  %113 = fcmp ogt float %.0253.lcssa, %.0229349
  br i1 %113, label %288, label %306

.preheader287:                                    ; preds = %.preheader287.lr.ph, %284
  %114 = phi i32 [ %106, %.preheader287.lr.ph ], [ %286, %284 ]
  %.0248336 = phi i32 [ 0, %.preheader287.lr.ph ], [ %285, %284 ]
  %.0249335 = phi float [ 0.000000e+00, %.preheader287.lr.ph ], [ %.1250, %284 ]
  %115 = load i32, ptr %26, align 4, !tbaa !16
  %.not358 = icmp eq i32 %115, 0
  br i1 %.not358, label %.thread282, label %.lr.ph307

.lr.ph307:                                        ; preds = %.preheader287
  %116 = load ptr, ptr %46, align 8, !tbaa !21
  %117 = mul i32 %115, %.0257347
  %wide.trip.count385 = zext i32 %115 to i64
  br label %123

._crit_edge337.loopexit:                          ; preds = %284
  %.pre = load i32, ptr %14, align 8, !tbaa !13
  br label %._crit_edge337

._crit_edge337:                                   ; preds = %.preheader288.._crit_edge337_crit_edge, %._crit_edge337.loopexit
  %.pre-phi = phi i32 [ %.pre405, %.preheader288.._crit_edge337_crit_edge ], [ %110, %._crit_edge337.loopexit ]
  %118 = phi i32 [ %105, %.preheader288.._crit_edge337_crit_edge ], [ %.pre, %._crit_edge337.loopexit ]
  %119 = phi i32 [ 0, %.preheader288.._crit_edge337_crit_edge ], [ %286, %._crit_edge337.loopexit ]
  %.0249.lcssa = phi float [ 0.000000e+00, %.preheader288.._crit_edge337_crit_edge ], [ %.1250, %._crit_edge337.loopexit ]
  %120 = fcmp ogt float %.0249.lcssa, %.0253340
  %.1256 = select i1 %120, i32 %.pre-phi, i32 %.0255339
  %.1254 = select i1 %120, float %.0249.lcssa, float %.0253340
  %indvars.iv.next402 = add nuw nsw i64 %indvars.iv401, 1
  %121 = zext i32 %118 to i64
  %122 = icmp ult i64 %indvars.iv.next402, %121
  br i1 %122, label %.preheader288, label %._crit_edge342, !llvm.loop !36

123:                                              ; preds = %.lr.ph307, %._crit_edge
  %indvars.iv382 = phi i64 [ 0, %.lr.ph307 ], [ %indvars.iv.next383, %._crit_edge ]
  %.0245305 = phi float [ 0.000000e+00, %.lr.ph307 ], [ %.1246.lcssa, %._crit_edge ]
  %124 = trunc nuw i64 %indvars.iv382 to i32
  %125 = add i32 %117, %124
  %126 = zext i32 %125 to i64
  %127 = getelementptr inbounds i32, ptr %116, i64 %126
  %128 = load i32, ptr %127, align 4, !tbaa !28
  %129 = icmp sgt i32 %128, -1
  br i1 %129, label %.preheader284, label %.thread282

.preheader284:                                    ; preds = %123
  %130 = load i32, ptr %10, align 4, !tbaa !12
  %.not359 = icmp eq i32 %130, 0
  br i1 %.not359, label %._crit_edge, label %.lr.ph302

.lr.ph302:                                        ; preds = %.preheader284
  %131 = load ptr, ptr %30, align 8, !tbaa !17
  %132 = load i32, ptr %14, align 8, !tbaa !13
  %133 = mul i32 %132, %128
  %134 = add i32 %133, %109
  %135 = mul i32 %134, %130
  %wide.trip.count380 = zext i32 %130 to i64
  br label %136

136:                                              ; preds = %.lr.ph302, %143
  %indvars.iv377 = phi i64 [ 0, %.lr.ph302 ], [ %indvars.iv.next378, %143 ]
  %.1246300 = phi float [ %.0245305, %.lr.ph302 ], [ %160, %143 ]
  %137 = trunc nuw i64 %indvars.iv377 to i32
  %138 = add i32 %135, %137
  %139 = zext i32 %138 to i64
  %140 = getelementptr inbounds i32, ptr %131, i64 %139
  %141 = load i32, ptr %140, align 4, !tbaa !28
  %142 = icmp sgt i32 %141, -1
  br i1 %142, label %143, label %._crit_edge

143:                                              ; preds = %136
  %144 = load ptr, ptr %34, align 8, !tbaa !18
  %145 = getelementptr inbounds float, ptr %144, i64 %139
  %146 = load float, ptr %145, align 4, !tbaa !24
  %147 = load ptr, ptr %38, align 8, !tbaa !19
  %148 = load i32, ptr %0, align 8, !tbaa !5
  %149 = mul i32 %148, %109
  %150 = add i32 %149, %141
  %151 = mul i32 %150, %114
  %152 = add i32 %151, %.0248336
  %153 = zext i32 %152 to i64
  %154 = getelementptr inbounds float, ptr %147, i64 %153
  %155 = load float, ptr %154, align 4, !tbaa !24
  %156 = fmul float %146, %155
  %157 = load ptr, ptr %50, align 8, !tbaa !22
  %158 = getelementptr inbounds float, ptr %157, i64 %126
  %159 = load float, ptr %158, align 4, !tbaa !24
  %160 = call float @llvm.fmuladd.f32(float %156, float %159, float %.1246300)
  %indvars.iv.next378 = add nuw nsw i64 %indvars.iv377, 1
  %exitcond381.not = icmp eq i64 %indvars.iv.next378, %wide.trip.count380
  br i1 %exitcond381.not, label %._crit_edge, label %136, !llvm.loop !38

._crit_edge:                                      ; preds = %143, %136, %.preheader284
  %.1246.lcssa = phi float [ %.0245305, %.preheader284 ], [ %.1246300, %136 ], [ %160, %143 ]
  %indvars.iv.next383 = add nuw nsw i64 %indvars.iv382, 1
  %exitcond386.not = icmp eq i64 %indvars.iv.next383, %wide.trip.count385
  br i1 %exitcond386.not, label %.thread282, label %123, !llvm.loop !39

.thread282:                                       ; preds = %._crit_edge, %123, %.preheader287
  %.5 = phi float [ 0.000000e+00, %.preheader287 ], [ %.0245305, %123 ], [ %.1246.lcssa, %._crit_edge ]
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %3) #13
  store ptr null, ptr %3, align 8, !tbaa !23
  %161 = call i32 @pomdp_belief_update_cpu(ptr noundef nonnull %0, ptr noundef nonnull %61, i32 noundef %110, i32 noundef %.0248336, ptr noundef nonnull align 8 dereferenceable(8) %3)
  %.not278 = icmp eq i32 %161, 0
  br i1 %.not278, label %164, label %162

162:                                              ; preds = %.thread282
  %163 = load ptr, ptr %3, align 8, !tbaa !23
  %.not279 = icmp eq ptr %163, null
  br i1 %.not279, label %284, label %.sink.split

164:                                              ; preds = %.thread282
  %165 = load i32, ptr %0, align 8, !tbaa !5
  %166 = zext i32 %165 to i64
  %167 = shl nuw nsw i64 %166, 2
  %168 = call noalias noundef nonnull ptr @_Znam(i64 noundef %167) #12
  %169 = load i32, ptr %22, align 8, !tbaa !15
  %.not360 = icmp eq i32 %169, 0
  br i1 %.not360, label %.preheader286, label %.lr.ph321

.preheader286:                                    ; preds = %248, %164
  %170 = load i32, ptr %65, align 8, !tbaa !40
  %.not362 = icmp eq i32 %170, 0
  br i1 %.not362, label %.preheader285, label %.preheader.lr.ph

.preheader.lr.ph:                                 ; preds = %.preheader286
  %171 = load i32, ptr %1, align 8, !tbaa !42
  %.not363 = icmp eq i32 %171, 0
  br i1 %.not363, label %.preheader285, label %.preheader.lr.ph.split.us

.preheader.lr.ph.split.us:                        ; preds = %.preheader.lr.ph
  %172 = load ptr, ptr %66, align 8, !tbaa !43
  %wide.trip.count393 = zext i32 %171 to i64
  %173 = add nsw i64 %wide.trip.count393, -1
  %min.iters.check = icmp ult i32 %171, 8
  %174 = trunc i64 %173 to i32
  %175 = icmp ugt i64 %173, 4294967295
  %n.vec = and i64 %wide.trip.count393, 4294967288
  %cmp.n = icmp eq i64 %n.vec, %wide.trip.count393
  %xtraiter444 = and i64 %wide.trip.count393, 1
  %lcmp.mod445.not = icmp eq i64 %xtraiter444, 0
  %176 = add nsw i64 %wide.trip.count393, -1
  br label %.preheader.us

.preheader.us:                                    ; preds = %._crit_edge325.us, %.preheader.lr.ph.split.us
  %.0223328.us = phi i32 [ 0, %.preheader.lr.ph.split.us ], [ %226, %._crit_edge325.us ]
  %.0224327.us = phi i32 [ 0, %.preheader.lr.ph.split.us ], [ %.2.us.lcssa, %._crit_edge325.us ]
  %177 = mul i32 %171, %.0223328.us
  br i1 %min.iters.check, label %scalar.ph.preheader, label %vector.scevcheck

vector.scevcheck:                                 ; preds = %.preheader.us
  %178 = mul i32 %171, %.0223328.us
  %179 = xor i32 %178, -1
  %180 = icmp ult i32 %179, %174
  %181 = or i1 %180, %175
  br i1 %181, label %scalar.ph.preheader, label %vector.body

vector.body:                                      ; preds = %vector.scevcheck, %vector.body
  %index = phi i64 [ %index.next, %vector.body ], [ 0, %vector.scevcheck ]
  %vec.phi = phi <4 x i1> [ %193, %vector.body ], [ zeroinitializer, %vector.scevcheck ]
  %vec.phi417 = phi <4 x i1> [ %194, %vector.body ], [ zeroinitializer, %vector.scevcheck ]
  %182 = trunc i64 %index to i32
  %183 = add i32 %177, %182
  %184 = zext i32 %183 to i64
  %185 = getelementptr inbounds float, ptr %172, i64 %184
  %186 = getelementptr inbounds i8, ptr %185, i64 16
  %wide.load = load <4 x float>, ptr %185, align 4, !tbaa !24
  %wide.load418 = load <4 x float>, ptr %186, align 4, !tbaa !24
  %187 = getelementptr inbounds float, ptr %168, i64 %index
  %188 = getelementptr inbounds i8, ptr %187, i64 16
  %wide.load419 = load <4 x float>, ptr %187, align 4, !tbaa !24
  %wide.load420 = load <4 x float>, ptr %188, align 4, !tbaa !24
  %189 = fmul <4 x float> %wide.load, %wide.load419
  %190 = fmul <4 x float> %wide.load418, %wide.load420
  %191 = fcmp olt <4 x float> %189, <float -1.000000e+10, float -1.000000e+10, float -1.000000e+10, float -1.000000e+10>
  %192 = fcmp olt <4 x float> %190, <float -1.000000e+10, float -1.000000e+10, float -1.000000e+10, float -1.000000e+10>
  %193 = or <4 x i1> %vec.phi, %191
  %194 = or <4 x i1> %vec.phi417, %192
  %index.next = add nuw i64 %index, 8
  %195 = icmp eq i64 %index.next, %n.vec
  br i1 %195, label %middle.block, label %vector.body, !llvm.loop !44

middle.block:                                     ; preds = %vector.body
  %bin.rdx = or <4 x i1> %194, %193
  %bin.rdx.fr = freeze <4 x i1> %bin.rdx
  %196 = bitcast <4 x i1> %bin.rdx.fr to i4
  %.not432 = icmp eq i4 %196, 0
  %rdx.select = select i1 %.not432, i32 %.0224327.us, i32 %.0223328.us
  br i1 %cmp.n, label %._crit_edge325.us, label %scalar.ph.preheader

scalar.ph.preheader:                              ; preds = %middle.block, %vector.scevcheck, %.preheader.us
  %indvars.iv390.ph = phi i64 [ 0, %vector.scevcheck ], [ 0, %.preheader.us ], [ %n.vec, %middle.block ]
  %.1225322.us.ph = phi i32 [ %.0224327.us, %vector.scevcheck ], [ %.0224327.us, %.preheader.us ], [ %rdx.select, %middle.block ]
  br i1 %lcmp.mod445.not, label %scalar.ph.prol.loopexit, label %scalar.ph.prol

scalar.ph.prol:                                   ; preds = %scalar.ph.preheader
  %197 = trunc nuw i64 %indvars.iv390.ph to i32
  %198 = add i32 %177, %197
  %199 = zext i32 %198 to i64
  %200 = getelementptr inbounds float, ptr %172, i64 %199
  %201 = load float, ptr %200, align 4, !tbaa !24
  %202 = getelementptr inbounds float, ptr %168, i64 %indvars.iv390.ph
  %203 = load float, ptr %202, align 4, !tbaa !24
  %204 = fmul float %201, %203
  %205 = fcmp olt float %204, -1.000000e+10
  %.2.us.prol = select i1 %205, i32 %.0223328.us, i32 %.1225322.us.ph
  %indvars.iv.next391.prol = or disjoint i64 %indvars.iv390.ph, 1
  br label %scalar.ph.prol.loopexit

scalar.ph.prol.loopexit:                          ; preds = %scalar.ph.prol, %scalar.ph.preheader
  %.2.us.lcssa439.unr = phi i32 [ poison, %scalar.ph.preheader ], [ %.2.us.prol, %scalar.ph.prol ]
  %indvars.iv390.unr = phi i64 [ %indvars.iv390.ph, %scalar.ph.preheader ], [ %indvars.iv.next391.prol, %scalar.ph.prol ]
  %.1225322.us.unr = phi i32 [ %.1225322.us.ph, %scalar.ph.preheader ], [ %.2.us.prol, %scalar.ph.prol ]
  %206 = icmp eq i64 %indvars.iv390.ph, %176
  br i1 %206, label %._crit_edge325.us, label %scalar.ph

scalar.ph:                                        ; preds = %scalar.ph.prol.loopexit, %scalar.ph
  %indvars.iv390 = phi i64 [ %indvars.iv.next391.1, %scalar.ph ], [ %indvars.iv390.unr, %scalar.ph.prol.loopexit ]
  %.1225322.us = phi i32 [ %.2.us.1, %scalar.ph ], [ %.1225322.us.unr, %scalar.ph.prol.loopexit ]
  %207 = trunc nuw i64 %indvars.iv390 to i32
  %208 = add i32 %177, %207
  %209 = zext i32 %208 to i64
  %210 = getelementptr inbounds float, ptr %172, i64 %209
  %211 = load float, ptr %210, align 4, !tbaa !24
  %212 = getelementptr inbounds float, ptr %168, i64 %indvars.iv390
  %213 = load float, ptr %212, align 4, !tbaa !24
  %214 = fmul float %211, %213
  %215 = fcmp olt float %214, -1.000000e+10
  %indvars.iv.next391 = add nuw nsw i64 %indvars.iv390, 1
  %216 = trunc nuw i64 %indvars.iv.next391 to i32
  %217 = add i32 %177, %216
  %218 = zext i32 %217 to i64
  %219 = getelementptr inbounds float, ptr %172, i64 %218
  %220 = load float, ptr %219, align 4, !tbaa !24
  %221 = getelementptr inbounds float, ptr %168, i64 %indvars.iv.next391
  %222 = load float, ptr %221, align 4, !tbaa !24
  %223 = fmul float %220, %222
  %224 = fcmp olt float %223, -1.000000e+10
  %225 = select i1 %224, i1 true, i1 %215
  %.2.us.1 = select i1 %225, i32 %.0223328.us, i32 %.1225322.us
  %indvars.iv.next391.1 = add nuw nsw i64 %indvars.iv390, 2
  %exitcond394.not.1 = icmp eq i64 %indvars.iv.next391.1, %wide.trip.count393
  br i1 %exitcond394.not.1, label %._crit_edge325.us, label %scalar.ph, !llvm.loop !45

._crit_edge325.us:                                ; preds = %scalar.ph.prol.loopexit, %scalar.ph, %middle.block
  %.2.us.lcssa = phi i32 [ %rdx.select, %middle.block ], [ %.2.us.lcssa439.unr, %scalar.ph.prol.loopexit ], [ %.2.us.1, %scalar.ph ]
  %226 = add nuw i32 %.0223328.us, 1
  %exitcond395.not = icmp eq i32 %226, %170
  br i1 %exitcond395.not, label %.preheader285, label %.preheader.us, !llvm.loop !46

.lr.ph321:                                        ; preds = %164, %248
  %.0231319 = phi i32 [ %249, %248 ], [ 0, %164 ]
  %.0232318 = phi float [ %.1233, %248 ], [ 1.000000e+10, %164 ]
  %227 = load i32, ptr %0, align 8, !tbaa !5
  %228 = zext i32 %227 to i64
  %229 = shl nuw nsw i64 %228, 2
  %230 = call noalias noundef nonnull ptr @_Znam(i64 noundef %229) #12
  %231 = call noundef i32 @_ZN4nova33pomdp_expand_construct_belief_cpuEPKNS_9NovaPOMDPEjPf(ptr noundef nonnull %0, i32 noundef %.0231319, ptr noundef nonnull %230)
  %232 = load i32, ptr %0, align 8, !tbaa !5
  %.not361 = icmp eq i32 %232, 0
  br i1 %.not361, label %._crit_edge315, label %.lr.ph314

._crit_edge315:                                   ; preds = %.lr.ph314, %.lr.ph321
  %.0228.lcssa = phi float [ 0.000000e+00, %.lr.ph321 ], [ %241, %.lr.ph314 ]
  %.lcssa = phi i32 [ 0, %.lr.ph321 ], [ %242, %.lr.ph314 ]
  %233 = fcmp olt float %.0228.lcssa, %.0232318
  br i1 %233, label %245, label %248

.lr.ph314:                                        ; preds = %.lr.ph321, %.lr.ph314
  %indvars.iv387 = phi i64 [ %indvars.iv.next388, %.lr.ph314 ], [ 0, %.lr.ph321 ]
  %.0228311 = phi float [ %241, %.lr.ph314 ], [ 0.000000e+00, %.lr.ph321 ]
  %234 = load ptr, ptr %3, align 8, !tbaa !23
  %235 = getelementptr inbounds float, ptr %234, i64 %indvars.iv387
  %236 = load float, ptr %235, align 4, !tbaa !24
  %237 = getelementptr inbounds float, ptr %230, i64 %indvars.iv387
  %238 = load float, ptr %237, align 4, !tbaa !24
  %239 = fsub float %236, %238
  %240 = call noundef float @_ZSt4fabsf(float noundef %239)
  %241 = fadd float %.0228311, %240
  %indvars.iv.next388 = add nuw nsw i64 %indvars.iv387, 1
  %242 = load i32, ptr %0, align 8, !tbaa !5
  %243 = zext i32 %242 to i64
  %244 = icmp ult i64 %indvars.iv.next388, %243
  br i1 %244, label %.lr.ph314, label %._crit_edge315, !llvm.loop !47

245:                                              ; preds = %._crit_edge315
  %246 = zext i32 %.lcssa to i64
  %247 = shl nuw nsw i64 %246, 2
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 4 %168, ptr nonnull align 4 %230, i64 %247, i1 false)
  br label %248

248:                                              ; preds = %._crit_edge315, %245
  %.1233 = phi float [ %.0228.lcssa, %245 ], [ %.0232318, %._crit_edge315 ]
  call void @_ZdaPv(ptr noundef nonnull %230) #14
  %249 = add nuw i32 %.0231319, 1
  %250 = load i32, ptr %22, align 8, !tbaa !15
  %251 = icmp ult i32 %249, %250
  br i1 %251, label %.lr.ph321, label %.preheader286, !llvm.loop !48

.preheader285:                                    ; preds = %._crit_edge325.us, %.preheader.lr.ph, %.preheader286
  %.0224.lcssa = phi i32 [ 0, %.preheader286 ], [ 0, %.preheader.lr.ph ], [ %.2.us.lcssa, %._crit_edge325.us ]
  %252 = load i32, ptr %0, align 8, !tbaa !5
  %.not364 = icmp eq i32 %252, 0
  br i1 %.not364, label %._crit_edge333, label %.lr.ph332

.lr.ph332:                                        ; preds = %.preheader285
  %253 = load ptr, ptr %3, align 8, !tbaa !23
  %254 = mul i32 %252, %.0224.lcssa
  %wide.trip.count399 = zext i32 %252 to i64
  %255 = load float, ptr %67, align 8, !tbaa !49
  %256 = fsub float 1.000000e+00, %255
  %257 = load ptr, ptr %66, align 8, !tbaa !43
  br label %261

._crit_edge333:                                   ; preds = %261, %.preheader285
  %.0221.lcssa = phi float [ 0.000000e+00, %.preheader285 ], [ %277, %261 ]
  %258 = fmul float %.5, %.0221.lcssa
  %259 = load float, ptr %107, align 4, !tbaa !24
  %260 = fcmp ogt float %258, %259
  br i1 %260, label %278, label %279

261:                                              ; preds = %.lr.ph332, %261
  %indvars.iv396 = phi i64 [ 0, %.lr.ph332 ], [ %indvars.iv.next397, %261 ]
  %.0221330 = phi float [ 0.000000e+00, %.lr.ph332 ], [ %277, %261 ]
  %262 = getelementptr inbounds float, ptr %253, i64 %indvars.iv396
  %263 = load float, ptr %262, align 4, !tbaa !24
  %264 = getelementptr inbounds float, ptr %61, i64 %indvars.iv396
  %265 = load float, ptr %264, align 4, !tbaa !24
  %266 = fcmp ult float %263, %265
  %267 = trunc nuw i64 %indvars.iv396 to i32
  %268 = add i32 %254, %267
  %269 = zext i32 %268 to i64
  %270 = getelementptr inbounds float, ptr %257, i64 %269
  %271 = load float, ptr %270, align 4, !tbaa !24
  %272 = getelementptr inbounds float, ptr %168, i64 %indvars.iv396
  %273 = load float, ptr %272, align 4, !tbaa !24
  %274 = fsub float %263, %273
  %.2239.lcssa.lcssa..2236.lcssa.lcssa = select i1 %266, float %.2239.lcssa, float %.2236.lcssa
  %275 = fdiv float %.2239.lcssa.lcssa..2236.lcssa.lcssa, %256
  %276 = fsub float %275, %271
  %277 = call float @llvm.fmuladd.f32(float %276, float %274, float %.0221330)
  %indvars.iv.next397 = add nuw nsw i64 %indvars.iv396, 1
  %exitcond400.not = icmp eq i64 %indvars.iv.next397, %wide.trip.count399
  br i1 %exitcond400.not, label %._crit_edge333, label %261, !llvm.loop !50

278:                                              ; preds = %._crit_edge333
  store i32 %.0248336, ptr %108, align 4, !tbaa !28
  store float %258, ptr %107, align 4, !tbaa !24
  br label %279

279:                                              ; preds = %278, %._crit_edge333
  %280 = call float @llvm.fmuladd.f32(float %.5, float %.0221.lcssa, float %.0249335)
  %281 = load ptr, ptr %3, align 8, !tbaa !23
  %282 = icmp eq ptr %281, null
  br i1 %282, label %.sink.split, label %283

283:                                              ; preds = %279
  call void @_ZdaPv(ptr noundef nonnull %281) #14
  br label %.sink.split

.sink.split:                                      ; preds = %283, %279, %162
  %.sink = phi ptr [ %163, %162 ], [ %168, %279 ], [ %168, %283 ]
  %.1250.ph = phi float [ %.0249335, %162 ], [ %280, %279 ], [ %280, %283 ]
  call void @_ZdaPv(ptr noundef nonnull %.sink) #14
  br label %284

284:                                              ; preds = %.sink.split, %162
  %.1250 = phi float [ %.0249335, %162 ], [ %.1250.ph, %.sink.split ]
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %3) #13
  %285 = add nuw i32 %.0248336, 1
  %286 = load i32, ptr %18, align 4, !tbaa !14
  %287 = icmp ult i32 %285, %286
  br i1 %287, label %.preheader287, label %._crit_edge337.loopexit, !llvm.loop !51

288:                                              ; preds = %._crit_edge342
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %4) #13
  store ptr null, ptr %4, align 8, !tbaa !23
  %289 = zext i32 %.0255.lcssa to i64
  %290 = getelementptr inbounds i32, ptr %63, i64 %289
  %291 = load i32, ptr %290, align 4, !tbaa !28
  %292 = call i32 @pomdp_belief_update_cpu(ptr noundef nonnull %0, ptr noundef nonnull %61, i32 noundef %.0255.lcssa, i32 noundef %291, ptr noundef nonnull align 8 dereferenceable(8) %4)
  %293 = icmp eq i32 %292, 0
  %294 = load i32, ptr %0, align 8, !tbaa !5
  br i1 %293, label %295, label %299

295:                                              ; preds = %288
  %296 = load ptr, ptr %4, align 8, !tbaa !23
  %297 = zext i32 %294 to i64
  %298 = shl nuw nsw i64 %297, 2
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 4 %58, ptr align 4 %296, i64 %298, i1 false)
  br label %302

299:                                              ; preds = %288
  %300 = zext i32 %294 to i64
  %301 = shl nuw nsw i64 %300, 2
  call void @llvm.memcpy.p0.p0.i64(ptr nonnull align 4 %58, ptr nonnull align 4 %61, i64 %301, i1 false)
  %.pr = load ptr, ptr %4, align 8, !tbaa !23
  br label %302

302:                                              ; preds = %299, %295
  %303 = phi ptr [ %.pr, %299 ], [ %296, %295 ]
  %.not = icmp eq ptr %303, null
  br i1 %.not, label %305, label %304

304:                                              ; preds = %302
  call void @_ZdaPv(ptr noundef nonnull %303) #14
  br label %305

305:                                              ; preds = %304, %302
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %4) #13
  br label %306

306:                                              ; preds = %305, %._crit_edge342
  %.1230 = phi float [ %.0253.lcssa, %305 ], [ %.0229349, %._crit_edge342 ]
  %307 = add nuw i32 %.0257347, 1
  %308 = load i32, ptr %22, align 8, !tbaa !15
  %309 = icmp ult i32 %307, %308
  br i1 %309, label %92, label %._crit_edge352, !llvm.loop !52

._crit_edge352:                                   ; preds = %306
  call void @_ZdaPv(ptr noundef nonnull %61) #14
  call void @_ZdaPv(ptr noundef nonnull %63) #14
  call void @_ZdaPv(ptr noundef nonnull %64) #14
  %310 = call i32 @pomdp_add_new_raw_beliefs_cpu(ptr noundef nonnull %0, i32 noundef 1, ptr noundef nonnull %58)
  call void @_ZdaPv(ptr noundef nonnull %58) #14
  br label %311

311:                                              ; preds = %._crit_edge352, %53
  %.0 = phi i32 [ 1, %53 ], [ 0, %._crit_edge352 ]
  ret i32 %.0
}

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

attributes #0 = { 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 #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #2 = { mustprogress nocallback nofree nosync nounwind speculatable willreturn memory(none) }
attributes #3 = { nofree 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 #4 = { nobuiltin 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 #5 = { "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 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #7 = { nobuiltin 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 = { 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 #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 = { nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #11 = { cold nounwind }
attributes #12 = { builtin allocsize(0) }
attributes #13 = { nounwind }
attributes #14 = { builtin nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 0}
!6 = !{!"_ZTSN4nova9NovaPOMDPE", !7, i64 0, !7, i64 4, !7, i64 8, !7, i64 12, !7, i64 16, !7, i64 20, !10, i64 24, !7, i64 28, !11, i64 32, !11, i64 40, !11, i64 48, !11, i64 56, !11, i64 64, !11, i64 72, !11, i64 80, !11, i64 88, !11, i64 96, !11, i64 104, !11, i64 112, !11, i64 120}
!7 = !{!"int", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C++ TBAA"}
!10 = !{!"float", !8, i64 0}
!11 = !{!"any pointer", !8, i64 0}
!12 = !{!6, !7, i64 4}
!13 = !{!6, !7, i64 8}
!14 = !{!6, !7, i64 12}
!15 = !{!6, !7, i64 16}
!16 = !{!6, !7, i64 20}
!17 = !{!6, !11, i64 32}
!18 = !{!6, !11, i64 40}
!19 = !{!6, !11, i64 48}
!20 = !{!6, !11, i64 56}
!21 = !{!6, !11, i64 64}
!22 = !{!6, !11, i64 72}
!23 = !{!11, !11, i64 0}
!24 = !{!10, !10, i64 0}
!25 = distinct !{!25, !26}
!26 = !{!"llvm.loop.mustprogress"}
!27 = distinct !{!27, !26}
!28 = !{!7, !7, i64 0}
!29 = distinct !{!29, !26, !30, !31}
!30 = !{!"llvm.loop.isvectorized", i32 1}
!31 = !{!"llvm.loop.unroll.runtime.disable"}
!32 = distinct !{!32, !26}
!33 = distinct !{!33, !26, !31, !30}
!34 = distinct !{!34, !35}
!35 = !{!"llvm.loop.unroll.disable"}
!36 = distinct !{!36, !26, !37}
!37 = !{!"llvm.loop.unswitch.partial.disable"}
!38 = distinct !{!38, !26}
!39 = distinct !{!39, !26}
!40 = !{!41, !7, i64 8}
!41 = !{!"_ZTSN4nova21NovaPOMDPAlphaVectorsE", !7, i64 0, !7, i64 4, !7, i64 8, !11, i64 16, !11, i64 24}
!42 = !{!41, !7, i64 0}
!43 = !{!41, !11, i64 16}
!44 = distinct !{!44, !26, !30, !31}
!45 = distinct !{!45, !26, !30}
!46 = distinct !{!46, !26}
!47 = distinct !{!47, !26}
!48 = distinct !{!48, !26}
!49 = !{!6, !10, i64 24}
!50 = distinct !{!50, !26}
!51 = distinct !{!51, !26}
!52 = distinct !{!52, !26}


; Effective O3 passes: ConstraintEliminationPass,CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalDCEPass,GlobalOptPass,IPSCCPPass,IndVarSimplifyPass,InferFunctionAttrsPass,InstCombinePass,InstSimplifyPass,JumpThreadingPass,LCSSAPass,LICMPass,LoopIdiomRecognizePass,LoopInstSimplifyPass,LoopLoadEliminationPass,LoopRotatePass,LoopSimplifyCFGPass,LoopSimplifyPass,LoopUnrollPass,LoopVectorizePass,PostOrderFunctionAttrsPass,ReassociatePass,SCCPPass,SROAPass,SimpleLoopUnswitchPass,SimplifyCFGPass,TailCallElimPass