; LLVM IR from ejoy/ejoy2d :: lua (lvm)

; 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.lua_TValue = type { %union.Value, i32 }
%union.Value = type { ptr }
%struct.Udata = type { ptr, i8, i8, i8, ptr, i64, %union.Value }
%struct.Table = type { ptr, i8, i8, i8, i8, i32, ptr, ptr, ptr, ptr, ptr }
%struct.lua_State = type { ptr, i8, i8, i8, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, %struct.CallInfo, ptr, i64, i32, i32, i32, i16, i16, i8, i8 }
%struct.CallInfo = type { ptr, ptr, ptr, ptr, %union.anon, i64, i16, i8 }
%union.anon = type { %struct.anon.0 }
%struct.anon.0 = type { ptr, i64, i64 }
%struct.global_State = type { ptr, ptr, i64, i64, i64, i64, %struct.stringtable, %struct.lua_TValue, i32, i8, i8, i8, i8, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, %struct.Mbuffer, i32, i32, i32, ptr, ptr, ptr, ptr, [24 x ptr], [9 x ptr] }
%struct.stringtable = type { ptr, i32, i32 }
%struct.Mbuffer = type { ptr, i64, i64 }

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

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

declare hidden ptr @luaT_gettm(ptr noundef, i32 noundef, ptr noundef) #1

declare hidden void @luaT_callTM(ptr noundef, ptr noundef, ptr noundef, ptr noundef, ptr noundef, i32 noundef) #1

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

; Function Attrs: nounwind uwtable
define hidden i32 @luaV_equalobj(ptr noundef %0, ptr noundef %1, ptr noundef %2) #2 {
  %4 = alloca i32, align 4
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca ptr, align 8
  %8 = alloca ptr, align 8
  %9 = alloca i32, align 4
  %10 = alloca double, align 8
  %11 = alloca double, align 8
  store ptr %0, ptr %5, align 8, !tbaa !5
  store ptr %1, ptr %6, align 8, !tbaa !5
  store ptr %2, ptr %7, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #3
  %12 = load ptr, ptr %6, align 8, !tbaa !5
  %13 = getelementptr inbounds %struct.lua_TValue, ptr %12, i32 0, i32 1
  %14 = load i32, ptr %13, align 8, !tbaa !9
  %15 = and i32 %14, 63
  %16 = load ptr, ptr %7, align 8, !tbaa !5
  %17 = getelementptr inbounds %struct.lua_TValue, ptr %16, i32 0, i32 1
  %18 = load i32, ptr %17, align 8, !tbaa !9
  %19 = and i32 %18, 63
  %20 = icmp ne i32 %15, %19
  br i1 %20, label %21, label %47

21:                                               ; preds = %3
  %22 = load ptr, ptr %6, align 8, !tbaa !5
  %23 = getelementptr inbounds %struct.lua_TValue, ptr %22, i32 0, i32 1
  %24 = load i32, ptr %23, align 8, !tbaa !9
  %25 = and i32 %24, 15
  %26 = load ptr, ptr %7, align 8, !tbaa !5
  %27 = getelementptr inbounds %struct.lua_TValue, ptr %26, i32 0, i32 1
  %28 = load i32, ptr %27, align 8, !tbaa !9
  %29 = and i32 %28, 15
  %30 = icmp ne i32 %25, %29
  br i1 %30, label %37, label %31

31:                                               ; preds = %21
  %32 = load ptr, ptr %6, align 8, !tbaa !5
  %33 = getelementptr inbounds %struct.lua_TValue, ptr %32, i32 0, i32 1
  %34 = load i32, ptr %33, align 8, !tbaa !9
  %35 = and i32 %34, 15
  %36 = icmp ne i32 %35, 3
  br i1 %36, label %37, label %38

37:                                               ; preds = %31, %21
  store i32 0, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %344

38:                                               ; preds = %31
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #3
  %39 = load ptr, ptr %6, align 8, !tbaa !5
  %40 = call i32 @tofloat(ptr noundef %39, ptr noundef %10)
  %41 = load ptr, ptr %7, align 8, !tbaa !5
  %42 = call i32 @tofloat(ptr noundef %41, ptr noundef %11)
  %43 = load double, ptr %10, align 8, !tbaa !12
  %44 = load double, ptr %11, align 8, !tbaa !12
  %45 = fcmp oeq double %43, %44
  %46 = zext i1 %45 to i32
  store i32 %46, ptr %4, align 4
  store i32 1, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #3
  br label %344

47:                                               ; preds = %3
  %48 = load ptr, ptr %6, align 8, !tbaa !5
  %49 = getelementptr inbounds %struct.lua_TValue, ptr %48, i32 0, i32 1
  %50 = load i32, ptr %49, align 8, !tbaa !9
  %51 = and i32 %50, 63
  switch i32 %51, label %297 [
    i32 0, label %52
    i32 19, label %53
    i32 3, label %62
    i32 1, label %71
    i32 2, label %80
    i32 22, label %89
    i32 4, label %98
    i32 20, label %107
    i32 7, label %115
    i32 5, label %206
  ]

52:                                               ; preds = %47
  store i32 1, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %344

