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

%struct.IRType1 = type { i8 }
%struct.RecordIndex = type { %union.TValue, %union.TValue, %union.TValue, %union.TValue, ptr, ptr, i32, i32, i32, i32, i32, i32 }
%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.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 = type { %union.anon, i32 }
%union.anon = type { %struct.GCRef }
%struct.GG_State = type { %struct.lua_State, %struct.global_State, %struct.jit_State, [64 x i16], [243 x ptr], [57 x i32] }
%struct.global_State = type { ptr, i32, i32, ptr, ptr, %struct.GCState, i32, %struct.SBuf, %struct.GCstr, i8, i8, i8, i8, %struct.GCRef, %union.TValue, %union.TValue, %union.TValue, %struct.Node, %struct.GCupval, i32, i32, ptr, ptr, ptr, i32, i32, %struct.GCRef, %struct.MRef, %struct.MRef, [38 x %struct.GCRef] }
%struct.GCState = type { i32, i32, i8, i8, i8, i8, i32, %struct.GCRef, %struct.MRef, %struct.GCRef, %struct.GCRef, %struct.GCRef, %struct.GCRef, i32, i32, i32, i32 }
%struct.SBuf = type { %struct.MRef, %struct.MRef, %struct.MRef, %struct.MRef }
%struct.GCstr = type { %struct.GCRef, i8, i8, i8, i8, i32, i32 }
%struct.Node = type { %union.TValue, %union.TValue, %struct.MRef, %struct.MRef }
%struct.GCupval = type { %struct.GCRef, i8, i8, i8, i8, %union.anon.6, %struct.MRef, i32 }
%union.anon.6 = type { %union.TValue }
%struct.GCtab = type { %struct.GCRef, i8, i8, i8, i8, %struct.MRef, %struct.GCRef, %struct.GCRef, ptr, %struct.MRef, i32, i32 }

; 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

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

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

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

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

declare hidden void @lj_cont_ra() #2

declare hidden void @lj_cont_nop() #2

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

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

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

declare hidden ptr @lj_tab_getstr(ptr noundef, ptr noundef) #2

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

; Function Attrs: nounwind uwtable
define hidden i32 @lj_record_idx(ptr noundef %0, ptr noundef %1) #3 {
  %3 = alloca i32, align 4
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca i32, align 4
  %7 = alloca i32, align 4
  %8 = alloca i32, align 4
  %9 = alloca i32, align 4
  %10 = alloca %struct.IRType1, align 1
  %11 = alloca ptr, align 8
  %12 = alloca i32, align 4
  %13 = alloca ptr, align 8
  %14 = alloca ptr, align 8
  %15 = alloca i32, align 4
  %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 ptr, align 8
  %22 = alloca i32, align 4
  %23 = alloca i32, align 4
  %24 = alloca i32, align 4
  %25 = alloca i32, align 4
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %6) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %8) #6
  call void @llvm.lifetime.start.p0(i64 4, ptr %9) #6
  call void @llvm.lifetime.start.p0(i64 1, ptr %10) #6
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #6
  br label %26

26:                                               ; preds = %161, %2
  %27 = load ptr, ptr %5, align 8, !tbaa !5
  %28 = getelementptr inbounds %struct.RecordIndex, ptr %27, i32 0, i32 6
  %29 = load i32, ptr %28, align 8, !tbaa !9
  %30 = and i32 %29, 520093696
  %31 = icmp eq i32 %30, 184549376
  %32 = xor i1 %31, true
  br i1 %32, label %33, label %162

33:                                               ; preds = %26
  %34 = load ptr, ptr %4, align 8, !tbaa !5
  %35 = load ptr, ptr %5, align 8, !tbaa !5
  %36 = load ptr, ptr %5, align 8, !tbaa !5
  %37 = getelementptr inbounds %struct.RecordIndex, ptr %36, i32 0, i32 8
  %38 = load i32, ptr %37, align 8, !tbaa !12
  %39 = icmp ne i32 %38, 0
  %40 = zext i1 %39 to i64
  %41 = select i1 %39, i32 1, i32 0
  %42 = call i32 @lj_record_mm_lookup(ptr noundef %34, ptr noundef %35, i32 noundef %41)
  %43 = icmp ne i32 %42, 0
  br i1 %43, label %46, label %44

44:                                               ; preds = %33
  %45 = load ptr, ptr %4, align 8, !tbaa !5
  call void @lj_trace_err(ptr noundef %45, i32 noundef 18) #7
  unreachable

46:                                               ; preds = %33
  br label %47

47:                                               ; preds = %644, %325, %206, %46
  %48 = load ptr, ptr %5, align 8, !tbaa !5
  %49 = getelementptr inbounds %struct.RecordIndex, ptr %48, i32 0, i32 10
  %50 = load i32, ptr %49, align 8, !tbaa !13
  %51 = and i32 %50, 520093696
  %52 = icmp eq i32 %51, 134217728
  br i1 %52, label %53, label %141

53:                                               ; preds = %47
  call void @llvm.lifetime.start.p0(i64 4, ptr %12) #6
  %54 = load ptr, ptr %4, align 8, !tbaa !5
  %55 = load ptr, ptr %5, align 8, !tbaa !5
  %56 = getelementptr inbounds %struct.RecordIndex, ptr %55, i32 0, i32 8
  %57 = load i32, ptr %56, align 8, !tbaa !12
  %58 = icmp ne i32 %57, 0
  %59 = zext i1 %58 to i64
  %60 = select i1 %58, ptr @lj_cont_nop, ptr @lj_cont_ra
  %61 = call i32 @rec_mm_prep(ptr noundef %54, ptr noundef %60)
  store i32 %61, ptr %12, align 4, !tbaa !14
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #6
  %62 = load ptr, ptr %4, align 8, !tbaa !5
  %63 = getelementptr inbounds %struct.jit_State, ptr %62, i32 0, i32 5
  %64 = load ptr, ptr %63, align 8, !tbaa !15
  %65 = load i32, ptr %12, align 4, !tbaa !14
  %66 = zext i32 %65 to i64
  %67 = getelementptr inbounds i32, ptr %64, i64 %66
  store ptr %67, ptr %13, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #6
  %68 = load ptr, ptr %4, align 8, !tbaa !5
  %69 = getelementptr inbounds %struct.jit_State, ptr %68, i32 0, i32 1
  %70 = load ptr, ptr %69, align 8, !tbaa !25
  %71 = getelementptr inbounds %struct.lua_State, ptr %70, i32 0, i32 0
  %72 = getelementptr inbounds %struct.anon.5, ptr %71, i32 0, i32 7
  %73 = load ptr, ptr %72, align 8, !tbaa !26
  %74 = load i32, ptr %12, align 4, !tbaa !14
  %75 = zext i32 %74 to i64
  %76 = getelementptr inbounds %union.TValue, ptr %73, i64 %75
  store ptr %76, ptr %14, align 8, !tbaa !5
  %77 = load ptr, ptr %5, align 8, !tbaa !5
  %78 = getelementptr inbounds %struct.RecordIndex, ptr %77, i32 0, i32 10
  %79 = load i32, ptr %78, align 8, !tbaa !13
  %80 = load ptr, ptr %13, align 8, !tbaa !5
  %81 = getelementptr inbounds i32, ptr %80, i64 0
  store i32 %79, ptr %81, align 4, !tbaa !14
  %82 = load ptr, ptr %5, align 8, !tbaa !5
  %83 = getelementptr inbounds %struct.RecordIndex, ptr %82, i32 0, i32 6
  %84 = load i32, ptr %83, align 8, !tbaa !9
  %85 = load ptr, ptr %13, align 8, !tbaa !5
  %86 = getelementptr inbounds i32, ptr %85, i64 1
  store i32 %84, ptr %86, align 4, !tbaa !14
  %87 = load ptr, ptr %5, align 8, !tbaa !5
  %88 = getelementptr inbounds %struct.RecordIndex, ptr %87, i32 0, i32 7
  %89 = load i32, ptr %88, align 4, !tbaa !27
  %90 = load ptr, ptr %13, align 8, !tbaa !5
  %91 = getelementptr inbounds i32, ptr %90, i64 2
  store i32 %89, ptr %91, align 4, !tbaa !14
  %92 = load ptr, ptr %4, align 8, !tbaa !5
  %93 = getelementptr inbounds %struct.jit_State, ptr %92, i32 0, i32 1
  %94 = load ptr, ptr %93, align 8, !tbaa !25
  %95 = load ptr, ptr %14, align 8, !tbaa !5
  %96 = getelementptr inbounds %union.TValue, ptr %95, i64 0
  %97 = load ptr, ptr %5, align 8, !tbaa !5
  %98 = getelementptr inbounds %struct.RecordIndex, ptr %97, i32 0, i32 3
  %99 = getelementptr inbounds %struct.anon, ptr %98, i32 0, i32 0
  %100 = getelementptr inbounds %struct.GCRef, ptr %99, i32 0, i32 0
  %101 = load i32, ptr %100, align 8, !tbaa !26
  %102 = zext i32 %101 to i64
  %103 = inttoptr i64 %102 to ptr
  call void @setfuncV(ptr noundef %94, ptr noundef %96, ptr noundef %103)
  %104 = load ptr, ptr %4, align 8, !tbaa !5
  %105 = getelementptr inbounds %struct.jit_State, ptr %104, i32 0, i32 1
  %106 = load ptr, ptr %105, align 8, !tbaa !25
  %107 = load ptr, ptr %14, align 8, !tbaa !5
  %108 = getelementptr inbounds %union.TValue, ptr %107, i64 1
  %109 = load ptr, ptr %5, align 8, !tbaa !5
  %110 = getelementptr inbounds %struct.RecordIndex, ptr %109, i32 0, i32 0
  call void @copyTV(ptr noundef %106, ptr noundef %108, ptr noundef %110)
  %111 = load ptr, ptr %4, align 8, !tbaa !5
  %112 = getelementptr inbounds %struct.jit_State, ptr %111, i32 0, i32 1
  %113 = load ptr, ptr %112, align 8, !tbaa !25
  %114 = load ptr, ptr %14, align 8, !tbaa !5
  %115 = getelementptr inbounds %union.TValue, ptr %114, i64 2
  %116 = load ptr, ptr %5, align 8, !tbaa !5
  %117 = getelementptr inbounds %struct.RecordIndex, ptr %116, i32 0, i32 1
  call void @copyTV(ptr noundef %113, ptr noundef %115, ptr noundef %117)
  %118 = load ptr, ptr %5, align 8, !tbaa !5
  %119 = getelementptr inbounds %struct.RecordIndex, ptr %118, i32 0, i32 8
  %120 = load i32, ptr %119, align 8, !tbaa !12
  %121 = icmp ne i32 %120, 0
  br i1 %121, label %122, label %137

