; LLVM IR from paintdream/DontStarveLuaJIT :: src/luajit/src (lj_record)

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

%union.TValue = type { i64 }
%struct.jit_State = type { %struct.GCtrace, ptr, ptr, ptr, ptr, ptr, i32, i32, i32, i8, i8, %struct.IRType1, i8, %struct.FoldState, ptr, i32, i32, i32, i32, i32, i32, i32, %struct.MRef, [5 x %union.TValue], ptr, i32, i32, i32, i32, ptr, ptr, i32, i32, i8, ptr, i32, i32, ptr, [100 x i16], [255 x i32], [15 x i32], [16 x ptr], [64 x %struct.HotPenalty], i32, i32, [16 x %struct.BPropEntry], i32, %struct.ScEvEntry, ptr, i32, i32, ptr, i32, i32, ptr, ptr, ptr, i64, i64, %union.TValue, ptr, i32, i32 }
%struct.GCtrace = type { %struct.GCRef, i8, i8, i8, i8, i32, %struct.GCRef, ptr, i32, i16, i16, ptr, ptr, %struct.GCRef, %struct.MRef, i32, i32, ptr, i32, i16, i16, i16, i16, i16, i16, i16, i8, i8 }
%struct.GCRef = type { i32 }
%struct.IRType1 = type { i8 }
%struct.FoldState = type { %union.IRIns, %union.IRIns, %union.IRIns }
%union.IRIns = type { %struct.anon.3 }
%struct.anon.3 = type { i32, %struct.IRType1, i8, i8, i8 }
%struct.MRef = type { i32 }
%struct.HotPenalty = type { %struct.MRef, i16, i16 }
%struct.BPropEntry = type { i16, i16, i32 }
%struct.ScEvEntry = type { %struct.MRef, i16, i16, i16, i16, %struct.IRType1, i8 }
%struct.lua_State = type { %union.anon.4 }
%union.anon.4 = type { %struct.anon.5, [320 x i8] }
%struct.anon.5 = type { %struct.GCRef, i8, i8, i8, i8, %struct.MRef, %struct.GCRef, ptr, ptr, %struct.MRef, %struct.MRef, %struct.GCRef, %struct.GCRef, ptr, i32 }
%struct.anon.0 = type { %struct.GCRef, %union.FrameLink }
%union.FrameLink = type { i32 }
%struct.GCfuncL = type { %struct.GCRef, i8, i8, i8, i8, %struct.GCRef, %struct.GCRef, %struct.MRef, [1 x %struct.GCRef] }
%struct.GCproto = type { %struct.GCRef, i8, i8, i8, i8, i32, %struct.GCRef, %struct.MRef, %struct.MRef, i32, i32, i32, i8, i8, i16, %struct.GCRef, i32, i32, %struct.MRef, %struct.MRef, %struct.MRef }
%struct.anon.1 = type { i32, i32 }
%struct.anon = type { %union.anon, i32 }
%union.anon = type { %struct.GCRef }

@lj_vm_asm_begin = external hidden global [0 x i8], align 1

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

; Function Attrs: alwaysinline nounwind uwtable
declare hidden void @lj_ir_set_(ptr noundef, i16 noundef zeroext, i16 noundef zeroext, i16 noundef zeroext) #1

declare hidden i32 @lj_opt_fold(ptr noundef) #2

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

declare hidden i32 @lj_ir_kgc(ptr noundef, ptr noundef, i32 noundef) #2

; Function Attrs: nounwind uwtable
declare hidden void @lj_record_stop(ptr noundef, i32 noundef, i32 noundef) #3

declare hidden void @lj_snap_add(ptr noundef) #2

; Function Attrs: noreturn
declare hidden void @lj_trace_err(ptr noundef, i32 noundef) #4

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

; Function Attrs: nounwind uwtable
define hidden void @lj_record_ret(ptr noundef %0, i32 noundef %1, i64 noundef %2) #3 {
  %4 = alloca ptr, align 8
  %5 = alloca i32, align 4
  %6 = alloca i64, align 8
  %7 = alloca ptr, align 8
  %8 = alloca i64, align 8
  %9 = alloca i32, align 4
  %10 = alloca i32, align 4
  %11 = alloca i32, align 4
  %12 = alloca i32, align 4
  %13 = alloca i64, align 8
  %14 = alloca i32, align 4
  %15 = alloca ptr, align 8
  %16 = alloca i32, align 4
  %17 = alloca i32, align 4
  %18 = alloca ptr, align 8
  %19 = alloca i32, align 4
  %20 = alloca i32, align 4
  %21 = alloca i32, align 4
  %22 = alloca i32, align 4
  %23 = alloca ptr, align 8
  %24 = alloca %union.TValue, align 8
  %25 = alloca i32, align 4
  store ptr %0, ptr %4, align 8, !tbaa !5
  store i32 %1, ptr %5, align 4, !tbaa !9
  store i64 %2, ptr %6, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 8, ptr %7) #7
  %26 = load ptr, ptr %4, align 8, !tbaa !5
  %27 = getelementptr inbounds %struct.jit_State, ptr %26, i32 0, i32 1
  %28 = load ptr, ptr %27, align 8, !tbaa !13
  %29 = getelementptr inbounds %struct.lua_State, ptr %28, i32 0, i32 0
  %30 = getelementptr inbounds %struct.anon.5, ptr %29, i32 0, i32 7
  %31 = load ptr, ptr %30, align 8, !tbaa !22
  %32 = getelementptr inbounds %union.TValue, ptr %31, i64 -1
  store ptr %32, ptr %7, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #7
  store i64 0, ptr %8, align 8, !tbaa !11
  br label %33

33:                                               ; preds = %68, %3
  %34 = load i64, ptr %8, align 8, !tbaa !11
  %35 = load i64, ptr %6, align 8, !tbaa !11
  %36 = icmp slt i64 %34, %35
  br i1 %36, label %37, label %71

37:                                               ; preds = %33
  %38 = load ptr, ptr %4, align 8, !tbaa !5
  %39 = getelementptr inbounds %struct.jit_State, ptr %38, i32 0, i32 5
  %40 = load ptr, ptr %39, align 8, !tbaa !23
  %41 = load i32, ptr %5, align 4, !tbaa !9
  %42 = zext i32 %41 to i64
  %43 = load i64, ptr %8, align 8, !tbaa !11
  %44 = add nsw i64 %42, %43
  %45 = getelementptr inbounds i32, ptr %40, i64 %44
  %46 = load i32, ptr %45, align 4, !tbaa !9
  %47 = icmp ne i32 %46, 0
  br i1 %47, label %48, label %58

48:                                               ; preds = %37
  %49 = load ptr, ptr %4, align 8, !tbaa !5
  %50 = getelementptr inbounds %struct.jit_State, ptr %49, i32 0, i32 5
  %51 = load ptr, ptr %50, align 8, !tbaa !23
  %52 = load i32, ptr %5, align 4, !tbaa !9
  %53 = zext i32 %52 to i64
  %54 = load i64, ptr %8, align 8, !tbaa !11
  %55 = add nsw i64 %53, %54
  %56 = getelementptr inbounds i32, ptr %51, i64 %55
  %57 = load i32, ptr %56, align 4, !tbaa !9
  br label %66

58:                                               ; preds = %37
  %59 = load ptr, ptr %4, align 8, !tbaa !5
  %60 = load i32, ptr %5, align 4, !tbaa !9
  %61 = zext i32 %60 to i64
  %62 = load i64, ptr %8, align 8, !tbaa !11
  %63 = add nsw i64 %61, %62
  %64 = trunc i64 %63 to i32
  %65 = call i32 @sload(ptr noundef %59, i32 noundef %64)
  br label %66

66:                                               ; preds = %58, %48
  %67 = phi i32 [ %57, %48 ], [ %65, %58 ]
  br label %68

68:                                               ; preds = %66
  %69 = load i64, ptr %8, align 8, !tbaa !11
  %70 = add nsw i64 %69, 1
  store i64 %70, ptr %8, align 8, !tbaa !11
  br label %33, !llvm.loop !24

71:                                               ; preds = %33
  br label %72

72:                                               ; preds = %93, %71
  %73 = load ptr, ptr %7, align 8, !tbaa !5
  %74 = getelementptr inbounds %struct.anon.0, ptr %73, i32 0, i32 1
  %75 = load i32, ptr %74, align 4, !tbaa !22
  %76 = sext i32 %75 to i64
  %77 = and i64 %76, 6
  %78 = icmp eq i64 %77, 6
  br i1 %78, label %79, label %126

79:                                               ; preds = %72
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #7
  %80 = load ptr, ptr %7, align 8, !tbaa !5
  %81 = getelementptr inbounds %struct.anon.0, ptr %80, i32 0, i32 1
  %82 = load i32, ptr %81, align 4, !tbaa !22
  %83 = sext i32 %82 to i64
  %84 = ashr i64 %83, 3
  %85 = trunc i64 %84 to i32
  store i32 %85, ptr %9, align 4, !tbaa !9
  %86 = load ptr, ptr %4, align 8, !tbaa !5
  %87 = getelementptr inbounds %struct.jit_State, ptr %86, i32 0, i32 20
  %88 = load i32, ptr %87, align 4, !tbaa !26
  %89 = add nsw i32 %88, -1
  store i32 %89, ptr %87, align 4, !tbaa !26
  %90 = icmp slt i32 %89, 0
  br i1 %90, label %91, label %93

91:                                               ; preds = %79
  %92 = load ptr, ptr %4, align 8, !tbaa !5
  call void @lj_trace_err(ptr noundef %92, i32 noundef 16) #8
  unreachable

93:                                               ; preds = %79
  %94 = load i64, ptr %6, align 8, !tbaa !11
  %95 = add nsw i64 %94, 1
  store i64 %95, ptr %6, align 8, !tbaa !11
  %96 = load i32, ptr %9, align 4, !tbaa !9
  %97 = load i32, ptr %5, align 4, !tbaa !9
  %98 = add i32 %97, %96
  store i32 %98, ptr %5, align 4, !tbaa !9
  %99 = load i32, ptr %9, align 4, !tbaa !9
  %100 = load ptr, ptr %4, align 8, !tbaa !5
  %101 = getelementptr inbounds %struct.jit_State, ptr %100, i32 0, i32 8
  %102 = load i32, ptr %101, align 8, !tbaa !27
  %103 = sub i32 %102, %99
  store i32 %103, ptr %101, align 8, !tbaa !27
  %104 = load i32, ptr %9, align 4, !tbaa !9
  %105 = load ptr, ptr %4, align 8, !tbaa !5
  %106 = getelementptr inbounds %struct.jit_State, ptr %105, i32 0, i32 5
  %107 = load ptr, ptr %106, align 8, !tbaa !23
  %108 = zext i32 %104 to i64
  %109 = sub i64 0, %108
  %110 = getelementptr inbounds i32, ptr %107, i64 %109
  store ptr %110, ptr %106, align 8, !tbaa !23
  %111 = load ptr, ptr %4, align 8, !tbaa !5
  %112 = getelementptr inbounds %struct.jit_State, ptr %111, i32 0, i32 5
  %113 = load ptr, ptr %112, align 8, !tbaa !23
  %114 = load i32, ptr %5, align 4, !tbaa !9
  %115 = add i32 %114, -1
  store i32 %115, ptr %5, align 4, !tbaa !9
  %116 = zext i32 %115 to i64
  %117 = getelementptr inbounds i32, ptr %113, i64 %116
  store i32 33587197, ptr %117, align 4, !tbaa !9
  %118 = load ptr, ptr %7, align 8, !tbaa !5
  %119 = load ptr, ptr %7, align 8, !tbaa !5
  %120 = getelementptr inbounds %struct.anon.0, ptr %119, i32 0, i32 1
  %121 = load i32, ptr %120, align 4, !tbaa !22
  %122 = sext i32 %121 to i64
  %123 = and i64 %122, -8
  %124 = sub i64 0, %123
  %125 = getelementptr inbounds i8, ptr %118, i64 %124
  store ptr %125, ptr %7, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #7
  br label %72, !llvm.loop !28

126:                                              ; preds = %72
  %127 = load ptr, ptr %4, align 8, !tbaa !5
  %128 = getelementptr inbounds %struct.jit_State, ptr %127, i32 0, i32 20
  %129 = load i32, ptr %128, align 4, !tbaa !26
  %130 = icmp eq i32 %129, 0
  br i1 %130, label %131, label %192