53:                                               ; preds = %47
  %54 = load ptr, ptr %6, align 8, !tbaa !5
  %55 = getelementptr inbounds %struct.lua_TValue, ptr %54, i32 0, i32 0
  %56 = load i64, ptr %55, align 8, !tbaa !14
  %57 = load ptr, ptr %7, align 8, !tbaa !5
  %58 = getelementptr inbounds %struct.lua_TValue, ptr %57, i32 0, i32 0
  %59 = load i64, ptr %58, align 8, !tbaa !14
  %60 = icmp eq i64 %56, %59
  %61 = zext i1 %60 to i32
  store i32 %61, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %344

62:                                               ; preds = %47
  %63 = load ptr, ptr %6, align 8, !tbaa !5
  %64 = getelementptr inbounds %struct.lua_TValue, ptr %63, i32 0, i32 0
  %65 = load double, ptr %64, align 8, !tbaa !14
  %66 = load ptr, ptr %7, align 8, !tbaa !5
  %67 = getelementptr inbounds %struct.lua_TValue, ptr %66, i32 0, i32 0
  %68 = load double, ptr %67, align 8, !tbaa !14
  %69 = fcmp oeq double %65, %68
  %70 = zext i1 %69 to i32
  store i32 %70, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %344

71:                                               ; preds = %47
  %72 = load ptr, ptr %6, align 8, !tbaa !5
  %73 = getelementptr inbounds %struct.lua_TValue, ptr %72, i32 0, i32 0
  %74 = load i32, ptr %73, align 8, !tbaa !14
  %75 = load ptr, ptr %7, align 8, !tbaa !5
  %76 = getelementptr inbounds %struct.lua_TValue, ptr %75, i32 0, i32 0
  %77 = load i32, ptr %76, align 8, !tbaa !14
  %78 = icmp eq i32 %74, %77
  %79 = zext i1 %78 to i32
  store i32 %79, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %344

80:                                               ; preds = %47
  %81 = load ptr, ptr %6, align 8, !tbaa !5
  %82 = getelementptr inbounds %struct.lua_TValue, ptr %81, i32 0, i32 0
  %83 = load ptr, ptr %82, align 8, !tbaa !14
  %84 = load ptr, ptr %7, align 8, !tbaa !5
  %85 = getelementptr inbounds %struct.lua_TValue, ptr %84, i32 0, i32 0
  %86 = load ptr, ptr %85, align 8, !tbaa !14
  %87 = icmp eq ptr %83, %86
  %88 = zext i1 %87 to i32
  store i32 %88, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %344

89:                                               ; preds = %47
  %90 = load ptr, ptr %6, align 8, !tbaa !5
  %91 = getelementptr inbounds %struct.lua_TValue, ptr %90, i32 0, i32 0
  %92 = load ptr, ptr %91, align 8, !tbaa !14
  %93 = load ptr, ptr %7, align 8, !tbaa !5
  %94 = getelementptr inbounds %struct.lua_TValue, ptr %93, i32 0, i32 0
  %95 = load ptr, ptr %94, align 8, !tbaa !14
  %96 = icmp eq ptr %92, %95
  %97 = zext i1 %96 to i32
  store i32 %97, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %344

98:                                               ; preds = %47
  %99 = load ptr, ptr %6, align 8, !tbaa !5
  %100 = getelementptr inbounds %struct.lua_TValue, ptr %99, i32 0, i32 0
  %101 = load ptr, ptr %100, align 8, !tbaa !14
  %102 = load ptr, ptr %7, align 8, !tbaa !5
  %103 = getelementptr inbounds %struct.lua_TValue, ptr %102, i32 0, i32 0
  %104 = load ptr, ptr %103, align 8, !tbaa !14
  %105 = icmp eq ptr %101, %104
  %106 = zext i1 %105 to i32
  store i32 %106, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %344

107:                                              ; preds = %47
  %108 = load ptr, ptr %6, align 8, !tbaa !5
  %109 = getelementptr inbounds %struct.lua_TValue, ptr %108, i32 0, i32 0
  %110 = load ptr, ptr %109, align 8, !tbaa !14
  %111 = load ptr, ptr %7, align 8, !tbaa !5
  %112 = getelementptr inbounds %struct.lua_TValue, ptr %111, i32 0, i32 0
  %113 = load ptr, ptr %112, align 8, !tbaa !14
  %114 = call i32 @luaS_eqlngstr(ptr noundef %110, ptr noundef %113)
  store i32 %114, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %344

115:                                              ; preds = %47
  %116 = load ptr, ptr %6, align 8, !tbaa !5
  %117 = getelementptr inbounds %struct.lua_TValue, ptr %116, i32 0, i32 0
  %118 = load ptr, ptr %117, align 8, !tbaa !14
  %119 = load ptr, ptr %7, align 8, !tbaa !5
  %120 = getelementptr inbounds %struct.lua_TValue, ptr %119, i32 0, i32 0
  %121 = load ptr, ptr %120, align 8, !tbaa !14
  %122 = icmp eq ptr %118, %121
  br i1 %122, label %123, label %124

123:                                              ; preds = %115
  store i32 1, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %344

124:                                              ; preds = %115
  %125 = load ptr, ptr %5, align 8, !tbaa !5
  %126 = icmp eq ptr %125, null
  br i1 %126, label %127, label %128

127:                                              ; preds = %124
  store i32 0, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %344

128:                                              ; preds = %124
  br label %129

