; LLVM IR from ramsdell/lineqpp :: lua (lobject)

; 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_State = type { ptr, i8, i8, i8, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, ptr, i32, i32, i16, i16, i8, i8, i32, i32, ptr, %struct.lua_TValue, %struct.lua_TValue, ptr, ptr, ptr, i64 }
%struct.lua_TValue = type { %union.Value, i32 }
%union.Value = type { ptr }
%struct.__va_list_tag = type { i32, i32, ptr, ptr }
%union.TString = type { %struct.anon }
%struct.anon = type { ptr, i8, i8, i8, i32, i64 }

@.str = external hidden unnamed_addr constant [1 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [3 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [2 x i8], align 1

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

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

; Function Attrs: nounwind uwtable
define hidden ptr @luaO_pushvfstring(ptr noundef %0, ptr noundef %1, ptr noundef %2) #1 {
  %4 = alloca ptr, align 8
  %5 = alloca ptr, align 8
  %6 = alloca ptr, align 8
  %7 = alloca i32, align 4
  %8 = alloca ptr, align 8
  %9 = alloca i32, align 4
  %10 = alloca ptr, align 8
  %11 = alloca ptr, align 8
  %12 = alloca [2 x i8], align 1
  %13 = alloca ptr, align 8
  %14 = alloca ptr, align 8
  %15 = alloca [40 x i8], align 16
  %16 = alloca [3 x i8], align 1
  store ptr %0, ptr %4, align 8, !tbaa !5
  store ptr %1, ptr %5, align 8, !tbaa !5
  store ptr %2, ptr %6, align 8, !tbaa !5
  call void @llvm.lifetime.start.p0(i64 4, ptr %7) #5
  store i32 1, ptr %7, align 4, !tbaa !9
  %17 = load ptr, ptr %4, align 8, !tbaa !5
  call void @pushstr(ptr noundef %17, ptr noundef @.str)
  br label %18

18:                                               ; preds = %231, %3
  call void @llvm.lifetime.start.p0(i64 8, ptr %8) #5
  %19 = load ptr, ptr %5, align 8, !tbaa !5
  %20 = call ptr @strchr(ptr noundef %19, i32 noundef 37) #6
  store ptr %20, ptr %8, align 8, !tbaa !5
  %21 = load ptr, ptr %8, align 8, !tbaa !5
  %22 = icmp eq ptr %21, null
  br i1 %22, label %23, label %24

23:                                               ; preds = %18
  store i32 2, ptr %9, align 4
  br label %229

24:                                               ; preds = %18
  call void @llvm.lifetime.start.p0(i64 8, ptr %10) #5
  %25 = load ptr, ptr %4, align 8, !tbaa !5
  %26 = getelementptr inbounds %struct.lua_State, ptr %25, i32 0, i32 4
  %27 = load ptr, ptr %26, align 8, !tbaa !11
  store ptr %27, ptr %10, align 8, !tbaa !5
  %28 = load ptr, ptr %4, align 8, !tbaa !5
  %29 = load ptr, ptr %5, align 8, !tbaa !5
  %30 = load ptr, ptr %8, align 8, !tbaa !5
  %31 = load ptr, ptr %5, align 8, !tbaa !5
  %32 = ptrtoint ptr %30 to i64
  %33 = ptrtoint ptr %31 to i64
  %34 = sub i64 %32, %33
  %35 = call ptr @luaS_newlstr(ptr noundef %28, ptr noundef %29, i64 noundef %34)
  %36 = load ptr, ptr %10, align 8, !tbaa !5
  %37 = getelementptr inbounds %struct.lua_TValue, ptr %36, i32 0, i32 0
  store ptr %35, ptr %37, align 8, !tbaa !16
  %38 = load ptr, ptr %10, align 8, !tbaa !5
  %39 = getelementptr inbounds %struct.lua_TValue, ptr %38, i32 0, i32 1
  store i32 4, ptr %39, align 8, !tbaa !17
  call void @llvm.lifetime.end.p0(i64 8, ptr %10) #5
  %40 = load ptr, ptr %4, align 8, !tbaa !5
  %41 = getelementptr inbounds %struct.lua_State, ptr %40, i32 0, i32 9
  %42 = load ptr, ptr %41, align 8, !tbaa !18
  %43 = load ptr, ptr %4, align 8, !tbaa !5
  %44 = getelementptr inbounds %struct.lua_State, ptr %43, i32 0, i32 4
  %45 = load ptr, ptr %44, align 8, !tbaa !11
  %46 = ptrtoint ptr %42 to i64
  %47 = ptrtoint ptr %45 to i64
  %48 = sub i64 %46, %47
  %49 = icmp sle i64 %48, 16
  br i1 %49, label %50, label %52

50:                                               ; preds = %24
  %51 = load ptr, ptr %4, align 8, !tbaa !5
  call void @luaD_growstack(ptr noundef %51, i32 noundef 1)
  br label %53

52:                                               ; preds = %24
  br label %53

53:                                               ; preds = %52, %50
  %54 = load ptr, ptr %4, align 8, !tbaa !5
  %55 = getelementptr inbounds %struct.lua_State, ptr %54, i32 0, i32 4
  %56 = load ptr, ptr %55, align 8, !tbaa !11
  %57 = getelementptr inbounds %struct.lua_TValue, ptr %56, i32 1
  store ptr %57, ptr %55, align 8, !tbaa !11
  %58 = load ptr, ptr %8, align 8, !tbaa !5
  %59 = getelementptr inbounds i8, ptr %58, i64 1
  %60 = load i8, ptr %59, align 1, !tbaa !16
  %61 = sext i8 %60 to i32
  switch i32 %61, label %215 [
    i32 115, label %62
    i32 99, label %85
    i32 100, label %107
    i32 102, label %150
    i32 112, label %192
    i32 37, label %213
  ]

62:                                               ; preds = %53
  call void @llvm.lifetime.start.p0(i64 8, ptr %11) #5
  %63 = load ptr, ptr %6, align 8, !tbaa !5
  %64 = getelementptr inbounds %struct.__va_list_tag, ptr %63, i32 0, i32 0
  %65 = load i32, ptr %64, align 8
  %66 = icmp ule i32 %65, 40
  br i1 %66, label %67, label %72

67:                                               ; preds = %62
  %68 = getelementptr inbounds %struct.__va_list_tag, ptr %63, i32 0, i32 3
  %69 = load ptr, ptr %68, align 8
  %70 = getelementptr i8, ptr %69, i32 %65
  %71 = add i32 %65, 8
  store i32 %71, ptr %64, align 8
  br label %76

72:                                               ; preds = %62
  %73 = getelementptr inbounds %struct.__va_list_tag, ptr %63, i32 0, i32 2
  %74 = load ptr, ptr %73, align 8
  %75 = getelementptr i8, ptr %74, i32 8
  store ptr %75, ptr %73, align 8
  br label %76

76:                                               ; preds = %72, %67
  %77 = phi ptr [ %70, %67 ], [ %74, %72 ]
  %78 = load ptr, ptr %77, align 8, !tbaa !5
  store ptr %78, ptr %11, align 8, !tbaa !5
  %79 = load ptr, ptr %11, align 8, !tbaa !5
  %80 = icmp eq ptr %79, null
  br i1 %80, label %81, label %82

81:                                               ; preds = %76
  store ptr @.str.1, ptr %11, align 8, !tbaa !5
  br label %82

82:                                               ; preds = %81, %76
  %83 = load ptr, ptr %4, align 8, !tbaa !5
  %84 = load ptr, ptr %11, align 8, !tbaa !5
  call void @pushstr(ptr noundef %83, ptr noundef %84)
  store i32 4, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 8, ptr %11) #5
  br label %224

85:                                               ; preds = %53
  call void @llvm.lifetime.start.p0(i64 2, ptr %12) #5
  %86 = load ptr, ptr %6, align 8, !tbaa !5
  %87 = getelementptr inbounds %struct.__va_list_tag, ptr %86, i32 0, i32 0
  %88 = load i32, ptr %87, align 8
  %89 = icmp ule i32 %88, 40
  br i1 %89, label %90, label %95

90:                                               ; preds = %85
  %91 = getelementptr inbounds %struct.__va_list_tag, ptr %86, i32 0, i32 3
  %92 = load ptr, ptr %91, align 8
  %93 = getelementptr i8, ptr %92, i32 %88
  %94 = add i32 %88, 8
  store i32 %94, ptr %87, align 8
  br label %99

95:                                               ; preds = %85
  %96 = getelementptr inbounds %struct.__va_list_tag, ptr %86, i32 0, i32 2
  %97 = load ptr, ptr %96, align 8
  %98 = getelementptr i8, ptr %97, i32 8
  store ptr %98, ptr %96, align 8
  br label %99

99:                                               ; preds = %95, %90
  %100 = phi ptr [ %93, %90 ], [ %97, %95 ]
  %101 = load i32, ptr %100, align 4, !tbaa !9
  %102 = trunc i32 %101 to i8
  %103 = getelementptr inbounds [2 x i8], ptr %12, i64 0, i64 0
  store i8 %102, ptr %103, align 1, !tbaa !16
  %104 = getelementptr inbounds [2 x i8], ptr %12, i64 0, i64 1
  store i8 0, ptr %104, align 1, !tbaa !16
  %105 = load ptr, ptr %4, align 8, !tbaa !5
  %106 = getelementptr inbounds [2 x i8], ptr %12, i64 0, i64 0
  call void @pushstr(ptr noundef %105, ptr noundef %106)
  store i32 4, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 2, ptr %12) #5
  br label %224