131:                                              ; preds = %126
  %132 = load ptr, ptr %4, align 8, !tbaa !5
  %133 = getelementptr inbounds %struct.jit_State, ptr %132, i32 0, i32 4
  %134 = load ptr, ptr %133, align 8, !tbaa !29
  %135 = icmp ne ptr %134, null
  br i1 %135, label %136, label %192

136:                                              ; preds = %131
  %137 = load ptr, ptr %4, align 8, !tbaa !5
  %138 = getelementptr inbounds %struct.jit_State, ptr %137, i32 0, i32 2
  %139 = load ptr, ptr %138, align 8, !tbaa !30
  %140 = load i32, ptr %139, align 4, !tbaa !9
  %141 = and i32 %140, 255
  %142 = call i32 @bc_isret(i32 noundef %141)
  %143 = icmp ne i32 %142, 0
  br i1 %143, label %144, label %192

144:                                              ; preds = %136
  %145 = load ptr, ptr %7, align 8, !tbaa !5
  %146 = getelementptr inbounds %struct.anon.0, ptr %145, i32 0, i32 1
  %147 = load i32, ptr %146, align 4, !tbaa !22
  %148 = sext i32 %147 to i64
  %149 = and i64 %148, 3
  %150 = icmp eq i64 %149, 0
  br i1 %150, label %151, label %169

151:                                              ; preds = %144
  %152 = load ptr, ptr %4, align 8, !tbaa !5
  %153 = getelementptr inbounds %struct.jit_State, ptr %152, i32 0, i32 49
  %154 = load i32, ptr %153, align 8, !tbaa !31
  %155 = icmp eq i32 %154, 0
  br i1 %155, label %156, label %192

156:                                              ; preds = %151
  %157 = load ptr, ptr %4, align 8, !tbaa !5
  %158 = getelementptr inbounds %struct.jit_State, ptr %157, i32 0, i32 50
  %159 = load i32, ptr %158, align 4, !tbaa !32
  %160 = icmp eq i32 %159, 0
  br i1 %160, label %161, label %192

161:                                              ; preds = %156
  %162 = load ptr, ptr %4, align 8, !tbaa !5
  %163 = getelementptr inbounds %struct.jit_State, ptr %162, i32 0, i32 0
  %164 = getelementptr inbounds %struct.GCtrace, ptr %163, i32 0, i32 15
  %165 = load i32, ptr %164, align 8, !tbaa !33
  %166 = and i32 %165, 255
  %167 = call i32 @bc_isret(i32 noundef %166)
  %168 = icmp ne i32 %167, 0
  br i1 %168, label %192, label %169

169:                                              ; preds = %161, %144
  store i64 0, ptr %8, align 8, !tbaa !11
  br label %170

170:                                              ; preds = %181, %169
  %171 = load i64, ptr %8, align 8, !tbaa !11
  %172 = load i32, ptr %5, align 4, !tbaa !9
  %173 = zext i32 %172 to i64
  %174 = icmp slt i64 %171, %173
  br i1 %174, label %175, label %184

175:                                              ; preds = %170
  %176 = load ptr, ptr %4, align 8, !tbaa !5
  %177 = getelementptr inbounds %struct.jit_State, ptr %176, i32 0, i32 5
  %178 = load ptr, ptr %177, align 8, !tbaa !23
  %179 = load i64, ptr %8, align 8, !tbaa !11
  %180 = getelementptr inbounds i32, ptr %178, i64 %179
  store i32 0, ptr %180, align 4, !tbaa !9
  br label %181

181:                                              ; preds = %175
  %182 = load i64, ptr %8, align 8, !tbaa !11
  %183 = add nsw i64 %182, 1
  store i64 %183, ptr %8, align 8, !tbaa !11
  br label %170, !llvm.loop !34

184:                                              ; preds = %170
  %185 = load i32, ptr %5, align 4, !tbaa !9
  %186 = load i64, ptr %6, align 8, !tbaa !11
  %187 = trunc i64 %186 to i32
  %188 = add i32 %185, %187
  %189 = load ptr, ptr %4, align 8, !tbaa !5
  %190 = getelementptr inbounds %struct.jit_State, ptr %189, i32 0, i32 7
  store i32 %188, ptr %190, align 4, !tbaa !35
  %191 = load ptr, ptr %4, align 8, !tbaa !5
  call void @lj_record_stop(ptr noundef %191, i32 noundef 7, i32 noundef 0)
  store i32 1, ptr %10, align 4
  br label %717

192:                                              ; preds = %161, %156, %151, %136, %131, %126
  %193 = load ptr, ptr %7, align 8, !tbaa !5
  %194 = getelementptr inbounds %struct.anon.0, ptr %193, i32 0, i32 1
  %195 = load i32, ptr %194, align 4, !tbaa !22
  %196 = sext i32 %195 to i64
  %197 = and i64 %196, 7
  %198 = icmp eq i64 %197, 3
  br i1 %198, label %199, label %237

199:                                              ; preds = %192
  call void @llvm.lifetime.start.p0(i64 4, ptr %11) #7
  %200 = load ptr, ptr %7, align 8, !tbaa !5
  %201 = getelementptr inbounds %struct.anon.0, ptr %200, i32 0, i32 1
  %202 = load i32, ptr %201, align 4, !tbaa !22
  %203 = sext i32 %202 to i64
  %204 = ashr i64 %203, 3
  %205 = trunc i64 %204 to i32
  store i32 %205, ptr %11, align 4, !tbaa !9
  %206 = load ptr, ptr %4, align 8, !tbaa !5
  %207 = getelementptr inbounds %struct.jit_State, ptr %206, i32 0, i32 20
  %208 = load i32, ptr %207, align 4, !tbaa !26
  %209 = add nsw i32 %208, -1
  store i32 %209, ptr %207, align 4, !tbaa !26
  %210 = icmp slt i32 %209, 0
  br i1 %210, label %211, label %213

211:                                              ; preds = %199
  %212 = load ptr, ptr %4, align 8, !tbaa !5
  call void @lj_trace_err(ptr noundef %212, i32 noundef 16) #8
  unreachable

213:                                              ; preds = %199
  %214 = load i32, ptr %11, align 4, !tbaa !9
  %215 = load i32, ptr %5, align 4, !tbaa !9
  %216 = add i32 %215, %214
  store i32 %216, ptr %5, align 4, !tbaa !9
  %217 = load i32, ptr %11, align 4, !tbaa !9
  %218 = load ptr, ptr %4, align 8, !tbaa !5
  %219 = getelementptr inbounds %struct.jit_State, ptr %218, i32 0, i32 8
  %220 = load i32, ptr %219, align 8, !tbaa !27
  %221 = sub i32 %220, %217
  store i32 %221, ptr %219, align 8, !tbaa !27
  %222 = load i32, ptr %11, align 4, !tbaa !9
  %223 = load ptr, ptr %4, align 8, !tbaa !5
  %224 = getelementptr inbounds %struct.jit_State, ptr %223, i32 0, i32 5
  %225 = load ptr, ptr %224, align 8, !tbaa !23
  %226 = zext i32 %222 to i64
  %227 = sub i64 0, %226
  %228 = getelementptr inbounds i32, ptr %225, i64 %227
  store ptr %228, ptr %224, align 8, !tbaa !23
  %229 = load ptr, ptr %7, align 8, !tbaa !5
  %230 = load ptr, ptr %7, align 8, !tbaa !5
  %231 = getelementptr inbounds %struct.anon.0, ptr %230, i32 0, i32 1
  %232 = load i32, ptr %231, align 4, !tbaa !22
  %233 = sext i32 %232 to i64
  %234 = and i64 %233, -8
  %235 = sub i64 0, %234
  %236 = getelementptr inbounds i8, ptr %229, i64 %235
  store ptr %236, ptr %7, align 8, !tbaa !5
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #7
  br label %237

237:                                              ; preds = %213, %192
  %238 = load ptr, ptr %7, align 8, !tbaa !5
  %239 = getelementptr inbounds %struct.anon.0, ptr %238, i32 0, i32 1
  %240 = load i32, ptr %239, align 4, !tbaa !22
  %241 = sext i32 %240 to i64
  %242 = and i64 %241, 3
  %243 = icmp eq i64 %242, 0
  br i1 %243, label %244, label %475

244:                                              ; preds = %237
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #7
  %245 = load ptr, ptr %7, align 8, !tbaa !5
  %246 = getelementptr inbounds %struct.anon.0, ptr %245, i32 0, i32 1
  %247 = getelementptr inbounds %struct.MRef, ptr %246, i32 0, i32 0
  %248 = load i32, ptr %247, align 4, !tbaa !22
  %249 = zext i32 %248 to i64
  %250 = inttoptr i64 %249 to ptr
  %251 = getelementptr inbounds i32, ptr %250, i64 -1
  %252 = load i32, ptr %251, align 4, !tbaa !9
  store i32 %252, ptr %12, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #7
  %253 = load i32, ptr %12, align 4, !tbaa !9
  %254 = lshr i32 %253, 24
  %255 = icmp ne i32 %254, 0
  br i1 %255, label %256, label %261

256:                                              ; preds = %244
  %257 = load i32, ptr %12, align 4, !tbaa !9
  %258 = lshr i32 %257, 24
  %259 = zext i32 %258 to i64
  %260 = sub nsw i64 %259, 1
  br label %263

261:                                              ; preds = %244
  %262 = load i64, ptr %6, align 8, !tbaa !11
  br label %263

263:                                              ; preds = %261, %256
  %264 = phi i64 [ %260, %256 ], [ %262, %261 ]
  store i64 %264, ptr %13, align 8, !tbaa !11
  call void @llvm.lifetime.start.p0(i64 4, ptr %14) #7
  %265 = load i32, ptr %12, align 4, !tbaa !9
  %266 = lshr i32 %265, 8
  %267 = and i32 %266, 255
  store i32 %267, ptr %14, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #7
  %268 = load ptr, ptr %7, align 8, !tbaa !5
  %269 = load i32, ptr %14, align 4, !tbaa !9
  %270 = add i32 %269, 1
  %271 = sub i32 %270, 0
  %272 = zext i32 %271 to i64
  %273 = sub i64 0, %272
  %274 = getelementptr inbounds %union.TValue, ptr %268, i64 %273
  %275 = getelementptr inbounds %struct.anon.0, ptr %274, i32 0, i32 0
  %276 = getelementptr inbounds %struct.GCRef, ptr %275, i32 0, i32 0
  %277 = load i32, ptr %276, align 8, !tbaa !22
  %278 = zext i32 %277 to i64
  %279 = inttoptr i64 %278 to ptr
  %280 = getelementptr inbounds %struct.GCfuncL, ptr %279, i32 0, i32 7
  %281 = getelementptr inbounds %struct.MRef, ptr %280, i32 0, i32 0
  %282 = load i32, ptr %281, align 8, !tbaa !22
  %283 = zext i32 %282 to i64
  %284 = inttoptr i64 %283 to ptr
  %285 = getelementptr inbounds i8, ptr %284, i64 -64
  store ptr %285, ptr %15, align 8, !tbaa !5
  %286 = load ptr, ptr %15, align 8, !tbaa !5
  %287 = getelementptr inbounds %struct.GCproto, ptr %286, i32 0, i32 13
  %288 = load i8, ptr %287, align 1, !tbaa !36
  %289 = zext i8 %288 to i32
  %290 = and i32 %289, 8
  %291 = icmp ne i32 %290, 0
  br i1 %291, label %292, label %294

292:                                              ; preds = %263
  %293 = load ptr, ptr %4, align 8, !tbaa !5
  call void @lj_trace_err(ptr noundef %293, i32 noundef 12) #8
  unreachable

294:                                              ; preds = %263
  %295 = load ptr, ptr %4, align 8, !tbaa !5
  %296 = getelementptr inbounds %struct.jit_State, ptr %295, i32 0, i32 20
  %297 = load i32, ptr %296, align 4, !tbaa !26
  %298 = icmp eq i32 %297, 0
  br i1 %298, label %299, label %336

299:                                              ; preds = %294
  %300 = load ptr, ptr %4, align 8, !tbaa !5
  %301 = getelementptr inbounds %struct.jit_State, ptr %300, i32 0, i32 4
  %302 = load ptr, ptr %301, align 8, !tbaa !29
  %303 = icmp ne ptr %302, null
  br i1 %303, label %304, label %336