122:                                              ; preds = %53
  %123 = load ptr, ptr %5, align 8, !tbaa !5
  %124 = getelementptr inbounds %struct.RecordIndex, ptr %123, i32 0, i32 8
  %125 = load i32, ptr %124, align 8, !tbaa !12
  %126 = load ptr, ptr %13, align 8, !tbaa !5
  %127 = getelementptr inbounds i32, ptr %126, i64 3
  store i32 %125, ptr %127, align 4, !tbaa !14
  %128 = load ptr, ptr %4, align 8, !tbaa !5
  %129 = getelementptr inbounds %struct.jit_State, ptr %128, i32 0, i32 1
  %130 = load ptr, ptr %129, align 8, !tbaa !25
  %131 = load ptr, ptr %14, align 8, !tbaa !5
  %132 = getelementptr inbounds %union.TValue, ptr %131, i64 3
  %133 = load ptr, ptr %5, align 8, !tbaa !5
  %134 = getelementptr inbounds %struct.RecordIndex, ptr %133, i32 0, i32 2
  call void @copyTV(ptr noundef %130, ptr noundef %132, ptr noundef %134)
  %135 = load ptr, ptr %4, align 8, !tbaa !5
  %136 = load i32, ptr %12, align 4, !tbaa !14
  call void @lj_record_call(ptr noundef %135, i32 noundef %136, i64 noundef 3)
  store i32 0, ptr %3, align 4
  store i32 1, ptr %15, align 4
  br label %140

137:                                              ; preds = %53
  %138 = load ptr, ptr %4, align 8, !tbaa !5
  %139 = load i32, ptr %12, align 4, !tbaa !14
  call void @lj_record_call(ptr noundef %138, i32 noundef %139, i64 noundef 2)
  store i32 0, ptr %3, align 4
  store i32 1, ptr %15, align 4
  br label %140

140:                                              ; preds = %137, %122
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %12) #6
  br label %646

141:                                              ; preds = %47
  %142 = load ptr, ptr %5, align 8, !tbaa !5
  %143 = getelementptr inbounds %struct.RecordIndex, ptr %142, i32 0, i32 10
  %144 = load i32, ptr %143, align 8, !tbaa !13
  %145 = load ptr, ptr %5, align 8, !tbaa !5
  %146 = getelementptr inbounds %struct.RecordIndex, ptr %145, i32 0, i32 6
  store i32 %144, ptr %146, align 8, !tbaa !9
  %147 = load ptr, ptr %4, align 8, !tbaa !5
  %148 = getelementptr inbounds %struct.jit_State, ptr %147, i32 0, i32 1
  %149 = load ptr, ptr %148, align 8, !tbaa !25
  %150 = load ptr, ptr %5, align 8, !tbaa !5
  %151 = getelementptr inbounds %struct.RecordIndex, ptr %150, i32 0, i32 0
  %152 = load ptr, ptr %5, align 8, !tbaa !5
  %153 = getelementptr inbounds %struct.RecordIndex, ptr %152, i32 0, i32 3
  call void @copyTV(ptr noundef %149, ptr noundef %151, ptr noundef %153)
  %154 = load ptr, ptr %5, align 8, !tbaa !5
  %155 = getelementptr inbounds %struct.RecordIndex, ptr %154, i32 0, i32 11
  %156 = load i32, ptr %155, align 4, !tbaa !28
  %157 = add nsw i32 %156, -1
  store i32 %157, ptr %155, align 4, !tbaa !28
  %158 = icmp eq i32 %157, 0
  br i1 %158, label %159, label %161

159:                                              ; preds = %141
  %160 = load ptr, ptr %4, align 8, !tbaa !5
  call void @lj_trace_err(ptr noundef %160, i32 noundef 19) #7
  unreachable

161:                                              ; preds = %141
  br label %26, !llvm.loop !29

162:                                              ; preds = %26
  %163 = load ptr, ptr %5, align 8, !tbaa !5
  %164 = getelementptr inbounds %struct.RecordIndex, ptr %163, i32 0, i32 1
  %165 = getelementptr inbounds %struct.anon, ptr %164, i32 0, i32 1
  %166 = load i32, ptr %165, align 4, !tbaa !26
  %167 = icmp eq i32 %166, -1
  br i1 %167, label %182, label %168

168:                                              ; preds = %162
  %169 = load ptr, ptr %5, align 8, !tbaa !5
  %170 = getelementptr inbounds %struct.RecordIndex, ptr %169, i32 0, i32 1
  %171 = getelementptr inbounds %struct.anon, ptr %170, i32 0, i32 1
  %172 = load i32, ptr %171, align 4, !tbaa !26
  %173 = icmp ult i32 %172, -65537
  br i1 %173, label %174, label %209

174:                                              ; preds = %168
  %175 = load ptr, ptr %5, align 8, !tbaa !5
  %176 = getelementptr inbounds %struct.RecordIndex, ptr %175, i32 0, i32 1
  %177 = load double, ptr %176, align 8, !tbaa !26
  %178 = load ptr, ptr %5, align 8, !tbaa !5
  %179 = getelementptr inbounds %struct.RecordIndex, ptr %178, i32 0, i32 1
  %180 = load double, ptr %179, align 8, !tbaa !26
  %181 = fcmp une double %177, %180
  br i1 %181, label %182, label %209

182:                                              ; preds = %174, %162
  %183 = load ptr, ptr %5, align 8, !tbaa !5
  %184 = getelementptr inbounds %struct.RecordIndex, ptr %183, i32 0, i32 8
  %185 = load i32, ptr %184, align 8, !tbaa !12
  %186 = icmp ne i32 %185, 0
  br i1 %186, label %187, label %189

187:                                              ; preds = %182
  %188 = load ptr, ptr %4, align 8, !tbaa !5
  call void @lj_trace_err(ptr noundef %188, i32 noundef 17) #7
  unreachable

189:                                              ; preds = %182
  %190 = load ptr, ptr %5, align 8, !tbaa !5
  %191 = getelementptr inbounds %struct.RecordIndex, ptr %190, i32 0, i32 7
  %192 = load i32, ptr %191, align 4, !tbaa !27
  %193 = trunc i32 %192 to i16
  %194 = zext i16 %193 to i32
  %195 = icmp slt i32 %194, 32768
  br i1 %195, label %196, label %208

196:                                              ; preds = %189
  %197 = load ptr, ptr %5, align 8, !tbaa !5
  %198 = getelementptr inbounds %struct.RecordIndex, ptr %197, i32 0, i32 11
  %199 = load i32, ptr %198, align 4, !tbaa !28
  %200 = icmp ne i32 %199, 0
  br i1 %200, label %201, label %207

201:                                              ; preds = %196
  %202 = load ptr, ptr %4, align 8, !tbaa !5
  %203 = load ptr, ptr %5, align 8, !tbaa !5
  %204 = call i32 @lj_record_mm_lookup(ptr noundef %202, ptr noundef %203, i32 noundef 0)
  %205 = icmp ne i32 %204, 0
  br i1 %205, label %206, label %207

206:                                              ; preds = %201
  br label %47

207:                                              ; preds = %201, %196
  store i32 32767, ptr %3, align 4
  store i32 1, ptr %15, align 4
  br label %646

208:                                              ; preds = %189
  br label %209

209:                                              ; preds = %208, %174, %168
  %210 = load ptr, ptr %4, align 8, !tbaa !5
  %211 = load ptr, ptr %5, align 8, !tbaa !5
  %212 = call i32 @rec_idx_key(ptr noundef %210, ptr noundef %211, ptr noundef %9, ptr noundef %10)
  store i32 %212, ptr %6, align 4, !tbaa !14
  %213 = load ptr, ptr %4, align 8, !tbaa !5
  %214 = getelementptr inbounds %struct.jit_State, ptr %213, i32 0, i32 0
  %215 = getelementptr inbounds %struct.GCtrace, ptr %214, i32 0, i32 7
  %216 = load ptr, ptr %215, align 8, !tbaa !31
  %217 = load i32, ptr %6, align 4, !tbaa !14
  %218 = trunc i32 %217 to i16
  %219 = zext i16 %218 to i64
  %220 = getelementptr inbounds %union.IRIns, ptr %216, i64 %219
  %221 = getelementptr inbounds %struct.anon.3, ptr %220, i32 0, i32 2
  %222 = load i8, ptr %221, align 1, !tbaa !26
  %223 = zext i8 %222 to i32
  store i32 %223, ptr %7, align 4, !tbaa !14
  %224 = load i32, ptr %7, align 4, !tbaa !14
  %225 = icmp eq i32 %224, 57
  %226 = zext i1 %225 to i64
  %227 = select i1 %225, i32 66, i32 67
  store i32 %227, ptr %8, align 4, !tbaa !14
  %228 = load i32, ptr %7, align 4, !tbaa !14
  %229 = icmp eq i32 %228, 26
  br i1 %229, label %230, label %243

230:                                              ; preds = %209
  %231 = load ptr, ptr %4, align 8, !tbaa !5
  %232 = getelementptr inbounds %struct.jit_State, ptr %231, i32 0, i32 0
  %233 = getelementptr inbounds %struct.GCtrace, ptr %232, i32 0, i32 7
  %234 = load ptr, ptr %233, align 8, !tbaa !31
  %235 = load i32, ptr %6, align 4, !tbaa !14
  %236 = trunc i32 %235 to i16
  %237 = zext i16 %236 to i64
  %238 = getelementptr inbounds %union.IRIns, ptr %234, i64 %237
  %239 = getelementptr inbounds %struct.MRef, ptr %238, i32 0, i32 0
  %240 = load i32, ptr %239, align 4, !tbaa !26
  %241 = zext i32 %240 to i64
  %242 = inttoptr i64 %241 to ptr
  br label %247

243:                                              ; preds = %209
  %244 = load ptr, ptr %5, align 8, !tbaa !5
  %245 = getelementptr inbounds %struct.RecordIndex, ptr %244, i32 0, i32 5
  %246 = load ptr, ptr %245, align 8, !tbaa !32
  br label %247

247:                                              ; preds = %243, %230
  %248 = phi ptr [ %242, %230 ], [ %246, %243 ]
  store ptr %248, ptr %11, align 8, !tbaa !5
  %249 = load ptr, ptr %5, align 8, !tbaa !5
  %250 = getelementptr inbounds %struct.RecordIndex, ptr %249, i32 0, i32 8
  %251 = load i32, ptr %250, align 8, !tbaa !12
  %252 = icmp eq i32 %251, 0
  br i1 %252, label %253, label %327