107:                                              ; preds = %53
  call void @llvm.lifetime.start.p0(i64 8, ptr %13) #5
  %108 = load ptr, ptr %4, align 8, !tbaa !5
  %109 = getelementptr inbounds %struct.lua_State, ptr %108, i32 0, i32 4
  %110 = load ptr, ptr %109, align 8, !tbaa !11
  store ptr %110, ptr %13, align 8, !tbaa !5
  %111 = load ptr, ptr %6, align 8, !tbaa !5
  %112 = getelementptr inbounds %struct.__va_list_tag, ptr %111, i32 0, i32 0
  %113 = load i32, ptr %112, align 8
  %114 = icmp ule i32 %113, 40
  br i1 %114, label %115, label %120

115:                                              ; preds = %107
  %116 = getelementptr inbounds %struct.__va_list_tag, ptr %111, i32 0, i32 3
  %117 = load ptr, ptr %116, align 8
  %118 = getelementptr i8, ptr %117, i32 %113
  %119 = add i32 %113, 8
  store i32 %119, ptr %112, align 8
  br label %124

120:                                              ; preds = %107
  %121 = getelementptr inbounds %struct.__va_list_tag, ptr %111, i32 0, i32 2
  %122 = load ptr, ptr %121, align 8
  %123 = getelementptr i8, ptr %122, i32 8
  store ptr %123, ptr %121, align 8
  br label %124