129:                                              ; preds = %128
  %130 = load ptr, ptr %6, align 8, !tbaa !5
  %131 = getelementptr inbounds %struct.lua_TValue, ptr %130, i32 0, i32 0
  %132 = load ptr, ptr %131, align 8, !tbaa !14
  %133 = getelementptr inbounds %struct.Udata, ptr %132, i32 0, i32 4
  %134 = load ptr, ptr %133, align 8, !tbaa !14
  %135 = icmp eq ptr %134, null
  br i1 %135, label %136, label %137

136:                                              ; preds = %129
  br label %164

137:                                              ; preds = %129
  %138 = load ptr, ptr %6, align 8, !tbaa !5
  %139 = getelementptr inbounds %struct.lua_TValue, ptr %138, i32 0, i32 0
  %140 = load ptr, ptr %139, align 8, !tbaa !14
  %141 = getelementptr inbounds %struct.Udata, ptr %140, i32 0, i32 4
  %142 = load ptr, ptr %141, align 8, !tbaa !14
  %143 = getelementptr inbounds %struct.Table, ptr %142, i32 0, i32 3
  %144 = load i8, ptr %143, align 2, !tbaa !15
  %145 = zext i8 %144 to i32
  %146 = and i32 %145, 32
  %147 = icmp ne i32 %146, 0
  br i1 %147, label %148, label %149

148:                                              ; preds = %137
  br label %162

149:                                              ; preds = %137
  %150 = load ptr, ptr %6, align 8, !tbaa !5
  %151 = getelementptr inbounds %struct.lua_TValue, ptr %150, i32 0, i32 0
  %152 = load ptr, ptr %151, align 8, !tbaa !14
  %153 = getelementptr inbounds %struct.Udata, ptr %152, i32 0, i32 4
  %154 = load ptr, ptr %153, align 8, !tbaa !14
  %155 = load ptr, ptr %5, align 8, !tbaa !5
  %156 = getelementptr inbounds %struct.lua_State, ptr %155, i32 0, i32 5
  %157 = load ptr, ptr %156, align 8, !tbaa !17
  %158 = getelementptr inbounds %struct.global_State, ptr %157, i32 0, i32 32
  %159 = getelementptr inbounds [24 x ptr], ptr %158, i64 0, i64 5
  %160 = load ptr, ptr %159, align 8, !tbaa !5
  %161 = call ptr @luaT_gettm(ptr noundef %154, i32 noundef 5, ptr noundef %160)
  br label %162

162:                                              ; preds = %149, %148
  %163 = phi ptr [ null, %148 ], [ %161, %149 ]
  br label %164

164:                                              ; preds = %162, %136
  %165 = phi ptr [ null, %136 ], [ %163, %162 ]
  store ptr %165, ptr %8, align 8, !tbaa !5
  %166 = load ptr, ptr %8, align 8, !tbaa !5
  %167 = icmp eq ptr %166, null
  br i1 %167, label %168, label %205

168:                                              ; preds = %164
  %169 = load ptr, ptr %7, align 8, !tbaa !5
  %170 = getelementptr inbounds %struct.lua_TValue, ptr %169, i32 0, i32 0
  %171 = load ptr, ptr %170, align 8, !tbaa !14
  %172 = getelementptr inbounds %struct.Udata, ptr %171, i32 0, i32 4
  %173 = load ptr, ptr %172, align 8, !tbaa !14
  %174 = icmp eq ptr %173, null
  br i1 %174, label %175, label %176

175:                                              ; preds = %168
  br label %203

176:                                              ; preds = %168
  %177 = load ptr, ptr %7, align 8, !tbaa !5
  %178 = getelementptr inbounds %struct.lua_TValue, ptr %177, i32 0, i32 0
  %179 = load ptr, ptr %178, align 8, !tbaa !14
  %180 = getelementptr inbounds %struct.Udata, ptr %179, i32 0, i32 4
  %181 = load ptr, ptr %180, align 8, !tbaa !14
  %182 = getelementptr inbounds %struct.Table, ptr %181, i32 0, i32 3
  %183 = load i8, ptr %182, align 2, !tbaa !15
  %184 = zext i8 %183 to i32
  %185 = and i32 %184, 32
  %186 = icmp ne i32 %185, 0
  br i1 %186, label %187, label %188

187:                                              ; preds = %176
  br label %201

188:                                              ; preds = %176
  %189 = load ptr, ptr %7, align 8, !tbaa !5
  %190 = getelementptr inbounds %struct.lua_TValue, ptr %189, i32 0, i32 0
  %191 = load ptr, ptr %190, align 8, !tbaa !14
  %192 = getelementptr inbounds %struct.Udata, ptr %191, i32 0, i32 4
  %193 = load ptr, ptr %192, align 8, !tbaa !14
  %194 = load ptr, ptr %5, align 8, !tbaa !5
  %195 = getelementptr inbounds %struct.lua_State, ptr %194, i32 0, i32 5
  %196 = load ptr, ptr %195, align 8, !tbaa !17
  %197 = getelementptr inbounds %struct.global_State, ptr %196, i32 0, i32 32
  %198 = getelementptr inbounds [24 x ptr], ptr %197, i64 0, i64 5
  %199 = load ptr, ptr %198, align 8, !tbaa !5
  %200 = call ptr @luaT_gettm(ptr noundef %193, i32 noundef 5, ptr noundef %199)
  br label %201