253:                                              ; preds = %247
  call void @llvm.lifetime.start.p0(i64 4, ptr %16) #6
  %254 = load ptr, ptr %11, align 8, !tbaa !5
  %255 = call i32 @itype2irt(ptr noundef %254)
  store i32 %255, ptr %16, align 4, !tbaa !14
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #6
  %256 = load ptr, ptr %11, align 8, !tbaa !5
  %257 = load ptr, ptr %4, align 8, !tbaa !5
  %258 = getelementptr inbounds i8, ptr %257, i64 -800
  %259 = getelementptr inbounds %struct.GG_State, ptr %258, i32 0, i32 1
  %260 = getelementptr inbounds %struct.global_State, ptr %259, i32 0, i32 17
  %261 = getelementptr inbounds %struct.Node, ptr %260, i32 0, i32 0
  %262 = icmp eq ptr %256, %261
  br i1 %262, label %263, label %277

263:                                              ; preds = %253
  %264 = load ptr, ptr %4, align 8, !tbaa !5
  %265 = load i32, ptr %6, align 4, !tbaa !14
  %266 = trunc i32 %265 to i16
  %267 = load ptr, ptr %4, align 8, !tbaa !5
  %268 = load ptr, ptr %4, align 8, !tbaa !5
  %269 = getelementptr inbounds i8, ptr %268, i64 -800
  %270 = getelementptr inbounds %struct.GG_State, ptr %269, i32 0, i32 1
  %271 = getelementptr inbounds %struct.global_State, ptr %270, i32 0, i32 17
  %272 = getelementptr inbounds %struct.Node, ptr %271, i32 0, i32 0
  %273 = call i32 @lj_ir_kptr_(ptr noundef %267, i32 noundef 26, ptr noundef %272)
  %274 = trunc i32 %273 to i16
  call void @lj_ir_set_(ptr noundef %264, i16 noundef zeroext 2181, i16 noundef zeroext %266, i16 noundef zeroext %274)
  %275 = load ptr, ptr %4, align 8, !tbaa !5
  %276 = call i32 @lj_opt_fold(ptr noundef %275)
  store i32 32767, ptr %17, align 4, !tbaa !14
  br label %289

277:                                              ; preds = %253
  %278 = load ptr, ptr %4, align 8, !tbaa !5
  %279 = load i32, ptr %8, align 4, !tbaa !14
  %280 = shl i32 %279, 8
  %281 = load i32, ptr %16, align 4, !tbaa !14
  %282 = or i32 128, %281
  %283 = or i32 %280, %282
  %284 = trunc i32 %283 to i16
  %285 = load i32, ptr %6, align 4, !tbaa !14
  %286 = trunc i32 %285 to i16
  call void @lj_ir_set_(ptr noundef %278, i16 noundef zeroext %284, i16 noundef zeroext %286, i16 noundef zeroext 0)
  %287 = load ptr, ptr %4, align 8, !tbaa !5
  %288 = call i32 @lj_opt_fold(ptr noundef %287)
  store i32 %288, ptr %17, align 4, !tbaa !14
  br label %289

289:                                              ; preds = %277, %263
  %290 = load i32, ptr %17, align 4, !tbaa !14
  %291 = trunc i32 %290 to i16
  %292 = zext i16 %291 to i32
  %293 = load i32, ptr %9, align 4, !tbaa !14
  %294 = icmp ult i32 %292, %293
  br i1 %294, label %295, label %300

295:                                              ; preds = %289
  %296 = load ptr, ptr %4, align 8, !tbaa !5
  %297 = load i32, ptr %9, align 4, !tbaa !14
  call void @lj_ir_rollback(ptr noundef %296, i32 noundef %297)
  %298 = load ptr, ptr %4, align 8, !tbaa !5
  %299 = getelementptr inbounds %struct.jit_State, ptr %298, i32 0, i32 11
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %299, ptr align 1 %10, i64 1, i1 false), !tbaa.struct !33
  br label %300

300:                                              ; preds = %295, %289
  %301 = load i32, ptr %16, align 4, !tbaa !14
  %302 = icmp eq i32 %301, 0
  br i1 %302, label %303, label %314

303:                                              ; preds = %300
  %304 = load ptr, ptr %5, align 8, !tbaa !5
  %305 = getelementptr inbounds %struct.RecordIndex, ptr %304, i32 0, i32 11
  %306 = load i32, ptr %305, align 4, !tbaa !28
  %307 = icmp ne i32 %306, 0
  br i1 %307, label %308, label %314

308:                                              ; preds = %303
  %309 = load ptr, ptr %4, align 8, !tbaa !5
  %310 = load ptr, ptr %5, align 8, !tbaa !5
  %311 = call i32 @lj_record_mm_lookup(ptr noundef %309, ptr noundef %310, i32 noundef 0)
  %312 = icmp ne i32 %311, 0
  br i1 %312, label %313, label %314

313:                                              ; preds = %308
  store i32 4, ptr %15, align 4
  br label %325

314:                                              ; preds = %308, %303, %300
  %315 = load i32, ptr %16, align 4, !tbaa !14
  %316 = icmp ule i32 %315, 2
  br i1 %316, label %317, label %323

317:                                              ; preds = %314
  %318 = load i32, ptr %16, align 4, !tbaa !14
  %319 = sub i32 32767, %318
  %320 = load i32, ptr %16, align 4, !tbaa !14
  %321 = shl i32 %320, 24
  %322 = add i32 %319, %321
  store i32 %322, ptr %17, align 4, !tbaa !14
  br label %323

323:                                              ; preds = %317, %314
  %324 = load i32, ptr %17, align 4, !tbaa !14
  store i32 %324, ptr %3, align 4
  store i32 1, ptr %15, align 4
  br label %325

325:                                              ; preds = %323, %313
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %16) #6
  %326 = load i32, ptr %15, align 4
  switch i32 %326, label %646 [
    i32 4, label %47
  ]

327:                                              ; preds = %247
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #6
  %328 = load ptr, ptr %5, align 8, !tbaa !5
  %329 = getelementptr inbounds %struct.RecordIndex, ptr %328, i32 0, i32 0
  %330 = getelementptr inbounds %struct.anon, ptr %329, i32 0, i32 0
  %331 = getelementptr inbounds %struct.GCRef, ptr %330, i32 0, i32 0
  %332 = load i32, ptr %331, align 8, !tbaa !26
  %333 = zext i32 %332 to i64
  %334 = inttoptr i64 %333 to ptr
  %335 = getelementptr inbounds %struct.GCtab, ptr %334, i32 0, i32 7
  %336 = getelementptr inbounds %struct.GCRef, ptr %335, i32 0, i32 0
  %337 = load i32, ptr %336, align 8, !tbaa !26
  %338 = zext i32 %337 to i64
  %339 = inttoptr i64 %338 to ptr
  store ptr %339, ptr %18, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #6
  %340 = load ptr, ptr %5, align 8, !tbaa !5
  %341 = getelementptr inbounds %struct.RecordIndex, ptr %340, i32 0, i32 7
  %342 = load i32, ptr %341, align 4, !tbaa !27
  %343 = lshr i32 %342, 24
  %344 = and i32 %343, 31
  %345 = sub i32 %344, 4
  %346 = icmp ule i32 %345, 8
  br i1 %346, label %347, label %354

347:                                              ; preds = %327
  %348 = load ptr, ptr %5, align 8, !tbaa !5
  %349 = getelementptr inbounds %struct.RecordIndex, ptr %348, i32 0, i32 8
  %350 = load i32, ptr %349, align 8, !tbaa !12
  %351 = and i32 %350, 520093696
  %352 = icmp eq i32 %351, 0
  %353 = xor i1 %352, true
  br label %354

354:                                              ; preds = %347, %327
  %355 = phi i1 [ false, %327 ], [ %353, %347 ]
  %356 = zext i1 %355 to i32
  store i32 %356, ptr %19, align 4, !tbaa !14
  %357 = load i32, ptr %6, align 4, !tbaa !14
  %358 = trunc i32 %357 to i16
  %359 = zext i16 %358 to i32
  %360 = load i32, ptr %9, align 4, !tbaa !14
  %361 = icmp ult i32 %359, %360
  br i1 %361, label %362, label %367

362:                                              ; preds = %354
  %363 = load ptr, ptr %4, align 8, !tbaa !5
  %364 = load i32, ptr %9, align 4, !tbaa !14
  call void @lj_ir_rollback(ptr noundef %363, i32 noundef %364)
  %365 = load ptr, ptr %4, align 8, !tbaa !5
  %366 = getelementptr inbounds %struct.jit_State, ptr %365, i32 0, i32 11
  call void @llvm.memcpy.p0.p0.i64(ptr align 2 %366, ptr align 1 %10, i64 1, i1 false), !tbaa.struct !33
  br label %367

367:                                              ; preds = %362, %354
  %368 = load ptr, ptr %11, align 8, !tbaa !5
  %369 = getelementptr inbounds %struct.anon, ptr %368, i32 0, i32 1
  %370 = load i32, ptr %369, align 4, !tbaa !26
  %371 = icmp eq i32 %370, -1
  br i1 %371, label %372, label %494

372:                                              ; preds = %367
  call void @llvm.lifetime.start.p0(i64 4, ptr %20) #6
  store i32 0, ptr %20, align 4, !tbaa !14
  %373 = load ptr, ptr %5, align 8, !tbaa !5
  %374 = getelementptr inbounds %struct.RecordIndex, ptr %373, i32 0, i32 11
  %375 = load i32, ptr %374, align 4, !tbaa !28
  %376 = icmp ne i32 %375, 0
  br i1 %376, label %377, label %403

377:                                              ; preds = %372
  %378 = load ptr, ptr %18, align 8, !tbaa !5
  %379 = icmp ne ptr %378, null
  br i1 %379, label %380, label %403