304:                                              ; preds = %299
  %305 = load ptr, ptr %7, align 8, !tbaa !5
  %306 = load ptr, ptr %4, align 8, !tbaa !5
  %307 = getelementptr inbounds %struct.jit_State, ptr %306, i32 0, i32 1
  %308 = load ptr, ptr %307, align 8, !tbaa !13
  %309 = getelementptr inbounds %struct.lua_State, ptr %308, i32 0, i32 0
  %310 = getelementptr inbounds %struct.anon.5, ptr %309, i32 0, i32 7
  %311 = load ptr, ptr %310, align 8, !tbaa !22
  %312 = getelementptr inbounds %union.TValue, ptr %311, i64 -1
  %313 = icmp eq ptr %305, %312
  br i1 %313, label %314, label %336

314:                                              ; preds = %304
  %315 = load ptr, ptr %4, align 8, !tbaa !5
  %316 = load ptr, ptr %15, align 8, !tbaa !5
  %317 = call i32 @check_downrec_unroll(ptr noundef %315, ptr noundef %316)
  %318 = icmp ne i32 %317, 0
  br i1 %318, label %319, label %334

319:                                              ; preds = %314
  %320 = load i32, ptr %5, align 4, !tbaa !9
  %321 = zext i32 %320 to i64
  %322 = load i64, ptr %6, align 8, !tbaa !11
  %323 = add nsw i64 %321, %322
  %324 = trunc i64 %323 to i32
  %325 = load ptr, ptr %4, align 8, !tbaa !5
  %326 = getelementptr inbounds %struct.jit_State, ptr %325, i32 0, i32 7
  store i32 %324, ptr %326, align 4, !tbaa !35
  %327 = load ptr, ptr %4, align 8, !tbaa !5
  call void @lj_snap_purge(ptr noundef %327)
  %328 = load ptr, ptr %4, align 8, !tbaa !5
  %329 = load ptr, ptr %4, align 8, !tbaa !5
  %330 = getelementptr inbounds %struct.jit_State, ptr %329, i32 0, i32 0
  %331 = getelementptr inbounds %struct.GCtrace, ptr %330, i32 0, i32 21
  %332 = load i16, ptr %331, align 8, !tbaa !38
  %333 = zext i16 %332 to i32
  call void @lj_record_stop(ptr noundef %328, i32 noundef 5, i32 noundef %333)
  store i32 1, ptr %10, align 4
  br label %472

334:                                              ; preds = %314
  %335 = load ptr, ptr %4, align 8, !tbaa !5
  call void @lj_snap_add(ptr noundef %335)
  br label %336

336:                                              ; preds = %334, %304, %299, %294
  store i64 0, ptr %8, align 8, !tbaa !11
  br label %337

337:                                              ; preds = %364, %336
  %338 = load i64, ptr %8, align 8, !tbaa !11
  %339 = load i64, ptr %13, align 8, !tbaa !11
  %340 = icmp slt i64 %338, %339
  br i1 %340, label %341, label %367

341:                                              ; preds = %337
  %342 = load i64, ptr %8, align 8, !tbaa !11
  %343 = load i64, ptr %6, align 8, !tbaa !11
  %344 = icmp slt i64 %342, %343
  br i1 %344, label %345, label %355

345:                                              ; preds = %341
  %346 = load ptr, ptr %4, align 8, !tbaa !5
  %347 = getelementptr inbounds %struct.jit_State, ptr %346, i32 0, i32 5
  %348 = load ptr, ptr %347, align 8, !tbaa !23
  %349 = load i32, ptr %5, align 4, !tbaa !9
  %350 = zext i32 %349 to i64
  %351 = load i64, ptr %8, align 8, !tbaa !11
  %352 = add nsw i64 %350, %351
  %353 = getelementptr inbounds i32, ptr %348, i64 %352
  %354 = load i32, ptr %353, align 4, !tbaa !9
  br label %356

355:                                              ; preds = %341
  br label %356

356:                                              ; preds = %355, %345
  %357 = phi i32 [ %354, %345 ], [ 32767, %355 ]
  %358 = load ptr, ptr %4, align 8, !tbaa !5
  %359 = getelementptr inbounds %struct.jit_State, ptr %358, i32 0, i32 5
  %360 = load ptr, ptr %359, align 8, !tbaa !23
  %361 = load i64, ptr %8, align 8, !tbaa !11
  %362 = sub nsw i64 %361, 1
  %363 = getelementptr inbounds i32, ptr %360, i64 %362
  store i32 %357, ptr %363, align 4, !tbaa !9
  br label %364

364:                                              ; preds = %356
  %365 = load i64, ptr %8, align 8, !tbaa !11
  %366 = add nsw i64 %365, 1
  store i64 %366, ptr %8, align 8, !tbaa !11
  br label %337, !llvm.loop !39

367:                                              ; preds = %337
  %368 = load i32, ptr %14, align 4, !tbaa !9
  %369 = load i64, ptr %13, align 8, !tbaa !11
  %370 = trunc i64 %369 to i32
  %371 = add i32 %368, %370
  %372 = load ptr, ptr %4, align 8, !tbaa !5
  %373 = getelementptr inbounds %struct.jit_State, ptr %372, i32 0, i32 7
  store i32 %371, ptr %373, align 4, !tbaa !35
  %374 = load ptr, ptr %4, align 8, !tbaa !5
  %375 = getelementptr inbounds %struct.jit_State, ptr %374, i32 0, i32 20
  %376 = load i32, ptr %375, align 4, !tbaa !26
  %377 = icmp sgt i32 %376, 0
  br i1 %377, label %378, label %397

378:                                              ; preds = %367
  %379 = load ptr, ptr %4, align 8, !tbaa !5
  %380 = getelementptr inbounds %struct.jit_State, ptr %379, i32 0, i32 20
  %381 = load i32, ptr %380, align 4, !tbaa !26
  %382 = add nsw i32 %381, -1
  store i32 %382, ptr %380, align 4, !tbaa !26
  %383 = load i32, ptr %14, align 4, !tbaa !9
  %384 = add i32 %383, 1
  %385 = load ptr, ptr %4, align 8, !tbaa !5
  %386 = getelementptr inbounds %struct.jit_State, ptr %385, i32 0, i32 8
  %387 = load i32, ptr %386, align 8, !tbaa !27
  %388 = sub i32 %387, %384
  store i32 %388, ptr %386, align 8, !tbaa !27
  %389 = load i32, ptr %14, align 4, !tbaa !9
  %390 = add i32 %389, 1
  %391 = load ptr, ptr %4, align 8, !tbaa !5
  %392 = getelementptr inbounds %struct.jit_State, ptr %391, i32 0, i32 5
  %393 = load ptr, ptr %392, align 8, !tbaa !23
  %394 = zext i32 %390 to i64
  %395 = sub i64 0, %394
  %396 = getelementptr inbounds i32, ptr %393, i64 %395
  store ptr %396, ptr %392, align 8, !tbaa !23
  br label %471

397:                                              ; preds = %367
  %398 = load ptr, ptr %4, align 8, !tbaa !5
  %399 = getelementptr inbounds %struct.jit_State, ptr %398, i32 0, i32 49
  %400 = load i32, ptr %399, align 8, !tbaa !31
  %401 = icmp eq i32 %400, 0
  br i1 %401, label %402, label %417

402:                                              ; preds = %397
  %403 = load ptr, ptr %4, align 8, !tbaa !5
  %404 = getelementptr inbounds %struct.jit_State, ptr %403, i32 0, i32 50
  %405 = load i32, ptr %404, align 4, !tbaa !32
  %406 = icmp eq i32 %405, 0
  br i1 %406, label %407, label %417

407:                                              ; preds = %402
  %408 = load ptr, ptr %4, align 8, !tbaa !5
  %409 = getelementptr inbounds %struct.jit_State, ptr %408, i32 0, i32 0
  %410 = getelementptr inbounds %struct.GCtrace, ptr %409, i32 0, i32 15
  %411 = load i32, ptr %410, align 8, !tbaa !33
  %412 = and i32 %411, 255
  %413 = call i32 @bc_isret(i32 noundef %412)
  %414 = icmp ne i32 %413, 0
  br i1 %414, label %417, label %415

415:                                              ; preds = %407
  %416 = load ptr, ptr %4, align 8, !tbaa !5
  call void @lj_trace_err(ptr noundef %416, i32 noundef 8) #8
  unreachable

417:                                              ; preds = %407, %402, %397
  %418 = load ptr, ptr %4, align 8, !tbaa !5
  %419 = getelementptr inbounds %struct.jit_State, ptr %418, i32 0, i32 10
  %420 = load i8, ptr %419, align 1, !tbaa !40
  %421 = icmp ne i8 %420, 0
  br i1 %421, label %422, label %424

422:                                              ; preds = %417
  %423 = load ptr, ptr %4, align 8, !tbaa !5
  call void @lj_trace_err(ptr noundef %423, i32 noundef 16) #8
  unreachable

424:                                              ; preds = %417
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #7
  %425 = load ptr, ptr %4, align 8, !tbaa !5
  %426 = load ptr, ptr %15, align 8, !tbaa !5
  %427 = call i32 @lj_ir_kgc(ptr noundef %425, ptr noundef %426, i32 noundef 7)
  store i32 %427, ptr %16, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #7
  %428 = load ptr, ptr %4, align 8, !tbaa !5
  %429 = load ptr, ptr %7, align 8, !tbaa !5
  %430 = getelementptr inbounds %struct.anon.0, ptr %429, i32 0, i32 1
  %431 = getelementptr inbounds %struct.MRef, ptr %430, i32 0, i32 0
  %432 = load i32, ptr %431, align 4, !tbaa !22
  %433 = zext i32 %432 to i64
  %434 = inttoptr i64 %433 to ptr
  %435 = call i32 @lj_ir_kptr_(ptr noundef %428, i32 noundef 25, ptr noundef %434)
  store i32 %435, ptr %17, align 4, !tbaa !9
  %436 = load ptr, ptr %4, align 8, !tbaa !5
  %437 = load i32, ptr %16, align 4, !tbaa !9
  %438 = trunc i32 %437 to i16
  %439 = load i32, ptr %17, align 4, !tbaa !9
  %440 = trunc i32 %439 to i16
  call void @lj_ir_set_(ptr noundef %436, i16 noundef zeroext 2949, i16 noundef zeroext %438, i16 noundef zeroext %440)
  %441 = load ptr, ptr %4, align 8, !tbaa !5
  %442 = call i32 @lj_opt_fold(ptr noundef %441)
  %443 = load ptr, ptr %4, align 8, !tbaa !5
  %444 = getelementptr inbounds %struct.jit_State, ptr %443, i32 0, i32 21
  %445 = load i32, ptr %444, align 8, !tbaa !41
  %446 = add nsw i32 %445, 1
  store i32 %446, ptr %444, align 8, !tbaa !41
  %447 = load ptr, ptr %4, align 8, !tbaa !5
  %448 = getelementptr inbounds %struct.jit_State, ptr %447, i32 0, i32 10
  store i8 1, ptr %448, align 1, !tbaa !40
  %449 = load ptr, ptr %4, align 8, !tbaa !5
  %450 = getelementptr inbounds %struct.jit_State, ptr %449, i32 0, i32 5
  %451 = load ptr, ptr %450, align 8, !tbaa !23
  %452 = load i32, ptr %14, align 4, !tbaa !9
  %453 = zext i32 %452 to i64
  %454 = getelementptr inbounds i32, ptr %451, i64 %453
  %455 = load ptr, ptr %4, align 8, !tbaa !5
  %456 = getelementptr inbounds %struct.jit_State, ptr %455, i32 0, i32 5
  %457 = load ptr, ptr %456, align 8, !tbaa !23
  %458 = getelementptr inbounds i32, ptr %457, i64 -1
  %459 = load i64, ptr %13, align 8, !tbaa !11
  %460 = mul i64 4, %459
  call void @llvm.memmove.p0.p0.i64(ptr align 4 %454, ptr align 4 %458, i64 %460, i1 false)
  %461 = load ptr, ptr %4, align 8, !tbaa !5
  %462 = getelementptr inbounds %struct.jit_State, ptr %461, i32 0, i32 5
  %463 = load ptr, ptr %462, align 8, !tbaa !23
  %464 = getelementptr inbounds i32, ptr %463, i64 -1
  %465 = load i32, ptr %14, align 4, !tbaa !9
  %466 = add i32 %465, 1
  %467 = zext i32 %466 to i64
  %468 = mul i64 4, %467
  call void @llvm.memset.p0.i64(ptr align 4 %464, i8 0, i64 %468, i1 false)
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #7
  br label %469