201:                                              ; preds = %188, %187
  %202 = phi ptr [ null, %187 ], [ %200, %188 ]
  br label %203

203:                                              ; preds = %201, %175
  %204 = phi ptr [ null, %175 ], [ %202, %201 ]
  store ptr %204, ptr %8, align 8, !tbaa !5
  br label %205

205:                                              ; preds = %203, %164
  br label %306

206:                                              ; preds = %47
  %207 = load ptr, ptr %6, align 8, !tbaa !5
  %208 = getelementptr inbounds %struct.lua_TValue, ptr %207, i32 0, i32 0
  %209 = load ptr, ptr %208, align 8, !tbaa !14
  %210 = load ptr, ptr %7, align 8, !tbaa !5
  %211 = getelementptr inbounds %struct.lua_TValue, ptr %210, i32 0, i32 0
  %212 = load ptr, ptr %211, align 8, !tbaa !14
  %213 = icmp eq ptr %209, %212
  br i1 %213, label %214, label %215

214:                                              ; preds = %206
  store i32 1, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %344

215:                                              ; preds = %206
  %216 = load ptr, ptr %5, align 8, !tbaa !5
  %217 = icmp eq ptr %216, null
  br i1 %217, label %218, label %219

218:                                              ; preds = %215
  store i32 0, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %344

219:                                              ; preds = %215
  br label %220

220:                                              ; preds = %219
  %221 = load ptr, ptr %6, align 8, !tbaa !5
  %222 = getelementptr inbounds %struct.lua_TValue, ptr %221, i32 0, i32 0
  %223 = load ptr, ptr %222, align 8, !tbaa !14
  %224 = getelementptr inbounds %struct.Table, ptr %223, i32 0, i32 9
  %225 = load ptr, ptr %224, align 8, !tbaa !14
  %226 = icmp eq ptr %225, null
  br i1 %226, label %227, label %228

227:                                              ; preds = %220
  br label %255

228:                                              ; preds = %220
  %229 = load ptr, ptr %6, align 8, !tbaa !5
  %230 = getelementptr inbounds %struct.lua_TValue, ptr %229, i32 0, i32 0
  %231 = load ptr, ptr %230, align 8, !tbaa !14
  %232 = getelementptr inbounds %struct.Table, ptr %231, i32 0, i32 9
  %233 = load ptr, ptr %232, align 8, !tbaa !14
  %234 = getelementptr inbounds %struct.Table, ptr %233, i32 0, i32 3
  %235 = load i8, ptr %234, align 2, !tbaa !15
  %236 = zext i8 %235 to i32
  %237 = and i32 %236, 32
  %238 = icmp ne i32 %237, 0
  br i1 %238, label %239, label %240

239:                                              ; preds = %228
  br label %253

240:                                              ; preds = %228
  %241 = load ptr, ptr %6, align 8, !tbaa !5
  %242 = getelementptr inbounds %struct.lua_TValue, ptr %241, i32 0, i32 0
  %243 = load ptr, ptr %242, align 8, !tbaa !14
  %244 = getelementptr inbounds %struct.Table, ptr %243, i32 0, i32 9
  %245 = load ptr, ptr %244, align 8, !tbaa !14
  %246 = load ptr, ptr %5, align 8, !tbaa !5
  %247 = getelementptr inbounds %struct.lua_State, ptr %246, i32 0, i32 5
  %248 = load ptr, ptr %247, align 8, !tbaa !17
  %249 = getelementptr inbounds %struct.global_State, ptr %248, i32 0, i32 32
  %250 = getelementptr inbounds [24 x ptr], ptr %249, i64 0, i64 5
  %251 = load ptr, ptr %250, align 8, !tbaa !5
  %252 = call ptr @luaT_gettm(ptr noundef %245, i32 noundef 5, ptr noundef %251)
  br label %253

253:                                              ; preds = %240, %239
  %254 = phi ptr [ null, %239 ], [ %252, %240 ]
  br label %255

255:                                              ; preds = %253, %227
  %256 = phi ptr [ null, %227 ], [ %254, %253 ]
  store ptr %256, ptr %8, align 8, !tbaa !5
  %257 = load ptr, ptr %8, align 8, !tbaa !5
  %258 = icmp eq ptr %257, null
  br i1 %258, label %259, label %296

259:                                              ; preds = %255
  %260 = load ptr, ptr %7, align 8, !tbaa !5
  %261 = getelementptr inbounds %struct.lua_TValue, ptr %260, i32 0, i32 0
  %262 = load ptr, ptr %261, align 8, !tbaa !14
  %263 = getelementptr inbounds %struct.Table, ptr %262, i32 0, i32 9
  %264 = load ptr, ptr %263, align 8, !tbaa !14
  %265 = icmp eq ptr %264, null
  br i1 %265, label %266, label %267

266:                                              ; preds = %259
  br label %294

267:                                              ; preds = %259
  %268 = load ptr, ptr %7, align 8, !tbaa !5
  %269 = getelementptr inbounds %struct.lua_TValue, ptr %268, i32 0, i32 0
  %270 = load ptr, ptr %269, align 8, !tbaa !14
  %271 = getelementptr inbounds %struct.Table, ptr %270, i32 0, i32 9
  %272 = load ptr, ptr %271, align 8, !tbaa !14
  %273 = getelementptr inbounds %struct.Table, ptr %272, i32 0, i32 3
  %274 = load i8, ptr %273, align 2, !tbaa !15
  %275 = zext i8 %274 to i32
  %276 = and i32 %275, 32
  %277 = icmp ne i32 %276, 0
  br i1 %277, label %278, label %279