380:                                              ; preds = %377
  call void @llvm.lifetime.start.p0(i64 8, ptr %21) #6
  %381 = load ptr, ptr %18, align 8, !tbaa !5
  %382 = load ptr, ptr %4, align 8, !tbaa !5
  %383 = getelementptr inbounds i8, ptr %382, i64 -800
  %384 = getelementptr inbounds %struct.GG_State, ptr %383, i32 0, i32 1
  %385 = getelementptr inbounds %struct.global_State, ptr %384, i32 0, i32 29
  %386 = getelementptr inbounds [38 x %struct.GCRef], ptr %385, i64 0, i64 1
  %387 = getelementptr inbounds %struct.GCRef, ptr %386, i32 0, i32 0
  %388 = load i32, ptr %387, align 4, !tbaa !34
  %389 = zext i32 %388 to i64
  %390 = inttoptr i64 %389 to ptr
  %391 = call ptr @lj_tab_getstr(ptr noundef %381, ptr noundef %390)
  store ptr %391, ptr %21, align 8, !tbaa !5
  %392 = load ptr, ptr %21, align 8, !tbaa !5
  %393 = icmp ne ptr %392, null
  br i1 %393, label %394, label %400

394:                                              ; preds = %380
  %395 = load ptr, ptr %21, align 8, !tbaa !5
  %396 = getelementptr inbounds %struct.anon, ptr %395, i32 0, i32 1
  %397 = load i32, ptr %396, align 4, !tbaa !26
  %398 = icmp eq i32 %397, -1
  %399 = xor i1 %398, true
  br label %400

400:                                              ; preds = %394, %380
  %401 = phi i1 [ false, %380 ], [ %399, %394 ]
  %402 = zext i1 %401 to i32
  store i32 %402, ptr %20, align 4, !tbaa !14
  call void @llvm.lifetime.end.p0(i64 8, ptr %21) #6
  br label %403

403:                                              ; preds = %400, %377, %372
  %404 = load i32, ptr %20, align 4, !tbaa !14
  %405 = icmp ne i32 %404, 0
  br i1 %405, label %406, label %416

406:                                              ; preds = %403
  %407 = load ptr, ptr %4, align 8, !tbaa !5
  %408 = load i32, ptr %8, align 4, !tbaa !14
  %409 = shl i32 %408, 8
  %410 = or i32 %409, 128
  %411 = trunc i32 %410 to i16
  %412 = load i32, ptr %6, align 4, !tbaa !14
  %413 = trunc i32 %412 to i16
  call void @lj_ir_set_(ptr noundef %407, i16 noundef zeroext %411, i16 noundef zeroext %413, i16 noundef zeroext 0)
  %414 = load ptr, ptr %4, align 8, !tbaa !5
  %415 = call i32 @lj_opt_fold(ptr noundef %414)
  br label %446

416:                                              ; preds = %403
  %417 = load i32, ptr %7, align 4, !tbaa !14
  %418 = icmp eq i32 %417, 59
  br i1 %418, label %419, label %445

419:                                              ; preds = %416
  %420 = load ptr, ptr %4, align 8, !tbaa !5
  %421 = load ptr, ptr %11, align 8, !tbaa !5
  %422 = load ptr, ptr %4, align 8, !tbaa !5
  %423 = getelementptr inbounds i8, ptr %422, i64 -800
  %424 = getelementptr inbounds %struct.GG_State, ptr %423, i32 0, i32 1
  %425 = getelementptr inbounds %struct.global_State, ptr %424, i32 0, i32 17
  %426 = getelementptr inbounds %struct.Node, ptr %425, i32 0, i32 0
  %427 = icmp eq ptr %421, %426
  %428 = zext i1 %427 to i64
  %429 = select i1 %427, i32 8, i32 9
  %430 = shl i32 %429, 8
  %431 = or i32 %430, 133
  %432 = trunc i32 %431 to i16
  %433 = load i32, ptr %6, align 4, !tbaa !14
  %434 = trunc i32 %433 to i16
  %435 = load ptr, ptr %4, align 8, !tbaa !5
  %436 = load ptr, ptr %4, align 8, !tbaa !5
  %437 = getelementptr inbounds i8, ptr %436, i64 -800
  %438 = getelementptr inbounds %struct.GG_State, ptr %437, i32 0, i32 1
  %439 = getelementptr inbounds %struct.global_State, ptr %438, i32 0, i32 17
  %440 = getelementptr inbounds %struct.Node, ptr %439, i32 0, i32 0
  %441 = call i32 @lj_ir_kptr_(ptr noundef %435, i32 noundef 26, ptr noundef %440)
  %442 = trunc i32 %441 to i16
  call void @lj_ir_set_(ptr noundef %420, i16 noundef zeroext %432, i16 noundef zeroext %434, i16 noundef zeroext %442)
  %443 = load ptr, ptr %4, align 8, !tbaa !5
  %444 = call i32 @lj_opt_fold(ptr noundef %443)
  br label %445

445:                                              ; preds = %419, %416
  br label %446

446:                                              ; preds = %445, %406
  %447 = load ptr, ptr %5, align 8, !tbaa !5
  %448 = getelementptr inbounds %struct.RecordIndex, ptr %447, i32 0, i32 11
  %449 = load i32, ptr %448, align 4, !tbaa !28
  %450 = icmp ne i32 %449, 0
  br i1 %450, label %451, label %457

451:                                              ; preds = %446
  %452 = load ptr, ptr %4, align 8, !tbaa !5
  %453 = load ptr, ptr %5, align 8, !tbaa !5
  %454 = call i32 @lj_record_mm_lookup(ptr noundef %452, ptr noundef %453, i32 noundef 1)
  %455 = icmp ne i32 %454, 0
  br i1 %455, label %456, label %457

456:                                              ; preds = %451
  store i32 4, ptr %15, align 4
  br label %491

457:                                              ; preds = %451, %446
  %458 = load ptr, ptr %11, align 8, !tbaa !5
  %459 = load ptr, ptr %4, align 8, !tbaa !5
  %460 = getelementptr inbounds i8, ptr %459, i64 -800
  %461 = getelementptr inbounds %struct.GG_State, ptr %460, i32 0, i32 1
  %462 = getelementptr inbounds %struct.global_State, ptr %461, i32 0, i32 17
  %463 = getelementptr inbounds %struct.Node, ptr %462, i32 0, i32 0
  %464 = icmp eq ptr %458, %463
  br i1 %464, label %465, label %490

465:                                              ; preds = %457
  call void @llvm.lifetime.start.p0(i64 4, ptr %22) #6
  %466 = load ptr, ptr %5, align 8, !tbaa !5
  %467 = getelementptr inbounds %struct.RecordIndex, ptr %466, i32 0, i32 7
  %468 = load i32, ptr %467, align 4, !tbaa !27
  store i32 %468, ptr %22, align 4, !tbaa !14
  %469 = load i32, ptr %22, align 4, !tbaa !14
  %470 = lshr i32 %469, 24
  %471 = and i32 %470, 31
  %472 = sub i32 %471, 15
  %473 = icmp ule i32 %472, 4
  br i1 %473, label %474, label %480

474:                                              ; preds = %465
  %475 = load ptr, ptr %4, align 8, !tbaa !5
  %476 = load i32, ptr %22, align 4, !tbaa !14
  %477 = trunc i32 %476 to i16
  call void @lj_ir_set_(ptr noundef %475, i16 noundef zeroext 23054, i16 noundef zeroext %477, i16 noundef zeroext 467)
  %478 = load ptr, ptr %4, align 8, !tbaa !5
  %479 = call i32 @lj_opt_fold(ptr noundef %478)
  store i32 %479, ptr %22, align 4, !tbaa !14
  br label %480

480:                                              ; preds = %474, %465
  %481 = load ptr, ptr %4, align 8, !tbaa !5
  %482 = load ptr, ptr %5, align 8, !tbaa !5
  %483 = getelementptr inbounds %struct.RecordIndex, ptr %482, i32 0, i32 6
  %484 = load i32, ptr %483, align 8, !tbaa !9
  %485 = trunc i32 %484 to i16
  %486 = load i32, ptr %22, align 4, !tbaa !14
  %487 = trunc i32 %486 to i16
  call void @lj_ir_set_(ptr noundef %481, i16 noundef zeroext 15365, i16 noundef zeroext %485, i16 noundef zeroext %487)
  %488 = load ptr, ptr %4, align 8, !tbaa !5
  %489 = call i32 @lj_opt_fold(ptr noundef %488)
  store i32 %489, ptr %6, align 4, !tbaa !14
  store i32 0, ptr %19, align 4, !tbaa !14
  call void @llvm.lifetime.end.p0(i64 4, ptr %22) #6
  br label %490

490:                                              ; preds = %480, %457
  store i32 0, ptr %15, align 4
  br label %491

491:                                              ; preds = %490, %456
  call void @llvm.lifetime.end.p0(i64 4, ptr %20) #6
  %492 = load i32, ptr %15, align 4
  switch i32 %492, label %644 [
    i32 0, label %493
  ]

493:                                              ; preds = %491
  br label %562

494:                                              ; preds = %367
  %495 = load ptr, ptr %4, align 8, !tbaa !5
  %496 = load i32, ptr %8, align 4, !tbaa !14
  %497 = trunc i32 %496 to i16
  %498 = load i32, ptr %6, align 4, !tbaa !14
  %499 = trunc i32 %498 to i16
  %500 = zext i16 %499 to i32
  %501 = call i32 @lj_opt_fwd_wasnonnil(ptr noundef %495, i16 noundef zeroext %497, i32 noundef %500)
  %502 = icmp ne i32 %501, 0
  br i1 %502, label %560, label %503

503:                                              ; preds = %494
  %504 = load i32, ptr %7, align 4, !tbaa !14
  %505 = icmp eq i32 %504, 59
  br i1 %505, label %506, label %520

506:                                              ; preds = %503
  %507 = load ptr, ptr %4, align 8, !tbaa !5
  %508 = load i32, ptr %6, align 4, !tbaa !14
  %509 = trunc i32 %508 to i16
  %510 = load ptr, ptr %4, align 8, !tbaa !5
  %511 = load ptr, ptr %4, align 8, !tbaa !5
  %512 = getelementptr inbounds i8, ptr %511, i64 -800
  %513 = getelementptr inbounds %struct.GG_State, ptr %512, i32 0, i32 1
  %514 = getelementptr inbounds %struct.global_State, ptr %513, i32 0, i32 17
  %515 = getelementptr inbounds %struct.Node, ptr %514, i32 0, i32 0
  %516 = call i32 @lj_ir_kptr_(ptr noundef %510, i32 noundef 26, ptr noundef %515)
  %517 = trunc i32 %516 to i16
  call void @lj_ir_set_(ptr noundef %507, i16 noundef zeroext 2437, i16 noundef zeroext %509, i16 noundef zeroext %517)
  %518 = load ptr, ptr %4, align 8, !tbaa !5
  %519 = call i32 @lj_opt_fold(ptr noundef %518)
  br label %520

