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

; 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.GCtab = type { %struct.GCRef, i8, i8, i8, i8, %struct.MRef, %struct.GCRef, %struct.GCRef, ptr, %struct.MRef, i32, i32 }
%struct.GCRef = type { i32 }
%struct.MRef = type { i32 }
%union.TValue = type { i64 }
%struct.anon = type { %union.anon, i32 }
%union.anon = type { %struct.GCRef }
%struct.lua_State = type { %union.anon.2 }
%union.anon.2 = type { %struct.anon.3, [320 x i8] }
%struct.anon.3 = type { %struct.GCRef, i8, i8, i8, i8, %struct.MRef, %struct.GCRef, ptr, ptr, %struct.MRef, %struct.MRef, %struct.GCRef, %struct.GCRef, ptr, 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.4, %struct.MRef, i32 }
%union.anon.4 = type { %union.TValue }

; 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 @clearhpart(ptr noundef) #1

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

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

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

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

36:                                               ; preds = %4
  call void @llvm.lifetime.start.p0(i64 8, ptr %12) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %13) #5
  %37 = load i32, ptr %7, align 4, !tbaa !9
  %38 = icmp ugt i32 %37, 134217729
  br i1 %38, label %39, label %41

39:                                               ; preds = %36
  %40 = load ptr, ptr %5, align 8, !tbaa !5
  call void @lj_err_msg(ptr noundef %40, i32 noundef 139) #6
  unreachable

41:                                               ; preds = %36
  %42 = load ptr, ptr %6, align 8, !tbaa !5
  %43 = getelementptr inbounds %struct.GCtab, ptr %42, i32 0, i32 4
  %44 = load i8, ptr %43, align 1, !tbaa !17
  %45 = sext i8 %44 to i32
  %46 = icmp sgt i32 %45, 0
  br i1 %46, label %47, label %86

47:                                               ; preds = %41
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #5
  %48 = load ptr, ptr %6, align 8, !tbaa !5
  %49 = getelementptr inbounds %struct.GCtab, ptr %48, i32 0, i32 5
  %50 = getelementptr inbounds %struct.MRef, ptr %49, i32 0, i32 0
  %51 = load i32, ptr %50, align 8, !tbaa !18
  %52 = zext i32 %51 to i64
  %53 = inttoptr i64 %52 to ptr
  store ptr %53, ptr %14, align 8, !tbaa !5
  %54 = load ptr, ptr %5, align 8, !tbaa !5
  %55 = load i32, ptr %7, align 4, !tbaa !9
  %56 = zext i32 %55 to i64
  %57 = mul i64 %56, 8
  %58 = trunc i64 %57 to i32
  %59 = call ptr @lj_mem_realloc(ptr noundef %54, ptr noundef null, i32 noundef 0, i32 noundef %58)
  store ptr %59, ptr %12, align 8, !tbaa !5
  %60 = load ptr, ptr %6, align 8, !tbaa !5
  %61 = getelementptr inbounds %struct.GCtab, ptr %60, i32 0, i32 4
  %62 = load i8, ptr %61, align 1, !tbaa !17
  %63 = sext i8 %62 to i32
  %64 = or i32 %63, 128
  %65 = trunc i32 %64 to i8
  %66 = load ptr, ptr %6, align 8, !tbaa !5
  %67 = getelementptr inbounds %struct.GCtab, ptr %66, i32 0, i32 4
  store i8 %65, ptr %67, align 1, !tbaa !17
  store i32 0, ptr %13, align 4, !tbaa !9
  br label %68

68:                                               ; preds = %82, %47
  %69 = load i32, ptr %13, align 4, !tbaa !9
  %70 = load i32, ptr %10, align 4, !tbaa !9
  %71 = icmp ult i32 %69, %70
  br i1 %71, label %72, label %85

72:                                               ; preds = %68
  %73 = load ptr, ptr %5, align 8, !tbaa !5
  %74 = load ptr, ptr %12, align 8, !tbaa !5
  %75 = load i32, ptr %13, align 4, !tbaa !9
  %76 = zext i32 %75 to i64
  %77 = getelementptr inbounds %union.TValue, ptr %74, i64 %76
  %78 = load ptr, ptr %14, align 8, !tbaa !5
  %79 = load i32, ptr %13, align 4, !tbaa !9
  %80 = zext i32 %79 to i64
  %81 = getelementptr inbounds %union.TValue, ptr %78, i64 %80
  call void @copyTV(ptr noundef %73, ptr noundef %77, ptr noundef %81)
  br label %82