278:                                              ; preds = %267
  br label %292

279:                                              ; preds = %267
  %280 = load ptr, ptr %7, align 8, !tbaa !5
  %281 = getelementptr inbounds %struct.lua_TValue, ptr %280, i32 0, i32 0
  %282 = load ptr, ptr %281, align 8, !tbaa !14
  %283 = getelementptr inbounds %struct.Table, ptr %282, i32 0, i32 9
  %284 = load ptr, ptr %283, align 8, !tbaa !14
  %285 = load ptr, ptr %5, align 8, !tbaa !5
  %286 = getelementptr inbounds %struct.lua_State, ptr %285, i32 0, i32 5
  %287 = load ptr, ptr %286, align 8, !tbaa !17
  %288 = getelementptr inbounds %struct.global_State, ptr %287, i32 0, i32 32
  %289 = getelementptr inbounds [24 x ptr], ptr %288, i64 0, i64 5
  %290 = load ptr, ptr %289, align 8, !tbaa !5
  %291 = call ptr @luaT_gettm(ptr noundef %284, i32 noundef 5, ptr noundef %290)
  br label %292

292:                                              ; preds = %279, %278
  %293 = phi ptr [ null, %278 ], [ %291, %279 ]
  br label %294

294:                                              ; preds = %292, %266
  %295 = phi ptr [ null, %266 ], [ %293, %292 ]
  store ptr %295, ptr %8, align 8, !tbaa !5
  br label %296

296:                                              ; preds = %294, %255
  br label %306

297:                                              ; preds = %47
  %298 = load ptr, ptr %6, align 8, !tbaa !5
  %299 = getelementptr inbounds %struct.lua_TValue, ptr %298, i32 0, i32 0
  %300 = load ptr, ptr %299, align 8, !tbaa !14
  %301 = load ptr, ptr %7, align 8, !tbaa !5
  %302 = getelementptr inbounds %struct.lua_TValue, ptr %301, i32 0, i32 0
  %303 = load ptr, ptr %302, align 8, !tbaa !14
  %304 = icmp eq ptr %300, %303
  %305 = zext i1 %304 to i32
  store i32 %305, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %344

306:                                              ; preds = %296, %205
  %307 = load ptr, ptr %8, align 8, !tbaa !5
  %308 = icmp eq ptr %307, null
  br i1 %308, label %309, label %310

309:                                              ; preds = %306
  store i32 0, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %344

310:                                              ; preds = %306
  %311 = load ptr, ptr %5, align 8, !tbaa !5
  %312 = load ptr, ptr %8, align 8, !tbaa !5
  %313 = load ptr, ptr %6, align 8, !tbaa !5
  %314 = load ptr, ptr %7, align 8, !tbaa !5
  %315 = load ptr, ptr %5, align 8, !tbaa !5
  %316 = getelementptr inbounds %struct.lua_State, ptr %315, i32 0, i32 4
  %317 = load ptr, ptr %316, align 8, !tbaa !22
  call void @luaT_callTM(ptr noundef %311, ptr noundef %312, ptr noundef %313, ptr noundef %314, ptr noundef %317, i32 noundef 1)
  %318 = load ptr, ptr %5, align 8, !tbaa !5
  %319 = getelementptr inbounds %struct.lua_State, ptr %318, i32 0, i32 4
  %320 = load ptr, ptr %319, align 8, !tbaa !22
  %321 = getelementptr inbounds %struct.lua_TValue, ptr %320, i32 0, i32 1
  %322 = load i32, ptr %321, align 8, !tbaa !9
  %323 = icmp eq i32 %322, 0
  br i1 %323, label %340, label %324

324:                                              ; preds = %310
  %325 = load ptr, ptr %5, align 8, !tbaa !5
  %326 = getelementptr inbounds %struct.lua_State, ptr %325, i32 0, i32 4
  %327 = load ptr, ptr %326, align 8, !tbaa !22
  %328 = getelementptr inbounds %struct.lua_TValue, ptr %327, i32 0, i32 1
  %329 = load i32, ptr %328, align 8, !tbaa !9
  %330 = icmp eq i32 %329, 1
  br i1 %330, label %331, label %338

331:                                              ; preds = %324
  %332 = load ptr, ptr %5, align 8, !tbaa !5
  %333 = getelementptr inbounds %struct.lua_State, ptr %332, i32 0, i32 4
  %334 = load ptr, ptr %333, align 8, !tbaa !22
  %335 = getelementptr inbounds %struct.lua_TValue, ptr %334, i32 0, i32 0
  %336 = load i32, ptr %335, align 8, !tbaa !14
  %337 = icmp eq i32 %336, 0
  br label %338

338:                                              ; preds = %331, %324
  %339 = phi i1 [ false, %324 ], [ %337, %331 ]
  br label %340

340:                                              ; preds = %338, %310
  %341 = phi i1 [ true, %310 ], [ %339, %338 ]
  %342 = xor i1 %341, true
  %343 = zext i1 %342 to i32
  store i32 %343, ptr %4, align 4
  store i32 1, ptr %9, align 4
  br label %344