520:                                              ; preds = %506, %503
  %521 = load ptr, ptr %5, align 8, !tbaa !5
  %522 = getelementptr inbounds %struct.RecordIndex, ptr %521, i32 0, i32 11
  %523 = load i32, ptr %522, align 4, !tbaa !28
  %524 = icmp ne i32 %523, 0
  br i1 %524, label %525, label %559

525:                                              ; preds = %520
  %526 = load ptr, ptr %18, align 8, !tbaa !5
  %527 = icmp ne ptr %526, null
  br i1 %527, label %544, label %528

528:                                              ; preds = %525
  call void @llvm.lifetime.start.p0(i64 4, ptr %23) #6
  %529 = load ptr, ptr %4, align 8, !tbaa !5
  %530 = load ptr, ptr %5, align 8, !tbaa !5
  %531 = getelementptr inbounds %struct.RecordIndex, ptr %530, i32 0, i32 6
  %532 = load i32, ptr %531, align 8, !tbaa !9
  %533 = trunc i32 %532 to i16
  call void @lj_ir_set_(ptr noundef %529, i16 noundef zeroext 17675, i16 noundef zeroext %533, i16 noundef zeroext 5)
  %534 = load ptr, ptr %4, align 8, !tbaa !5
  %535 = call i32 @lj_opt_fold(ptr noundef %534)
  store i32 %535, ptr %23, align 4, !tbaa !14
  %536 = load ptr, ptr %4, align 8, !tbaa !5
  %537 = load i32, ptr %23, align 4, !tbaa !14
  %538 = trunc i32 %537 to i16
  %539 = load ptr, ptr %4, align 8, !tbaa !5
  %540 = call i32 @lj_ir_knull(ptr noundef %539, i32 noundef 11)
  %541 = trunc i32 %540 to i16
  call void @lj_ir_set_(ptr noundef %536, i16 noundef zeroext 2187, i16 noundef zeroext %538, i16 noundef zeroext %541)
  %542 = load ptr, ptr %4, align 8, !tbaa !5
  %543 = call i32 @lj_opt_fold(ptr noundef %542)
  call void @llvm.lifetime.end.p0(i64 4, ptr %23) #6
  br label %558

544:                                              ; preds = %525
  call void @llvm.lifetime.start.p0(i64 4, ptr %24) #6
  %545 = load ptr, ptr %11, align 8, !tbaa !5
  %546 = call i32 @itype2irt(ptr noundef %545)
  store i32 %546, ptr %24, align 4, !tbaa !14
  %547 = load ptr, ptr %4, align 8, !tbaa !5
  %548 = load i32, ptr %8, align 4, !tbaa !14
  %549 = shl i32 %548, 8
  %550 = load i32, ptr %24, align 4, !tbaa !14
  %551 = or i32 128, %550
  %552 = or i32 %549, %551
  %553 = trunc i32 %552 to i16
  %554 = load i32, ptr %6, align 4, !tbaa !14
  %555 = trunc i32 %554 to i16
  call void @lj_ir_set_(ptr noundef %547, i16 noundef zeroext %553, i16 noundef zeroext %555, i16 noundef zeroext 0)
  %556 = load ptr, ptr %4, align 8, !tbaa !5
  %557 = call i32 @lj_opt_fold(ptr noundef %556)
  call void @llvm.lifetime.end.p0(i64 4, ptr %24) #6
  br label %558

558:                                              ; preds = %544, %528
  br label %559

559:                                              ; preds = %558, %520
  br label %561

560:                                              ; preds = %494
  store i32 0, ptr %19, align 4, !tbaa !14
  br label %561

561:                                              ; preds = %560, %559
  br label %562

562:                                              ; preds = %561, %493
  %563 = load ptr, ptr %5, align 8, !tbaa !5
  %564 = getelementptr inbounds %struct.RecordIndex, ptr %563, i32 0, i32 8
  %565 = load i32, ptr %564, align 8, !tbaa !12
  %566 = lshr i32 %565, 24
  %567 = and i32 %566, 31
  %568 = sub i32 %567, 15
  %569 = icmp ule i32 %568, 4
  br i1 %569, label %570, label %580

570:                                              ; preds = %562
  %571 = load ptr, ptr %4, align 8, !tbaa !5
  %572 = load ptr, ptr %5, align 8, !tbaa !5
  %573 = getelementptr inbounds %struct.RecordIndex, ptr %572, i32 0, i32 8
  %574 = load i32, ptr %573, align 8, !tbaa !12
  %575 = trunc i32 %574 to i16
  call void @lj_ir_set_(ptr noundef %571, i16 noundef zeroext 23054, i16 noundef zeroext %575, i16 noundef zeroext 467)
  %576 = load ptr, ptr %4, align 8, !tbaa !5
  %577 = call i32 @lj_opt_fold(ptr noundef %576)
  %578 = load ptr, ptr %5, align 8, !tbaa !5
  %579 = getelementptr inbounds %struct.RecordIndex, ptr %578, i32 0, i32 8
  store i32 %577, ptr %579, align 8, !tbaa !12
  br label %580

580:                                              ; preds = %570, %562
  %581 = load ptr, ptr %4, align 8, !tbaa !5
  %582 = load i32, ptr %8, align 4, !tbaa !14
  %583 = add i32 %582, 7
  %584 = shl i32 %583, 8
  %585 = load ptr, ptr %5, align 8, !tbaa !5
  %586 = getelementptr inbounds %struct.RecordIndex, ptr %585, i32 0, i32 8
  %587 = load i32, ptr %586, align 8, !tbaa !12
  %588 = lshr i32 %587, 24
  %589 = and i32 %588, 31
  %590 = or i32 %584, %589
  %591 = trunc i32 %590 to i16
  %592 = load i32, ptr %6, align 4, !tbaa !14
  %593 = trunc i32 %592 to i16
  %594 = load ptr, ptr %5, align 8, !tbaa !5
  %595 = getelementptr inbounds %struct.RecordIndex, ptr %594, i32 0, i32 8
  %596 = load i32, ptr %595, align 8, !tbaa !12
  %597 = trunc i32 %596 to i16
  call void @lj_ir_set_(ptr noundef %581, i16 noundef zeroext %591, i16 noundef zeroext %593, i16 noundef zeroext %597)
  %598 = load ptr, ptr %4, align 8, !tbaa !5
  %599 = call i32 @lj_opt_fold(ptr noundef %598)
  %600 = load i32, ptr %19, align 4, !tbaa !14
  %601 = icmp ne i32 %600, 0
  br i1 %601, label %610, label %602

602:                                              ; preds = %580
  %603 = load ptr, ptr %5, align 8, !tbaa !5
  %604 = getelementptr inbounds %struct.RecordIndex, ptr %603, i32 0, i32 8
  %605 = load i32, ptr %604, align 8, !tbaa !12
  %606 = lshr i32 %605, 24
  %607 = and i32 %606, 31
  %608 = sub i32 %607, 4
  %609 = icmp ule i32 %608, 8
  br i1 %609, label %610, label %618

610:                                              ; preds = %602, %580
  %611 = load ptr, ptr %4, align 8, !tbaa !5
  %612 = load ptr, ptr %5, align 8, !tbaa !5
  %613 = getelementptr inbounds %struct.RecordIndex, ptr %612, i32 0, i32 6
  %614 = load i32, ptr %613, align 8, !tbaa !9
  %615 = trunc i32 %614 to i16
  call void @lj_ir_set_(ptr noundef %611, i16 noundef zeroext 22272, i16 noundef zeroext %615, i16 noundef zeroext 0)
  %616 = load ptr, ptr %4, align 8, !tbaa !5
  %617 = call i32 @lj_opt_fold(ptr noundef %616)
  br label %618

618:                                              ; preds = %610, %602
  %619 = load ptr, ptr %4, align 8, !tbaa !5
  %620 = load ptr, ptr %5, align 8, !tbaa !5
  %621 = getelementptr inbounds %struct.RecordIndex, ptr %620, i32 0, i32 7
  %622 = load i32, ptr %621, align 4, !tbaa !27
  %623 = call i32 @nommstr(ptr noundef %619, i32 noundef %622)
  %624 = icmp ne i32 %623, 0
  br i1 %624, label %641, label %625

625:                                              ; preds = %618
  call void @llvm.lifetime.start.p0(i64 4, ptr %25) #6
  %626 = load ptr, ptr %4, align 8, !tbaa !5
  %627 = load ptr, ptr %5, align 8, !tbaa !5
  %628 = getelementptr inbounds %struct.RecordIndex, ptr %627, i32 0, i32 6
  %629 = load i32, ptr %628, align 8, !tbaa !9
  %630 = trunc i32 %629 to i16
  call void @lj_ir_set_(ptr noundef %626, i16 noundef zeroext 16133, i16 noundef zeroext %630, i16 noundef zeroext 10)
  %631 = load ptr, ptr %4, align 8, !tbaa !5
  %632 = call i32 @lj_opt_fold(ptr noundef %631)
  store i32 %632, ptr %25, align 4, !tbaa !14
  %633 = load ptr, ptr %4, align 8, !tbaa !5
  %634 = load i32, ptr %25, align 4, !tbaa !14
  %635 = trunc i32 %634 to i16
  %636 = load ptr, ptr %4, align 8, !tbaa !5
  %637 = call i32 @lj_ir_kint(ptr noundef %636, i32 noundef 0)
  %638 = trunc i32 %637 to i16
  call void @lj_ir_set_(ptr noundef %633, i16 noundef zeroext 19472, i16 noundef zeroext %635, i16 noundef zeroext %638)
  %639 = load ptr, ptr %4, align 8, !tbaa !5
  %640 = call i32 @lj_opt_fold(ptr noundef %639)
  call void @llvm.lifetime.end.p0(i64 4, ptr %25) #6
  br label %641

641:                                              ; preds = %625, %618
  %642 = load ptr, ptr %4, align 8, !tbaa !5
  %643 = getelementptr inbounds %struct.jit_State, ptr %642, i32 0, i32 10
  store i8 1, ptr %643, align 1, !tbaa !35
  store i32 0, ptr %3, align 4
  store i32 1, ptr %15, align 4
  br label %644

644:                                              ; preds = %641, %491
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #6
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #6
  %645 = load i32, ptr %15, align 4
  switch i32 %645, label %646 [
    i32 4, label %47
  ]

646:                                              ; preds = %644, %325, %207, %140
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #6
  call void @llvm.lifetime.end.p0(i64 1, ptr %10) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %9) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %8) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #6
  call void @llvm.lifetime.end.p0(i64 4, ptr %6) #6
  %647 = load i32, ptr %3, align 4
  ret i32 %647
}

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

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

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