82:                                               ; preds = %72
  %83 = load i32, ptr %13, align 4, !tbaa !9
  %84 = add i32 %83, 1
  store i32 %84, ptr %13, align 4, !tbaa !9
  br label %68, !llvm.loop !19

85:                                               ; preds = %68
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #5
  br label %103

86:                                               ; preds = %41
  %87 = load ptr, ptr %5, align 8, !tbaa !5
  %88 = load ptr, ptr %6, align 8, !tbaa !5
  %89 = getelementptr inbounds %struct.GCtab, ptr %88, i32 0, i32 5
  %90 = getelementptr inbounds %struct.MRef, ptr %89, i32 0, i32 0
  %91 = load i32, ptr %90, align 8, !tbaa !18
  %92 = zext i32 %91 to i64
  %93 = inttoptr i64 %92 to ptr
  %94 = load i32, ptr %10, align 4, !tbaa !9
  %95 = zext i32 %94 to i64
  %96 = mul i64 %95, 8
  %97 = trunc i64 %96 to i32
  %98 = load i32, ptr %7, align 4, !tbaa !9
  %99 = zext i32 %98 to i64
  %100 = mul i64 %99, 8
  %101 = trunc i64 %100 to i32
  %102 = call ptr @lj_mem_realloc(ptr noundef %87, ptr noundef %93, i32 noundef %97, i32 noundef %101)
  store ptr %102, ptr %12, align 8, !tbaa !5
  br label %103

103:                                              ; preds = %86, %85
  %104 = load ptr, ptr %12, align 8, !tbaa !5
  %105 = ptrtoint ptr %104 to i64
  %106 = trunc i64 %105 to i32
  %107 = load ptr, ptr %6, align 8, !tbaa !5
  %108 = getelementptr inbounds %struct.GCtab, ptr %107, i32 0, i32 5
  %109 = getelementptr inbounds %struct.MRef, ptr %108, i32 0, i32 0
  store i32 %106, ptr %109, align 8, !tbaa !18
  %110 = load i32, ptr %7, align 4, !tbaa !9
  %111 = load ptr, ptr %6, align 8, !tbaa !5
  %112 = getelementptr inbounds %struct.GCtab, ptr %111, i32 0, i32 10
  store i32 %110, ptr %112, align 4, !tbaa !15
  %113 = load i32, ptr %10, align 4, !tbaa !9
  store i32 %113, ptr %13, align 4, !tbaa !9
  br label %114

114:                                              ; preds = %124, %103
  %115 = load i32, ptr %13, align 4, !tbaa !9
  %116 = load i32, ptr %7, align 4, !tbaa !9
  %117 = icmp ult i32 %115, %116
  br i1 %117, label %118, label %127

118:                                              ; preds = %114
  %119 = load ptr, ptr %12, align 8, !tbaa !5
  %120 = load i32, ptr %13, align 4, !tbaa !9
  %121 = zext i32 %120 to i64
  %122 = getelementptr inbounds %union.TValue, ptr %119, i64 %121
  %123 = getelementptr inbounds %struct.anon, ptr %122, i32 0, i32 1
  store i32 -1, ptr %123, align 4, !tbaa !21
  br label %124

124:                                              ; preds = %118
  %125 = load i32, ptr %13, align 4, !tbaa !9
  %126 = add i32 %125, 1
  store i32 %126, ptr %13, align 4, !tbaa !9
  br label %114, !llvm.loop !22

127:                                              ; preds = %114
  call void @llvm.lifetime.end.p0(i64 4, ptr %13) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %12) #5
  br label %128

128:                                              ; preds = %127, %4
  %129 = load i32, ptr %8, align 4, !tbaa !9
  %130 = icmp ne i32 %129, 0
  br i1 %130, label %131, label %136

131:                                              ; preds = %128
  %132 = load ptr, ptr %5, align 8, !tbaa !5
  %133 = load ptr, ptr %6, align 8, !tbaa !5
  %134 = load i32, ptr %8, align 4, !tbaa !9
  call void @newhpart(ptr noundef %132, ptr noundef %133, i32 noundef %134)
  %135 = load ptr, ptr %6, align 8, !tbaa !5
  call void @clearhpart(ptr noundef %135)
  br label %153