124:                                              ; preds = %120, %115
  %125 = phi ptr [ %118, %115 ], [ %122, %120 ]
  %126 = load i32, ptr %125, align 4, !tbaa !9
  %127 = sitofp i32 %126 to double
  %128 = load ptr, ptr %13, align 8, !tbaa !5
  %129 = getelementptr inbounds %struct.lua_TValue, ptr %128, i32 0, i32 0
  store double %127, ptr %129, align 8, !tbaa !16
  %130 = load ptr, ptr %13, align 8, !tbaa !5
  %131 = getelementptr inbounds %struct.lua_TValue, ptr %130, i32 0, i32 1
  store i32 3, ptr %131, align 8, !tbaa !17
  call void @llvm.lifetime.end.p0(i64 8, ptr %13) #5
  %132 = load ptr, ptr %4, align 8, !tbaa !5
  %133 = getelementptr inbounds %struct.lua_State, ptr %132, i32 0, i32 9
  %134 = load ptr, ptr %133, align 8, !tbaa !18
  %135 = load ptr, ptr %4, align 8, !tbaa !5
  %136 = getelementptr inbounds %struct.lua_State, ptr %135, i32 0, i32 4
  %137 = load ptr, ptr %136, align 8, !tbaa !11
  %138 = ptrtoint ptr %134 to i64
  %139 = ptrtoint ptr %137 to i64
  %140 = sub i64 %138, %139
  %141 = icmp sle i64 %140, 16
  br i1 %141, label %142, label %144

142:                                              ; preds = %124
  %143 = load ptr, ptr %4, align 8, !tbaa !5
  call void @luaD_growstack(ptr noundef %143, i32 noundef 1)
  br label %145

144:                                              ; preds = %124
  br label %145

145:                                              ; preds = %144, %142
  %146 = load ptr, ptr %4, align 8, !tbaa !5
  %147 = getelementptr inbounds %struct.lua_State, ptr %146, i32 0, i32 4
  %148 = load ptr, ptr %147, align 8, !tbaa !11
  %149 = getelementptr inbounds %struct.lua_TValue, ptr %148, i32 1
  store ptr %149, ptr %147, align 8, !tbaa !11
  br label %224

150:                                              ; preds = %53
  call void @llvm.lifetime.start.p0(i64 8, ptr %14) #5
  %151 = load ptr, ptr %4, align 8, !tbaa !5
  %152 = getelementptr inbounds %struct.lua_State, ptr %151, i32 0, i32 4
  %153 = load ptr, ptr %152, align 8, !tbaa !11
  store ptr %153, ptr %14, align 8, !tbaa !5
  %154 = load ptr, ptr %6, align 8, !tbaa !5
  %155 = getelementptr inbounds %struct.__va_list_tag, ptr %154, i32 0, i32 1
  %156 = load i32, ptr %155, align 4
  %157 = icmp ule i32 %156, 160
  br i1 %157, label %158, label %163

158:                                              ; preds = %150
  %159 = getelementptr inbounds %struct.__va_list_tag, ptr %154, i32 0, i32 3
  %160 = load ptr, ptr %159, align 8
  %161 = getelementptr i8, ptr %160, i32 %156
  %162 = add i32 %156, 16
  store i32 %162, ptr %155, align 4
  br label %167

163:                                              ; preds = %150
  %164 = getelementptr inbounds %struct.__va_list_tag, ptr %154, i32 0, i32 2
  %165 = load ptr, ptr %164, align 8
  %166 = getelementptr i8, ptr %165, i32 8
  store ptr %166, ptr %164, align 8
  br label %167