declare hidden void @lj_ir_rollback(ptr noundef, i32 noundef) #2

; 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) #5

declare hidden i32 @lj_opt_fwd_wasnonnil(ptr noundef, i16 noundef zeroext, i32 noundef) #2

; Function Attrs: nounwind uwtable
declare hidden i32 @nommstr(ptr 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 = { nounwind }
attributes #7 = { 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, !11, i64 48}
!10 = !{!"RecordIndex", !7, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !6, i64 32, !6, i64 40, !11, i64 48, !11, i64 52, !11, i64 56, !11, i64 60, !11, i64 64, !11, i64 68}
!11 = !{!"int", !7, i64 0}
!12 = !{!10, !11, i64 56}
!13 = !{!10, !11, i64 64}
!14 = !{!11, !11, i64 0}
!15 = !{!16, !6, i64 128}
!16 = !{!"jit_State", !17, i64 0, !6, i64 96, !6, i64 104, !6, i64 112, !6, i64 120, !6, i64 128, !11, i64 136, !11, i64 140, !11, i64 144, !7, i64 148, !7, i64 149, !21, i64 150, !7, i64 151, !22, i64 152, !6, i64 176, !11, i64 184, !11, i64 188, !11, i64 192, !11, i64 196, !11, i64 200, !11, i64 204, !11, i64 208, !20, i64 212, !7, i64 216, !6, i64 256, !11, i64 264, !11, i64 268, !11, i64 272, !11, i64 276, !6, i64 280, !6, i64 288, !11, i64 296, !11, i64 300, !7, i64 304, !6, i64 312, !11, i64 320, !11, i64 324, !6, i64 328, !7, i64 336, !7, i64 536, !7, i64 1556, !7, i64 1616, !7, i64 1744, !11, i64 2256, !11, i64 2260, !7, i64 2264, !11, i64 2392, !23, i64 2396, !6, i64 2416, !11, i64 2424, !11, i64 2428, !6, i64 2432, !11, i64 2440, !11, i64 2444, !6, i64 2448, !6, i64 2456, !6, i64 2464, !24, i64 2472, !24, i64 2480, !7, i64 2488, !6, i64 2496, !11, i64 2504, !11, i64 2508}
!17 = !{!"GCtrace", !18, i64 0, !7, i64 4, !7, i64 5, !7, i64 6, !7, i64 7, !11, i64 8, !18, i64 12, !6, i64 16, !11, i64 24, !19, i64 28, !19, i64 30, !6, i64 32, !6, i64 40, !18, i64 48, !20, i64 52, !11, i64 56, !11, i64 60, !6, i64 64, !11, i64 72, !19, i64 76, !19, i64 78, !19, i64 80, !19, i64 82, !19, i64 84, !19, i64 86, !19, i64 88, !7, i64 90, !7, i64 91}
!18 = !{!"GCRef", !11, i64 0}
!19 = !{!"short", !7, i64 0}
!20 = !{!"MRef", !11, i64 0}
!21 = !{!"IRType1", !7, i64 0}
!22 = !{!"FoldState", !7, i64 0, !7, i64 8, !7, i64 16}
!23 = !{!"ScEvEntry", !20, i64 0, !19, i64 4, !19, i64 6, !19, i64 8, !19, i64 10, !21, i64 12, !7, i64 13}
!24 = !{!"long", !7, i64 0}
!25 = !{!16, !6, i64 96}
!26 = !{!7, !7, i64 0}
!27 = !{!10, !11, i64 52}
!28 = !{!10, !11, i64 68}
!29 = distinct !{!29, !30}
!30 = !{!"llvm.loop.mustprogress"}
!31 = !{!16, !6, i64 16}
!32 = !{!10, !6, i64 40}
!33 = !{i64 0, i64 1, !26}
!34 = !{!18, !11, i64 0}
!35 = !{!16, !7, i64 149}


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

%struct.IRType1 = type { i8 }
%union.TValue = type { i64 }
%union.IRIns = type { %struct.anon.3 }
%struct.anon.3 = type { i32, %struct.IRType1, i8, i8, i8 }

; 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

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

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

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

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

declare hidden void @lj_cont_ra() #2

declare hidden void @lj_cont_nop() #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 @lj_record_mm_lookup(ptr noundef, ptr noundef, i32 noundef) local_unnamed_addr #3

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

declare hidden ptr @lj_tab_getstr(ptr noundef, ptr noundef) local_unnamed_addr #2

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

; Function Attrs: nounwind uwtable
define hidden i32 @lj_record_idx(ptr noundef %0, ptr noundef %1) local_unnamed_addr #3 {
  %3 = alloca i32, align 4
  %4 = alloca %struct.IRType1, align 1
  call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %3) #5
  call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %4) #5
  %5 = getelementptr inbounds i8, ptr %1, i64 48
  %6 = getelementptr inbounds i8, ptr %1, i64 56
  %7 = getelementptr inbounds i8, ptr %1, i64 8
  %8 = getelementptr inbounds i8, ptr %1, i64 12
  %9 = getelementptr inbounds i8, ptr %1, i64 52
  %10 = getelementptr inbounds i8, ptr %0, i64 16
  %11 = getelementptr inbounds i8, ptr %1, i64 40
  %12 = getelementptr inbounds i8, ptr %0, i64 150
  %13 = getelementptr inbounds i8, ptr %1, i64 68
  %14 = getelementptr inbounds i8, ptr %0, i64 -152
  %15 = getelementptr inbounds i8, ptr %0, i64 -256
  %16 = getelementptr inbounds i8, ptr %1, i64 64
  %17 = getelementptr inbounds i8, ptr %0, i64 96
  %18 = getelementptr inbounds i8, ptr %1, i64 24
  br label %19

19:                                               ; preds = %61, %2
  %20 = load i32, ptr %5, align 8, !tbaa !5
  %21 = and i32 %20, 520093696
  %.not = icmp eq i32 %21, 184549376
  br i1 %.not, label %67, label %22

22:                                               ; preds = %19
  %23 = load i32, ptr %6, align 8, !tbaa !11
  %.not221 = icmp ne i32 %23, 0
  %24 = zext i1 %.not221 to i32
  %25 = call i32 @lj_record_mm_lookup(ptr noundef %0, ptr noundef nonnull %1, i32 noundef %24)
  %.not222 = icmp eq i32 %25, 0
  br i1 %.not222, label %26, label %.thread

26:                                               ; preds = %22
  call void @lj_trace_err(ptr noundef %0, i32 noundef 18) #6
  unreachable

.thread:                                          ; preds = %175, %129, %83, %22
  %27 = load i32, ptr %16, align 8, !tbaa !12
  %28 = and i32 %27, 520093696
  %29 = icmp eq i32 %28, 134217728
  br i1 %29, label %30, label %61

30:                                               ; preds = %.thread
  %31 = load i32, ptr %6, align 8, !tbaa !11
  %.not223 = icmp eq i32 %31, 0
  %32 = select i1 %.not223, ptr @lj_cont_ra, ptr @lj_cont_nop
  %33 = call i32 @rec_mm_prep(ptr noundef %0, ptr noundef nonnull %32)
  %34 = getelementptr inbounds i8, ptr %0, i64 128
  %35 = load ptr, ptr %34, align 8, !tbaa !13
  %36 = zext i32 %33 to i64
  %37 = getelementptr inbounds i32, ptr %35, i64 %36
  %38 = load ptr, ptr %17, align 8, !tbaa !23
  %39 = getelementptr inbounds i8, ptr %38, i64 16
  %40 = load ptr, ptr %39, align 8, !tbaa !24
  %41 = getelementptr inbounds %union.TValue, ptr %40, i64 %36
  %42 = load i32, ptr %16, align 8, !tbaa !12
  store i32 %42, ptr %37, align 4, !tbaa !25
  %43 = load i32, ptr %5, align 8, !tbaa !5
  %44 = getelementptr inbounds i8, ptr %37, i64 4
  store i32 %43, ptr %44, align 4, !tbaa !25
  %45 = load i32, ptr %9, align 4, !tbaa !26
  %46 = getelementptr inbounds i8, ptr %37, i64 8
  store i32 %45, ptr %46, align 4, !tbaa !25
  %47 = load i32, ptr %18, align 8, !tbaa !24
  %48 = zext i32 %47 to i64
  %49 = inttoptr i64 %48 to ptr
  call void @setfuncV(ptr noundef %38, ptr noundef %41, ptr noundef %49)
  %50 = load ptr, ptr %17, align 8, !tbaa !23
  %51 = getelementptr inbounds i8, ptr %41, i64 8
  call void @copyTV(ptr noundef %50, ptr noundef nonnull %51, ptr noundef nonnull %1)
  %52 = load ptr, ptr %17, align 8, !tbaa !23
  %53 = getelementptr inbounds i8, ptr %41, i64 16
  call void @copyTV(ptr noundef %52, ptr noundef nonnull %53, ptr noundef nonnull %7)
  %54 = load i32, ptr %6, align 8, !tbaa !11
  %.not224 = icmp eq i32 %54, 0
  br i1 %.not224, label %60, label %55

55:                                               ; preds = %30
  %56 = getelementptr inbounds i8, ptr %37, i64 12
  store i32 %54, ptr %56, align 4, !tbaa !25
  %57 = load ptr, ptr %17, align 8, !tbaa !23
  %58 = getelementptr inbounds i8, ptr %41, i64 24
  %59 = getelementptr inbounds i8, ptr %1, i64 16
  call void @copyTV(ptr noundef %57, ptr noundef nonnull %58, ptr noundef nonnull %59)
  call void @lj_record_call(ptr noundef nonnull %0, i32 noundef %33, i64 noundef 3)
  br label %.loopexit

60:                                               ; preds = %30
  call void @lj_record_call(ptr noundef nonnull %0, i32 noundef %33, i64 noundef 2)
  br label %.loopexit

61:                                               ; preds = %.thread
  store i32 %27, ptr %5, align 8, !tbaa !5
  %62 = load ptr, ptr %17, align 8, !tbaa !23
  call void @copyTV(ptr noundef %62, ptr noundef nonnull %1, ptr noundef nonnull %18)
  %63 = load i32, ptr %13, align 4, !tbaa !27
  %64 = add nsw i32 %63, -1
  store i32 %64, ptr %13, align 4, !tbaa !27
  %65 = icmp eq i32 %64, 0
  br i1 %65, label %66, label %19, !llvm.loop !28

66:                                               ; preds = %61
  call void @lj_trace_err(ptr noundef nonnull %0, i32 noundef 19) #6
  unreachable