469:                                              ; preds = %424
  br label %470

470:                                              ; preds = %469
  br label %471

471:                                              ; preds = %470, %378
  store i32 0, ptr %10, align 4
  br label %472

472:                                              ; preds = %471, %319
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %14) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #7
  %473 = load i32, ptr %10, align 4
  switch i32 %473, label %717 [
    i32 0, label %474
  ]

474:                                              ; preds = %472
  br label %716

475:                                              ; preds = %237
  %476 = load ptr, ptr %7, align 8, !tbaa !5
  %477 = getelementptr inbounds %struct.anon.0, ptr %476, i32 0, i32 1
  %478 = load i32, ptr %477, align 4, !tbaa !22
  %479 = sext i32 %478 to i64
  %480 = and i64 %479, 7
  %481 = icmp eq i64 %480, 2
  br i1 %481, label %482, label %713

482:                                              ; preds = %475
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #7
  %483 = load ptr, ptr %7, align 8, !tbaa !5
  %484 = getelementptr inbounds %union.TValue, ptr %483, i64 -1
  %485 = getelementptr inbounds %struct.anon.1, ptr %484, i32 0, i32 0
  %486 = load i32, ptr %485, align 8, !tbaa !22
  %487 = sext i32 %486 to i64
  %488 = add nsw i64 ptrtoint (ptr @lj_vm_asm_begin to i64), %487
  %489 = inttoptr i64 %488 to ptr
  store ptr %489, ptr %18, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #7
  %490 = load ptr, ptr %7, align 8, !tbaa !5
  %491 = getelementptr inbounds %struct.anon.0, ptr %490, i32 0, i32 1
  %492 = load i32, ptr %491, align 4, !tbaa !22
  %493 = sext i32 %492 to i64
  %494 = ashr i64 %493, 3
  %495 = trunc i64 %494 to i32
  store i32 %495, ptr %19, align 4, !tbaa !9
  %496 = load ptr, ptr %4, align 8, !tbaa !5
  %497 = getelementptr inbounds %struct.jit_State, ptr %496, i32 0, i32 20
  %498 = load i32, ptr %497, align 4, !tbaa !26
  %499 = sub nsw i32 %498, 2
  store i32 %499, ptr %497, align 4, !tbaa !26
  %500 = icmp slt i32 %499, 0
  br i1 %500, label %501, label %503

501:                                              ; preds = %482
  %502 = load ptr, ptr %4, align 8, !tbaa !5
  call void @lj_trace_err(ptr noundef %502, i32 noundef 16) #8
  unreachable

503:                                              ; preds = %482
  %504 = load i32, ptr %19, align 4, !tbaa !9
  %505 = load ptr, ptr %4, align 8, !tbaa !5
  %506 = getelementptr inbounds %struct.jit_State, ptr %505, i32 0, i32 8
  %507 = load i32, ptr %506, align 8, !tbaa !27
  %508 = sub i32 %507, %504
  store i32 %508, ptr %506, align 8, !tbaa !27
  %509 = load i32, ptr %19, align 4, !tbaa !9
  %510 = load ptr, ptr %4, align 8, !tbaa !5
  %511 = getelementptr inbounds %struct.jit_State, ptr %510, i32 0, i32 5
  %512 = load ptr, ptr %511, align 8, !tbaa !23
  %513 = zext i32 %509 to i64
  %514 = sub i64 0, %513
  %515 = getelementptr inbounds i32, ptr %512, i64 %514
  store ptr %515, ptr %511, align 8, !tbaa !23
  %516 = load i32, ptr %19, align 4, !tbaa !9
  %517 = sub i32 %516, 2
  %518 = load ptr, ptr %4, align 8, !tbaa !5
  %519 = getelementptr inbounds %struct.jit_State, ptr %518, i32 0, i32 7
  store i32 %517, ptr %519, align 4, !tbaa !35
  %520 = load ptr, ptr %18, align 8, !tbaa !5
  %521 = icmp eq ptr %520, @lj_cont_ra
  br i1 %521, label %522, label %566

522:                                              ; preds = %503
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #7
  %523 = load ptr, ptr %7, align 8, !tbaa !5
  %524 = getelementptr inbounds %union.TValue, ptr %523, i64 -1
  %525 = getelementptr inbounds %struct.anon.0, ptr %524, i32 0, i32 1
  %526 = getelementptr inbounds %struct.MRef, ptr %525, i32 0, i32 0
  %527 = load i32, ptr %526, align 4, !tbaa !22
  %528 = zext i32 %527 to i64
  %529 = inttoptr i64 %528 to ptr
  %530 = getelementptr inbounds i32, ptr %529, i64 -1
  %531 = load i32, ptr %530, align 4, !tbaa !9
  %532 = lshr i32 %531, 8
  %533 = and i32 %532, 255
  store i32 %533, ptr %20, align 4, !tbaa !9
  %534 = load i64, ptr %6, align 8, !tbaa !11
  %535 = icmp ne i64 %534, 0
  br i1 %535, label %536, label %546

536:                                              ; preds = %522
  %537 = load ptr, ptr %4, align 8, !tbaa !5
  %538 = getelementptr inbounds %struct.jit_State, ptr %537, i32 0, i32 5
  %539 = load ptr, ptr %538, align 8, !tbaa !23
  %540 = load i32, ptr %19, align 4, !tbaa !9
  %541 = load i32, ptr %5, align 4, !tbaa !9
  %542 = add i32 %540, %541
  %543 = zext i32 %542 to i64
  %544 = getelementptr inbounds i32, ptr %539, i64 %543
  %545 = load i32, ptr %544, align 4, !tbaa !9
  br label %547

546:                                              ; preds = %522
  br label %547

547:                                              ; preds = %546, %536
  %548 = phi i32 [ %545, %536 ], [ 32767, %546 ]
  %549 = load ptr, ptr %4, align 8, !tbaa !5
  %550 = getelementptr inbounds %struct.jit_State, ptr %549, i32 0, i32 5
  %551 = load ptr, ptr %550, align 8, !tbaa !23
  %552 = load i32, ptr %20, align 4, !tbaa !9
  %553 = zext i32 %552 to i64
  %554 = getelementptr inbounds i32, ptr %551, i64 %553
  store i32 %548, ptr %554, align 4, !tbaa !9
  %555 = load i32, ptr %20, align 4, !tbaa !9
  %556 = load ptr, ptr %4, align 8, !tbaa !5
  %557 = getelementptr inbounds %struct.jit_State, ptr %556, i32 0, i32 7
  %558 = load i32, ptr %557, align 4, !tbaa !35
  %559 = icmp uge i32 %555, %558
  br i1 %559, label %560, label %565

560:                                              ; preds = %547
  %561 = load i32, ptr %20, align 4, !tbaa !9
  %562 = add i32 %561, 1
  %563 = load ptr, ptr %4, align 8, !tbaa !5
  %564 = getelementptr inbounds %struct.jit_State, ptr %563, i32 0, i32 7
  store i32 %562, ptr %564, align 4, !tbaa !35
  br label %565

565:                                              ; preds = %560, %547
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #7
  br label %712

566:                                              ; preds = %503
  %567 = load ptr, ptr %18, align 8, !tbaa !5
  %568 = icmp eq ptr %567, @lj_cont_nop
  br i1 %568, label %569, label %570

569:                                              ; preds = %566
  br label %711

570:                                              ; preds = %566
  %571 = load ptr, ptr %18, align 8, !tbaa !5
  %572 = icmp eq ptr %571, @lj_cont_cat
  br i1 %572, label %573, label %709

573:                                              ; preds = %570
  call void @llvm.lifetime.start.p0(i64 4, ptr %21) #7
  %574 = load ptr, ptr %7, align 8, !tbaa !5
  %575 = getelementptr inbounds %union.TValue, ptr %574, i64 -1
  %576 = getelementptr inbounds %struct.anon.0, ptr %575, i32 0, i32 1
  %577 = getelementptr inbounds %struct.MRef, ptr %576, i32 0, i32 0
  %578 = load i32, ptr %577, align 4, !tbaa !22
  %579 = zext i32 %578 to i64
  %580 = inttoptr i64 %579 to ptr
  %581 = getelementptr inbounds i32, ptr %580, i64 -1
  %582 = load i32, ptr %581, align 4, !tbaa !9
  %583 = lshr i32 %582, 24
  store i32 %583, ptr %21, align 4, !tbaa !9
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #7
  %584 = load i64, ptr %6, align 8, !tbaa !11
  %585 = icmp ne i64 %584, 0
  br i1 %585, label %586, label %596

586:                                              ; preds = %573
  %587 = load ptr, ptr %4, align 8, !tbaa !5
  %588 = getelementptr inbounds %struct.jit_State, ptr %587, i32 0, i32 5
  %589 = load ptr, ptr %588, align 8, !tbaa !23
  %590 = load i32, ptr %19, align 4, !tbaa !9
  %591 = load i32, ptr %5, align 4, !tbaa !9
  %592 = add i32 %590, %591
  %593 = zext i32 %592 to i64
  %594 = getelementptr inbounds i32, ptr %589, i64 %593
  %595 = load i32, ptr %594, align 4, !tbaa !9
  br label %597

596:                                              ; preds = %573
  br label %597

597:                                              ; preds = %596, %586
  %598 = phi i32 [ %595, %586 ], [ 32767, %596 ]
  store i32 %598, ptr %22, align 4, !tbaa !9
  %599 = load i32, ptr %21, align 4, !tbaa !9
  %600 = load i32, ptr %19, align 4, !tbaa !9
  %601 = sub i32 %600, 2
  %602 = icmp ne i32 %599, %601
  br i1 %602, label %603, label %675

603:                                              ; preds = %597
  call void @llvm.lifetime.start.p0(i64 8, ptr %23) #7
  %604 = load ptr, ptr %4, align 8, !tbaa !5
  %605 = getelementptr inbounds %struct.jit_State, ptr %604, i32 0, i32 1
  %606 = load ptr, ptr %605, align 8, !tbaa !13
  %607 = getelementptr inbounds %struct.lua_State, ptr %606, i32 0, i32 0
  %608 = getelementptr inbounds %struct.anon.5, ptr %607, i32 0, i32 7
  %609 = load ptr, ptr %608, align 8, !tbaa !22
  store ptr %609, ptr %23, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %24) #7
  %610 = load i32, ptr %22, align 4, !tbaa !9
  %611 = load ptr, ptr %4, align 8, !tbaa !5
  %612 = getelementptr inbounds %struct.jit_State, ptr %611, i32 0, i32 5
  %613 = load ptr, ptr %612, align 8, !tbaa !23
  %614 = load i32, ptr %19, align 4, !tbaa !9
  %615 = sub i32 %614, 2
  %616 = zext i32 %615 to i64
  %617 = getelementptr inbounds i32, ptr %613, i64 %616
  store i32 %610, ptr %617, align 4, !tbaa !9
  %618 = load ptr, ptr %4, align 8, !tbaa !5
  %619 = getelementptr inbounds %struct.jit_State, ptr %618, i32 0, i32 1
  %620 = load ptr, ptr %619, align 8, !tbaa !13
  %621 = load ptr, ptr %23, align 8, !tbaa !5
  %622 = getelementptr inbounds %union.TValue, ptr %621, i64 -2
  call void @copyTV(ptr noundef %620, ptr noundef %24, ptr noundef %622)
  %623 = load i64, ptr %6, align 8, !tbaa !11
  %624 = icmp ne i64 %623, 0
  br i1 %624, label %625, label %635

625:                                              ; preds = %603
  %626 = load ptr, ptr %4, align 8, !tbaa !5
  %627 = getelementptr inbounds %struct.jit_State, ptr %626, i32 0, i32 1
  %628 = load ptr, ptr %627, align 8, !tbaa !13
  %629 = load ptr, ptr %23, align 8, !tbaa !5
  %630 = getelementptr inbounds %union.TValue, ptr %629, i64 -2
  %631 = load ptr, ptr %23, align 8, !tbaa !5
  %632 = load i32, ptr %5, align 4, !tbaa !9
  %633 = zext i32 %632 to i64
  %634 = getelementptr inbounds %union.TValue, ptr %631, i64 %633
  call void @copyTV(ptr noundef %628, ptr noundef %630, ptr noundef %634)
  br label %639