136:                                              ; preds = %128
  call void @llvm.lifetime.start.p0(i64 8, ptr %15) #5
  %137 = load ptr, ptr %5, align 8, !tbaa !5
  %138 = getelementptr inbounds %struct.lua_State, ptr %137, i32 0, i32 0
  %139 = getelementptr inbounds %struct.anon.3, ptr %138, i32 0, i32 5
  %140 = getelementptr inbounds %struct.MRef, ptr %139, i32 0, i32 0
  %141 = load i32, ptr %140, align 8, !tbaa !21
  %142 = zext i32 %141 to i64
  %143 = inttoptr i64 %142 to ptr
  store ptr %143, ptr %15, align 8, !tbaa !5
  %144 = load ptr, ptr %15, align 8, !tbaa !5
  %145 = getelementptr inbounds %struct.global_State, ptr %144, i32 0, i32 17
  %146 = ptrtoint ptr %145 to i64
  %147 = trunc i64 %146 to i32
  %148 = load ptr, ptr %6, align 8, !tbaa !5
  %149 = getelementptr inbounds %struct.GCtab, ptr %148, i32 0, i32 9
  %150 = getelementptr inbounds %struct.MRef, ptr %149, i32 0, i32 0
  store i32 %147, ptr %150, align 8, !tbaa !11
  %151 = load ptr, ptr %6, align 8, !tbaa !5
  %152 = getelementptr inbounds %struct.GCtab, ptr %151, i32 0, i32 11
  store i32 0, ptr %152, align 8, !tbaa !16
  call void @llvm.lifetime.end.p0(i64 8, ptr %15) #5
  br label %153

153:                                              ; preds = %136, %131
  %154 = load i32, ptr %7, align 4, !tbaa !9
  %155 = load i32, ptr %10, align 4, !tbaa !9
  %156 = icmp ult i32 %154, %155
  br i1 %156, label %157, label %218

157:                                              ; preds = %153
  call void @llvm.lifetime.start.p0(i64 8, ptr %16) #5
  %158 = load ptr, ptr %6, align 8, !tbaa !5
  %159 = getelementptr inbounds %struct.GCtab, ptr %158, i32 0, i32 5
  %160 = getelementptr inbounds %struct.MRef, ptr %159, i32 0, i32 0
  %161 = load i32, ptr %160, align 8, !tbaa !18
  %162 = zext i32 %161 to i64
  %163 = inttoptr i64 %162 to ptr
  store ptr %163, ptr %16, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %17) #5
  %164 = load i32, ptr %7, align 4, !tbaa !9
  %165 = load ptr, ptr %6, align 8, !tbaa !5
  %166 = getelementptr inbounds %struct.GCtab, ptr %165, i32 0, i32 10
  store i32 %164, ptr %166, align 4, !tbaa !15
  %167 = load i32, ptr %7, align 4, !tbaa !9
  store i32 %167, ptr %17, align 4, !tbaa !9
  br label %168

168:                                              ; preds = %191, %157
  %169 = load i32, ptr %17, align 4, !tbaa !9
  %170 = load i32, ptr %10, align 4, !tbaa !9
  %171 = icmp ult i32 %169, %170
  br i1 %171, label %172, label %194

172:                                              ; preds = %168
  %173 = load ptr, ptr %16, align 8, !tbaa !5
  %174 = load i32, ptr %17, align 4, !tbaa !9
  %175 = zext i32 %174 to i64
  %176 = getelementptr inbounds %union.TValue, ptr %173, i64 %175
  %177 = getelementptr inbounds %struct.anon, ptr %176, i32 0, i32 1
  %178 = load i32, ptr %177, align 4, !tbaa !21
  %179 = icmp eq i32 %178, -1
  br i1 %179, label %190, label %180

180:                                              ; preds = %172
  %181 = load ptr, ptr %5, align 8, !tbaa !5
  %182 = load ptr, ptr %5, align 8, !tbaa !5
  %183 = load ptr, ptr %6, align 8, !tbaa !5
  %184 = load i32, ptr %17, align 4, !tbaa !9
  %185 = call ptr @lj_tab_setinth(ptr noundef %182, ptr noundef %183, i32 noundef %184)
  %186 = load ptr, ptr %16, align 8, !tbaa !5
  %187 = load i32, ptr %17, align 4, !tbaa !9
  %188 = zext i32 %187 to i64
  %189 = getelementptr inbounds %union.TValue, ptr %186, i64 %188
  call void @copyTV(ptr noundef %181, ptr noundef %185, ptr noundef %189)
  br label %190

190:                                              ; preds = %180, %172
  br label %191

191:                                              ; preds = %190
  %192 = load i32, ptr %17, align 4, !tbaa !9
  %193 = add i32 %192, 1
  store i32 %193, ptr %17, align 4, !tbaa !9
  br label %168, !llvm.loop !23