67:                                               ; preds = %19
  %68 = load i32, ptr %8, align 4, !tbaa !24
  %69 = icmp eq i32 %68, -1
  br i1 %69, label %75, label %70

70:                                               ; preds = %67
  %71 = icmp ult i32 %68, -65537
  br i1 %71, label %72, label %85

72:                                               ; preds = %70
  %73 = load double, ptr %7, align 8, !tbaa !24
  %74 = fcmp uno double %73, 0.000000e+00
  br i1 %74, label %75, label %85

75:                                               ; preds = %72, %67
  %76 = load i32, ptr %6, align 8, !tbaa !11
  %.not206 = icmp eq i32 %76, 0
  br i1 %.not206, label %78, label %77

77:                                               ; preds = %75
  call void @lj_trace_err(ptr noundef %0, i32 noundef 17) #6
  unreachable

78:                                               ; preds = %75
  %79 = load i32, ptr %9, align 4, !tbaa !26
  %80 = and i32 %79, 32768
  %.not207.not = icmp eq i32 %80, 0
  br i1 %.not207.not, label %81, label %85

81:                                               ; preds = %78
  %82 = load i32, ptr %13, align 4, !tbaa !27
  %.not219 = icmp eq i32 %82, 0
  br i1 %.not219, label %.loopexit, label %83

83:                                               ; preds = %81
  %84 = call i32 @lj_record_mm_lookup(ptr noundef %0, ptr noundef nonnull %1, i32 noundef 0)
  %.not220 = icmp eq i32 %84, 0
  br i1 %.not220, label %.loopexit, label %.thread

85:                                               ; preds = %78, %72, %70
  %86 = call i32 @rec_idx_key(ptr noundef %0, ptr noundef nonnull %1, ptr noundef nonnull %3, ptr noundef nonnull %4)
  %87 = load ptr, ptr %10, align 8, !tbaa !30
  %88 = trunc i32 %86 to i16
  %.mask = and i32 %86, 65535
  %89 = zext nneg i32 %.mask to i64
  %90 = getelementptr inbounds %union.IRIns, ptr %87, i64 %89
  %91 = getelementptr inbounds i8, ptr %90, i64 5
  %92 = load i8, ptr %91, align 1, !tbaa !24
  %93 = icmp eq i8 %92, 57
  %94 = select i1 %93, i32 66, i32 67
  %95 = icmp eq i8 %92, 26
  br i1 %95, label %96, label %100

96:                                               ; preds = %85
  %97 = load i32, ptr %90, align 4, !tbaa !24
  %98 = zext i32 %97 to i64
  %99 = inttoptr i64 %98 to ptr
  br label %102

100:                                              ; preds = %85
  %101 = load ptr, ptr %11, align 8, !tbaa !31
  br label %102

102:                                              ; preds = %100, %96
  %103 = phi ptr [ %99, %96 ], [ %101, %100 ]
  %104 = load i32, ptr %6, align 8, !tbaa !11
  %105 = icmp eq i32 %104, 0
  br i1 %105, label %106, label %134

106:                                              ; preds = %102
  %107 = call i32 @itype2irt(ptr noundef %103)
  %.fr = freeze i32 %107
  %108 = icmp eq ptr %103, %15
  br i1 %108, label %109, label %113

109:                                              ; preds = %106
  %110 = call i32 @lj_ir_kptr_(ptr noundef nonnull %0, i32 noundef 26, ptr noundef nonnull %15) #5
  %111 = trunc i32 %110 to i16
  call void @lj_ir_set_(ptr noundef nonnull %0, i16 noundef zeroext 2181, i16 noundef zeroext %88, i16 noundef zeroext %111)
  %112 = call i32 @lj_opt_fold(ptr noundef nonnull %0) #5
  br label %119

113:                                              ; preds = %106
  %114 = shl nuw nsw i32 %94, 8
  %115 = or i32 %114, %.fr
  %116 = trunc i32 %115 to i16
  %117 = or i16 %116, 128
  call void @lj_ir_set_(ptr noundef nonnull %0, i16 noundef zeroext %117, i16 noundef zeroext %88, i16 noundef zeroext 0)
  %118 = call i32 @lj_opt_fold(ptr noundef nonnull %0) #5
  br label %119

119:                                              ; preds = %113, %109
  %.0191 = phi i32 [ 32767, %109 ], [ %118, %113 ]
  %120 = and i32 %.0191, 65535
  %121 = load i32, ptr %3, align 4, !tbaa !25
  %122 = icmp ult i32 %120, %121
  br i1 %122, label %123, label %125

123:                                              ; preds = %119
  call void @lj_ir_rollback(ptr noundef nonnull %0, i32 noundef %121) #5
  %124 = load i8, ptr %4, align 1, !tbaa !24
  store i8 %124, ptr %12, align 2, !tbaa !24
  br label %125

125:                                              ; preds = %123, %119
  %126 = icmp eq i32 %.fr, 0
  br i1 %126, label %127, label %131

127:                                              ; preds = %125
  %128 = load i32, ptr %13, align 4, !tbaa !27
  %.not217 = icmp eq i32 %128, 0
  br i1 %.not217, label %.loopexit, label %129

129:                                              ; preds = %127
  %130 = call i32 @lj_record_mm_lookup(ptr noundef nonnull %0, ptr noundef nonnull %1, i32 noundef 0)
  %.not218 = icmp eq i32 %130, 0
  br i1 %.not218, label %.loopexit, label %.thread

131:                                              ; preds = %125
  %132 = icmp ult i32 %.fr, 3
  %reass.sub = mul nuw nsw i32 %.fr, 16777215
  %133 = add nuw nsw i32 %reass.sub, 32767
  %spec.select = select i1 %132, i32 %133, i32 %.0191
  br label %.loopexit

134:                                              ; preds = %102
  %135 = load i32, ptr %1, align 8, !tbaa !24
  %136 = zext i32 %135 to i64
  %137 = inttoptr i64 %136 to ptr
  %138 = getelementptr inbounds i8, ptr %137, i64 16
  %139 = load i32, ptr %138, align 8, !tbaa !24
  %140 = zext i32 %139 to i64
  %141 = inttoptr i64 %140 to ptr
  %142 = load i32, ptr %9, align 4, !tbaa !26
  %143 = load i32, ptr %3, align 4, !tbaa !25
  %144 = icmp ult i32 %.mask, %143
  br i1 %144, label %145, label %147

145:                                              ; preds = %134
  call void @lj_ir_rollback(ptr noundef nonnull %0, i32 noundef %143) #5
  %146 = load i8, ptr %4, align 1, !tbaa !24
  store i8 %146, ptr %12, align 2, !tbaa !24
  br label %147

147:                                              ; preds = %145, %134
  %148 = getelementptr inbounds i8, ptr %103, i64 4
  %149 = load i32, ptr %148, align 4, !tbaa !24
  %150 = icmp eq i32 %149, -1
  br i1 %150, label %151, label %200

151:                                              ; preds = %147
  %152 = load i32, ptr %13, align 4, !tbaa !27
  %153 = icmp ne i32 %152, 0
  %154 = icmp ne i32 %139, 0
  %or.cond = select i1 %153, i1 %154, i1 false
  br i1 %or.cond, label %155, label %.thread227

155:                                              ; preds = %151
  %156 = load i32, ptr %14, align 4, !tbaa !32
  %157 = zext i32 %156 to i64
  %158 = inttoptr i64 %157 to ptr
  %159 = call ptr @lj_tab_getstr(ptr noundef nonnull %141, ptr noundef %158) #5
  %.not211 = icmp eq ptr %159, null
  br i1 %.not211, label %.thread227, label %160

160:                                              ; preds = %155
  %161 = getelementptr inbounds i8, ptr %159, i64 4
  %162 = load i32, ptr %161, align 4, !tbaa !24
  %.not241 = icmp eq i32 %162, -1
  br i1 %.not241, label %.thread227, label %163

163:                                              ; preds = %160
  %.tr = trunc nuw nsw i32 %94 to i16
  %164 = shl nuw nsw i16 %.tr, 8
  %165 = or disjoint i16 %164, 128
  call void @lj_ir_set_(ptr noundef nonnull %0, i16 noundef zeroext %165, i16 noundef zeroext %88, i16 noundef zeroext 0)
  br label %.sink.split

.thread227:                                       ; preds = %155, %151, %160
  %166 = icmp eq i8 %92, 59
  br i1 %166, label %167, label %173

167:                                              ; preds = %.thread227
  %168 = icmp eq ptr %103, %15
  %169 = select i1 %168, i16 2181, i16 2437
  %170 = call i32 @lj_ir_kptr_(ptr noundef nonnull %0, i32 noundef 26, ptr noundef nonnull %15) #5
  %171 = trunc i32 %170 to i16
  call void @lj_ir_set_(ptr noundef nonnull %0, i16 noundef zeroext %169, i16 noundef zeroext %88, i16 noundef zeroext %171)
  br label %.sink.split

.sink.split:                                      ; preds = %163, %167
  %172 = call i32 @lj_opt_fold(ptr noundef nonnull %0) #5
  br label %173

173:                                              ; preds = %.sink.split, %.thread227
  %174 = load i32, ptr %13, align 4, !tbaa !27
  %.not213 = icmp eq i32 %174, 0
  br i1 %.not213, label %177, label %175

175:                                              ; preds = %173
  %176 = call i32 @lj_record_mm_lookup(ptr noundef nonnull %0, ptr noundef nonnull %1, i32 noundef 1)
  %.not214 = icmp eq i32 %176, 0
  br i1 %.not214, label %177, label %.thread

177:                                              ; preds = %175, %173
  %178 = lshr i32 %142, 24
  %179 = and i32 %178, 31
  %180 = add nsw i32 %179, -4
  %181 = icmp ult i32 %180, 9
  %182 = and i32 %104, 520093696
  %183 = icmp ne i32 %182, 0
  %184 = and i1 %183, %181
  %185 = icmp eq ptr %103, %15
  br i1 %185, label %186, label %.thread232

186:                                              ; preds = %177
  %187 = load i32, ptr %9, align 4, !tbaa !26
  %188 = lshr i32 %187, 24
  %189 = and i32 %188, 31
  %190 = add nsw i32 %189, -15
  %191 = icmp ult i32 %190, 5
  br i1 %191, label %192, label %195

192:                                              ; preds = %186
  %193 = trunc i32 %187 to i16
  call void @lj_ir_set_(ptr noundef nonnull %0, i16 noundef zeroext 23054, i16 noundef zeroext %193, i16 noundef zeroext 467)
  %194 = call i32 @lj_opt_fold(ptr noundef nonnull %0) #5
  br label %195