635:                                              ; preds = %603
  %636 = load ptr, ptr %23, align 8, !tbaa !5
  %637 = getelementptr inbounds %union.TValue, ptr %636, i64 -2
  %638 = getelementptr inbounds %struct.anon, ptr %637, i32 0, i32 1
  store i32 -1, ptr %638, align 4, !tbaa !22
  br label %639

639:                                              ; preds = %635, %625
  %640 = load ptr, ptr %23, align 8, !tbaa !5
  %641 = load i32, ptr %19, align 4, !tbaa !9
  %642 = zext i32 %641 to i64
  %643 = sub i64 0, %642
  %644 = getelementptr inbounds %union.TValue, ptr %640, i64 %643
  %645 = load ptr, ptr %4, align 8, !tbaa !5
  %646 = getelementptr inbounds %struct.jit_State, ptr %645, i32 0, i32 1
  %647 = load ptr, ptr %646, align 8, !tbaa !13
  %648 = getelementptr inbounds %struct.lua_State, ptr %647, i32 0, i32 0
  %649 = getelementptr inbounds %struct.anon.5, ptr %648, i32 0, i32 7
  store ptr %644, ptr %649, align 8, !tbaa !22
  %650 = load ptr, ptr %4, align 8, !tbaa !5
  %651 = load i32, ptr %21, align 4, !tbaa !9
  %652 = load i32, ptr %19, align 4, !tbaa !9
  %653 = sub i32 %652, 2
  %654 = call i32 @rec_cat(ptr noundef %650, i32 noundef %651, i32 noundef %653)
  store i32 %654, ptr %22, align 4, !tbaa !9
  %655 = load ptr, ptr %4, align 8, !tbaa !5
  %656 = getelementptr inbounds %struct.jit_State, ptr %655, i32 0, i32 1
  %657 = load ptr, ptr %656, align 8, !tbaa !13
  %658 = getelementptr inbounds %struct.lua_State, ptr %657, i32 0, i32 0
  %659 = getelementptr inbounds %struct.anon.5, ptr %658, i32 0, i32 7
  %660 = load ptr, ptr %659, align 8, !tbaa !22
  %661 = load i32, ptr %19, align 4, !tbaa !9
  %662 = zext i32 %661 to i64
  %663 = getelementptr inbounds %union.TValue, ptr %660, i64 %662
  store ptr %663, ptr %23, align 8, !tbaa !5
  %664 = load ptr, ptr %23, align 8, !tbaa !5
  %665 = load ptr, ptr %4, align 8, !tbaa !5
  %666 = getelementptr inbounds %struct.jit_State, ptr %665, i32 0, i32 1
  %667 = load ptr, ptr %666, align 8, !tbaa !13
  %668 = getelementptr inbounds %struct.lua_State, ptr %667, i32 0, i32 0
  %669 = getelementptr inbounds %struct.anon.5, ptr %668, i32 0, i32 7
  store ptr %664, ptr %669, align 8, !tbaa !22
  %670 = load ptr, ptr %4, align 8, !tbaa !5
  %671 = getelementptr inbounds %struct.jit_State, ptr %670, i32 0, i32 1
  %672 = load ptr, ptr %671, align 8, !tbaa !13
  %673 = load ptr, ptr %23, align 8, !tbaa !5
  %674 = getelementptr inbounds %union.TValue, ptr %673, i64 -2
  call void @copyTV(ptr noundef %672, ptr noundef %674, ptr noundef %24)
  call void @llvm.lifetime.end.p0(i64 8, ptr %24) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %23) #7
  br label %675

675:                                              ; preds = %639, %597
  %676 = load i32, ptr %22, align 4, !tbaa !9
  %677 = icmp ne i32 %676, 0
  br i1 %677, label %678, label %708

678:                                              ; preds = %675
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #7
  %679 = load ptr, ptr %7, align 8, !tbaa !5
  %680 = getelementptr inbounds %union.TValue, ptr %679, i64 -1
  %681 = getelementptr inbounds %struct.anon.0, ptr %680, i32 0, i32 1
  %682 = getelementptr inbounds %struct.MRef, ptr %681, i32 0, i32 0
  %683 = load i32, ptr %682, align 4, !tbaa !22
  %684 = zext i32 %683 to i64
  %685 = inttoptr i64 %684 to ptr
  %686 = getelementptr inbounds i32, ptr %685, i64 -1
  %687 = load i32, ptr %686, align 4, !tbaa !9
  %688 = lshr i32 %687, 8
  %689 = and i32 %688, 255
  store i32 %689, ptr %25, align 4, !tbaa !9
  %690 = load i32, ptr %22, align 4, !tbaa !9
  %691 = load ptr, ptr %4, align 8, !tbaa !5
  %692 = getelementptr inbounds %struct.jit_State, ptr %691, i32 0, i32 5
  %693 = load ptr, ptr %692, align 8, !tbaa !23
  %694 = load i32, ptr %25, align 4, !tbaa !9
  %695 = zext i32 %694 to i64
  %696 = getelementptr inbounds i32, ptr %693, i64 %695
  store i32 %690, ptr %696, align 4, !tbaa !9
  %697 = load i32, ptr %25, align 4, !tbaa !9
  %698 = load ptr, ptr %4, align 8, !tbaa !5
  %699 = getelementptr inbounds %struct.jit_State, ptr %698, i32 0, i32 7
  %700 = load i32, ptr %699, align 4, !tbaa !35
  %701 = icmp uge i32 %697, %700
  br i1 %701, label %702, label %707

702:                                              ; preds = %678
  %703 = load i32, ptr %25, align 4, !tbaa !9
  %704 = add i32 %703, 1
  %705 = load ptr, ptr %4, align 8, !tbaa !5
  %706 = getelementptr inbounds %struct.jit_State, ptr %705, i32 0, i32 7
  store i32 %704, ptr %706, align 4, !tbaa !35
  br label %707

707:                                              ; preds = %702, %678
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #7
  br label %708

708:                                              ; preds = %707, %675
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #7
  call void @llvm.lifetime.end.p0(i64 4, ptr %21) #7
  br label %710

709:                                              ; preds = %570
  br label %710

710:                                              ; preds = %709, %708
  br label %711

711:                                              ; preds = %710, %569
  br label %712

712:                                              ; preds = %711, %565
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #7
  br label %715

713:                                              ; preds = %475
  %714 = load ptr, ptr %4, align 8, !tbaa !5
  call void @lj_trace_err(ptr noundef %714, i32 noundef 16) #8
  unreachable

715:                                              ; preds = %712
  br label %716

716:                                              ; preds = %715, %474
  store i32 0, ptr %10, align 4
  br label %717

717:                                              ; preds = %716, %472, %184
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #7
  call void @llvm.lifetime.end.p0(i64 8, ptr %7) #7
  %718 = load i32, ptr %10, align 4
  switch i32 %718, label %720 [
    i32 0, label %719
    i32 1, label %719
  ]

719:                                              ; preds = %717, %717
  ret void

720:                                              ; preds = %717
  unreachable
}

; Function Attrs: nounwind uwtable
declare hidden i32 @sload(ptr noundef, i32 noundef) #3

; Function Attrs: alwaysinline nounwind uwtable
declare hidden i32 @bc_isret(i32 noundef) #1

; Function Attrs: nounwind uwtable
declare hidden i32 @check_downrec_unroll(ptr noundef, ptr noundef) #3

declare hidden void @lj_snap_purge(ptr noundef) #2

declare hidden i32 @lj_ir_kptr_(ptr noundef, i32 noundef, ptr noundef) #2

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

declare hidden void @lj_cont_ra() #2

declare hidden void @lj_cont_nop() #2

declare hidden void @lj_cont_cat() #2

; Function Attrs: alwaysinline nounwind uwtable
declare hidden void @copyTV(ptr noundef, ptr noundef, ptr noundef) #1

; Function Attrs: nounwind uwtable
declare hidden i32 @rec_cat(ptr noundef, i32 noundef, i32 noundef) #3

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !10, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!12, !12, i64 0}
!12 = !{!"long", !7, i64 0}
!13 = !{!14, !6, i64 96}
!14 = !{!"jit_State", !15, i64 0, !6, i64 96, !6, i64 104, !6, i64 112, !6, i64 120, !6, i64 128, !10, i64 136, !10, i64 140, !10, i64 144, !7, i64 148, !7, i64 149, !19, i64 150, !7, i64 151, !20, i64 152, !6, i64 176, !10, i64 184, !10, i64 188, !10, i64 192, !10, i64 196, !10, i64 200, !10, i64 204, !10, i64 208, !18, i64 212, !7, i64 216, !6, i64 256, !10, i64 264, !10, i64 268, !10, i64 272, !10, i64 276, !6, i64 280, !6, i64 288, !10, i64 296, !10, i64 300, !7, i64 304, !6, i64 312, !10, i64 320, !10, i64 324, !6, i64 328, !7, i64 336, !7, i64 536, !7, i64 1556, !7, i64 1616, !7, i64 1744, !10, i64 2256, !10, i64 2260, !7, i64 2264, !10, i64 2392, !21, i64 2396, !6, i64 2416, !10, i64 2424, !10, i64 2428, !6, i64 2432, !10, i64 2440, !10, i64 2444, !6, i64 2448, !6, i64 2456, !6, i64 2464, !12, i64 2472, !12, i64 2480, !7, i64 2488, !6, i64 2496, !10, i64 2504, !10, i64 2508}
!15 = !{!"GCtrace", !16, i64 0, !7, i64 4, !7, i64 5, !7, i64 6, !7, i64 7, !10, i64 8, !16, i64 12, !6, i64 16, !10, i64 24, !17, i64 28, !17, i64 30, !6, i64 32, !6, i64 40, !16, i64 48, !18, i64 52, !10, i64 56, !10, i64 60, !6, i64 64, !10, i64 72, !17, i64 76, !17, i64 78, !17, i64 80, !17, i64 82, !17, i64 84, !17, i64 86, !17, i64 88, !7, i64 90, !7, i64 91}
!16 = !{!"GCRef", !10, i64 0}
!17 = !{!"short", !7, i64 0}
!18 = !{!"MRef", !10, i64 0}
!19 = !{!"IRType1", !7, i64 0}
!20 = !{!"FoldState", !7, i64 0, !7, i64 8, !7, i64 16}
!21 = !{!"ScEvEntry", !18, i64 0, !17, i64 4, !17, i64 6, !17, i64 8, !17, i64 10, !19, i64 12, !7, i64 13}
!22 = !{!7, !7, i64 0}
!23 = !{!14, !6, i64 128}
!24 = distinct !{!24, !25}
!25 = !{!"llvm.loop.mustprogress"}
!26 = !{!14, !10, i64 204}
!27 = !{!14, !10, i64 144}
!28 = distinct !{!28, !25}
!29 = !{!14, !6, i64 120}
!30 = !{!14, !6, i64 104}
!31 = !{!14, !10, i64 2424}
!32 = !{!14, !10, i64 2428}
!33 = !{!14, !10, i64 56}
!34 = distinct !{!34, !25}
!35 = !{!14, !10, i64 140}
!36 = !{!37, !7, i64 37}
!37 = !{!"GCproto", !16, i64 0, !7, i64 4, !7, i64 5, !7, i64 6, !7, i64 7, !10, i64 8, !16, i64 12, !18, i64 16, !18, i64 20, !10, i64 24, !10, i64 28, !10, i64 32, !7, i64 36, !7, i64 37, !17, i64 38, !16, i64 40, !10, i64 44, !10, i64 48, !18, i64 52, !18, i64 56, !18, i64 60}
!38 = !{!14, !17, i64 80}
!39 = distinct !{!39, !25}
!40 = !{!14, !7, i64 149}
!41 = !{!14, !10, i64 208}


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

%union.TValue = type { i64 }

@lj_vm_asm_begin = external hidden global [0 x i8], align 1

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