344:                                              ; preds = %340, %309, %297, %218, %214, %127, %123, %107, %98, %89, %80, %71, %62, %53, %52, %38, %37
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #3
  %345 = load i32, ptr %4, align 4
  ret i32 %345
}

declare hidden i32 @luaS_eqlngstr(ptr noundef, ptr noundef) #1

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !6, i64 0}
!6 = !{!"any pointer", !7, i64 0}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!10, !11, i64 8}
!10 = !{!"lua_TValue", !7, i64 0, !11, i64 8}
!11 = !{!"int", !7, i64 0}
!12 = !{!13, !13, i64 0}
!13 = !{!"double", !7, i64 0}
!14 = !{!7, !7, i64 0}
!15 = !{!16, !7, i64 10}
!16 = !{!"Table", !6, i64 0, !7, i64 8, !7, i64 9, !7, i64 10, !7, i64 11, !11, i64 12, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48}
!17 = !{!18, !6, i64 24}
!18 = !{!"lua_State", !6, i64 0, !7, i64 8, !7, i64 9, !7, i64 10, !6, i64 16, !6, i64 24, !6, i64 32, !6, i64 40, !6, i64 48, !6, i64 56, !6, i64 64, !6, i64 72, !6, i64 80, !6, i64 88, !19, i64 96, !6, i64 168, !20, i64 176, !11, i64 184, !11, i64 188, !11, i64 192, !21, i64 196, !21, i64 198, !7, i64 200, !7, i64 201}
!19 = !{!"CallInfo", !6, i64 0, !6, i64 8, !6, i64 16, !6, i64 24, !7, i64 32, !20, i64 56, !21, i64 64, !7, i64 66}
!20 = !{!"long", !7, i64 0}
!21 = !{!"short", !7, i64 0}
!22 = !{!18, !6, i64 16}


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

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

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

declare hidden ptr @luaT_gettm(ptr noundef, i32 noundef, ptr noundef) local_unnamed_addr #1

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

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

; Function Attrs: nounwind uwtable
define hidden i32 @luaV_equalobj(ptr noundef %0, ptr noundef %1, ptr noundef %2) local_unnamed_addr #2 {
  %4 = alloca double, align 8
  %5 = alloca double, align 8
  %6 = getelementptr inbounds i8, ptr %1, i64 8
  %7 = load i32, ptr %6, align 8, !tbaa !5
  %8 = and i32 %7, 63
  %9 = getelementptr inbounds i8, ptr %2, i64 8
  %10 = load i32, ptr %9, align 8, !tbaa !5
  %11 = and i32 %10, 63
  %.not = icmp eq i32 %8, %11
  br i1 %.not, label %23, label %12

12:                                               ; preds = %3
  %13 = and i32 %7, 15
  %14 = and i32 %10, 15
  %.not75 = icmp eq i32 %13, 3
  %15 = icmp eq i32 %14, 3
  %or.cond = and i1 %.not75, %15
  br i1 %or.cond, label %16, label %.thread79

16:                                               ; preds = %12
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %4) #3
  call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %5) #3
  %17 = call i32 @tofloat(ptr noundef nonnull %1, ptr noundef nonnull %4)
  %18 = call i32 @tofloat(ptr noundef nonnull %2, ptr noundef nonnull %5)
  %19 = load double, ptr %4, align 8, !tbaa !10
  %20 = load double, ptr %5, align 8, !tbaa !10
  %21 = fcmp oeq double %19, %20
  %22 = zext i1 %21 to i32
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %5) #3
  call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %4) #3
  br label %.thread79

23:                                               ; preds = %3
  switch i32 %8, label %116 [
    i32 0, label %.thread79
    i32 19, label %24
    i32 3, label %29
    i32 1, label %34
    i32 2, label %39
    i32 22, label %44
    i32 4, label %49
    i32 20, label %54
    i32 7, label %58
    i32 5, label %87
  ]

24:                                               ; preds = %23
  %25 = load i64, ptr %1, align 8, !tbaa !12
  %26 = load i64, ptr %2, align 8, !tbaa !12
  %27 = icmp eq i64 %25, %26
  %28 = zext i1 %27 to i32
  br label %.thread79

29:                                               ; preds = %23
  %30 = load double, ptr %1, align 8, !tbaa !12
  %31 = load double, ptr %2, align 8, !tbaa !12
  %32 = fcmp oeq double %30, %31
  %33 = zext i1 %32 to i32
  br label %.thread79

34:                                               ; preds = %23
  %35 = load i32, ptr %1, align 8, !tbaa !12
  %36 = load i32, ptr %2, align 8, !tbaa !12
  %37 = icmp eq i32 %35, %36
  %38 = zext i1 %37 to i32
  br label %.thread79

39:                                               ; preds = %23
  %40 = load ptr, ptr %1, align 8, !tbaa !12
  %41 = load ptr, ptr %2, align 8, !tbaa !12
  %42 = icmp eq ptr %40, %41
  %43 = zext i1 %42 to i32
  br label %.thread79

44:                                               ; preds = %23
  %45 = load ptr, ptr %1, align 8, !tbaa !12
  %46 = load ptr, ptr %2, align 8, !tbaa !12
  %47 = icmp eq ptr %45, %46
  %48 = zext i1 %47 to i32
  br label %.thread79