194:                                              ; preds = %168
  %195 = load ptr, ptr %6, align 8, !tbaa !5
  %196 = getelementptr inbounds %struct.GCtab, ptr %195, i32 0, i32 4
  %197 = load i8, ptr %196, align 1, !tbaa !17
  %198 = sext i8 %197 to i32
  %199 = icmp sle i32 %198, 0
  br i1 %199, label %200, label %217

200:                                              ; preds = %194
  %201 = load ptr, ptr %5, align 8, !tbaa !5
  %202 = load ptr, ptr %16, align 8, !tbaa !5
  %203 = load i32, ptr %10, align 4, !tbaa !9
  %204 = zext i32 %203 to i64
  %205 = mul i64 %204, 8
  %206 = trunc i64 %205 to i32
  %207 = load i32, ptr %7, align 4, !tbaa !9
  %208 = zext i32 %207 to i64
  %209 = mul i64 %208, 8
  %210 = trunc i64 %209 to i32
  %211 = call ptr @lj_mem_realloc(ptr noundef %201, ptr noundef %202, i32 noundef %206, i32 noundef %210)
  %212 = ptrtoint ptr %211 to i64
  %213 = trunc i64 %212 to i32
  %214 = load ptr, ptr %6, align 8, !tbaa !5
  %215 = getelementptr inbounds %struct.GCtab, ptr %214, i32 0, i32 5
  %216 = getelementptr inbounds %struct.MRef, ptr %215, i32 0, i32 0
  store i32 %213, ptr %216, align 8, !tbaa !18
  br label %217

217:                                              ; preds = %200, %194
  call void @llvm.lifetime.end.p0(i64 4, ptr %17) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %16) #5
  br label %218

218:                                              ; preds = %217, %153
  %219 = load i32, ptr %11, align 4, !tbaa !9
  %220 = icmp ugt i32 %219, 0
  br i1 %220, label %221, label %263

221:                                              ; preds = %218
  call void @llvm.lifetime.start.p0(i64 8, ptr %18) #5
  call void @llvm.lifetime.start.p0(i64 4, ptr %19) #5
  %222 = load i32, ptr %11, align 4, !tbaa !9
  store i32 %222, ptr %19, align 4, !tbaa !9
  br label %223

223:                                              ; preds = %246, %221
  %224 = load i32, ptr %19, align 4, !tbaa !9
  %225 = icmp sge i32 %224, 0
  br i1 %225, label %226, label %249

226:                                              ; preds = %223
  call void @llvm.lifetime.start.p0(i64 8, ptr %20) #5
  %227 = load ptr, ptr %9, align 8, !tbaa !5
  %228 = load i32, ptr %19, align 4, !tbaa !9
  %229 = sext i32 %228 to i64
  %230 = getelementptr inbounds %struct.Node, ptr %227, i64 %229
  store ptr %230, ptr %20, align 8, !tbaa !5
  %231 = load ptr, ptr %20, align 8, !tbaa !5
  %232 = getelementptr inbounds %struct.Node, ptr %231, i32 0, i32 0
  %233 = getelementptr inbounds %struct.anon, ptr %232, i32 0, i32 1
  %234 = load i32, ptr %233, align 4, !tbaa !21
  %235 = icmp eq i32 %234, -1
  br i1 %235, label %245, label %236

236:                                              ; preds = %226
  %237 = load ptr, ptr %5, align 8, !tbaa !5
  %238 = load ptr, ptr %5, align 8, !tbaa !5
  %239 = load ptr, ptr %6, align 8, !tbaa !5
  %240 = load ptr, ptr %20, align 8, !tbaa !5
  %241 = getelementptr inbounds %struct.Node, ptr %240, i32 0, i32 1
  %242 = call ptr @lj_tab_set(ptr noundef %238, ptr noundef %239, ptr noundef %241)
  %243 = load ptr, ptr %20, align 8, !tbaa !5
  %244 = getelementptr inbounds %struct.Node, ptr %243, i32 0, i32 0
  call void @copyTV(ptr noundef %237, ptr noundef %242, ptr noundef %244)
  br label %245

245:                                              ; preds = %236, %226
  call void @llvm.lifetime.end.p0(i64 8, ptr %20) #5
  br label %246

246:                                              ; preds = %245
  %247 = load i32, ptr %19, align 4, !tbaa !9
  %248 = add nsw i32 %247, -1
  store i32 %248, ptr %19, align 4, !tbaa !9
  br label %223, !llvm.loop !24