; Function Attrs: alwaysinline nounwind uwtable
declare hidden void @lj_ir_set_(ptr noundef, i16 noundef zeroext, i16 noundef zeroext, i16 noundef zeroext) local_unnamed_addr #1

declare hidden i32 @lj_opt_fold(ptr noundef) local_unnamed_addr #2

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

declare hidden i32 @lj_ir_kgc(ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
declare hidden void @lj_record_stop(ptr noundef, i32 noundef, i32 noundef) local_unnamed_addr #3

declare hidden void @lj_snap_add(ptr noundef) local_unnamed_addr #2

; Function Attrs: noreturn
declare hidden void @lj_trace_err(ptr noundef, i32 noundef) local_unnamed_addr #4

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

; Function Attrs: nounwind uwtable
define hidden void @lj_record_ret(ptr noundef %0, i32 noundef %1, i64 noundef %2) local_unnamed_addr #3 {
  %4 = alloca %union.TValue, align 8
  %5 = getelementptr inbounds i8, ptr %0, i64 96
  %6 = load ptr, ptr %5, align 8, !tbaa !5
  %7 = getelementptr inbounds i8, ptr %6, i64 16
  %8 = load ptr, ptr %7, align 8, !tbaa !19
  %9 = getelementptr inbounds i8, ptr %8, i64 -8
  %10 = icmp sgt i64 %2, 0
  br i1 %10, label %.lr.ph, label %.preheader

.lr.ph:                                           ; preds = %3
  %11 = getelementptr inbounds i8, ptr %0, i64 128
  %12 = zext i32 %1 to i64
  br label %20

.preheader:                                       ; preds = %28, %3
  %13 = getelementptr inbounds i8, ptr %8, i64 -4
  %14 = load i32, ptr %13, align 4, !tbaa !19
  %15 = and i32 %14, 6
  %16 = icmp eq i32 %15, 6
  br i1 %16, label %.lr.ph225, label %._crit_edge

.lr.ph225:                                        ; preds = %.preheader
  %17 = getelementptr inbounds i8, ptr %0, i64 204
  %18 = getelementptr inbounds i8, ptr %0, i64 144
  %19 = getelementptr inbounds i8, ptr %0, i64 128
  br label %30

20:                                               ; preds = %.lr.ph, %28
  %.0191221 = phi i64 [ 0, %.lr.ph ], [ %29, %28 ]
  %21 = load ptr, ptr %11, align 8, !tbaa !20
  %22 = add nuw nsw i64 %.0191221, %12
  %23 = getelementptr inbounds i32, ptr %21, i64 %22
  %24 = load i32, ptr %23, align 4, !tbaa !21
  %.not216 = icmp eq i32 %24, 0
  br i1 %.not216, label %25, label %28

25:                                               ; preds = %20
  %26 = trunc i64 %22 to i32
  %27 = tail call i32 @sload(ptr noundef nonnull %0, i32 noundef %26)
  br label %28

28:                                               ; preds = %20, %25
  %29 = add nuw nsw i64 %.0191221, 1
  %exitcond.not = icmp eq i64 %29, %2
  br i1 %exitcond.not, label %.preheader, label %20, !llvm.loop !22

30:                                               ; preds = %.lr.ph225, %37
  %31 = phi i32 [ %14, %.lr.ph225 ], [ %56, %37 ]
  %32 = phi ptr [ %13, %.lr.ph225 ], [ %55, %37 ]
  %.0224 = phi i32 [ %1, %.lr.ph225 ], [ %47, %37 ]
  %.0188223 = phi i64 [ %2, %.lr.ph225 ], [ %39, %37 ]
  %.0189222 = phi ptr [ %9, %.lr.ph225 ], [ %54, %37 ]
  %33 = load i32, ptr %17, align 4, !tbaa !24
  %34 = add nsw i32 %33, -1
  store i32 %34, ptr %17, align 4, !tbaa !24
  %35 = icmp slt i32 %33, 1
  br i1 %35, label %36, label %37

36:                                               ; preds = %30
  tail call void @lj_trace_err(ptr noundef nonnull %0, i32 noundef 16) #7
  unreachable

37:                                               ; preds = %30
  %38 = ashr i32 %31, 3
  %39 = add nsw i64 %.0188223, 1
  %40 = load i32, ptr %18, align 8, !tbaa !25
  %41 = sub i32 %40, %38
  store i32 %41, ptr %18, align 8, !tbaa !25
  %42 = load ptr, ptr %19, align 8, !tbaa !20
  %43 = zext i32 %38 to i64
  %44 = sub nsw i64 0, %43
  %45 = getelementptr inbounds i32, ptr %42, i64 %44
  store ptr %45, ptr %19, align 8, !tbaa !20
  %46 = add i32 %.0224, -1
  %47 = add i32 %46, %38
  %48 = zext i32 %47 to i64
  %49 = getelementptr inbounds i32, ptr %45, i64 %48
  store i32 33587197, ptr %49, align 4, !tbaa !21
  %50 = load i32, ptr %32, align 4, !tbaa !19
  %51 = and i32 %50, -8
  %52 = sext i32 %51 to i64
  %53 = sub nsw i64 0, %52
  %54 = getelementptr inbounds i8, ptr %.0189222, i64 %53
  %55 = getelementptr inbounds i8, ptr %54, i64 4
  %56 = load i32, ptr %55, align 4, !tbaa !19
  %57 = and i32 %56, 6
  %58 = icmp eq i32 %57, 6
  br i1 %58, label %30, label %._crit_edge, !llvm.loop !26

._crit_edge:                                      ; preds = %37, %.preheader
  %59 = phi i32 [ %14, %.preheader ], [ %56, %37 ]
  %.0189.lcssa = phi ptr [ %9, %.preheader ], [ %54, %37 ]
  %.0188.lcssa = phi i64 [ %2, %.preheader ], [ %39, %37 ]
  %.0.lcssa = phi i32 [ %1, %.preheader ], [ %47, %37 ]
  %.lcssa = phi ptr [ %13, %.preheader ], [ %55, %37 ]
  %60 = getelementptr inbounds i8, ptr %0, i64 204
  %61 = load i32, ptr %60, align 4, !tbaa !24
  %62 = icmp eq i32 %61, 0
  br i1 %62, label %63, label %96

63:                                               ; preds = %._crit_edge
  %64 = getelementptr inbounds i8, ptr %0, i64 120
  %65 = load ptr, ptr %64, align 8, !tbaa !27
  %.not = icmp eq ptr %65, null
  br i1 %.not, label %96, label %66

66:                                               ; preds = %63
  %67 = getelementptr inbounds i8, ptr %0, i64 104
  %68 = load ptr, ptr %67, align 8, !tbaa !28
  %69 = load i32, ptr %68, align 4, !tbaa !21
  %70 = and i32 %69, 255
  %71 = tail call i32 @bc_isret(i32 noundef %70)
  %.not202 = icmp eq i32 %71, 0
  %.pre244 = load i32, ptr %.lcssa, align 4, !tbaa !19
  br i1 %.not202, label %96, label %72

72:                                               ; preds = %66
  %73 = and i32 %.pre244, 3
  %74 = icmp eq i32 %73, 0
  br i1 %74, label %75, label %88

75:                                               ; preds = %72
  %76 = getelementptr inbounds i8, ptr %0, i64 2424
  %77 = load i32, ptr %76, align 8, !tbaa !29
  %78 = icmp eq i32 %77, 0
  br i1 %78, label %79, label %96

79:                                               ; preds = %75
  %80 = getelementptr inbounds i8, ptr %0, i64 2428
  %81 = load i32, ptr %80, align 4, !tbaa !30
  %82 = icmp eq i32 %81, 0
  br i1 %82, label %83, label %96

83:                                               ; preds = %79
  %84 = getelementptr inbounds i8, ptr %0, i64 56
  %85 = load i32, ptr %84, align 8, !tbaa !31
  %86 = and i32 %85, 255
  %87 = tail call i32 @bc_isret(i32 noundef %86)
  %.not203 = icmp eq i32 %87, 0
  br i1 %.not203, label %88, label %._crit_edge243

._crit_edge243:                                   ; preds = %83
  %.pre = load i32, ptr %.lcssa, align 4, !tbaa !19
  br label %96

88:                                               ; preds = %83, %72
  %.not237 = icmp eq i32 %.0.lcssa, 0
  br i1 %.not237, label %._crit_edge232, label %.lr.ph231

.lr.ph231:                                        ; preds = %88
  %89 = zext i32 %.0.lcssa to i64
  %90 = getelementptr inbounds i8, ptr %0, i64 128
  %91 = load ptr, ptr %90, align 8, !tbaa !20
  %92 = shl nuw nsw i64 %89, 2
  tail call void @llvm.memset.p0.i64(ptr align 4 %91, i8 0, i64 %92, i1 false), !tbaa !21
  br label %._crit_edge232

._crit_edge232:                                   ; preds = %.lr.ph231, %88
  %93 = trunc i64 %.0188.lcssa to i32
  %94 = add i32 %.0.lcssa, %93
  %95 = getelementptr inbounds i8, ptr %0, i64 140
  store i32 %94, ptr %95, align 4, !tbaa !32
  tail call void @lj_record_stop(ptr noundef nonnull %0, i32 noundef 7, i32 noundef 0)
  br label %354

96:                                               ; preds = %._crit_edge243, %79, %75, %66, %63, %._crit_edge
  %97 = phi i32 [ %.pre, %._crit_edge243 ], [ %.pre244, %79 ], [ %.pre244, %75 ], [ %.pre244, %66 ], [ %59, %63 ], [ %59, %._crit_edge ]
  %98 = and i32 %97, 7
  %99 = icmp eq i32 %98, 3
  br i1 %99, label %100, label %121

100:                                              ; preds = %96
  %101 = load i32, ptr %60, align 4, !tbaa !24
  %102 = add nsw i32 %101, -1
  store i32 %102, ptr %60, align 4, !tbaa !24
  %103 = icmp slt i32 %101, 1
  br i1 %103, label %104, label %105

104:                                              ; preds = %100
  tail call void @lj_trace_err(ptr noundef nonnull %0, i32 noundef 16) #7
  unreachable

105:                                              ; preds = %100
  %106 = ashr i32 %97, 3
  %107 = add i32 %106, %.0.lcssa
  %108 = getelementptr inbounds i8, ptr %0, i64 144
  %109 = load i32, ptr %108, align 8, !tbaa !25
  %110 = sub i32 %109, %106
  store i32 %110, ptr %108, align 8, !tbaa !25
  %111 = getelementptr inbounds i8, ptr %0, i64 128
  %112 = load ptr, ptr %111, align 8, !tbaa !20
  %113 = zext i32 %106 to i64
  %114 = sub nsw i64 0, %113
  %115 = getelementptr inbounds i32, ptr %112, i64 %114
  store ptr %115, ptr %111, align 8, !tbaa !20
  %116 = load i32, ptr %.lcssa, align 4, !tbaa !19
  %117 = and i32 %116, -8
  %118 = sext i32 %117 to i64
  %119 = sub nsw i64 0, %118
  %120 = getelementptr inbounds i8, ptr %.0189.lcssa, i64 %119
  br label %121

121:                                              ; preds = %105, %96
  %.1190 = phi ptr [ %120, %105 ], [ %.0189.lcssa, %96 ]
  %.1 = phi i32 [ %107, %105 ], [ %.0.lcssa, %96 ]
  %122 = getelementptr inbounds i8, ptr %.1190, i64 4
  %123 = load i32, ptr %122, align 4, !tbaa !19
  %124 = zext i32 %123 to i64
  %125 = and i64 %124, 3
  %126 = icmp eq i64 %125, 0
  br i1 %126, label %127, label %250

127:                                              ; preds = %121
  %128 = zext i32 %123 to i64
  %129 = inttoptr i64 %128 to ptr
  %130 = getelementptr inbounds i8, ptr %129, i64 -4
  %131 = load i32, ptr %130, align 4, !tbaa !21
  %132 = lshr i32 %131, 24
  %.not210 = icmp ult i32 %131, 16777216
  %133 = zext nneg i32 %132 to i64
  %134 = add nsw i64 %133, -1
  %135 = select i1 %.not210, i64 %.0188.lcssa, i64 %134
  %136 = lshr i32 %131, 8
  %137 = and i32 %136, 255
  %138 = add nuw nsw i32 %137, 1
  %139 = zext nneg i32 %138 to i64
  %140 = sub nsw i64 0, %139
  %141 = getelementptr inbounds %union.TValue, ptr %.1190, i64 %140
  %142 = load i32, ptr %141, align 8, !tbaa !19
  %143 = zext i32 %142 to i64
  %144 = inttoptr i64 %143 to ptr
  %145 = getelementptr inbounds i8, ptr %144, i64 16
  %146 = load i32, ptr %145, align 8, !tbaa !19
  %147 = zext i32 %146 to i64
  %148 = inttoptr i64 %147 to ptr
  %149 = getelementptr inbounds i8, ptr %148, i64 -64
  %150 = getelementptr inbounds i8, ptr %148, i64 -27
  %151 = load i8, ptr %150, align 1, !tbaa !33
  %152 = and i8 %151, 8
  %.not211 = icmp eq i8 %152, 0
  br i1 %.not211, label %154, label %153

153:                                              ; preds = %127
  tail call void @lj_trace_err(ptr noundef nonnull %0, i32 noundef 12) #7
  unreachable

154:                                              ; preds = %127
  %155 = load i32, ptr %60, align 4, !tbaa !24
  %156 = icmp eq i32 %155, 0
  br i1 %156, label %157, label %175

157:                                              ; preds = %154
  %158 = getelementptr inbounds i8, ptr %0, i64 120
  %159 = load ptr, ptr %158, align 8, !tbaa !27
  %.not212 = icmp eq ptr %159, null
  br i1 %.not212, label %175, label %160

160:                                              ; preds = %157
  %161 = load ptr, ptr %5, align 8, !tbaa !5
  %162 = getelementptr inbounds i8, ptr %161, i64 16
  %163 = load ptr, ptr %162, align 8, !tbaa !19
  %164 = getelementptr inbounds i8, ptr %163, i64 -8
  %165 = icmp eq ptr %.1190, %164
  br i1 %165, label %166, label %175

166:                                              ; preds = %160
  %167 = tail call i32 @check_downrec_unroll(ptr noundef nonnull %0, ptr noundef nonnull %149)
  %.not213 = icmp eq i32 %167, 0
  br i1 %.not213, label %174, label %.critedge

.critedge:                                        ; preds = %166
  %168 = trunc i64 %.0188.lcssa to i32
  %169 = add i32 %.1, %168
  %170 = getelementptr inbounds i8, ptr %0, i64 140
  store i32 %169, ptr %170, align 4, !tbaa !32
  tail call void @lj_snap_purge(ptr noundef nonnull %0) #8
  %171 = getelementptr inbounds i8, ptr %0, i64 80
  %172 = load i16, ptr %171, align 8, !tbaa !35
  %173 = zext i16 %172 to i32
  tail call void @lj_record_stop(ptr noundef nonnull %0, i32 noundef 5, i32 noundef %173)
  br label %354

174:                                              ; preds = %166
  tail call void @lj_snap_add(ptr noundef nonnull %0) #8
  br label %175

175:                                              ; preds = %174, %160, %157, %154
  %176 = icmp sgt i64 %135, 0
  br i1 %176, label %.lr.ph235, label %._crit_edge236

.lr.ph235:                                        ; preds = %175
  %177 = getelementptr inbounds i8, ptr %0, i64 128
  %178 = zext i32 %.1 to i64
  %179 = load ptr, ptr %177, align 8, !tbaa !20
  %invariant.gep = getelementptr i8, ptr %179, i64 -4
  %invariant.gep250 = getelementptr inbounds i32, ptr %179, i64 %178
  %xtraiter = and i64 %135, 1
  %180 = icmp eq i64 %135, 1
  br i1 %180, label %._crit_edge236.loopexit.unr-lcssa, label %.lr.ph235.new

.lr.ph235.new:                                    ; preds = %.lr.ph235
  %unroll_iter = and i64 %135, 9223372036854775806
  br label %181

181:                                              ; preds = %191, %.lr.ph235.new
  %.2233 = phi i64 [ 0, %.lr.ph235.new ], [ %193, %191 ]
  %niter = phi i64 [ 0, %.lr.ph235.new ], [ %niter.next.1, %191 ]
  %182 = icmp slt i64 %.2233, %.0188.lcssa
  br i1 %182, label %183, label %185

183:                                              ; preds = %181
  %gep251 = getelementptr inbounds i32, ptr %invariant.gep250, i64 %.2233
  %184 = load i32, ptr %gep251, align 4, !tbaa !21
  br label %185

185:                                              ; preds = %181, %183
  %186 = phi i32 [ %184, %183 ], [ 32767, %181 ]
  %gep = getelementptr i32, ptr %invariant.gep, i64 %.2233
  store i32 %186, ptr %gep, align 4, !tbaa !21
  %187 = or disjoint i64 %.2233, 1
  %188 = icmp slt i64 %187, %.0188.lcssa
  br i1 %188, label %189, label %191

189:                                              ; preds = %185
  %gep251.1 = getelementptr inbounds i32, ptr %invariant.gep250, i64 %187
  %190 = load i32, ptr %gep251.1, align 4, !tbaa !21
  br label %191

191:                                              ; preds = %189, %185
  %192 = phi i32 [ %190, %189 ], [ 32767, %185 ]
  %gep.1 = getelementptr i32, ptr %179, i64 %.2233
  store i32 %192, ptr %gep.1, align 4, !tbaa !21
  %193 = add nuw nsw i64 %.2233, 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 %._crit_edge236.loopexit.unr-lcssa, label %181, !llvm.loop !36

._crit_edge236.loopexit.unr-lcssa:                ; preds = %191, %.lr.ph235
  %.2233.unr = phi i64 [ 0, %.lr.ph235 ], [ %193, %191 ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %._crit_edge236, label %.epil.preheader

.epil.preheader:                                  ; preds = %._crit_edge236.loopexit.unr-lcssa
  %194 = icmp slt i64 %.2233.unr, %.0188.lcssa
  br i1 %194, label %195, label %._crit_edge236.loopexit.epilog-lcssa

195:                                              ; preds = %.epil.preheader
  %gep251.epil = getelementptr inbounds i32, ptr %invariant.gep250, i64 %.2233.unr
  %196 = load i32, ptr %gep251.epil, align 4, !tbaa !21
  br label %._crit_edge236.loopexit.epilog-lcssa

._crit_edge236.loopexit.epilog-lcssa:             ; preds = %195, %.epil.preheader
  %197 = phi i32 [ %196, %195 ], [ 32767, %.epil.preheader ]
  %gep.epil = getelementptr i32, ptr %invariant.gep, i64 %.2233.unr
  store i32 %197, ptr %gep.epil, align 4, !tbaa !21
  br label %._crit_edge236

._crit_edge236:                                   ; preds = %._crit_edge236.loopexit.epilog-lcssa, %._crit_edge236.loopexit.unr-lcssa, %175
  %198 = trunc i64 %135 to i32
  %199 = add i32 %137, %198
  %200 = getelementptr inbounds i8, ptr %0, i64 140
  store i32 %199, ptr %200, align 4, !tbaa !32
  %201 = load i32, ptr %60, align 4, !tbaa !24
  %202 = icmp sgt i32 %201, 0
  br i1 %202, label %203, label %211

203:                                              ; preds = %._crit_edge236
  %204 = add nsw i32 %201, -1
  store i32 %204, ptr %60, align 4, !tbaa !24
  %205 = getelementptr inbounds i8, ptr %0, i64 144
  %206 = load i32, ptr %205, align 8, !tbaa !25
  %207 = sub i32 %206, %138
  store i32 %207, ptr %205, align 8, !tbaa !25
  %208 = getelementptr inbounds i8, ptr %0, i64 128
  %209 = load ptr, ptr %208, align 8, !tbaa !20
  %210 = getelementptr inbounds i32, ptr %209, i64 %140
  store ptr %210, ptr %208, align 8, !tbaa !20
  br label %354

211:                                              ; preds = %._crit_edge236
  %212 = getelementptr inbounds i8, ptr %0, i64 2424
  %213 = load i32, ptr %212, align 8, !tbaa !29
  %214 = icmp eq i32 %213, 0
  br i1 %214, label %215, label %225

215:                                              ; preds = %211
  %216 = getelementptr inbounds i8, ptr %0, i64 2428
  %217 = load i32, ptr %216, align 4, !tbaa !30
  %218 = icmp eq i32 %217, 0
  br i1 %218, label %219, label %225

219:                                              ; preds = %215
  %220 = getelementptr inbounds i8, ptr %0, i64 56
  %221 = load i32, ptr %220, align 8, !tbaa !31
  %222 = and i32 %221, 255
  %223 = tail call i32 @bc_isret(i32 noundef %222)
  %.not214 = icmp eq i32 %223, 0
  br i1 %.not214, label %224, label %225

224:                                              ; preds = %219
  tail call void @lj_trace_err(ptr noundef nonnull %0, i32 noundef 8) #7
  unreachable

225:                                              ; preds = %219, %215, %211
  %226 = getelementptr inbounds i8, ptr %0, i64 149
  %227 = load i8, ptr %226, align 1, !tbaa !37
  %.not215 = icmp eq i8 %227, 0
  br i1 %.not215, label %229, label %228

228:                                              ; preds = %225
  tail call void @lj_trace_err(ptr noundef nonnull %0, i32 noundef 16) #7
  unreachable

229:                                              ; preds = %225
  %230 = tail call i32 @lj_ir_kgc(ptr noundef nonnull %0, ptr noundef nonnull %149, i32 noundef 7) #8
  %231 = load i32, ptr %122, align 4, !tbaa !19
  %232 = zext i32 %231 to i64
  %233 = inttoptr i64 %232 to ptr
  %234 = tail call i32 @lj_ir_kptr_(ptr noundef nonnull %0, i32 noundef 25, ptr noundef %233) #8
  %235 = trunc i32 %230 to i16
  %236 = trunc i32 %234 to i16
  tail call void @lj_ir_set_(ptr noundef nonnull %0, i16 noundef zeroext 2949, i16 noundef zeroext %235, i16 noundef zeroext %236)
  %237 = tail call i32 @lj_opt_fold(ptr noundef nonnull %0) #8
  %238 = getelementptr inbounds i8, ptr %0, i64 208
  %239 = load i32, ptr %238, align 8, !tbaa !38
  %240 = add nsw i32 %239, 1
  store i32 %240, ptr %238, align 8, !tbaa !38
  store i8 1, ptr %226, align 1, !tbaa !37
  %241 = getelementptr inbounds i8, ptr %0, i64 128
  %242 = load ptr, ptr %241, align 8, !tbaa !20
  %243 = zext nneg i32 %137 to i64
  %244 = getelementptr inbounds i32, ptr %242, i64 %243
  %245 = getelementptr inbounds i8, ptr %242, i64 -4
  %246 = shl i64 %135, 2
  tail call void @llvm.memmove.p0.p0.i64(ptr align 4 %244, ptr nonnull align 4 %245, i64 %246, i1 false)
  %247 = load ptr, ptr %241, align 8, !tbaa !20
  %248 = getelementptr inbounds i8, ptr %247, i64 -4
  %249 = shl nuw nsw i64 %139, 2
  tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 4 dereferenceable(1) %248, i8 0, i64 %249, i1 false)
  br label %354

250:                                              ; preds = %121
  %251 = and i64 %124, 7
  %252 = icmp eq i64 %251, 2
  br i1 %252, label %253, label %353

253:                                              ; preds = %250
  %254 = getelementptr inbounds i8, ptr %.1190, i64 -8
  %255 = load i32, ptr %254, align 8, !tbaa !19
  %256 = sext i32 %255 to i64
  %257 = add nsw i64 %256, ptrtoint (ptr @lj_vm_asm_begin to i64)
  %258 = inttoptr i64 %257 to ptr
  %259 = ashr i32 %123, 3
  %260 = load i32, ptr %60, align 4, !tbaa !24
  %261 = add nsw i32 %260, -2
  store i32 %261, ptr %60, align 4, !tbaa !24
  %262 = icmp slt i32 %260, 2
  br i1 %262, label %263, label %264

263:                                              ; preds = %253
  tail call void @lj_trace_err(ptr noundef nonnull %0, i32 noundef 16) #7
  unreachable

264:                                              ; preds = %253
  %265 = getelementptr inbounds i8, ptr %0, i64 144
  %266 = load i32, ptr %265, align 8, !tbaa !25
  %267 = sub i32 %266, %259
  store i32 %267, ptr %265, align 8, !tbaa !25
  %268 = getelementptr inbounds i8, ptr %0, i64 128
  %269 = load ptr, ptr %268, align 8, !tbaa !20
  %270 = zext i32 %259 to i64
  %271 = sub nsw i64 0, %270
  %272 = getelementptr inbounds i32, ptr %269, i64 %271
  store ptr %272, ptr %268, align 8, !tbaa !20
  %273 = add nsw i32 %259, -2
  %274 = getelementptr inbounds i8, ptr %0, i64 140
  store i32 %273, ptr %274, align 4, !tbaa !32
  %275 = icmp eq ptr %258, @lj_cont_ra
  br i1 %275, label %276, label %297

276:                                              ; preds = %264
  %277 = getelementptr inbounds i8, ptr %.1190, i64 -4
  %278 = load i32, ptr %277, align 4, !tbaa !19
  %279 = zext i32 %278 to i64
  %280 = inttoptr i64 %279 to ptr
  %281 = getelementptr inbounds i8, ptr %280, i64 -4
  %282 = load i32, ptr %281, align 4, !tbaa !21
  %283 = lshr i32 %282, 8
  %284 = and i32 %283, 255
  %.not208 = icmp eq i64 %.0188.lcssa, 0
  br i1 %.not208, label %290, label %285

285:                                              ; preds = %276
  %286 = add i32 %259, %.1
  %287 = zext i32 %286 to i64
  %288 = getelementptr inbounds i32, ptr %272, i64 %287
  %289 = load i32, ptr %288, align 4, !tbaa !21
  br label %290

290:                                              ; preds = %276, %285
  %291 = phi i32 [ %289, %285 ], [ 32767, %276 ]
  %292 = zext nneg i32 %284 to i64
  %293 = getelementptr inbounds i32, ptr %272, i64 %292
  store i32 %291, ptr %293, align 4, !tbaa !21
  %294 = load i32, ptr %274, align 4, !tbaa !32
  %.not209 = icmp ult i32 %284, %294
  br i1 %.not209, label %354, label %295

295:                                              ; preds = %290
  %296 = add nuw nsw i32 %284, 1
  store i32 %296, ptr %274, align 4, !tbaa !32
  br label %354

297:                                              ; preds = %264
  %298 = icmp eq ptr %258, @lj_cont_cat
  br i1 %298, label %299, label %354

299:                                              ; preds = %297
  %300 = getelementptr inbounds i8, ptr %.1190, i64 -4
  %301 = load i32, ptr %300, align 4, !tbaa !19
  %302 = zext i32 %301 to i64
  %303 = inttoptr i64 %302 to ptr
  %304 = getelementptr inbounds i8, ptr %303, i64 -4
  %305 = load i32, ptr %304, align 4, !tbaa !21
  %306 = lshr i32 %305, 24
  %.not204 = icmp eq i64 %.0188.lcssa, 0
  br i1 %.not204, label %312, label %307

307:                                              ; preds = %299
  %308 = add i32 %259, %.1
  %309 = zext i32 %308 to i64
  %310 = getelementptr inbounds i32, ptr %272, i64 %309
  %311 = load i32, ptr %310, align 4, !tbaa !21
  br label %312

312:                                              ; preds = %299, %307
  %313 = phi i32 [ %311, %307 ], [ 32767, %299 ]
  %.not205 = icmp eq i32 %306, %273
  br i1 %.not205, label %338, label %314

314:                                              ; preds = %312
  %315 = load ptr, ptr %5, align 8, !tbaa !5
  %316 = getelementptr inbounds i8, ptr %315, i64 16
  %317 = load ptr, ptr %316, align 8, !tbaa !19
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %4) #8
  %318 = zext i32 %273 to i64
  %319 = getelementptr inbounds i32, ptr %272, i64 %318
  store i32 %313, ptr %319, align 4, !tbaa !21
  %320 = getelementptr inbounds i8, ptr %317, i64 -16
  call void @copyTV(ptr noundef %315, ptr noundef nonnull %4, ptr noundef nonnull %320)
  br i1 %.not204, label %325, label %321