49:                                               ; preds = %23
  %50 = load ptr, ptr %1, align 8, !tbaa !12
  %51 = load ptr, ptr %2, align 8, !tbaa !12
  %52 = icmp eq ptr %50, %51
  %53 = zext i1 %52 to i32
  br label %.thread79

54:                                               ; preds = %23
  %55 = load ptr, ptr %1, align 8, !tbaa !12
  %56 = load ptr, ptr %2, align 8, !tbaa !12
  %57 = tail call i32 @luaS_eqlngstr(ptr noundef %55, ptr noundef %56) #3
  br label %.thread79

58:                                               ; preds = %23
  %59 = load ptr, ptr %1, align 8, !tbaa !12
  %60 = load ptr, ptr %2, align 8, !tbaa !12
  %61 = icmp eq ptr %59, %60
  br i1 %61, label %.thread79, label %62

62:                                               ; preds = %58
  %63 = icmp eq ptr %0, null
  br i1 %63, label %.thread79, label %64

64:                                               ; preds = %62
  %65 = getelementptr inbounds i8, ptr %59, i64 16
  %66 = load ptr, ptr %65, align 8, !tbaa !12
  %67 = icmp eq ptr %66, null
  br i1 %67, label %.thread, label %68

68:                                               ; preds = %64
  %69 = getelementptr inbounds i8, ptr %66, i64 10
  %70 = load i8, ptr %69, align 2, !tbaa !13
  %71 = and i8 %70, 32
  %.not72 = icmp eq i8 %71, 0
  br i1 %.not72, label %72, label %.thread

72:                                               ; preds = %68
  %73 = getelementptr inbounds i8, ptr %0, i64 24
  %74 = load ptr, ptr %73, align 8, !tbaa !16
  %75 = getelementptr inbounds i8, ptr %74, i64 288
  %76 = load ptr, ptr %75, align 8, !tbaa !21
  %77 = tail call ptr @luaT_gettm(ptr noundef nonnull %66, i32 noundef 5, ptr noundef %76) #3
  %78 = icmp eq ptr %77, null
  br i1 %78, label %..thread_crit_edge, label %.thread82

..thread_crit_edge:                               ; preds = %72
  %.pre85 = load ptr, ptr %2, align 8, !tbaa !12
  br label %.thread

.thread:                                          ; preds = %..thread_crit_edge, %68, %64
  %79 = phi ptr [ %.pre85, %..thread_crit_edge ], [ %60, %68 ], [ %60, %64 ]
  %80 = getelementptr inbounds i8, ptr %79, i64 16
  %81 = load ptr, ptr %80, align 8, !tbaa !12
  %82 = icmp eq ptr %81, null
  br i1 %82, label %.thread79, label %83

83:                                               ; preds = %.thread
  %84 = getelementptr inbounds i8, ptr %81, i64 10
  %85 = load i8, ptr %84, align 2, !tbaa !13
  %86 = and i8 %85, 32
  %.not73 = icmp eq i8 %86, 0
  br i1 %.not73, label %121, label %.thread79

87:                                               ; preds = %23
  %88 = load ptr, ptr %1, align 8, !tbaa !12
  %89 = load ptr, ptr %2, align 8, !tbaa !12
  %90 = icmp eq ptr %88, %89
  br i1 %90, label %.thread79, label %91

91:                                               ; preds = %87
  %92 = icmp eq ptr %0, null
  br i1 %92, label %.thread79, label %93

93:                                               ; preds = %91
  %94 = getelementptr inbounds i8, ptr %88, i64 40
  %95 = load ptr, ptr %94, align 8, !tbaa !12
  %96 = icmp eq ptr %95, null
  br i1 %96, label %.thread77, label %97

97:                                               ; preds = %93
  %98 = getelementptr inbounds i8, ptr %95, i64 10
  %99 = load i8, ptr %98, align 2, !tbaa !13
  %100 = and i8 %99, 32
  %.not70 = icmp eq i8 %100, 0
  br i1 %.not70, label %101, label %.thread77

101:                                              ; preds = %97
  %102 = getelementptr inbounds i8, ptr %0, i64 24
  %103 = load ptr, ptr %102, align 8, !tbaa !16
  %104 = getelementptr inbounds i8, ptr %103, i64 288
  %105 = load ptr, ptr %104, align 8, !tbaa !21
  %106 = tail call ptr @luaT_gettm(ptr noundef nonnull %95, i32 noundef 5, ptr noundef %105) #3
  %107 = icmp eq ptr %106, null
  br i1 %107, label %..thread77_crit_edge, label %.thread82

..thread77_crit_edge:                             ; preds = %101
  %.pre = load ptr, ptr %2, align 8, !tbaa !12
  br label %.thread77

.thread77:                                        ; preds = %..thread77_crit_edge, %97, %93
  %108 = phi ptr [ %.pre, %..thread77_crit_edge ], [ %89, %97 ], [ %89, %93 ]
  %109 = getelementptr inbounds i8, ptr %108, i64 40
  %110 = load ptr, ptr %109, align 8, !tbaa !12
  %111 = icmp eq ptr %110, null
  br i1 %111, label %.thread79, label %112