249:                                              ; preds = %223
  %250 = load ptr, ptr %5, align 8, !tbaa !5
  %251 = getelementptr inbounds %struct.lua_State, ptr %250, i32 0, i32 0
  %252 = getelementptr inbounds %struct.anon.3, ptr %251, i32 0, i32 5
  %253 = getelementptr inbounds %struct.MRef, ptr %252, i32 0, i32 0
  %254 = load i32, ptr %253, align 8, !tbaa !21
  %255 = zext i32 %254 to i64
  %256 = inttoptr i64 %255 to ptr
  store ptr %256, ptr %18, align 8, !tbaa !5
  %257 = load ptr, ptr %18, align 8, !tbaa !5
  %258 = load ptr, ptr %9, align 8, !tbaa !5
  %259 = load i32, ptr %11, align 4, !tbaa !9
  %260 = add i32 %259, 1
  %261 = zext i32 %260 to i64
  %262 = mul i64 %261, 24
  call void @lj_mem_free(ptr noundef %257, ptr noundef %258, i64 noundef %262)
  call void @llvm.lifetime.end.p0(i64 4, ptr %19) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %18) #5
  br label %263

263:                                              ; preds = %249, %218
  call void @llvm.lifetime.end.p0(i64 4, ptr %11) #5
  call void @llvm.lifetime.end.p0(i64 4, ptr %10) #5
  call void @llvm.lifetime.end.p0(i64 8, ptr %9) #5
  ret void
}

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

declare hidden ptr @lj_mem_realloc(ptr noundef, ptr noundef, i32 noundef, i32 noundef) #4

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

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

; Function Attrs: nounwind uwtable
declare hidden ptr @lj_tab_set(ptr noundef, ptr noundef, ptr noundef) #2

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 = { nounwind uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #3 = { 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 #4 = { "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 }

!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, !10, i64 32}
!12 = !{!"GCtab", !13, i64 0, !7, i64 4, !7, i64 5, !7, i64 6, !7, i64 7, !14, i64 8, !13, i64 12, !13, i64 16, !6, i64 24, !14, i64 32, !10, i64 36, !10, i64 40}
!13 = !{!"GCRef", !10, i64 0}
!14 = !{!"MRef", !10, i64 0}
!15 = !{!12, !10, i64 36}
!16 = !{!12, !10, i64 40}
!17 = !{!12, !7, i64 7}
!18 = !{!12, !10, i64 8}
!19 = distinct !{!19, !20}
!20 = !{!"llvm.loop.mustprogress"}
!21 = !{!7, !7, i64 0}
!22 = distinct !{!22, !20}
!23 = distinct !{!23, !20}
!24 = distinct !{!24, !20}


; 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 }
%struct.Node = type { %union.TValue, %union.TValue, %struct.MRef, %struct.MRef }
%struct.MRef = type { i32 }

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

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

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

; Function Attrs: nounwind uwtable
define hidden void @lj_tab_resize(ptr noundef %0, ptr noundef %1, i32 noundef %2, i32 noundef %3) local_unnamed_addr #1 {
  %5 = getelementptr inbounds i8, ptr %1, i64 32
  %6 = load i32, ptr %5, align 8, !tbaa !5
  %7 = zext i32 %6 to i64
  %8 = inttoptr i64 %7 to ptr
  %9 = getelementptr inbounds i8, ptr %1, i64 36
  %10 = load i32, ptr %9, align 4, !tbaa !13
  %11 = getelementptr inbounds i8, ptr %1, i64 40
  %12 = load i32, ptr %11, align 8, !tbaa !14
  %13 = icmp ult i32 %10, %2
  br i1 %13, label %14, label %.loopexit

14:                                               ; preds = %4
  %15 = icmp ugt i32 %2, 134217729
  br i1 %15, label %16, label %17

16:                                               ; preds = %14
  tail call void @lj_err_msg(ptr noundef %0, i32 noundef 139) #4
  unreachable

17:                                               ; preds = %14
  %18 = getelementptr inbounds i8, ptr %1, i64 7
  %19 = load i8, ptr %18, align 1, !tbaa !15
  %20 = icmp sgt i8 %19, 0
  %21 = getelementptr inbounds i8, ptr %1, i64 8
  %22 = load i32, ptr %21, align 8, !tbaa !16
  %23 = zext i32 %22 to i64
  %24 = inttoptr i64 %23 to ptr
  br i1 %20, label %25, label %32