321:                                              ; preds = %314
  %322 = load ptr, ptr %5, align 8, !tbaa !5
  %323 = zext i32 %.1 to i64
  %324 = getelementptr inbounds %union.TValue, ptr %317, i64 %323
  call void @copyTV(ptr noundef %322, ptr noundef nonnull %320, ptr noundef %324)
  br label %327

325:                                              ; preds = %314
  %326 = getelementptr inbounds i8, ptr %317, i64 -12
  store i32 -1, ptr %326, align 4, !tbaa !19
  br label %327

327:                                              ; preds = %325, %321
  %328 = getelementptr inbounds %union.TValue, ptr %317, i64 %271
  %329 = load ptr, ptr %5, align 8, !tbaa !5
  %330 = getelementptr inbounds i8, ptr %329, i64 16
  store ptr %328, ptr %330, align 8, !tbaa !19
  %331 = call i32 @rec_cat(ptr noundef nonnull %0, i32 noundef %306, i32 noundef %273)
  %332 = load ptr, ptr %5, align 8, !tbaa !5
  %333 = getelementptr inbounds i8, ptr %332, i64 16
  %334 = load ptr, ptr %333, align 8, !tbaa !19
  %335 = getelementptr inbounds %union.TValue, ptr %334, i64 %270
  store ptr %335, ptr %333, align 8, !tbaa !19
  %336 = load ptr, ptr %5, align 8, !tbaa !5
  %337 = getelementptr inbounds i8, ptr %335, i64 -16
  call void @copyTV(ptr noundef %336, ptr noundef nonnull %337, ptr noundef nonnull %4)
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %4) #8
  br label %338