167:                                              ; preds = %163, %158
  %168 = phi ptr [ %161, %158 ], [ %165, %163 ]
  %169 = load double, ptr %168, align 8, !tbaa !19
  %170 = load ptr, ptr %14, align 8, !tbaa !5
  %171 = getelementptr inbounds %struct.lua_TValue, ptr %170, i32 0, i32 0
  store double %169, ptr %171, align 8, !tbaa !16
  %172 = load ptr, ptr %14, align 8, !tbaa !5
  %173 = getelementptr inbounds %struct.lua_TValue, ptr %172, i32 0, i32 1
  store i32 3, ptr %173, align 8, !tbaa !17
  call void @llvm.lifetime.end.p0(i64 8, ptr %14) #5
  %174 = load ptr, ptr %4, align 8, !tbaa !5
  %175 = getelementptr inbounds %struct.lua_State, ptr %174, i32 0, i32 9
  %176 = load ptr, ptr %175, align 8, !tbaa !18
  %177 = load ptr, ptr %4, align 8, !tbaa !5
  %178 = getelementptr inbounds %struct.lua_State, ptr %177, i32 0, i32 4
  %179 = load ptr, ptr %178, align 8, !tbaa !11
  %180 = ptrtoint ptr %176 to i64
  %181 = ptrtoint ptr %179 to i64
  %182 = sub i64 %180, %181
  %183 = icmp sle i64 %182, 16
  br i1 %183, label %184, label %186

184:                                              ; preds = %167
  %185 = load ptr, ptr %4, align 8, !tbaa !5
  call void @luaD_growstack(ptr noundef %185, i32 noundef 1)
  br label %187

186:                                              ; preds = %167
  br label %187

187:                                              ; preds = %186, %184
  %188 = load ptr, ptr %4, align 8, !tbaa !5
  %189 = getelementptr inbounds %struct.lua_State, ptr %188, i32 0, i32 4
  %190 = load ptr, ptr %189, align 8, !tbaa !11
  %191 = getelementptr inbounds %struct.lua_TValue, ptr %190, i32 1
  store ptr %191, ptr %189, align 8, !tbaa !11
  br label %224

192:                                              ; preds = %53
  call void @llvm.lifetime.start.p0(i64 40, ptr %15) #5
  %193 = getelementptr inbounds [40 x i8], ptr %15, i64 0, i64 0
  %194 = load ptr, ptr %6, align 8, !tbaa !5
  %195 = getelementptr inbounds %struct.__va_list_tag, ptr %194, i32 0, i32 0
  %196 = load i32, ptr %195, align 8
  %197 = icmp ule i32 %196, 40
  br i1 %197, label %198, label %203

198:                                              ; preds = %192
  %199 = getelementptr inbounds %struct.__va_list_tag, ptr %194, i32 0, i32 3
  %200 = load ptr, ptr %199, align 8
  %201 = getelementptr i8, ptr %200, i32 %196
  %202 = add i32 %196, 8
  store i32 %202, ptr %195, align 8
  br label %207

203:                                              ; preds = %192
  %204 = getelementptr inbounds %struct.__va_list_tag, ptr %194, i32 0, i32 2
  %205 = load ptr, ptr %204, align 8
  %206 = getelementptr i8, ptr %205, i32 8
  store ptr %206, ptr %204, align 8
  br label %207

207:                                              ; preds = %203, %198
  %208 = phi ptr [ %201, %198 ], [ %205, %203 ]
  %209 = load ptr, ptr %208, align 8, !tbaa !5
  %210 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef %193, ptr noundef @.str.2, ptr noundef %209) #5
  %211 = load ptr, ptr %4, align 8, !tbaa !5
  %212 = getelementptr inbounds [40 x i8], ptr %15, i64 0, i64 0
  call void @pushstr(ptr noundef %211, ptr noundef %212)
  store i32 4, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 40, ptr %15) #5
  br label %224

213:                                              ; preds = %53
  %214 = load ptr, ptr %4, align 8, !tbaa !5
  call void @pushstr(ptr noundef %214, ptr noundef @.str.3)
  br label %224

215:                                              ; preds = %53
  call void @llvm.lifetime.start.p0(i64 3, ptr %16) #5
  %216 = getelementptr inbounds [3 x i8], ptr %16, i64 0, i64 0
  store i8 37, ptr %216, align 1, !tbaa !16
  %217 = load ptr, ptr %8, align 8, !tbaa !5
  %218 = getelementptr inbounds i8, ptr %217, i64 1
  %219 = load i8, ptr %218, align 1, !tbaa !16
  %220 = getelementptr inbounds [3 x i8], ptr %16, i64 0, i64 1
  store i8 %219, ptr %220, align 1, !tbaa !16
  %221 = getelementptr inbounds [3 x i8], ptr %16, i64 0, i64 2
  store i8 0, ptr %221, align 1, !tbaa !16
  %222 = load ptr, ptr %4, align 8, !tbaa !5
  %223 = getelementptr inbounds [3 x i8], ptr %16, i64 0, i64 0
  call void @pushstr(ptr noundef %222, ptr noundef %223)
  store i32 4, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 3, ptr %16) #5
  br label %224

224:                                              ; preds = %215, %213, %207, %187, %145, %99, %82
  %225 = load i32, ptr %7, align 4, !tbaa !9
  %226 = add nsw i32 %225, 2
  store i32 %226, ptr %7, align 4, !tbaa !9
  %227 = load ptr, ptr %8, align 8, !tbaa !5
  %228 = getelementptr inbounds i8, ptr %227, i64 2
  store ptr %228, ptr %5, align 8, !tbaa !5
  store i32 0, ptr %9, align 4
  br label %229