25:                                               ; preds = %17
  %26 = shl nuw nsw i32 %2, 3
  %27 = tail call ptr @lj_mem_realloc(ptr noundef %0, ptr noundef null, i32 noundef 0, i32 noundef %26) #5
  %28 = load i8, ptr %18, align 1, !tbaa !15
  %29 = or i8 %28, -128
  store i8 %29, ptr %18, align 1, !tbaa !15
  %.not98 = icmp eq i32 %10, 0
  br i1 %.not98, label %.lr.ph94.preheader, label %.lr.ph.preheader

.lr.ph.preheader:                                 ; preds = %25
  %wide.trip.count = zext i32 %10 to i64
  br label %.lr.ph

.lr.ph:                                           ; preds = %.lr.ph.preheader, %.lr.ph
  %indvars.iv = phi i64 [ 0, %.lr.ph.preheader ], [ %indvars.iv.next, %.lr.ph ]
  %30 = getelementptr inbounds %union.TValue, ptr %27, i64 %indvars.iv
  %31 = getelementptr inbounds %union.TValue, ptr %24, i64 %indvars.iv
  tail call void @copyTV(ptr noundef %0, ptr noundef %30, ptr noundef %31)
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
  %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
  br i1 %exitcond.not, label %.lr.ph94.preheader, label %.lr.ph, !llvm.loop !17

32:                                               ; preds = %17
  %33 = shl i32 %10, 3
  %34 = shl nuw nsw i32 %2, 3
  %35 = tail call ptr @lj_mem_realloc(ptr noundef %0, ptr noundef %24, i32 noundef %33, i32 noundef %34) #5
  br label %.lr.ph94.preheader

.lr.ph94.preheader:                               ; preds = %.lr.ph, %32, %25
  %.0 = phi ptr [ %35, %32 ], [ %27, %25 ], [ %27, %.lr.ph ]
  %36 = ptrtoint ptr %.0 to i64
  %37 = trunc i64 %36 to i32
  %38 = getelementptr inbounds i8, ptr %1, i64 8
  store i32 %37, ptr %38, align 8, !tbaa !16
  store i32 %2, ptr %9, align 4, !tbaa !13
  %invariant.gep = getelementptr inbounds i8, ptr %.0, i64 4
  %39 = zext i32 %10 to i64
  %wide.trip.count103 = zext nneg i32 %2 to i64
  %40 = sub nsw i64 %wide.trip.count103, %39
  %xtraiter = and i64 %40, 7
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.lr.ph94.prol.loopexit, label %.lr.ph94.prol

.lr.ph94.prol:                                    ; preds = %.lr.ph94.preheader, %.lr.ph94.prol
  %indvars.iv100.prol = phi i64 [ %indvars.iv.next101.prol, %.lr.ph94.prol ], [ %39, %.lr.ph94.preheader ]
  %prol.iter = phi i64 [ %prol.iter.next, %.lr.ph94.prol ], [ 0, %.lr.ph94.preheader ]
  %gep.prol = getelementptr inbounds %union.TValue, ptr %invariant.gep, i64 %indvars.iv100.prol
  store i32 -1, ptr %gep.prol, align 4, !tbaa !19
  %indvars.iv.next101.prol = add nuw nsw i64 %indvars.iv100.prol, 1
  %prol.iter.next = add i64 %prol.iter, 1
  %prol.iter.cmp.not = icmp eq i64 %prol.iter.next, %xtraiter
  br i1 %prol.iter.cmp.not, label %.lr.ph94.prol.loopexit, label %.lr.ph94.prol, !llvm.loop !20

.lr.ph94.prol.loopexit:                           ; preds = %.lr.ph94.prol, %.lr.ph94.preheader
  %indvars.iv100.unr = phi i64 [ %39, %.lr.ph94.preheader ], [ %indvars.iv.next101.prol, %.lr.ph94.prol ]
  %41 = sub nsw i64 %39, %wide.trip.count103
  %42 = icmp ugt i64 %41, -8
  br i1 %42, label %.loopexit, label %.lr.ph94.preheader.new

.lr.ph94.preheader.new:                           ; preds = %.lr.ph94.prol.loopexit
  %invariant.gep112 = getelementptr i8, ptr %invariant.gep, i64 8
  %invariant.gep114 = getelementptr i8, ptr %invariant.gep, i64 16
  %invariant.gep116 = getelementptr i8, ptr %invariant.gep, i64 24
  %invariant.gep118 = getelementptr i8, ptr %invariant.gep, i64 32
  %invariant.gep120 = getelementptr i8, ptr %invariant.gep, i64 40
  %invariant.gep122 = getelementptr i8, ptr %invariant.gep, i64 48
  %invariant.gep124 = getelementptr i8, ptr %invariant.gep, i64 56
  br label %.lr.ph94