112:                                              ; preds = %.thread77
  %113 = getelementptr inbounds i8, ptr %110, i64 10
  %114 = load i8, ptr %113, align 2, !tbaa !13
  %115 = and i8 %114, 32
  %.not71 = icmp eq i8 %115, 0
  br i1 %.not71, label %121, label %.thread79

116:                                              ; preds = %23
  %117 = load ptr, ptr %1, align 8, !tbaa !12
  %118 = load ptr, ptr %2, align 8, !tbaa !12
  %119 = icmp eq ptr %117, %118
  %120 = zext i1 %119 to i32
  br label %.thread79

121:                                              ; preds = %112, %83
  %.sink = phi ptr [ %81, %83 ], [ %110, %112 ]
  %122 = getelementptr inbounds i8, ptr %0, i64 24
  %123 = load ptr, ptr %122, align 8, !tbaa !16
  %124 = getelementptr inbounds i8, ptr %123, i64 288
  %125 = load ptr, ptr %124, align 8, !tbaa !21
  %126 = tail call ptr @luaT_gettm(ptr noundef nonnull %.sink, i32 noundef 5, ptr noundef %125) #3
  %127 = icmp eq ptr %126, null
  br i1 %127, label %.thread79, label %.thread82

.thread82:                                        ; preds = %72, %101, %121
  %.084 = phi ptr [ %126, %121 ], [ %77, %72 ], [ %106, %101 ]
  %128 = getelementptr inbounds i8, ptr %0, i64 16
  %129 = load ptr, ptr %128, align 8, !tbaa !22
  tail call void @luaT_callTM(ptr noundef nonnull %0, ptr noundef nonnull %.084, ptr noundef nonnull %1, ptr noundef nonnull %2, ptr noundef %129, i32 noundef 1) #3
  %130 = load ptr, ptr %128, align 8, !tbaa !22
  %131 = getelementptr inbounds i8, ptr %130, i64 8
  %132 = load i32, ptr %131, align 8, !tbaa !5
  switch i32 %132, label %.fold.split [
    i32 0, label %.thread79
    i32 1, label %133
  ]

133:                                              ; preds = %.thread82
  %134 = load i32, ptr %130, align 8, !tbaa !12
  %135 = icmp ne i32 %134, 0
  %136 = zext i1 %135 to i32
  br label %.thread79

.fold.split:                                      ; preds = %.thread82
  br label %.thread79

.thread79:                                        ; preds = %112, %.thread77, %83, %.thread, %133, %.fold.split, %.thread82, %121, %91, %87, %62, %58, %23, %12, %116, %54, %49, %44, %39, %34, %29, %24, %16
  %.057 = phi i32 [ %22, %16 ], [ %120, %116 ], [ %57, %54 ], [ %53, %49 ], [ %48, %44 ], [ %43, %39 ], [ %38, %34 ], [ %33, %29 ], [ %28, %24 ], [ 0, %12 ], [ 1, %23 ], [ 1, %58 ], [ 0, %62 ], [ 1, %87 ], [ 0, %91 ], [ 0, %121 ], [ %132, %.thread82 ], [ %136, %133 ], [ 1, %.fold.split ], [ 0, %.thread ], [ 0, %83 ], [ 0, %.thread77 ], [ 0, %112 ]
  ret i32 %.057
}

declare hidden i32 @luaS_eqlngstr(ptr noundef, ptr noundef) local_unnamed_addr #1

attributes #0 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) }
attributes #1 = { "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #2 = { 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 = { 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, !9, i64 8}
!6 = !{!"lua_TValue", !7, i64 0, !9, i64 8}
!7 = !{!"omnipotent char", !8, i64 0}
!8 = !{!"Simple C/C++ TBAA"}
!9 = !{!"int", !7, i64 0}
!10 = !{!11, !11, i64 0}
!11 = !{!"double", !7, i64 0}
!12 = !{!7, !7, i64 0}
!13 = !{!14, !7, i64 10}
!14 = !{!"Table", !15, i64 0, !7, i64 8, !7, i64 9, !7, i64 10, !7, i64 11, !9, i64 12, !15, i64 16, !15, i64 24, !15, i64 32, !15, i64 40, !15, i64 48}
!15 = !{!"any pointer", !7, i64 0}
!16 = !{!17, !15, i64 24}
!17 = !{!"lua_State", !15, i64 0, !7, i64 8, !7, i64 9, !7, i64 10, !15, i64 16, !15, i64 24, !15, i64 32, !15, i64 40, !15, i64 48, !15, i64 56, !15, i64 64, !15, i64 72, !15, i64 80, !15, i64 88, !18, i64 96, !15, i64 168, !19, i64 176, !9, i64 184, !9, i64 188, !9, i64 192, !20, i64 196, !20, i64 198, !7, i64 200, !7, i64 201}
!18 = !{!"CallInfo", !15, i64 0, !15, i64 8, !15, i64 16, !15, i64 24, !7, i64 32, !19, i64 56, !20, i64 64, !7, i64 66}
!19 = !{!"long", !7, i64 0}
!20 = !{!"short", !7, i64 0}
!21 = !{!15, !15, i64 0}
!22 = !{!17, !15, i64 16}


; Effective O3 passes: CorrelatedValuePropagationPass,EarlyCSEPass,GVNPass,GlobalOptPass,InferFunctionAttrsPass,InstCombinePass,JumpThreadingPass,SROAPass,SimplifyCFGPass,TailCallElimPass