229:                                              ; preds = %224, %23
  call void @llvm.lifetime.end.p0(i64 8, ptr %8) #5
  %230 = load i32, ptr %9, align 4
  switch i32 %230, label %264 [
    i32 0, label %231
    i32 2, label %232
  ]

231:                                              ; preds = %229
  br label %18

232:                                              ; preds = %229
  %233 = load ptr, ptr %4, align 8, !tbaa !5
  %234 = load ptr, ptr %5, align 8, !tbaa !5
  call void @pushstr(ptr noundef %233, ptr noundef %234)
  %235 = load ptr, ptr %4, align 8, !tbaa !5
  %236 = load i32, ptr %7, align 4, !tbaa !9
  %237 = add nsw i32 %236, 1
  %238 = load ptr, ptr %4, align 8, !tbaa !5
  %239 = getelementptr inbounds %struct.lua_State, ptr %238, i32 0, i32 4
  %240 = load ptr, ptr %239, align 8, !tbaa !11
  %241 = load ptr, ptr %4, align 8, !tbaa !5
  %242 = getelementptr inbounds %struct.lua_State, ptr %241, i32 0, i32 5
  %243 = load ptr, ptr %242, align 8, !tbaa !21
  %244 = ptrtoint ptr %240 to i64
  %245 = ptrtoint ptr %243 to i64
  %246 = sub i64 %244, %245
  %247 = sdiv exact i64 %246, 16
  %248 = trunc i64 %247 to i32
  %249 = sub nsw i32 %248, 1
  call void @luaV_concat(ptr noundef %235, i32 noundef %237, i32 noundef %249)
  %250 = load i32, ptr %7, align 4, !tbaa !9
  %251 = load ptr, ptr %4, align 8, !tbaa !5
  %252 = getelementptr inbounds %struct.lua_State, ptr %251, i32 0, i32 4
  %253 = load ptr, ptr %252, align 8, !tbaa !11
  %254 = sext i32 %250 to i64
  %255 = sub i64 0, %254
  %256 = getelementptr inbounds %struct.lua_TValue, ptr %253, i64 %255
  store ptr %256, ptr %252, align 8, !tbaa !11
  %257 = load ptr, ptr %4, align 8, !tbaa !5
  %258 = getelementptr inbounds %struct.lua_State, ptr %257, i32 0, i32 4
  %259 = load ptr, ptr %258, align 8, !tbaa !11
  %260 = getelementptr inbounds %struct.lua_TValue, ptr %259, i64 -1
  %261 = getelementptr inbounds %struct.lua_TValue, ptr %260, i32 0, i32 0
  %262 = load ptr, ptr %261, align 8, !tbaa !16
  %263 = getelementptr inbounds %union.TString, ptr %262, i64 1
  store i32 1, ptr %9, align 4
  call void @llvm.lifetime.end.p0(i64 4, ptr %7) #5
  ret ptr %263

264:                                              ; preds = %229
  unreachable
}

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

; Function Attrs: nounwind willreturn memory(read)
declare ptr @strchr(ptr noundef, i32 noundef) #2

declare hidden ptr @luaS_newlstr(ptr noundef, ptr noundef, i64 noundef) #3

declare hidden void @luaD_growstack(ptr noundef, i32 noundef) #3

; Function Attrs: nounwind
declare i32 @sprintf(ptr noundef, ptr noundef, ...) #4

declare hidden void @luaV_concat(ptr noundef, i32 noundef, i32 noundef) #3

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