.lr.ph94:                                         ; preds = %.lr.ph94, %.lr.ph94.preheader.new
  %indvars.iv100 = phi i64 [ %indvars.iv100.unr, %.lr.ph94.preheader.new ], [ %indvars.iv.next101.7, %.lr.ph94 ]
  %gep = getelementptr inbounds %union.TValue, ptr %invariant.gep, i64 %indvars.iv100
  store i32 -1, ptr %gep, align 4, !tbaa !19
  %gep113 = getelementptr %union.TValue, ptr %invariant.gep112, i64 %indvars.iv100
  store i32 -1, ptr %gep113, align 4, !tbaa !19
  %gep115 = getelementptr %union.TValue, ptr %invariant.gep114, i64 %indvars.iv100
  store i32 -1, ptr %gep115, align 4, !tbaa !19
  %gep117 = getelementptr %union.TValue, ptr %invariant.gep116, i64 %indvars.iv100
  store i32 -1, ptr %gep117, align 4, !tbaa !19
  %gep119 = getelementptr %union.TValue, ptr %invariant.gep118, i64 %indvars.iv100
  store i32 -1, ptr %gep119, align 4, !tbaa !19
  %gep121 = getelementptr %union.TValue, ptr %invariant.gep120, i64 %indvars.iv100
  store i32 -1, ptr %gep121, align 4, !tbaa !19
  %gep123 = getelementptr %union.TValue, ptr %invariant.gep122, i64 %indvars.iv100
  store i32 -1, ptr %gep123, align 4, !tbaa !19
  %gep125 = getelementptr %union.TValue, ptr %invariant.gep124, i64 %indvars.iv100
  store i32 -1, ptr %gep125, align 4, !tbaa !19
  %indvars.iv.next101.7 = add nuw nsw i64 %indvars.iv100, 8
  %exitcond104.not.7 = icmp eq i64 %indvars.iv.next101.7, %wide.trip.count103
  br i1 %exitcond104.not.7, label %.loopexit, label %.lr.ph94, !llvm.loop !22

.loopexit:                                        ; preds = %.lr.ph94.prol.loopexit, %.lr.ph94, %4
  %.not = icmp eq i32 %3, 0
  br i1 %.not, label %44, label %43

43:                                               ; preds = %.loopexit
  tail call void @newhpart(ptr noundef %0, ptr noundef %1, i32 noundef %3)
  tail call void @clearhpart(ptr noundef %1)
  br label %48

44:                                               ; preds = %.loopexit
  %45 = getelementptr inbounds i8, ptr %0, i64 8
  %46 = load i32, ptr %45, align 8, !tbaa !19
  %47 = add i32 %46, 160
  store i32 %47, ptr %5, align 8, !tbaa !5
  store i32 0, ptr %11, align 8, !tbaa !14
  br label %48

48:                                               ; preds = %44, %43
  %49 = icmp ugt i32 %10, %2
  br i1 %49, label %50, label %75

50:                                               ; preds = %48
  %51 = getelementptr inbounds i8, ptr %1, i64 8
  %52 = load i32, ptr %51, align 8, !tbaa !16
  %53 = zext i32 %52 to i64
  %54 = inttoptr i64 %53 to ptr
  store i32 %2, ptr %9, align 4, !tbaa !13
  %55 = zext i32 %2 to i64
  br label %56

56:                                               ; preds = %50, %64
  %indvars.iv105 = phi i64 [ %55, %50 ], [ %indvars.iv.next106, %64 ]
  %57 = getelementptr inbounds %union.TValue, ptr %54, i64 %indvars.iv105
  %58 = getelementptr inbounds i8, ptr %57, i64 4
  %59 = load i32, ptr %58, align 4, !tbaa !19
  %60 = icmp eq i32 %59, -1
  br i1 %60, label %64, label %61

61:                                               ; preds = %56
  %62 = trunc nuw i64 %indvars.iv105 to i32
  %63 = tail call ptr @lj_tab_setinth(ptr noundef %0, ptr noundef %1, i32 noundef %62)
  tail call void @copyTV(ptr noundef %0, ptr noundef %63, ptr noundef nonnull %57)
  br label %64

64:                                               ; preds = %56, %61
  %indvars.iv.next106 = add nuw nsw i64 %indvars.iv105, 1
  %lftr.wideiv = trunc i64 %indvars.iv.next106 to i32
  %exitcond108.not = icmp eq i32 %10, %lftr.wideiv
  br i1 %exitcond108.not, label %65, label %56, !llvm.loop !23