195:                                              ; preds = %192, %186
  %.0190 = phi i32 [ %194, %192 ], [ %187, %186 ]
  %196 = load i32, ptr %5, align 8, !tbaa !5
  %197 = trunc i32 %196 to i16
  %198 = trunc i32 %.0190 to i16
  call void @lj_ir_set_(ptr noundef nonnull %0, i16 noundef zeroext 15365, i16 noundef zeroext %197, i16 noundef zeroext %198)
  %199 = call i32 @lj_opt_fold(ptr noundef nonnull %0) #5
  br label %.thread232

200:                                              ; preds = %147
  %201 = lshr i32 %142, 24
  %202 = and i32 %201, 31
  %203 = add nsw i32 %202, -4
  %204 = icmp ult i32 %203, 9
  %205 = and i32 %104, 520093696
  %206 = icmp ne i32 %205, 0
  %207 = and i1 %206, %204
  %208 = trunc nuw nsw i32 %94 to i16
  %209 = call i32 @lj_opt_fwd_wasnonnil(ptr noundef nonnull %0, i16 noundef zeroext %208, i32 noundef %.mask) #5
  %.not208 = icmp eq i32 %209, 0
  br i1 %.not208, label %210, label %.thread232

210:                                              ; preds = %200
  %211 = icmp eq i8 %92, 59
  br i1 %211, label %212, label %216

212:                                              ; preds = %210
  %213 = call i32 @lj_ir_kptr_(ptr noundef nonnull %0, i32 noundef 26, ptr noundef nonnull %15) #5
  %214 = trunc i32 %213 to i16
  call void @lj_ir_set_(ptr noundef nonnull %0, i16 noundef zeroext 2437, i16 noundef zeroext %88, i16 noundef zeroext %214)
  %215 = call i32 @lj_opt_fold(ptr noundef nonnull %0) #5
  br label %216

216:                                              ; preds = %212, %210
  %217 = load i32, ptr %13, align 4, !tbaa !27
  %.not209 = icmp eq i32 %217, 0
  br i1 %.not209, label %.thread232, label %218

218:                                              ; preds = %216
  %.not210 = icmp eq i32 %139, 0
  br i1 %.not210, label %219, label %227

219:                                              ; preds = %218
  %220 = load i32, ptr %5, align 8, !tbaa !5
  %221 = trunc i32 %220 to i16
  call void @lj_ir_set_(ptr noundef nonnull %0, i16 noundef zeroext 17675, i16 noundef zeroext %221, i16 noundef zeroext 5)
  %222 = call i32 @lj_opt_fold(ptr noundef nonnull %0) #5
  %223 = trunc i32 %222 to i16
  %224 = call i32 @lj_ir_knull(ptr noundef nonnull %0, i32 noundef 11) #5
  %225 = trunc i32 %224 to i16
  call void @lj_ir_set_(ptr noundef nonnull %0, i16 noundef zeroext 2187, i16 noundef zeroext %223, i16 noundef zeroext %225)
  %226 = call i32 @lj_opt_fold(ptr noundef nonnull %0) #5
  br label %.thread232

227:                                              ; preds = %218
  %228 = call i32 @itype2irt(ptr noundef nonnull %103)
  %229 = shl nuw nsw i32 %94, 8
  %230 = or i32 %229, %228
  %231 = trunc i32 %230 to i16
  %232 = or i16 %231, 128
  call void @lj_ir_set_(ptr noundef nonnull %0, i16 noundef zeroext %232, i16 noundef zeroext %88, i16 noundef zeroext 0)
  %233 = call i32 @lj_opt_fold(ptr noundef nonnull %0) #5
  br label %.thread232

.thread232:                                       ; preds = %177, %195, %200, %219, %227, %216
  %.2196.shrunk = phi i1 [ %207, %227 ], [ %207, %219 ], [ %207, %216 ], [ false, %200 ], [ %184, %177 ], [ false, %195 ]
  %.2186 = phi i32 [ %86, %227 ], [ %86, %219 ], [ %86, %216 ], [ %86, %200 ], [ %86, %177 ], [ %199, %195 ]
  %234 = load i32, ptr %6, align 8, !tbaa !11
  %235 = lshr i32 %234, 24
  %236 = and i32 %235, 31
  %237 = add nsw i32 %236, -15
  %238 = icmp ult i32 %237, 5
  br i1 %238, label %239, label %242

239:                                              ; preds = %.thread232
  %240 = trunc i32 %234 to i16
  call void @lj_ir_set_(ptr noundef nonnull %0, i16 noundef zeroext 23054, i16 noundef zeroext %240, i16 noundef zeroext 467)
  %241 = call i32 @lj_opt_fold(ptr noundef nonnull %0) #5
  store i32 %241, ptr %6, align 8, !tbaa !11
  %.pre = lshr i32 %241, 24
  %.pre315 = and i32 %.pre, 31
  br label %242

242:                                              ; preds = %239, %.thread232
  %.pre-phi316 = phi i32 [ %.pre315, %239 ], [ %236, %.thread232 ]
  %243 = phi i32 [ %241, %239 ], [ %234, %.thread232 ]
  %244 = shl nuw nsw i32 %94, 8
  %245 = add nuw nsw i32 %244, 1792
  %246 = or disjoint i32 %.pre-phi316, %245
  %247 = trunc nuw nsw i32 %246 to i16
  %248 = trunc i32 %.2186 to i16
  %249 = trunc i32 %243 to i16
  call void @lj_ir_set_(ptr noundef nonnull %0, i16 noundef zeroext %247, i16 noundef zeroext %248, i16 noundef zeroext %249)
  %250 = call i32 @lj_opt_fold(ptr noundef nonnull %0) #5
  br i1 %.2196.shrunk, label %257, label %251

251:                                              ; preds = %242
  %252 = load i32, ptr %6, align 8, !tbaa !11
  %253 = lshr i32 %252, 24
  %254 = and i32 %253, 31
  %255 = add nsw i32 %254, -4
  %256 = icmp ult i32 %255, 9
  br i1 %256, label %257, label %261

257:                                              ; preds = %251, %242
  %258 = load i32, ptr %5, align 8, !tbaa !5
  %259 = trunc i32 %258 to i16
  call void @lj_ir_set_(ptr noundef nonnull %0, i16 noundef zeroext 22272, i16 noundef zeroext %259, i16 noundef zeroext 0)
  %260 = call i32 @lj_opt_fold(ptr noundef nonnull %0) #5
  br label %261

261:                                              ; preds = %257, %251
  %262 = load i32, ptr %9, align 4, !tbaa !26
  %263 = call i32 @nommstr(ptr noundef nonnull %0, i32 noundef %262)
  %.not216 = icmp eq i32 %263, 0
  br i1 %.not216, label %264, label %272

264:                                              ; preds = %261
  %265 = load i32, ptr %5, align 8, !tbaa !5
  %266 = trunc i32 %265 to i16
  call void @lj_ir_set_(ptr noundef nonnull %0, i16 noundef zeroext 16133, i16 noundef zeroext %266, i16 noundef zeroext 10)
  %267 = call i32 @lj_opt_fold(ptr noundef nonnull %0) #5
  %268 = trunc i32 %267 to i16
  %269 = call i32 @lj_ir_kint(ptr noundef nonnull %0, i32 noundef 0) #5
  %270 = trunc i32 %269 to i16
  call void @lj_ir_set_(ptr noundef nonnull %0, i16 noundef zeroext 19472, i16 noundef zeroext %268, i16 noundef zeroext %270)
  %271 = call i32 @lj_opt_fold(ptr noundef nonnull %0) #5
  br label %272

272:                                              ; preds = %261, %264
  %273 = getelementptr inbounds i8, ptr %0, i64 149
  store i8 1, ptr %273, align 1, !tbaa !33
  br label %.loopexit

.loopexit:                                        ; preds = %129, %127, %81, %83, %131, %272, %55, %60
  %.5 = phi i32 [ 0, %272 ], [ 0, %60 ], [ 0, %55 ], [ %spec.select, %131 ], [ 32767, %83 ], [ 32767, %81 ], [ 32767, %127 ], [ 32767, %129 ]
  call void @llvm.lifetime.end.p0(i64 1, ptr nonnull %4) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %3) #5
  ret i32 %.5
}

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

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

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

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

declare hidden i32 @lj_opt_fwd_wasnonnil(ptr noundef, i16 noundef zeroext, i32 noundef) local_unnamed_addr #2

; Function Attrs: nounwind uwtable
declare hidden i32 @nommstr(ptr 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 = { nounwind }
attributes #6 = { noreturn nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !10, i64 48}
!6 = !{!"RecordIndex", !7, i64 0, !7, i64 8, !7, i64 16, !7, i64 24, !9, i64 32, !9, i64 40, !10, i64 48, !10, i64 52, !10, i64 56, !10, i64 60, !10, i64 64, !10, i64 68}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!"any pointer", !7, i64 0}
!10 = !{!"int", !7, i64 0}
!11 = !{!6, !10, i64 56}
!12 = !{!6, !10, i64 64}
!13 = !{!14, !9, i64 128}
!14 = !{!"jit_State", !15, i64 0, !9, i64 96, !9, i64 104, !9, i64 112, !9, i64 120, !9, 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, !9, 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, !9, i64 256, !10, i64 264, !10, i64 268, !10, i64 272, !10, i64 276, !9, i64 280, !9, i64 288, !10, i64 296, !10, i64 300, !7, i64 304, !9, i64 312, !10, i64 320, !10, i64 324, !9, 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, !9, i64 2416, !10, i64 2424, !10, i64 2428, !9, i64 2432, !10, i64 2440, !10, i64 2444, !9, i64 2448, !9, i64 2456, !9, i64 2464, !22, i64 2472, !22, i64 2480, !7, i64 2488, !9, 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, !9, i64 16, !10, i64 24, !17, i64 28, !17, i64 30, !9, i64 32, !9, i64 40, !16, i64 48, !18, i64 52, !10, i64 56, !10, i64 60, !9, 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 = !{!"long", !7, i64 0}
!23 = !{!14, !9, i64 96}
!24 = !{!7, !7, i64 0}
!25 = !{!10, !10, i64 0}
!26 = !{!6, !10, i64 52}
!27 = !{!6, !10, i64 68}
!28 = distinct !{!28, !29}
!29 = !{!"llvm.loop.mustprogress"}
!30 = !{!14, !9, i64 16}
!31 = !{!6, !9, i64 40}
!32 = !{!16, !10, i64 0}
!33 = !{!14, !7, i64 149}


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