!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, !6, i64 16}
!12 = !{!"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, !10, i64 88, !10, i64 92, !13, i64 96, !13, i64 98, !7, i64 100, !7, i64 101, !10, i64 104, !10, i64 108, !6, i64 112, !14, i64 120, !14, i64 136, !6, i64 152, !6, i64 160, !6, i64 168, !15, i64 176}
!13 = !{!"short", !7, i64 0}
!14 = !{!"lua_TValue", !7, i64 0, !10, i64 8}
!15 = !{!"long", !7, i64 0}
!16 = !{!7, !7, i64 0}
!17 = !{!14, !10, i64 8}
!18 = !{!12, !6, i64 56}
!19 = !{!20, !20, i64 0}
!20 = !{!"double", !7, i64 0}
!21 = !{!12, !6, i64 24}


; 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.lua_TValue = type { %union.Value, i32 }
%union.Value = type { ptr }

@.str = external hidden unnamed_addr constant [1 x i8], align 1
@.str.1 = external hidden unnamed_addr constant [7 x i8], align 1
@.str.2 = external hidden unnamed_addr constant [3 x i8], align 1
@.str.3 = external hidden unnamed_addr constant [2 x i8], align 1

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

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

; Function Attrs: nounwind uwtable
define hidden nonnull ptr @luaO_pushvfstring(ptr noundef %0, ptr noundef %1, ptr nocapture noundef %2) local_unnamed_addr #1 {
  %4 = alloca [2 x i8], align 1
  %5 = alloca [40 x i8], align 16
  %6 = alloca [3 x i8], align 1
  tail call void @pushstr(ptr noundef %0, ptr noundef nonnull @.str)
  %7 = tail call ptr @strchr(ptr noundef nonnull dereferenceable(1) %1, i32 noundef 37) #5
  %8 = icmp eq ptr %7, null
  br i1 %8, label %._crit_edge, label %.lr.ph

.lr.ph:                                           ; preds = %3
  %9 = getelementptr inbounds i8, ptr %0, i64 16
  %10 = getelementptr inbounds i8, ptr %0, i64 56
  %11 = getelementptr inbounds i8, ptr %2, i64 8
  %12 = getelementptr inbounds i8, ptr %2, i64 16
  %13 = getelementptr inbounds i8, ptr %2, i64 4
  %14 = getelementptr inbounds i8, ptr %4, i64 1
  %15 = getelementptr inbounds i8, ptr %6, i64 1
  %16 = getelementptr inbounds i8, ptr %6, i64 2
  br label %17

17:                                               ; preds = %.lr.ph, %135
  %18 = phi ptr [ %7, %.lr.ph ], [ %138, %135 ]
  %.069 = phi ptr [ %1, %.lr.ph ], [ %137, %135 ]
  %.05368 = phi i32 [ 1, %.lr.ph ], [ %136, %135 ]
  %19 = load ptr, ptr %9, align 8, !tbaa !5
  %20 = ptrtoint ptr %18 to i64
  %21 = ptrtoint ptr %.069 to i64
  %22 = sub i64 %20, %21
  %23 = call ptr @luaS_newlstr(ptr noundef %0, ptr noundef %.069, i64 noundef %22) #6
  store ptr %23, ptr %19, align 8, !tbaa !14
  %24 = getelementptr inbounds i8, ptr %19, i64 8
  store i32 4, ptr %24, align 8, !tbaa !15
  %25 = load ptr, ptr %10, align 8, !tbaa !16
  %26 = load ptr, ptr %9, align 8, !tbaa !5
  %27 = ptrtoint ptr %25 to i64
  %28 = ptrtoint ptr %26 to i64
  %29 = sub i64 %27, %28
  %30 = icmp slt i64 %29, 17
  br i1 %30, label %31, label %32

31:                                               ; preds = %17
  call void @luaD_growstack(ptr noundef nonnull %0, i32 noundef 1) #6
  %.pre = load ptr, ptr %9, align 8, !tbaa !5
  br label %32

32:                                               ; preds = %17, %31
  %33 = phi ptr [ %26, %17 ], [ %.pre, %31 ]
  %34 = getelementptr inbounds i8, ptr %33, i64 16
  store ptr %34, ptr %9, align 8, !tbaa !5
  %35 = getelementptr inbounds i8, ptr %18, i64 1
  %36 = load i8, ptr %35, align 1, !tbaa !14
  switch i8 %36, label %134 [
    i8 115, label %37
    i8 99, label %52
    i8 100, label %67
    i8 102, label %93
    i8 112, label %118
    i8 37, label %133
  ]

37:                                               ; preds = %32
  %38 = load i32, ptr %2, align 8
  %39 = icmp ult i32 %38, 41
  br i1 %39, label %40, label %45

40:                                               ; preds = %37
  %41 = load ptr, ptr %12, align 8
  %42 = zext nneg i32 %38 to i64
  %43 = getelementptr i8, ptr %41, i64 %42
  %44 = add nuw nsw i32 %38, 8
  store i32 %44, ptr %2, align 8
  br label %48

45:                                               ; preds = %37
  %46 = load ptr, ptr %11, align 8
  %47 = getelementptr i8, ptr %46, i64 8
  store ptr %47, ptr %11, align 8
  br label %48

48:                                               ; preds = %45, %40
  %49 = phi ptr [ %43, %40 ], [ %46, %45 ]
  %50 = load ptr, ptr %49, align 8, !tbaa !17
  %51 = icmp eq ptr %50, null
  %spec.store.select = select i1 %51, ptr @.str.1, ptr %50
  call void @pushstr(ptr noundef nonnull %0, ptr noundef nonnull %spec.store.select)
  br label %135

52:                                               ; preds = %32
  call void @llvm.lifetime.start.p0(i64 2, ptr nonnull %4) #6
  %53 = load i32, ptr %2, align 8
  %54 = icmp ult i32 %53, 41
  br i1 %54, label %55, label %60

55:                                               ; preds = %52
  %56 = load ptr, ptr %12, align 8
  %57 = zext nneg i32 %53 to i64
  %58 = getelementptr i8, ptr %56, i64 %57
  %59 = add nuw nsw i32 %53, 8
  store i32 %59, ptr %2, align 8
  br label %63

60:                                               ; preds = %52
  %61 = load ptr, ptr %11, align 8
  %62 = getelementptr i8, ptr %61, i64 8
  store ptr %62, ptr %11, align 8
  br label %63

63:                                               ; preds = %60, %55
  %64 = phi ptr [ %58, %55 ], [ %61, %60 ]
  %65 = load i32, ptr %64, align 4, !tbaa !18
  %66 = trunc i32 %65 to i8
  store i8 %66, ptr %4, align 1, !tbaa !14
  store i8 0, ptr %14, align 1, !tbaa !14
  call void @pushstr(ptr noundef nonnull %0, ptr noundef nonnull %4)
  call void @llvm.lifetime.end.p0(i64 2, ptr nonnull %4) #6
  br label %135

67:                                               ; preds = %32
  %68 = load i32, ptr %2, align 8
  %69 = icmp ult i32 %68, 41
  br i1 %69, label %70, label %75

70:                                               ; preds = %67
  %71 = load ptr, ptr %12, align 8
  %72 = zext nneg i32 %68 to i64
  %73 = getelementptr i8, ptr %71, i64 %72
  %74 = add nuw nsw i32 %68, 8
  store i32 %74, ptr %2, align 8
  br label %78

75:                                               ; preds = %67
  %76 = load ptr, ptr %11, align 8
  %77 = getelementptr i8, ptr %76, i64 8
  store ptr %77, ptr %11, align 8
  br label %78

78:                                               ; preds = %75, %70
  %79 = phi ptr [ %73, %70 ], [ %76, %75 ]
  %80 = load i32, ptr %79, align 4, !tbaa !18
  %81 = sitofp i32 %80 to double
  store double %81, ptr %34, align 8, !tbaa !14
  %82 = getelementptr inbounds i8, ptr %33, i64 24
  store i32 3, ptr %82, align 8, !tbaa !15
  %83 = load ptr, ptr %10, align 8, !tbaa !16
  %84 = load ptr, ptr %9, align 8, !tbaa !5
  %85 = ptrtoint ptr %83 to i64
  %86 = ptrtoint ptr %84 to i64
  %87 = sub i64 %85, %86
  %88 = icmp slt i64 %87, 17
  br i1 %88, label %89, label %90

89:                                               ; preds = %78
  call void @luaD_growstack(ptr noundef nonnull %0, i32 noundef 1) #6
  %.pre73 = load ptr, ptr %9, align 8, !tbaa !5
  br label %90

90:                                               ; preds = %78, %89
  %91 = phi ptr [ %84, %78 ], [ %.pre73, %89 ]
  %92 = getelementptr inbounds i8, ptr %91, i64 16
  store ptr %92, ptr %9, align 8, !tbaa !5
  br label %135

93:                                               ; preds = %32
  %94 = load i32, ptr %13, align 4
  %95 = icmp ult i32 %94, 161
  br i1 %95, label %96, label %101

96:                                               ; preds = %93
  %97 = load ptr, ptr %12, align 8
  %98 = zext nneg i32 %94 to i64
  %99 = getelementptr i8, ptr %97, i64 %98
  %100 = add nuw nsw i32 %94, 16
  store i32 %100, ptr %13, align 4
  br label %104

101:                                              ; preds = %93
  %102 = load ptr, ptr %11, align 8
  %103 = getelementptr i8, ptr %102, i64 8
  store ptr %103, ptr %11, align 8
  br label %104

104:                                              ; preds = %101, %96
  %105 = phi ptr [ %99, %96 ], [ %102, %101 ]
  %106 = load double, ptr %105, align 8, !tbaa !19
  store double %106, ptr %34, align 8, !tbaa !14
  %107 = getelementptr inbounds i8, ptr %33, i64 24
  store i32 3, ptr %107, align 8, !tbaa !15
  %108 = load ptr, ptr %10, align 8, !tbaa !16
  %109 = load ptr, ptr %9, align 8, !tbaa !5
  %110 = ptrtoint ptr %108 to i64
  %111 = ptrtoint ptr %109 to i64
  %112 = sub i64 %110, %111
  %113 = icmp slt i64 %112, 17
  br i1 %113, label %114, label %115

114:                                              ; preds = %104
  call void @luaD_growstack(ptr noundef nonnull %0, i32 noundef 1) #6
  %.pre72 = load ptr, ptr %9, align 8, !tbaa !5
  br label %115

115:                                              ; preds = %104, %114
  %116 = phi ptr [ %109, %104 ], [ %.pre72, %114 ]
  %117 = getelementptr inbounds i8, ptr %116, i64 16
  store ptr %117, ptr %9, align 8, !tbaa !5
  br label %135

118:                                              ; preds = %32
  call void @llvm.lifetime.start.p0(i64 40, ptr nonnull %5) #6
  %119 = load i32, ptr %2, align 8
  %120 = icmp ult i32 %119, 41
  br i1 %120, label %121, label %126

121:                                              ; preds = %118
  %122 = load ptr, ptr %12, align 8
  %123 = zext nneg i32 %119 to i64
  %124 = getelementptr i8, ptr %122, i64 %123
  %125 = add nuw nsw i32 %119, 8
  store i32 %125, ptr %2, align 8
  br label %129

126:                                              ; preds = %118
  %127 = load ptr, ptr %11, align 8
  %128 = getelementptr i8, ptr %127, i64 8
  store ptr %128, ptr %11, align 8
  br label %129

129:                                              ; preds = %126, %121
  %130 = phi ptr [ %124, %121 ], [ %127, %126 ]
  %131 = load ptr, ptr %130, align 8, !tbaa !17
  %132 = call i32 (ptr, ptr, ...) @sprintf(ptr noundef nonnull dereferenceable(1) %5, ptr noundef nonnull dereferenceable(1) @.str.2, ptr noundef %131) #6
  call void @pushstr(ptr noundef nonnull %0, ptr noundef nonnull %5)
  call void @llvm.lifetime.end.p0(i64 40, ptr nonnull %5) #6
  br label %135

133:                                              ; preds = %32
  call void @pushstr(ptr noundef nonnull %0, ptr noundef nonnull @.str.3)
  br label %135

134:                                              ; preds = %32
  call void @llvm.lifetime.start.p0(i64 3, ptr nonnull %6) #6
  store i8 37, ptr %6, align 1, !tbaa !14
  store i8 %36, ptr %15, align 1, !tbaa !14
  store i8 0, ptr %16, align 1, !tbaa !14
  call void @pushstr(ptr noundef nonnull %0, ptr noundef nonnull %6)
  call void @llvm.lifetime.end.p0(i64 3, ptr nonnull %6) #6
  br label %135

135:                                              ; preds = %48, %63, %90, %115, %129, %133, %134
  %136 = add nuw nsw i32 %.05368, 2
  %137 = getelementptr inbounds i8, ptr %18, i64 2
  %138 = call ptr @strchr(ptr noundef nonnull dereferenceable(1) %137, i32 noundef 37) #5
  %139 = icmp eq ptr %138, null
  br i1 %139, label %._crit_edge, label %17

._crit_edge:                                      ; preds = %135, %3
  %.053.lcssa = phi i32 [ 1, %3 ], [ %136, %135 ]
  %.0.lcssa = phi ptr [ %1, %3 ], [ %137, %135 ]
  call void @pushstr(ptr noundef %0, ptr noundef %.0.lcssa)
  %140 = add nuw nsw i32 %.053.lcssa, 1
  %141 = getelementptr inbounds i8, ptr %0, i64 16
  %142 = load ptr, ptr %141, align 8, !tbaa !5
  %143 = getelementptr inbounds i8, ptr %0, i64 24
  %144 = load ptr, ptr %143, align 8, !tbaa !21
  %145 = ptrtoint ptr %142 to i64
  %146 = ptrtoint ptr %144 to i64
  %147 = sub i64 %145, %146
  %148 = lshr exact i64 %147, 4
  %149 = trunc i64 %148 to i32
  %150 = add nsw i32 %149, -1
  call void @luaV_concat(ptr noundef %0, i32 noundef %140, i32 noundef %150) #6
  %151 = load ptr, ptr %141, align 8, !tbaa !5
  %152 = zext nneg i32 %.053.lcssa to i64
  %153 = sub nsw i64 0, %152
  %154 = getelementptr inbounds %struct.lua_TValue, ptr %151, i64 %153
  store ptr %154, ptr %141, align 8, !tbaa !5
  %155 = getelementptr inbounds i8, ptr %154, i64 -16
  %156 = load ptr, ptr %155, align 8, !tbaa !14
  %157 = getelementptr inbounds i8, ptr %156, i64 24
  ret ptr %157
}

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