338:                                              ; preds = %327, %312
  %.0187 = phi i32 [ %331, %327 ], [ %313, %312 ]
  %.not206 = icmp eq i32 %.0187, 0
  br i1 %.not206, label %354, label %339

339:                                              ; preds = %338
  %340 = load i32, ptr %300, align 4, !tbaa !19
  %341 = zext i32 %340 to i64
  %342 = inttoptr i64 %341 to ptr
  %343 = getelementptr inbounds i8, ptr %342, i64 -4
  %344 = load i32, ptr %343, align 4, !tbaa !21
  %345 = lshr i32 %344, 8
  %346 = and i32 %345, 255
  %347 = load ptr, ptr %268, align 8, !tbaa !20
  %348 = zext nneg i32 %346 to i64
  %349 = getelementptr inbounds i32, ptr %347, i64 %348
  store i32 %.0187, ptr %349, align 4, !tbaa !21
  %350 = load i32, ptr %274, align 4, !tbaa !32
  %.not207 = icmp ult i32 %346, %350
  br i1 %.not207, label %354, label %351

351:                                              ; preds = %339
  %352 = add nuw nsw i32 %346, 1
  store i32 %352, ptr %274, align 4, !tbaa !32
  br label %354

353:                                              ; preds = %250
  tail call void @lj_trace_err(ptr noundef nonnull %0, i32 noundef 16) #7
  unreachable

354:                                              ; preds = %203, %229, %338, %351, %339, %290, %295, %297, %.critedge, %._crit_edge232
  ret void
}

; Function Attrs: nounwind uwtable
declare hidden i32 @sload(ptr noundef, i32 noundef) local_unnamed_addr #3

; Function Attrs: alwaysinline nounwind uwtable
declare hidden i32 @bc_isret(i32 noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
declare hidden i32 @check_downrec_unroll(ptr noundef, ptr noundef) local_unnamed_addr #3

declare hidden void @lj_snap_purge(ptr noundef) local_unnamed_addr #2

declare hidden i32 @lj_ir_kptr_(ptr noundef, i32 noundef, ptr noundef) local_unnamed_addr #2

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

declare hidden void @lj_cont_ra() #2

declare hidden void @lj_cont_cat() #2

; Function Attrs: alwaysinline nounwind uwtable
declare hidden void @copyTV(ptr noundef, ptr noundef, ptr noundef) local_unnamed_addr #1

; Function Attrs: nounwind uwtable
declare hidden i32 @rec_cat(ptr noundef, i32 noundef, i32 noundef) local_unnamed_addr #3

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { alwaysinline nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { noreturn "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 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: readwrite) }
attributes #6 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #7 = { noreturn nounwind }
attributes #8 = { 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, !12, i64 96}
!6 = !{!"jit_State", !7, i64 0, !12, i64 96, !12, i64 104, !12, i64 112, !12, i64 120, !12, i64 128, !9, i64 136, !9, i64 140, !9, i64 144, !10, i64 148, !10, i64 149, !15, i64 150, !10, i64 151, !16, i64 152, !12, i64 176, !9, i64 184, !9, i64 188, !9, i64 192, !9, i64 196, !9, i64 200, !9, i64 204, !9, i64 208, !14, i64 212, !10, i64 216, !12, i64 256, !9, i64 264, !9, i64 268, !9, i64 272, !9, i64 276, !12, i64 280, !12, i64 288, !9, i64 296, !9, i64 300, !10, i64 304, !12, i64 312, !9, i64 320, !9, i64 324, !12, i64 328, !10, i64 336, !10, i64 536, !10, i64 1556, !10, i64 1616, !10, i64 1744, !9, i64 2256, !9, i64 2260, !10, i64 2264, !9, i64 2392, !17, i64 2396, !12, i64 2416, !9, i64 2424, !9, i64 2428, !12, i64 2432, !9, i64 2440, !9, i64 2444, !12, i64 2448, !12, i64 2456, !12, i64 2464, !18, i64 2472, !18, i64 2480, !10, i64 2488, !12, i64 2496, !9, i64 2504, !9, i64 2508}
!7 = !{!"GCtrace", !8, i64 0, !10, i64 4, !10, i64 5, !10, i64 6, !10, i64 7, !9, i64 8, !8, i64 12, !12, i64 16, !9, i64 24, !13, i64 28, !13, i64 30, !12, i64 32, !12, i64 40, !8, i64 48, !14, i64 52, !9, i64 56, !9, i64 60, !12, i64 64, !9, i64 72, !13, i64 76, !13, i64 78, !13, i64 80, !13, i64 82, !13, i64 84, !13, i64 86, !13, i64 88, !10, i64 90, !10, i64 91}
!8 = !{!"GCRef", !9, i64 0}
!9 = !{!"int", !10, i64 0}
!10 = !{!"omnipotent char", !11, i64 0}
!11 = !{!"Simple C/C++ TBAA"}
!12 = !{!"any pointer", !10, i64 0}
!13 = !{!"short", !10, i64 0}
!14 = !{!"MRef", !9, i64 0}
!15 = !{!"IRType1", !10, i64 0}
!16 = !{!"FoldState", !10, i64 0, !10, i64 8, !10, i64 16}
!17 = !{!"ScEvEntry", !14, i64 0, !13, i64 4, !13, i64 6, !13, i64 8, !13, i64 10, !15, i64 12, !10, i64 13}
!18 = !{!"long", !10, i64 0}
!19 = !{!10, !10, i64 0}
!20 = !{!6, !12, i64 128}
!21 = !{!9, !9, i64 0}
!22 = distinct !{!22, !23}
!23 = !{!"llvm.loop.mustprogress"}
!24 = !{!6, !9, i64 204}
!25 = !{!6, !9, i64 144}
!26 = distinct !{!26, !23}
!27 = !{!6, !12, i64 120}
!28 = !{!6, !12, i64 104}
!29 = !{!6, !9, i64 2424}
!30 = !{!6, !9, i64 2428}
!31 = !{!6, !9, i64 56}
!32 = !{!6, !9, i64 140}
!33 = !{!34, !10, i64 37}
!34 = !{!"GCproto", !8, i64 0, !10, i64 4, !10, i64 5, !10, i64 6, !10, i64 7, !9, i64 8, !8, i64 12, !14, i64 16, !14, i64 20, !9, i64 24, !9, i64 28, !9, i64 32, !10, i64 36, !10, i64 37, !13, i64 38, !8, i64 40, !9, i64 44, !9, i64 48, !14, i64 52, !14, i64 56, !14, i64 60}
!35 = !{!6, !13, i64 80}
!36 = distinct !{!36, !23}
!37 = !{!6, !10, i64 149}
!38 = !{!6, !9, i64 208}


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