65:                                               ; preds = %64
  %66 = getelementptr inbounds i8, ptr %1, i64 7
  %67 = load i8, ptr %66, align 1, !tbaa !15
  %68 = icmp slt i8 %67, 1
  br i1 %68, label %69, label %75

69:                                               ; preds = %65
  %70 = shl i32 %10, 3
  %71 = shl i32 %2, 3
  %72 = tail call ptr @lj_mem_realloc(ptr noundef %0, ptr noundef nonnull %54, i32 noundef %70, i32 noundef %71) #5
  %73 = ptrtoint ptr %72 to i64
  %74 = trunc i64 %73 to i32
  store i32 %74, ptr %51, align 8, !tbaa !16
  br label %75

75:                                               ; preds = %65, %69, %48
  %.not90 = icmp eq i32 %12, 0
  br i1 %.not90, label %94, label %.preheader

.preheader:                                       ; preds = %75
  %76 = icmp sgt i32 %12, -1
  br i1 %76, label %.lr.ph97.preheader, label %._crit_edge

.lr.ph97.preheader:                               ; preds = %.preheader
  %77 = zext nneg i32 %12 to i64
  br label %.lr.ph97

.lr.ph97:                                         ; preds = %.lr.ph97.preheader, %85
  %indvars.iv109 = phi i64 [ %77, %.lr.ph97.preheader ], [ %indvars.iv.next110, %85 ]
  %78 = getelementptr inbounds %struct.Node, ptr %8, i64 %indvars.iv109
  %79 = getelementptr inbounds i8, ptr %78, i64 4
  %80 = load i32, ptr %79, align 4, !tbaa !19
  %81 = icmp eq i32 %80, -1
  br i1 %81, label %85, label %82

82:                                               ; preds = %.lr.ph97
  %83 = getelementptr inbounds i8, ptr %78, i64 8
  %84 = tail call ptr @lj_tab_set(ptr noundef %0, ptr noundef %1, ptr noundef nonnull %83)
  tail call void @copyTV(ptr noundef %0, ptr noundef %84, ptr noundef nonnull %78)
  br label %85

85:                                               ; preds = %82, %.lr.ph97
  %indvars.iv.next110 = add nsw i64 %indvars.iv109, -1
  %86 = icmp sgt i64 %indvars.iv109, 0
  br i1 %86, label %.lr.ph97, label %._crit_edge, !llvm.loop !24

._crit_edge:                                      ; preds = %85, %.preheader
  %87 = getelementptr inbounds i8, ptr %0, i64 8
  %88 = load i32, ptr %87, align 8, !tbaa !19
  %89 = zext i32 %88 to i64
  %90 = inttoptr i64 %89 to ptr
  %91 = add i32 %12, 1
  %92 = zext i32 %91 to i64
  %93 = mul nuw nsw i64 %92, 24
  tail call void @lj_mem_free(ptr noundef %90, ptr noundef %8, i64 noundef %93)
  br label %94

94:                                               ; preds = %._crit_edge, %75
  ret void
}

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

declare hidden ptr @lj_mem_realloc(ptr noundef, ptr noundef, i32 noundef, i32 noundef) local_unnamed_addr #3

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

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

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

attributes #0 = { 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 #1 = { 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 = { 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 #3 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #4 = { noreturn nounwind }
attributes #5 = { nounwind }

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !8, i64 32}
!6 = !{!"GCtab", !7, i64 0, !9, i64 4, !9, i64 5, !9, i64 6, !9, i64 7, !11, i64 8, !7, i64 12, !7, i64 16, !12, i64 24, !11, i64 32, !8, i64 36, !8, i64 40}
!7 = !{!"GCRef", !8, i64 0}
!8 = !{!"int", !9, i64 0}
!9 = !{!"omnipotent char", !10, i64 0}
!10 = !{!"Simple C/C++ TBAA"}
!11 = !{!"MRef", !8, i64 0}
!12 = !{!"any pointer", !9, i64 0}
!13 = !{!6, !8, i64 36}
!14 = !{!6, !8, i64 40}
!15 = !{!6, !9, i64 7}
!16 = !{!6, !8, i64 8}
!17 = distinct !{!17, !18}
!18 = !{!"llvm.loop.mustprogress"}
!19 = !{!9, !9, i64 0}
!20 = distinct !{!20, !21}
!21 = !{!"llvm.loop.unroll.disable"}
!22 = distinct !{!22, !18}
!23 = distinct !{!23, !18}
!24 = distinct !{!24, !18}


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