; Function Attrs: mustprogress nofree nounwind willreturn memory(argmem: read)
declare ptr @strchr(ptr noundef, i32 noundef) local_unnamed_addr #2

declare hidden ptr @luaS_newlstr(ptr noundef, ptr noundef, i64 noundef) local_unnamed_addr #3

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

; Function Attrs: nofree nounwind
declare noundef i32 @sprintf(ptr noalias nocapture noundef writeonly, ptr nocapture noundef readonly, ...) local_unnamed_addr #4

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

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

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

!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 8, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{i32 7, !"uwtable", i32 2}
!4 = !{!"clang version 19.1.0 (git@github.com:llvm/llvm-project.git a4bf6cd7cfb1a1421ba92bca9d017b49936c55e4)"}
!5 = !{!6, !7, i64 16}
!6 = !{!"lua_State", !7, i64 0, !8, i64 8, !8, i64 9, !8, i64 10, !7, i64 16, !7, i64 24, !7, i64 32, !7, i64 40, !7, i64 48, !7, i64 56, !7, i64 64, !7, i64 72, !7, i64 80, !10, i64 88, !10, i64 92, !11, i64 96, !11, i64 98, !8, i64 100, !8, i64 101, !10, i64 104, !10, i64 108, !7, i64 112, !12, i64 120, !12, i64 136, !7, i64 152, !7, i64 160, !7, i64 168, !13, i64 176}
!7 = !{!"any pointer", !8, i64 0}
!8 = !{!"omnipotent char", !9, i64 0}
!9 = !{!"Simple C/C++ TBAA"}
!10 = !{!"int", !8, i64 0}
!11 = !{!"short", !8, i64 0}
!12 = !{!"lua_TValue", !8, i64 0, !10, i64 8}
!13 = !{!"long", !8, i64 0}
!14 = !{!8, !8, i64 0}
!15 = !{!12, !10, i64 8}
!16 = !{!6, !7, i64 56}
!17 = !{!7, !7, i64 0}
!18 = !{!10, !10, i64 0}
!19 = !{!20, !20, i64 0}
!20 = !{!"double", !8, i64 0}
!21 = !{!6, !7, i64 24}


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