move alloca to entry block

Dibyendu Majumdar 9 years ago
parent 6edfc4bfa0
commit 2279fb7656

@ -484,4 +484,6 @@ private:
};
}
#define RAVI_CODEGEN_FORPREP2 1
#endif

@ -0,0 +1,315 @@
; ModuleID = 'ravi_module_ravif1'
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc-elf"
%0 = type { %ravi.TValue*, i32*, i64 }
%ravi.lua_State = type { %ravi.GCObject*, i8, i8, i8, %ravi.TValue*, %ravi.global_State*, %ravi.CallInfo*, i32*, %ravi.TValue*, %ravi.TValue*, %ravi.UpVal*, %ravi.GCObject*, %ravi.lua_State*, %ravi.lua_longjmp*, %ravi.CallInfo, i8* (%ravi.lua_State*, %ravi.lua_Debug*)*, i64, i32, i32, i32, i16, i16, i8, i8 }
%ravi.global_State = type opaque
%ravi.TValue = type { %ravi.Value, i32 }
%ravi.Value = type { double }
%ravi.UpVal = type opaque
%ravi.GCObject = type { %ravi.GCObject*, i8, i8 }
%ravi.lua_longjmp = type opaque
%ravi.CallInfo = type { %ravi.TValue*, %ravi.TValue*, %ravi.CallInfo*, %ravi.CallInfo*, %0, i64, i16, i8 }
%ravi.lua_Debug = type opaque
%ravi.LClosure = type { %ravi.GCObject*, i8, i8, i8, %ravi.GCObject*, %ravi.Proto*, [1 x %ravi.UpVal*] }
%ravi.Proto = type { %ravi.GCObject*, i8, i8, i8, i8, i8, i32, i32, i32, i32, i32, i32, i32, i32, %ravi.TValue*, i32*, %ravi.Proto**, i32*, %ravi.LocVar*, %ravi.Upvaldesc*, %ravi.LClosure*, %ravi.TString*, %ravi.GCObject*, %ravi.RaviJITProto* }
%ravi.LocVar = type { %ravi.TString*, i32, i32, i32 }
%ravi.Upvaldesc = type { %ravi.TString*, i8, i8 }
%ravi.TString = type { %ravi.GCObject*, i8, i8, i8, i32, i64, %ravi.TString* }
%ravi.RaviJITProto = type opaque
@0 = private unnamed_addr constant [29 x i8] c"'for' limit must be a number\00"
@1 = private unnamed_addr constant [28 x i8] c"'for' step must be a number\00"
@2 = private unnamed_addr constant [37 x i8] c"'for' initial value must be a number\00"
define i32 @ravif1(%ravi.lua_State* %L) {
entry:
%stopnow = alloca i32
%ilimit = alloca i64
%nlimit = alloca double
%ninit = alloca double
%nstep = alloca double
%L_ci = getelementptr inbounds %ravi.lua_State* %L, i32 0, i32 6
%0 = load %ravi.CallInfo** %L_ci, !tbaa !0
%base = getelementptr inbounds %ravi.CallInfo* %0, i32 0, i32 4, i32 0
%1 = bitcast %ravi.CallInfo* %0 to %ravi.LClosure***
%2 = load %ravi.LClosure*** %1, !tbaa !7
%3 = load %ravi.LClosure** %2, !tbaa !8
%Proto = getelementptr inbounds %ravi.LClosure* %3, i32 0, i32 5
%4 = load %ravi.Proto** %Proto, !tbaa !9
%k = getelementptr inbounds %ravi.Proto* %4, i32 0, i32 14
%5 = load %ravi.TValue** %k, !tbaa !11
%6 = load %ravi.TValue** %base, !tbaa !14
%srcvalue = getelementptr inbounds %ravi.TValue* %5, i32 0, i32 0, i32 0
%destvalue = getelementptr inbounds %ravi.TValue* %6, i32 0, i32 0, i32 0
%7 = load double* %srcvalue, !tbaa !15
store double %7, double* %destvalue, !tbaa !15
%srctype = getelementptr inbounds %ravi.TValue* %5, i32 0, i32 1
%desttype = getelementptr inbounds %ravi.TValue* %6, i32 0, i32 1
%8 = load i32* %srctype, !tbaa !17
store i32 %8, i32* %desttype, !tbaa !17
%srcvalue1 = getelementptr inbounds %ravi.TValue* %5, i32 1, i32 0, i32 0
%destvalue2 = getelementptr inbounds %ravi.TValue* %6, i32 1, i32 0, i32 0
%9 = load double* %srcvalue1, !tbaa !15
store double %9, double* %destvalue2, !tbaa !15
%srctype3 = getelementptr inbounds %ravi.TValue* %5, i32 1, i32 1
%desttype4 = getelementptr inbounds %ravi.TValue* %6, i32 1, i32 1
%10 = load i32* %srctype3, !tbaa !17
store i32 %10, i32* %desttype4, !tbaa !17
%srcvalue5 = getelementptr inbounds %ravi.TValue* %5, i32 2, i32 0, i32 0
%destvalue6 = getelementptr inbounds %ravi.TValue* %6, i32 2, i32 0, i32 0
%11 = load double* %srcvalue5, !tbaa !15
store double %11, double* %destvalue6, !tbaa !15
%srctype7 = getelementptr inbounds %ravi.TValue* %5, i32 2, i32 1
%desttype8 = getelementptr inbounds %ravi.TValue* %6, i32 2, i32 1
%12 = load i32* %srctype7, !tbaa !17
store i32 %12, i32* %desttype8, !tbaa !17
%srcvalue9 = getelementptr inbounds %ravi.TValue* %5, i32 3, i32 0, i32 0
%destvalue10 = getelementptr inbounds %ravi.TValue* %6, i32 3, i32 0, i32 0
%13 = load double* %srcvalue9, !tbaa !15
store double %13, double* %destvalue10, !tbaa !15
%srctype11 = getelementptr inbounds %ravi.TValue* %5, i32 3, i32 1
%desttype12 = getelementptr inbounds %ravi.TValue* %6, i32 3, i32 1
%14 = load i32* %srctype11, !tbaa !17
store i32 %14, i32* %desttype12, !tbaa !17
%15 = getelementptr inbounds %ravi.TValue* %6, i32 1
%16 = getelementptr inbounds %ravi.TValue* %6, i32 2
%17 = getelementptr inbounds %ravi.TValue* %6, i32 3
%init.tt = load i32* %desttype4, !tbaa !17
%init.is.integer = icmp eq i32 %init.tt, 19
%step.is.integer = icmp eq i32 %14, 19
%step.i.ptr = bitcast %ravi.TValue* %17 to i64*
%step.i = load i64* %step.i.ptr, !tbaa !15
%18 = call i32 @luaV_forlimit(%ravi.TValue* %16, i64* %ilimit, i64 %step.i, i32* %stopnow)
%init.and.step.are.integers = and i1 %init.is.integer, %step.is.integer
%19 = icmp ne i32 %18, 0
%all.integers = and i1 %init.and.step.are.integers, %19
br i1 %all.integers, label %if.all.integers, label %if.not.all.integers
if.all.integers: ; preds = %entry
%stopnow.value = load i32* %stopnow, !tbaa !13
%stopnow.is.zero = icmp eq i32 %stopnow.value, 0
br i1 %stopnow.is.zero, label %if.stopnow.iszero, label %if.stopnow.notzero
if.stopnow.iszero: ; preds = %if.all.integers
%init.i.ptr = bitcast %ravi.TValue* %15 to i64*
%init.i = load i64* %init.i.ptr, !tbaa !15
br label %if.stopnow.notzero
if.stopnow.notzero: ; preds = %if.stopnow.iszero, %if.all.integers
%initv = phi i64 [ %init.i, %if.stopnow.iszero ], [ 0, %if.all.integers ]
%initv-pstep.i = sub nsw i64 %initv, %step.i
%step.gt.zero = icmp sgt i64 %step.i, 0
%. = select i1 %step.gt.zero, i8* blockaddress(@ravif1, %forloop_ilt7_), i8* blockaddress(@ravif1, %forloop_igt7_)
br i1 %step.gt.zero, label %forloop_ilt7_, label %forloop_igt7_
if.not.all.integers: ; preds = %entry
%limit.tt = load i32* %desttype8, !tbaa !17
%limit.is.float = icmp eq i32 %limit.tt, 3
br i1 %limit.is.float, label %if.limit.isfloat, label %if.limit.notfloat
if.limit.isfloat: ; preds = %if.not.all.integers
%limit.n.ptr = getelementptr inbounds %ravi.TValue* %16, i32 0, i32 0, i32 0
%limit.n = load double* %limit.n.ptr, !tbaa !15
store volatile double %limit.n, double* %nlimit, !tbaa !5
br label %if.else.step
if.limit.notfloat: ; preds = %if.not.all.integers
%20 = call i32 @luaV_tonumber_(%ravi.TValue* %16, double* %nlimit)
%limit.float.ok = icmp eq i32 %20, 0
br i1 %limit.float.ok, label %if.limit.float.failed, label %if.else.step
if.limit.float.failed: ; preds = %if.limit.notfloat
call void @luaG_runerror(%ravi.lua_State* %L, i8* getelementptr inbounds ([29 x i8]* @0, i32 0, i32 0))
br label %if.else.step
if.else.step: ; preds = %if.limit.float.failed, %if.limit.notfloat, %if.limit.isfloat
%step.tt14 = load i32* %desttype12, !tbaa !17
%step.is.float = icmp eq i32 %step.tt14, 3
br i1 %step.is.float, label %if.step.isfloat, label %if.step.notfloat
if.step.isfloat: ; preds = %if.else.step
%step.n.ptr = getelementptr inbounds %ravi.TValue* %17, i32 0, i32 0, i32 0
%step.n = load double* %step.n.ptr, !tbaa !15
store volatile double %step.n, double* %nstep, !tbaa !5
br label %if.else.init
if.step.notfloat: ; preds = %if.else.step
%21 = call i32 @luaV_tonumber_(%ravi.TValue* %17, double* %nstep)
%step.float.ok = icmp eq i32 %21, 0
br i1 %step.float.ok, label %if.step.float.failed, label %if.else.init
if.step.float.failed: ; preds = %if.step.notfloat
call void @luaG_runerror(%ravi.lua_State* %L, i8* getelementptr inbounds ([28 x i8]* @1, i32 0, i32 0))
br label %if.else.init
if.else.init: ; preds = %if.step.float.failed, %if.step.notfloat, %if.step.isfloat
%init.tt15 = load i32* %desttype4, !tbaa !17
%init.is.float = icmp eq i32 %init.tt15, 3
br i1 %init.is.float, label %if.init.is.float, label %if.init.not.float
if.init.is.float: ; preds = %if.else.init
%init.n.ptr = getelementptr inbounds %ravi.TValue* %15, i32 0, i32 0, i32 0
%init.n = load double* %init.n.ptr, !tbaa !15
store double %init.n, double* %ninit, !tbaa !5
br label %if.else.done
if.init.not.float: ; preds = %if.else.init
%22 = call i32 @luaV_tonumber_(%ravi.TValue* %15, double* %ninit)
%init.float.ok = icmp eq i32 %22, 0
br i1 %init.float.ok, label %if.init.float.failed, label %if.else.done
if.init.float.failed: ; preds = %if.init.not.float
call void @luaG_runerror(%ravi.lua_State* %L, i8* getelementptr inbounds ([37 x i8]* @2, i32 0, i32 0))
br label %if.else.done
if.else.done: ; preds = %if.init.float.failed, %if.init.not.float, %if.init.is.float
%ninit16 = load double* %ninit, !tbaa !5
%nstep17 = load double* %nstep, !tbaa !5
%ninit-nstep = fsub double %ninit16, %nstep17
store volatile double %ninit-nstep, double* %ninit, !tbaa !5
%step.gt.zero18 = fcmp ogt double %nstep17, 0.000000e+00
%.53 = select i1 %step.gt.zero18, i8* blockaddress(@ravif1, %forloop_flt7_), i8* blockaddress(@ravif1, %forloop_fgt7_)
br i1 %step.gt.zero18, label %forloop_flt7_, label %forloop_fgt7_
forbody6_: ; preds = %updatef, %updatei
%23 = phi i32 [ 19, %updatei ], [ 3, %updatef ]
%24 = phi double [ %.pre, %updatei ], [ %init.n40, %updatef ]
%25 = phi %ravi.TValue* [ %26, %updatei ], [ %28, %updatef ]
%iidx.0 = phi i64 [ %iidx.3, %updatei ], [ %iidx.6, %updatef ]
%brnch.2 = phi i8* [ %brnch.5, %updatei ], [ %brnch.8, %updatef ]
%istep.0 = phi i64 [ %istep.3, %updatei ], [ %istep.6, %updatef ]
%dest.value = getelementptr inbounds %ravi.TValue* %25, i32 0, i32 0, i32 0
store double %24, double* %dest.value, !tbaa !15
%dest.tt = getelementptr inbounds %ravi.TValue* %25, i32 0, i32 1
store i32 %23, i32* %dest.tt, !tbaa !17
indirectbr i8* %brnch.2, [label %forloop_ilt7_, label %forloop_igt7_, label %forloop_flt7_, label %forloop_fgt7_]
forloop_ilt7_: ; preds = %forbody6_, %if.stopnow.notzero
%iidx.1 = phi i64 [ %initv-pstep.i, %if.stopnow.notzero ], [ %iidx.0, %forbody6_ ]
%brnch.3 = phi i8* [ %., %if.stopnow.notzero ], [ %brnch.2, %forbody6_ ]
%istep.1 = phi i64 [ %step.i, %if.stopnow.notzero ], [ %istep.0, %forbody6_ ]
%next.idx = add nsw i64 %istep.1, %iidx.1
%limit.i = load i64* %ilimit, !tbaa !5
%idx.gt.limit = icmp sgt i64 %next.idx, %limit.i
br i1 %idx.gt.limit, label %exit_iforloop, label %updatei
forloop_igt7_: ; preds = %forbody6_, %if.stopnow.notzero
%iidx.2 = phi i64 [ %iidx.0, %forbody6_ ], [ %initv-pstep.i, %if.stopnow.notzero ]
%brnch.4 = phi i8* [ %brnch.2, %forbody6_ ], [ %., %if.stopnow.notzero ]
%istep.2 = phi i64 [ %istep.0, %forbody6_ ], [ %step.i, %if.stopnow.notzero ]
%next.idx26 = add nsw i64 %istep.2, %iidx.2
%limit.i27 = load i64* %ilimit, !tbaa !5
%limit.gt.idx = icmp sgt i64 %limit.i27, %next.idx26
br i1 %limit.gt.idx, label %exit_iforloop, label %updatei
updatei: ; preds = %forloop_igt7_, %forloop_ilt7_
%iidx.3 = phi i64 [ %next.idx, %forloop_ilt7_ ], [ %next.idx26, %forloop_igt7_ ]
%brnch.5 = phi i8* [ %brnch.3, %forloop_ilt7_ ], [ %brnch.4, %forloop_igt7_ ]
%istep.3 = phi i64 [ %istep.1, %forloop_ilt7_ ], [ %istep.2, %forloop_igt7_ ]
%26 = load %ravi.TValue** %base, !tbaa !14
%27 = getelementptr inbounds %ravi.TValue* %26, i32 4
%var.tt.ptr = getelementptr inbounds %ravi.TValue* %26, i32 4, i32 1
%var.i = bitcast %ravi.TValue* %27 to i64*
store i64 %iidx.3, i64* %var.i, !tbaa !15
store i32 19, i32* %var.tt.ptr, !tbaa !17
%src.value.phi.trans.insert = getelementptr inbounds %ravi.TValue* %26, i32 4, i32 0, i32 0
%.pre = load double* %src.value.phi.trans.insert, !tbaa !15
br label %forbody6_
forloop_flt7_: ; preds = %forbody6_, %if.else.done
%iidx.4 = phi i64 [ %iidx.0, %forbody6_ ], [ undef, %if.else.done ]
%brnch.6 = phi i8* [ %brnch.2, %forbody6_ ], [ %.53, %if.else.done ]
%istep.4 = phi i64 [ %istep.0, %forbody6_ ], [ undef, %if.else.done ]
%step.n29 = load double* %nstep, !tbaa !5
%init.n30 = load double* %ninit, !tbaa !5
%next.idx31 = fadd double %step.n29, %init.n30
store double %next.idx31, double* %ninit, !tbaa !5
%limit.n32 = load double* %nlimit, !tbaa !5
%idx.gt.limit33 = fcmp ogt double %next.idx31, %limit.n32
br i1 %idx.gt.limit33, label %exit_iforloop, label %updatef
forloop_fgt7_: ; preds = %forbody6_, %if.else.done
%iidx.5 = phi i64 [ %iidx.0, %forbody6_ ], [ undef, %if.else.done ]
%brnch.7 = phi i8* [ %brnch.2, %forbody6_ ], [ %.53, %if.else.done ]
%istep.5 = phi i64 [ %istep.0, %forbody6_ ], [ undef, %if.else.done ]
%step.n34 = load double* %nstep, !tbaa !5
%init.n35 = load double* %ninit, !tbaa !5
%next.idx36 = fadd double %step.n34, %init.n35
store double %next.idx36, double* %ninit, !tbaa !5
%limit.n37 = load double* %nlimit, !tbaa !5
%limit.gt.idx38 = fcmp ogt double %limit.n37, %next.idx36
br i1 %limit.gt.idx38, label %exit_iforloop, label %updatef
updatef: ; preds = %forloop_fgt7_, %forloop_flt7_
%init.n40 = phi double [ %next.idx36, %forloop_fgt7_ ], [ %next.idx31, %forloop_flt7_ ]
%iidx.6 = phi i64 [ %iidx.5, %forloop_fgt7_ ], [ %iidx.4, %forloop_flt7_ ]
%brnch.8 = phi i8* [ %brnch.7, %forloop_fgt7_ ], [ %brnch.6, %forloop_flt7_ ]
%istep.6 = phi i64 [ %istep.5, %forloop_fgt7_ ], [ %istep.4, %forloop_flt7_ ]
%28 = load %ravi.TValue** %base, !tbaa !14
%var.tt.ptr39 = getelementptr inbounds %ravi.TValue* %28, i32 4, i32 1
%var.n = getelementptr inbounds %ravi.TValue* %28, i32 4, i32 0, i32 0
store double %init.n40, double* %var.n, !tbaa !15
store i32 3, i32* %var.tt.ptr39, !tbaa !17
br label %forbody6_
exit_iforloop: ; preds = %forloop_fgt7_, %forloop_flt7_, %forloop_igt7_, %forloop_ilt7_
%29 = load %ravi.TValue** %base, !tbaa !14
%30 = getelementptr inbounds %ravi.TValue* %29, i32 1
%L_top = getelementptr inbounds %ravi.lua_State* %L, i32 0, i32 4
store %ravi.TValue* %30, %ravi.TValue** %L_top, !tbaa !18
%sizep = getelementptr inbounds %ravi.Proto* %4, i32 0, i32 10
%31 = load i32* %sizep
%32 = icmp sgt i32 %31, 0
br i1 %32, label %if.then, label %if.else
if.then: ; preds = %exit_iforloop
call void @luaF_close(%ravi.lua_State* %L, %ravi.TValue* %29)
br label %if.else
if.else: ; preds = %if.then, %exit_iforloop
%33 = call i32 @luaD_poscall(%ravi.lua_State* %L, %ravi.TValue* %29)
%34 = icmp eq i32 %33, 0
br i1 %34, label %if.else42, label %if.then41
if.then41: ; preds = %if.else
%ci_top = getelementptr inbounds %ravi.CallInfo* %0, i32 0, i32 1
%35 = load %ravi.TValue** %ci_top
store %ravi.TValue* %35, %ravi.TValue** %L_top
br label %if.else42
if.else42: ; preds = %if.else, %if.then41
ret i32 1
}
declare i32 @luaD_poscall(%ravi.lua_State*, %ravi.TValue*)
declare void @luaF_close(%ravi.lua_State*, %ravi.TValue*)
declare void @luaG_runerror(%ravi.lua_State*, i8*)
declare i32 @luaV_forlimit(%ravi.TValue*, i64*, i64, i32*)
declare i32 @luaV_tonumber_(%ravi.TValue*, double*)
!0 = !{!"CallInfo", !1, i64 0, !1, i64 4, !1, i64 8, !1, i64 12, !4, i64 16, !5, i64 32, !6, i64 40, !2, i64 42}
!1 = !{!"any pointer", !2, i64 0}
!2 = !{!"omnipotent char", !3, i64 0}
!3 = !{!"Simple C / C++ TBAA"}
!4 = !{!"CallInfo_l", !1, i64 0, !1, i64 4, !5, i64 8}
!5 = !{!"long long", !2, i64 0}
!6 = !{!"short", !2, i64 0}
!7 = !{!0, !1, i64 0}
!8 = !{!1, !1, i64 0}
!9 = !{!10, !1, i64 12}
!10 = !{!"LClosure", !1, i64 0, !2, i64 4, !2, i64 5, !2, i64 6, !1, i64 8, !1, i64 12, !2, i64 16}
!11 = !{!12, !1, i64 44}
!12 = !{!"Proto", !1, i64 0, !2, i64 4, !2, i64 5, !2, i64 6, !2, i64 7, !2, i64 8, !13, i64 12, !13, i64 16, !13, i64 20, !13, i64 24, !13, i64 28, !13, i64 32, !13, i64 36, !13, i64 40, !1, i64 44, !1, i64 48, !1, i64 52, !1, i64 56, !1, i64 60, !1, i64 64, !1, i64 68, !1, i64 72, !1, i64 76}
!13 = !{!"int", !2, i64 0}
!14 = !{!0, !1, i64 16}
!15 = !{!16, !5, i64 0}
!16 = !{!"TValue", !5, i64 0, !13, i64 8}
!17 = !{!16, !13, i64 8}
!18 = !{!19, !1, i64 8}
!19 = !{!"lua_State", !1, i64 0, !2, i64 4, !2, i64 5, !2, i64 6, !1, i64 8, !1, i64 12, !1, i64 16, !1, i64 20, !1, i64 24, !1, i64 28, !1, i64 32, !1, i64 36, !1, i64 40, !1, i64 44, !0, i64 48, !1, i64 92, !5, i64 96, !13, i64 104, !13, i64 108, !13, i64 112, !6, i64 114, !6, i64 116, !2, i64 118, !2, i64 119}

@ -0,0 +1,308 @@
; ModuleID = 'ravi_module_ravif1'
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc-elf"
%0 = type { %ravi.TValue*, i32*, i64 }
%ravi.lua_State = type { %ravi.GCObject*, i8, i8, i8, %ravi.TValue*, %ravi.global_State*, %ravi.CallInfo*, i32*, %ravi.TValue*, %ravi.TValue*, %ravi.UpVal*, %ravi.GCObject*, %ravi.lua_State*, %ravi.lua_longjmp*, %ravi.CallInfo, i8* (%ravi.lua_State*, %ravi.lua_Debug*)*, i64, i32, i32, i32, i16, i16, i8, i8 }
%ravi.global_State = type opaque
%ravi.TValue = type { %ravi.Value, i32 }
%ravi.Value = type { double }
%ravi.UpVal = type opaque
%ravi.GCObject = type { %ravi.GCObject*, i8, i8 }
%ravi.lua_longjmp = type opaque
%ravi.CallInfo = type { %ravi.TValue*, %ravi.TValue*, %ravi.CallInfo*, %ravi.CallInfo*, %0, i64, i16, i8 }
%ravi.lua_Debug = type opaque
%ravi.LClosure = type { %ravi.GCObject*, i8, i8, i8, %ravi.GCObject*, %ravi.Proto*, [1 x %ravi.UpVal*] }
%ravi.Proto = type { %ravi.GCObject*, i8, i8, i8, i8, i8, i32, i32, i32, i32, i32, i32, i32, i32, %ravi.TValue*, i32*, %ravi.Proto**, i32*, %ravi.LocVar*, %ravi.Upvaldesc*, %ravi.LClosure*, %ravi.TString*, %ravi.GCObject*, %ravi.RaviJITProto* }
%ravi.LocVar = type { %ravi.TString*, i32, i32, i32 }
%ravi.Upvaldesc = type { %ravi.TString*, i8, i8 }
%ravi.TString = type { %ravi.GCObject*, i8, i8, i8, i32, i64, %ravi.TString* }
%ravi.RaviJITProto = type opaque
@0 = private unnamed_addr constant [29 x i8] c"'for' limit must be a number\00"
@1 = private unnamed_addr constant [28 x i8] c"'for' step must be a number\00"
@2 = private unnamed_addr constant [37 x i8] c"'for' initial value must be a number\00"
define i32 @ravif1(%ravi.lua_State* %L) {
entry:
%stopnow = alloca i32
%ilimit = alloca i64
%nlimit = alloca double
%ninit = alloca double
%nstep = alloca double
%L_ci = getelementptr inbounds %ravi.lua_State* %L, i32 0, i32 6
%0 = load %ravi.CallInfo** %L_ci, !tbaa !0
%base = getelementptr inbounds %ravi.CallInfo* %0, i32 0, i32 4, i32 0
%1 = bitcast %ravi.CallInfo* %0 to %ravi.LClosure***
%2 = load %ravi.LClosure*** %1, !tbaa !7
%3 = load %ravi.LClosure** %2, !tbaa !8
%Proto = getelementptr inbounds %ravi.LClosure* %3, i32 0, i32 5
%4 = load %ravi.Proto** %Proto, !tbaa !9
%k = getelementptr inbounds %ravi.Proto* %4, i32 0, i32 14
%5 = load %ravi.TValue** %k, !tbaa !11
tail call void @luaV_op_loadnil(%ravi.CallInfo* %0, i32 0, i32 0)
%6 = load %ravi.TValue** %base, !tbaa !14
%dest.value = getelementptr inbounds %ravi.TValue* %6, i32 0, i32 0, i32 0
store double 0.000000e+00, double* %dest.value, !tbaa !15
%dest.tt = getelementptr inbounds %ravi.TValue* %6, i32 0, i32 1
store i32 3, i32* %dest.tt, !tbaa !17
%srcvalue = getelementptr inbounds %ravi.TValue* %5, i32 0, i32 0, i32 0
%destvalue = getelementptr inbounds %ravi.TValue* %6, i32 1, i32 0, i32 0
%7 = load double* %srcvalue, !tbaa !15
store double %7, double* %destvalue, !tbaa !15
%srctype = getelementptr inbounds %ravi.TValue* %5, i32 0, i32 1
%desttype = getelementptr inbounds %ravi.TValue* %6, i32 1, i32 1
%8 = load i32* %srctype, !tbaa !17
store i32 %8, i32* %desttype, !tbaa !17
%srcvalue1 = getelementptr inbounds %ravi.TValue* %5, i32 1, i32 0, i32 0
%destvalue2 = getelementptr inbounds %ravi.TValue* %6, i32 2, i32 0, i32 0
%9 = load double* %srcvalue1, !tbaa !15
store double %9, double* %destvalue2, !tbaa !15
%srctype3 = getelementptr inbounds %ravi.TValue* %5, i32 1, i32 1
%desttype4 = getelementptr inbounds %ravi.TValue* %6, i32 2, i32 1
%10 = load i32* %srctype3, !tbaa !17
store i32 %10, i32* %desttype4, !tbaa !17
%destvalue6 = getelementptr inbounds %ravi.TValue* %6, i32 3, i32 0, i32 0
%11 = load double* %srcvalue, !tbaa !15
store double %11, double* %destvalue6, !tbaa !15
%desttype8 = getelementptr inbounds %ravi.TValue* %6, i32 3, i32 1
%12 = load i32* %srctype, !tbaa !17
store i32 %12, i32* %desttype8, !tbaa !17
%13 = getelementptr inbounds %ravi.TValue* %6, i32 1
%14 = getelementptr inbounds %ravi.TValue* %6, i32 2
%15 = getelementptr inbounds %ravi.TValue* %6, i32 3
%init.tt = load i32* %desttype, !tbaa !17
%init.is.integer = icmp eq i32 %init.tt, 19
%step.is.integer = icmp eq i32 %12, 19
%step.i.ptr = bitcast %ravi.TValue* %15 to i64*
%step.i = load i64* %step.i.ptr, !tbaa !15
%16 = call i32 @luaV_forlimit(%ravi.TValue* %14, i64* %ilimit, i64 %step.i, i32* %stopnow)
%init.and.step.are.integers = and i1 %init.is.integer, %step.is.integer
%17 = icmp ne i32 %16, 0
%all.integers = and i1 %init.and.step.are.integers, %17
br i1 %all.integers, label %if.all.integers, label %if.not.all.integers
if.all.integers: ; preds = %entry
%stopnow.value = load i32* %stopnow, !tbaa !13
%stopnow.is.zero = icmp eq i32 %stopnow.value, 0
br i1 %stopnow.is.zero, label %if.stopnow.iszero, label %if.stopnow.notzero
if.stopnow.iszero: ; preds = %if.all.integers
%init.i.ptr = bitcast %ravi.TValue* %13 to i64*
%init.i = load i64* %init.i.ptr, !tbaa !15
br label %if.stopnow.notzero
if.stopnow.notzero: ; preds = %if.stopnow.iszero, %if.all.integers
%initv = phi i64 [ %init.i, %if.stopnow.iszero ], [ 0, %if.all.integers ]
%initv-pstep.i = sub nsw i64 %initv, %step.i
%step.gt.zero = icmp sgt i64 %step.i, 0
%. = select i1 %step.gt.zero, i8* blockaddress(@ravif1, %forloop_ilt8_), i8* blockaddress(@ravif1, %forloop_igt8_)
br i1 %step.gt.zero, label %forloop_ilt8_, label %forloop_igt8_
if.not.all.integers: ; preds = %entry
%limit.tt = load i32* %desttype4, !tbaa !17
%limit.is.float = icmp eq i32 %limit.tt, 3
br i1 %limit.is.float, label %if.limit.isfloat, label %if.limit.notfloat
if.limit.isfloat: ; preds = %if.not.all.integers
%limit.n.ptr = getelementptr inbounds %ravi.TValue* %14, i32 0, i32 0, i32 0
%limit.n = load double* %limit.n.ptr, !tbaa !15
store volatile double %limit.n, double* %nlimit, !tbaa !5
br label %if.else.step
if.limit.notfloat: ; preds = %if.not.all.integers
%18 = call i32 @luaV_tonumber_(%ravi.TValue* %14, double* %nlimit)
%limit.float.ok = icmp eq i32 %18, 0
br i1 %limit.float.ok, label %if.limit.float.failed, label %if.else.step
if.limit.float.failed: ; preds = %if.limit.notfloat
call void @luaG_runerror(%ravi.lua_State* %L, i8* getelementptr inbounds ([29 x i8]* @0, i32 0, i32 0))
br label %if.else.step
if.else.step: ; preds = %if.limit.float.failed, %if.limit.notfloat, %if.limit.isfloat
%step.tt10 = load i32* %desttype8, !tbaa !17
%step.is.float = icmp eq i32 %step.tt10, 3
br i1 %step.is.float, label %if.step.isfloat, label %if.step.notfloat
if.step.isfloat: ; preds = %if.else.step
%step.n.ptr = getelementptr inbounds %ravi.TValue* %15, i32 0, i32 0, i32 0
%step.n = load double* %step.n.ptr, !tbaa !15
store volatile double %step.n, double* %nstep, !tbaa !5
br label %if.else.init
if.step.notfloat: ; preds = %if.else.step
%19 = call i32 @luaV_tonumber_(%ravi.TValue* %15, double* %nstep)
%step.float.ok = icmp eq i32 %19, 0
br i1 %step.float.ok, label %if.step.float.failed, label %if.else.init
if.step.float.failed: ; preds = %if.step.notfloat
call void @luaG_runerror(%ravi.lua_State* %L, i8* getelementptr inbounds ([28 x i8]* @1, i32 0, i32 0))
br label %if.else.init
if.else.init: ; preds = %if.step.float.failed, %if.step.notfloat, %if.step.isfloat
%init.tt11 = load i32* %desttype, !tbaa !17
%init.is.float = icmp eq i32 %init.tt11, 3
br i1 %init.is.float, label %if.init.is.float, label %if.init.not.float
if.init.is.float: ; preds = %if.else.init
%init.n.ptr = getelementptr inbounds %ravi.TValue* %13, i32 0, i32 0, i32 0
%init.n = load double* %init.n.ptr, !tbaa !15
store double %init.n, double* %ninit, !tbaa !5
br label %if.else.done
if.init.not.float: ; preds = %if.else.init
%20 = call i32 @luaV_tonumber_(%ravi.TValue* %13, double* %ninit)
%init.float.ok = icmp eq i32 %20, 0
br i1 %init.float.ok, label %if.init.float.failed, label %if.else.done
if.init.float.failed: ; preds = %if.init.not.float
call void @luaG_runerror(%ravi.lua_State* %L, i8* getelementptr inbounds ([37 x i8]* @2, i32 0, i32 0))
br label %if.else.done
if.else.done: ; preds = %if.init.float.failed, %if.init.not.float, %if.init.is.float
%ninit12 = load double* %ninit, !tbaa !5
%nstep13 = load double* %nstep, !tbaa !5
%ninit-nstep = fsub double %ninit12, %nstep13
store volatile double %ninit-nstep, double* %ninit, !tbaa !5
%step.gt.zero14 = fcmp ogt double %nstep13, 0.000000e+00
%.49 = select i1 %step.gt.zero14, i8* blockaddress(@ravif1, %forloop_flt8_), i8* blockaddress(@ravif1, %forloop_fgt8_)
br i1 %step.gt.zero14, label %forloop_flt8_, label %forloop_fgt8_
forbody7_: ; preds = %updatef, %updatei
%iidx.0 = phi i64 [ %iidx.3, %updatei ], [ %iidx.6, %updatef ]
%brnch.2 = phi i8* [ %brnch.5, %updatei ], [ %brnch.8, %updatef ]
%istep.0 = phi i64 [ %istep.3, %updatei ], [ %istep.6, %updatef ]
%21 = bitcast %ravi.TValue** %base to double**
%22 = load double** %21, !tbaa !14
%23 = load double* %22, !tbaa !15
%24 = fadd double %23, 1.000000e+00
store double %24, double* %22, !tbaa !15
indirectbr i8* %brnch.2, [label %forloop_ilt8_, label %forloop_igt8_, label %forloop_flt8_, label %forloop_fgt8_]
forloop_ilt8_: ; preds = %forbody7_, %if.stopnow.notzero
%iidx.1 = phi i64 [ %initv-pstep.i, %if.stopnow.notzero ], [ %iidx.0, %forbody7_ ]
%brnch.3 = phi i8* [ %., %if.stopnow.notzero ], [ %brnch.2, %forbody7_ ]
%istep.1 = phi i64 [ %step.i, %if.stopnow.notzero ], [ %istep.0, %forbody7_ ]
%next.idx = add nsw i64 %istep.1, %iidx.1
%limit.i = load i64* %ilimit, !tbaa !5
%idx.gt.limit = icmp sgt i64 %next.idx, %limit.i
br i1 %idx.gt.limit, label %exit_iforloop, label %updatei
forloop_igt8_: ; preds = %forbody7_, %if.stopnow.notzero
%iidx.2 = phi i64 [ %iidx.0, %forbody7_ ], [ %initv-pstep.i, %if.stopnow.notzero ]
%brnch.4 = phi i8* [ %brnch.2, %forbody7_ ], [ %., %if.stopnow.notzero ]
%istep.2 = phi i64 [ %istep.0, %forbody7_ ], [ %step.i, %if.stopnow.notzero ]
%next.idx22 = add nsw i64 %istep.2, %iidx.2
%limit.i23 = load i64* %ilimit, !tbaa !5
%limit.gt.idx = icmp sgt i64 %limit.i23, %next.idx22
br i1 %limit.gt.idx, label %exit_iforloop, label %updatei
updatei: ; preds = %forloop_igt8_, %forloop_ilt8_
%iidx.3 = phi i64 [ %next.idx, %forloop_ilt8_ ], [ %next.idx22, %forloop_igt8_ ]
%brnch.5 = phi i8* [ %brnch.3, %forloop_ilt8_ ], [ %brnch.4, %forloop_igt8_ ]
%istep.3 = phi i64 [ %istep.1, %forloop_ilt8_ ], [ %istep.2, %forloop_igt8_ ]
%25 = load %ravi.TValue** %base, !tbaa !14
%26 = getelementptr inbounds %ravi.TValue* %25, i32 4
%var.tt.ptr = getelementptr inbounds %ravi.TValue* %25, i32 4, i32 1
%var.i = bitcast %ravi.TValue* %26 to i64*
store i64 %iidx.3, i64* %var.i, !tbaa !15
store i32 19, i32* %var.tt.ptr, !tbaa !17
br label %forbody7_
forloop_flt8_: ; preds = %forbody7_, %if.else.done
%iidx.4 = phi i64 [ %iidx.0, %forbody7_ ], [ undef, %if.else.done ]
%brnch.6 = phi i8* [ %brnch.2, %forbody7_ ], [ %.49, %if.else.done ]
%istep.4 = phi i64 [ %istep.0, %forbody7_ ], [ undef, %if.else.done ]
%step.n25 = load double* %nstep, !tbaa !5
%init.n26 = load double* %ninit, !tbaa !5
%next.idx27 = fadd double %step.n25, %init.n26
store double %next.idx27, double* %ninit, !tbaa !5
%limit.n28 = load double* %nlimit, !tbaa !5
%idx.gt.limit29 = fcmp ogt double %next.idx27, %limit.n28
br i1 %idx.gt.limit29, label %exit_iforloop, label %updatef
forloop_fgt8_: ; preds = %forbody7_, %if.else.done
%iidx.5 = phi i64 [ %iidx.0, %forbody7_ ], [ undef, %if.else.done ]
%brnch.7 = phi i8* [ %brnch.2, %forbody7_ ], [ %.49, %if.else.done ]
%istep.5 = phi i64 [ %istep.0, %forbody7_ ], [ undef, %if.else.done ]
%step.n30 = load double* %nstep, !tbaa !5
%init.n31 = load double* %ninit, !tbaa !5
%next.idx32 = fadd double %step.n30, %init.n31
store double %next.idx32, double* %ninit, !tbaa !5
%limit.n33 = load double* %nlimit, !tbaa !5
%limit.gt.idx34 = fcmp ogt double %limit.n33, %next.idx32
br i1 %limit.gt.idx34, label %exit_iforloop, label %updatef
updatef: ; preds = %forloop_fgt8_, %forloop_flt8_
%init.n36 = phi double [ %next.idx32, %forloop_fgt8_ ], [ %next.idx27, %forloop_flt8_ ]
%iidx.6 = phi i64 [ %iidx.5, %forloop_fgt8_ ], [ %iidx.4, %forloop_flt8_ ]
%brnch.8 = phi i8* [ %brnch.7, %forloop_fgt8_ ], [ %brnch.6, %forloop_flt8_ ]
%istep.6 = phi i64 [ %istep.5, %forloop_fgt8_ ], [ %istep.4, %forloop_flt8_ ]
%27 = load %ravi.TValue** %base, !tbaa !14
%var.tt.ptr35 = getelementptr inbounds %ravi.TValue* %27, i32 4, i32 1
%var.n = getelementptr inbounds %ravi.TValue* %27, i32 4, i32 0, i32 0
store double %init.n36, double* %var.n, !tbaa !15
store i32 3, i32* %var.tt.ptr35, !tbaa !17
br label %forbody7_
exit_iforloop: ; preds = %forloop_fgt8_, %forloop_flt8_, %forloop_igt8_, %forloop_ilt8_
%28 = load %ravi.TValue** %base, !tbaa !14
%29 = getelementptr inbounds %ravi.TValue* %28, i32 1
%L_top = getelementptr inbounds %ravi.lua_State* %L, i32 0, i32 4
store %ravi.TValue* %29, %ravi.TValue** %L_top, !tbaa !18
%sizep = getelementptr inbounds %ravi.Proto* %4, i32 0, i32 10
%30 = load i32* %sizep
%31 = icmp sgt i32 %30, 0
br i1 %31, label %if.then, label %if.else
if.then: ; preds = %exit_iforloop
call void @luaF_close(%ravi.lua_State* %L, %ravi.TValue* %28)
br label %if.else
if.else: ; preds = %if.then, %exit_iforloop
%32 = call i32 @luaD_poscall(%ravi.lua_State* %L, %ravi.TValue* %28)
%33 = icmp eq i32 %32, 0
br i1 %33, label %if.else38, label %if.then37
if.then37: ; preds = %if.else
%ci_top = getelementptr inbounds %ravi.CallInfo* %0, i32 0, i32 1
%34 = load %ravi.TValue** %ci_top
store %ravi.TValue* %34, %ravi.TValue** %L_top
br label %if.else38
if.else38: ; preds = %if.else, %if.then37
ret i32 1
}
declare i32 @luaD_poscall(%ravi.lua_State*, %ravi.TValue*)
declare void @luaF_close(%ravi.lua_State*, %ravi.TValue*)
declare void @luaG_runerror(%ravi.lua_State*, i8*)
declare i32 @luaV_forlimit(%ravi.TValue*, i64*, i64, i32*)
declare i32 @luaV_tonumber_(%ravi.TValue*, double*)
declare void @luaV_op_loadnil(%ravi.CallInfo*, i32, i32)
!0 = !{!"CallInfo", !1, i64 0, !1, i64 4, !1, i64 8, !1, i64 12, !4, i64 16, !5, i64 32, !6, i64 40, !2, i64 42}
!1 = !{!"any pointer", !2, i64 0}
!2 = !{!"omnipotent char", !3, i64 0}
!3 = !{!"Simple C / C++ TBAA"}
!4 = !{!"CallInfo_l", !1, i64 0, !1, i64 4, !5, i64 8}
!5 = !{!"long long", !2, i64 0}
!6 = !{!"short", !2, i64 0}
!7 = !{!0, !1, i64 0}
!8 = !{!1, !1, i64 0}
!9 = !{!10, !1, i64 12}
!10 = !{!"LClosure", !1, i64 0, !2, i64 4, !2, i64 5, !2, i64 6, !1, i64 8, !1, i64 12, !2, i64 16}
!11 = !{!12, !1, i64 44}
!12 = !{!"Proto", !1, i64 0, !2, i64 4, !2, i64 5, !2, i64 6, !2, i64 7, !2, i64 8, !13, i64 12, !13, i64 16, !13, i64 20, !13, i64 24, !13, i64 28, !13, i64 32, !13, i64 36, !13, i64 40, !1, i64 44, !1, i64 48, !1, i64 52, !1, i64 56, !1, i64 60, !1, i64 64, !1, i64 68, !1, i64 72, !1, i64 76}
!13 = !{!"int", !2, i64 0}
!14 = !{!0, !1, i64 16}
!15 = !{!16, !5, i64 0}
!16 = !{!"TValue", !5, i64 0, !13, i64 8}
!17 = !{!16, !13, i64 8}
!18 = !{!19, !1, i64 8}
!19 = !{!"lua_State", !1, i64 0, !2, i64 4, !2, i64 5, !2, i64 6, !1, i64 8, !1, i64 12, !1, i64 16, !1, i64 20, !1, i64 24, !1, i64 28, !1, i64 32, !1, i64 36, !1, i64 40, !1, i64 44, !0, i64 48, !1, i64 92, !5, i64 96, !13, i64 104, !13, i64 108, !13, i64 112, !6, i64 114, !6, i64 116, !2, i64 118, !2, i64 119}

@ -0,0 +1,540 @@
; ModuleID = 'ravi_module_ravif1'
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-windows-msvc-elf"
%0 = type { %ravi.TValue*, i32*, i64 }
%ravi.lua_State = type { %ravi.GCObject*, i8, i8, i8, %ravi.TValue*, %ravi.global_State*, %ravi.CallInfo*, i32*, %ravi.TValue*, %ravi.TValue*, %ravi.UpVal*, %ravi.GCObject*, %ravi.lua_State*, %ravi.lua_longjmp*, %ravi.CallInfo, i8* (%ravi.lua_State*, %ravi.lua_Debug*)*, i64, i32, i32, i32, i16, i16, i8, i8 }
%ravi.global_State = type opaque
%ravi.TValue = type { %ravi.Value, i32 }
%ravi.Value = type { double }
%ravi.UpVal = type opaque
%ravi.GCObject = type { %ravi.GCObject*, i8, i8 }
%ravi.lua_longjmp = type opaque
%ravi.CallInfo = type { %ravi.TValue*, %ravi.TValue*, %ravi.CallInfo*, %ravi.CallInfo*, %0, i64, i16, i8 }
%ravi.lua_Debug = type opaque
%ravi.LClosure = type { %ravi.GCObject*, i8, i8, i8, %ravi.GCObject*, %ravi.Proto*, [1 x %ravi.UpVal*] }
%ravi.Proto = type { %ravi.GCObject*, i8, i8, i8, i8, i8, i32, i32, i32, i32, i32, i32, i32, i32, %ravi.TValue*, i32*, %ravi.Proto**, i32*, %ravi.LocVar*, %ravi.Upvaldesc*, %ravi.LClosure*, %ravi.TString*, %ravi.GCObject*, %ravi.RaviJITProto* }
%ravi.LocVar = type { %ravi.TString*, i32, i32, i32 }
%ravi.Upvaldesc = type { %ravi.TString*, i8, i8 }
%ravi.TString = type { %ravi.GCObject*, i8, i8, i8, i32, i64, %ravi.TString* }
%ravi.RaviJITProto = type opaque
@0 = private unnamed_addr constant [29 x i8] c"'for' limit must be a number\00"
@1 = private unnamed_addr constant [28 x i8] c"'for' step must be a number\00"
@2 = private unnamed_addr constant [37 x i8] c"'for' initial value must be a number\00"
define i32 @ravif1(%ravi.lua_State* %L) {
entry:
%stopnow35 = alloca i32
%ilimit36 = alloca i64
%nlimit39 = alloca double
%ninit40 = alloca double
%nstep41 = alloca double
%stopnow = alloca i32
%ilimit = alloca i64
%nlimit = alloca double
%ninit = alloca double
%nstep = alloca double
%L_ci = getelementptr inbounds %ravi.lua_State* %L, i32 0, i32 6
%0 = load %ravi.CallInfo** %L_ci, !tbaa !0
%base = getelementptr inbounds %ravi.CallInfo* %0, i32 0, i32 4, i32 0
%1 = bitcast %ravi.CallInfo* %0 to %ravi.LClosure***
%2 = load %ravi.LClosure*** %1, !tbaa !7
%3 = load %ravi.LClosure** %2, !tbaa !8
%Proto = getelementptr inbounds %ravi.LClosure* %3, i32 0, i32 5
%4 = load %ravi.Proto** %Proto, !tbaa !9
%k = getelementptr inbounds %ravi.Proto* %4, i32 0, i32 14
%5 = load %ravi.TValue** %k, !tbaa !11
%6 = load %ravi.TValue** %base, !tbaa !14
%srcvalue = getelementptr inbounds %ravi.TValue* %5, i32 0, i32 0, i32 0
%destvalue = getelementptr inbounds %ravi.TValue* %6, i32 0, i32 0, i32 0
%7 = load double* %srcvalue, !tbaa !15
store double %7, double* %destvalue, !tbaa !15
%srctype = getelementptr inbounds %ravi.TValue* %5, i32 0, i32 1
%desttype = getelementptr inbounds %ravi.TValue* %6, i32 0, i32 1
%8 = load i32* %srctype, !tbaa !17
store i32 %8, i32* %desttype, !tbaa !17
%srcvalue1 = getelementptr inbounds %ravi.TValue* %5, i32 1, i32 0, i32 0
%destvalue2 = getelementptr inbounds %ravi.TValue* %6, i32 1, i32 0, i32 0
%9 = load double* %srcvalue1, !tbaa !15
store double %9, double* %destvalue2, !tbaa !15
%srctype3 = getelementptr inbounds %ravi.TValue* %5, i32 1, i32 1
%desttype4 = getelementptr inbounds %ravi.TValue* %6, i32 1, i32 1
%10 = load i32* %srctype3, !tbaa !17
store i32 %10, i32* %desttype4, !tbaa !17
%srcvalue5 = getelementptr inbounds %ravi.TValue* %5, i32 2, i32 0, i32 0
%destvalue6 = getelementptr inbounds %ravi.TValue* %6, i32 2, i32 0, i32 0
%11 = load double* %srcvalue5, !tbaa !15
store double %11, double* %destvalue6, !tbaa !15
%srctype7 = getelementptr inbounds %ravi.TValue* %5, i32 2, i32 1
%desttype8 = getelementptr inbounds %ravi.TValue* %6, i32 2, i32 1
%12 = load i32* %srctype7, !tbaa !17
store i32 %12, i32* %desttype8, !tbaa !17
%srcvalue9 = getelementptr inbounds %ravi.TValue* %5, i32 3, i32 0, i32 0
%destvalue10 = getelementptr inbounds %ravi.TValue* %6, i32 3, i32 0, i32 0
%13 = load double* %srcvalue9, !tbaa !15
store double %13, double* %destvalue10, !tbaa !15
%srctype11 = getelementptr inbounds %ravi.TValue* %5, i32 3, i32 1
%desttype12 = getelementptr inbounds %ravi.TValue* %6, i32 3, i32 1
%14 = load i32* %srctype11, !tbaa !17
store i32 %14, i32* %desttype12, !tbaa !17
%15 = getelementptr inbounds %ravi.TValue* %6, i32 1
%16 = getelementptr inbounds %ravi.TValue* %6, i32 2
%17 = getelementptr inbounds %ravi.TValue* %6, i32 3
%init.tt = load i32* %desttype4, !tbaa !17
%init.is.integer = icmp eq i32 %init.tt, 19
%step.is.integer = icmp eq i32 %14, 19
%step.i.ptr = bitcast %ravi.TValue* %17 to i64*
%step.i = load i64* %step.i.ptr, !tbaa !15
%18 = call i32 @luaV_forlimit(%ravi.TValue* %16, i64* %ilimit, i64 %step.i, i32* %stopnow)
%init.and.step.are.integers = and i1 %init.is.integer, %step.is.integer
%19 = icmp ne i32 %18, 0
%all.integers = and i1 %init.and.step.are.integers, %19
br i1 %all.integers, label %if.all.integers, label %if.not.all.integers
if.all.integers: ; preds = %entry
%stopnow.value = load i32* %stopnow, !tbaa !13
%stopnow.is.zero = icmp eq i32 %stopnow.value, 0
br i1 %stopnow.is.zero, label %if.stopnow.iszero, label %if.stopnow.notzero
if.stopnow.iszero: ; preds = %if.all.integers
%init.i.ptr = bitcast %ravi.TValue* %15 to i64*
%init.i = load i64* %init.i.ptr, !tbaa !15
br label %if.stopnow.notzero
if.stopnow.notzero: ; preds = %if.stopnow.iszero, %if.all.integers
%initv = phi i64 [ %init.i, %if.stopnow.iszero ], [ 0, %if.all.integers ]
%initv-pstep.i = sub nsw i64 %initv, %step.i
%step.gt.zero = icmp sgt i64 %step.i, 0
%. = select i1 %step.gt.zero, i8* blockaddress(@ravif1, %forloop_ilt13_), i8* blockaddress(@ravif1, %forloop_igt13_)
br i1 %step.gt.zero, label %forloop_ilt13_, label %forloop_igt13_
if.not.all.integers: ; preds = %entry
%limit.tt = load i32* %desttype8, !tbaa !17
%limit.is.float = icmp eq i32 %limit.tt, 3
br i1 %limit.is.float, label %if.limit.isfloat, label %if.limit.notfloat
if.limit.isfloat: ; preds = %if.not.all.integers
%limit.n.ptr = getelementptr inbounds %ravi.TValue* %16, i32 0, i32 0, i32 0
%limit.n = load double* %limit.n.ptr, !tbaa !15
store volatile double %limit.n, double* %nlimit, !tbaa !5
br label %if.else.step
if.limit.notfloat: ; preds = %if.not.all.integers
%20 = call i32 @luaV_tonumber_(%ravi.TValue* %16, double* %nlimit)
%limit.float.ok = icmp eq i32 %20, 0
br i1 %limit.float.ok, label %if.limit.float.failed, label %if.else.step
if.limit.float.failed: ; preds = %if.limit.notfloat
call void @luaG_runerror(%ravi.lua_State* %L, i8* getelementptr inbounds ([29 x i8]* @0, i32 0, i32 0))
br label %if.else.step
if.else.step: ; preds = %if.limit.float.failed, %if.limit.notfloat, %if.limit.isfloat
%step.tt14 = load i32* %desttype12, !tbaa !17
%step.is.float = icmp eq i32 %step.tt14, 3
br i1 %step.is.float, label %if.step.isfloat, label %if.step.notfloat
if.step.isfloat: ; preds = %if.else.step
%step.n.ptr = getelementptr inbounds %ravi.TValue* %17, i32 0, i32 0, i32 0
%step.n = load double* %step.n.ptr, !tbaa !15
store volatile double %step.n, double* %nstep, !tbaa !5
br label %if.else.init
if.step.notfloat: ; preds = %if.else.step
%21 = call i32 @luaV_tonumber_(%ravi.TValue* %17, double* %nstep)
%step.float.ok = icmp eq i32 %21, 0
br i1 %step.float.ok, label %if.step.float.failed, label %if.else.init
if.step.float.failed: ; preds = %if.step.notfloat
call void @luaG_runerror(%ravi.lua_State* %L, i8* getelementptr inbounds ([28 x i8]* @1, i32 0, i32 0))
br label %if.else.init
if.else.init: ; preds = %if.step.float.failed, %if.step.notfloat, %if.step.isfloat
%init.tt15 = load i32* %desttype4, !tbaa !17
%init.is.float = icmp eq i32 %init.tt15, 3
br i1 %init.is.float, label %if.init.is.float, label %if.init.not.float
if.init.is.float: ; preds = %if.else.init
%init.n.ptr = getelementptr inbounds %ravi.TValue* %15, i32 0, i32 0, i32 0
%init.n = load double* %init.n.ptr, !tbaa !15
store double %init.n, double* %ninit, !tbaa !5
br label %if.else.done
if.init.not.float: ; preds = %if.else.init
%22 = call i32 @luaV_tonumber_(%ravi.TValue* %15, double* %ninit)
%init.float.ok = icmp eq i32 %22, 0
br i1 %init.float.ok, label %if.init.float.failed, label %if.else.done
if.init.float.failed: ; preds = %if.init.not.float
call void @luaG_runerror(%ravi.lua_State* %L, i8* getelementptr inbounds ([37 x i8]* @2, i32 0, i32 0))
br label %if.else.done
if.else.done: ; preds = %if.init.float.failed, %if.init.not.float, %if.init.is.float
%ninit16 = load double* %ninit, !tbaa !5
%nstep17 = load double* %nstep, !tbaa !5
%ninit-nstep = fsub double %ninit16, %nstep17
store volatile double %ninit-nstep, double* %ninit, !tbaa !5
%step.gt.zero18 = fcmp ogt double %nstep17, 0.000000e+00
%.171 = select i1 %step.gt.zero18, i8* blockaddress(@ravif1, %forloop_flt13_), i8* blockaddress(@ravif1, %forloop_fgt13_)
br i1 %step.gt.zero18, label %forloop_flt13_, label %forloop_fgt13_
forbody6_: ; preds = %updatef151, %updatei137
%23 = phi i32 [ 19, %updatei137 ], [ 3, %updatef151 ]
%24 = phi double [ %.pre, %updatei137 ], [ %init.n154, %updatef151 ]
%base34 = phi %ravi.TValue* [ %45, %updatei137 ], [ %47, %updatef151 ]
%iidx38.0 = phi i64 [ %iidx38.11, %updatei137 ], [ %iidx38.14, %updatef151 ]
%istep.0 = phi i64 [ %istep.3, %updatei137 ], [ %istep.6, %updatef151 ]
%iidx.0 = phi i64 [ %iidx.3, %updatei137 ], [ %iidx.6, %updatef151 ]
%brnch.2 = phi i8* [ %brnch.5, %updatei137 ], [ %brnch.8, %updatef151 ]
%istep37.0 = phi i64 [ %istep37.11, %updatei137 ], [ %istep37.14, %updatef151 ]
%dest.value = getelementptr inbounds %ravi.TValue* %base34, i32 0, i32 0, i32 0
store double %24, double* %dest.value, !tbaa !15
%dest.tt = getelementptr inbounds %ravi.TValue* %base34, i32 0, i32 1
store i32 %23, i32* %dest.tt, !tbaa !17
%srcvalue22 = getelementptr inbounds %ravi.TValue* %5, i32 4, i32 0, i32 0
%destvalue23 = getelementptr inbounds %ravi.TValue* %base34, i32 5, i32 0, i32 0
%25 = load double* %srcvalue22, !tbaa !15
store double %25, double* %destvalue23, !tbaa !15
%srctype24 = getelementptr inbounds %ravi.TValue* %5, i32 4, i32 1
%desttype25 = getelementptr inbounds %ravi.TValue* %base34, i32 5, i32 1
%26 = load i32* %srctype24, !tbaa !17
store i32 %26, i32* %desttype25, !tbaa !17
%srcvalue26 = getelementptr inbounds %ravi.TValue* %5, i32 5, i32 0, i32 0
%destvalue27 = getelementptr inbounds %ravi.TValue* %base34, i32 6, i32 0, i32 0
%27 = load double* %srcvalue26, !tbaa !15
store double %27, double* %destvalue27, !tbaa !15
%srctype28 = getelementptr inbounds %ravi.TValue* %5, i32 5, i32 1
%desttype29 = getelementptr inbounds %ravi.TValue* %base34, i32 6, i32 1
%28 = load i32* %srctype28, !tbaa !17
store i32 %28, i32* %desttype29, !tbaa !17
%destvalue31 = getelementptr inbounds %ravi.TValue* %base34, i32 7, i32 0, i32 0
%29 = load double* %srcvalue9, !tbaa !15
store double %29, double* %destvalue31, !tbaa !15
%desttype33 = getelementptr inbounds %ravi.TValue* %base34, i32 7, i32 1
%30 = load i32* %srctype11, !tbaa !17
store i32 %30, i32* %desttype33, !tbaa !17
%31 = getelementptr inbounds %ravi.TValue* %base34, i32 5
%32 = getelementptr inbounds %ravi.TValue* %base34, i32 6
%33 = getelementptr inbounds %ravi.TValue* %base34, i32 7
%init.tt46 = load i32* %desttype25, !tbaa !17
%init.is.integer47 = icmp eq i32 %init.tt46, 19
%step.is.integer50 = icmp eq i32 %30, 19
%step.i.ptr51 = bitcast %ravi.TValue* %33 to i64*
%step.i52 = load i64* %step.i.ptr51, !tbaa !15
%34 = call i32 @luaV_forlimit(%ravi.TValue* %32, i64* %ilimit36, i64 %step.i52, i32* %stopnow35)
%init.and.step.are.integers53 = and i1 %init.is.integer47, %step.is.integer50
%35 = icmp ne i32 %34, 0
%all.integers54 = and i1 %init.and.step.are.integers53, %35
br i1 %all.integers54, label %if.all.integers55, label %if.not.all.integers68
if.all.integers55: ; preds = %forbody6_
%stopnow.value56 = load i32* %stopnow35, !tbaa !13
%stopnow.is.zero57 = icmp eq i32 %stopnow.value56, 0
br i1 %stopnow.is.zero57, label %if.stopnow.iszero59, label %if.stopnow.notzero61
if.stopnow.iszero59: ; preds = %if.all.integers55
%init.i.ptr58 = bitcast %ravi.TValue* %31 to i64*
%init.i60 = load i64* %init.i.ptr58, !tbaa !15
br label %if.stopnow.notzero61
if.stopnow.notzero61: ; preds = %if.stopnow.iszero59, %if.all.integers55
%initv62 = phi i64 [ %init.i60, %if.stopnow.iszero59 ], [ 0, %if.all.integers55 ]
%initv-pstep.i63 = sub nsw i64 %initv62, %step.i52
%step.gt.zero64 = icmp sgt i64 %step.i52, 0
%.172 = select i1 %step.gt.zero64, i8* blockaddress(@ravif1, %forloop_ilt12_), i8* blockaddress(@ravif1, %forloop_igt12_)
br i1 %step.gt.zero64, label %forloop_ilt12_, label %forloop_igt12_
if.not.all.integers68: ; preds = %forbody6_
%limit.tt70 = load i32* %desttype29, !tbaa !17
%limit.is.float71 = icmp eq i32 %limit.tt70, 3
br i1 %limit.is.float71, label %if.limit.isfloat72, label %if.limit.notfloat75
if.limit.isfloat72: ; preds = %if.not.all.integers68
%limit.n.ptr73 = getelementptr inbounds %ravi.TValue* %32, i32 0, i32 0, i32 0
%limit.n74 = load double* %limit.n.ptr73, !tbaa !15
store volatile double %limit.n74, double* %nlimit39, !tbaa !5
br label %if.else.step78
if.limit.notfloat75: ; preds = %if.not.all.integers68
%36 = call i32 @luaV_tonumber_(%ravi.TValue* %32, double* %nlimit39)
%limit.float.ok76 = icmp eq i32 %36, 0
br i1 %limit.float.ok76, label %if.limit.float.failed77, label %if.else.step78
if.limit.float.failed77: ; preds = %if.limit.notfloat75
call void @luaG_runerror(%ravi.lua_State* %L, i8* getelementptr inbounds ([29 x i8]* @0, i32 0, i32 0))
br label %if.else.step78
if.else.step78: ; preds = %if.limit.float.failed77, %if.limit.notfloat75, %if.limit.isfloat72
%step.tt79 = load i32* %desttype33, !tbaa !17
%step.is.float80 = icmp eq i32 %step.tt79, 3
br i1 %step.is.float80, label %if.step.isfloat81, label %if.step.notfloat84
if.step.isfloat81: ; preds = %if.else.step78
%step.n.ptr82 = getelementptr inbounds %ravi.TValue* %33, i32 0, i32 0, i32 0
%step.n83 = load double* %step.n.ptr82, !tbaa !15
store volatile double %step.n83, double* %nstep41, !tbaa !5
br label %if.else.init87
if.step.notfloat84: ; preds = %if.else.step78
%37 = call i32 @luaV_tonumber_(%ravi.TValue* %33, double* %nstep41)
%step.float.ok85 = icmp eq i32 %37, 0
br i1 %step.float.ok85, label %if.step.float.failed86, label %if.else.init87
if.step.float.failed86: ; preds = %if.step.notfloat84
call void @luaG_runerror(%ravi.lua_State* %L, i8* getelementptr inbounds ([28 x i8]* @1, i32 0, i32 0))
br label %if.else.init87
if.else.init87: ; preds = %if.step.float.failed86, %if.step.notfloat84, %if.step.isfloat81
%init.tt88 = load i32* %desttype25, !tbaa !17
%init.is.float89 = icmp eq i32 %init.tt88, 3
br i1 %init.is.float89, label %if.init.is.float90, label %if.init.not.float93
if.init.is.float90: ; preds = %if.else.init87
%init.n.ptr91 = getelementptr inbounds %ravi.TValue* %31, i32 0, i32 0, i32 0
%init.n92 = load double* %init.n.ptr91, !tbaa !15
store double %init.n92, double* %ninit40, !tbaa !5
br label %if.else.done96
if.init.not.float93: ; preds = %if.else.init87
%38 = call i32 @luaV_tonumber_(%ravi.TValue* %31, double* %ninit40)
%init.float.ok94 = icmp eq i32 %38, 0
br i1 %init.float.ok94, label %if.init.float.failed95, label %if.else.done96
if.init.float.failed95: ; preds = %if.init.not.float93
call void @luaG_runerror(%ravi.lua_State* %L, i8* getelementptr inbounds ([37 x i8]* @2, i32 0, i32 0))
br label %if.else.done96
if.else.done96: ; preds = %if.init.float.failed95, %if.init.not.float93, %if.init.is.float90
%ninit97 = load double* %ninit40, !tbaa !5
%nstep98 = load double* %nstep41, !tbaa !5
%ninit-nstep99 = fsub double %ninit97, %nstep98
store volatile double %ninit-nstep99, double* %ninit40, !tbaa !5
%step.gt.zero100 = fcmp ogt double %nstep98, 0.000000e+00
%.173 = select i1 %step.gt.zero100, i8* blockaddress(@ravif1, %forloop_flt12_), i8* blockaddress(@ravif1, %forloop_fgt12_)
br i1 %step.gt.zero100, label %forloop_flt12_, label %forloop_fgt12_
forbody11_: ; preds = %updatef, %updatei
%39 = phi i32 [ 19, %updatei ], [ 3, %updatef ]
%40 = phi double [ %.pre174, %updatei ], [ %init.n126, %updatef ]
%41 = phi %ravi.TValue* [ %42, %updatei ], [ %44, %updatef ]
%brnch42.2 = phi i8* [ %brnch42.5, %updatei ], [ %brnch42.8, %updatef ]
%iidx38.1 = phi i64 [ %iidx38.4, %updatei ], [ %iidx38.7, %updatef ]
%istep37.1 = phi i64 [ %istep37.4, %updatei ], [ %istep37.7, %updatef ]
%dest.value105 = getelementptr inbounds %ravi.TValue* %41, i32 0, i32 0, i32 0
store double %40, double* %dest.value105, !tbaa !15
%dest.tt107 = getelementptr inbounds %ravi.TValue* %41, i32 0, i32 1
store i32 %39, i32* %dest.tt107, !tbaa !17
indirectbr i8* %brnch42.2, [label %forloop_ilt12_, label %forloop_igt12_, label %forloop_flt12_, label %forloop_fgt12_]
forloop_ilt12_: ; preds = %forbody11_, %if.stopnow.notzero61
%brnch42.3 = phi i8* [ %.172, %if.stopnow.notzero61 ], [ %brnch42.2, %forbody11_ ]
%iidx38.2 = phi i64 [ %initv-pstep.i63, %if.stopnow.notzero61 ], [ %iidx38.1, %forbody11_ ]
%istep37.2 = phi i64 [ %step.i52, %if.stopnow.notzero61 ], [ %istep37.1, %forbody11_ ]
%next.idx = add nsw i64 %istep37.2, %iidx38.2
%limit.i = load i64* %ilimit36, !tbaa !5
%idx.gt.limit = icmp sgt i64 %next.idx, %limit.i
br i1 %idx.gt.limit, label %exit_iforloop, label %updatei
forloop_igt12_: ; preds = %forbody11_, %if.stopnow.notzero61
%brnch42.4 = phi i8* [ %brnch42.2, %forbody11_ ], [ %.172, %if.stopnow.notzero61 ]
%iidx38.3 = phi i64 [ %iidx38.1, %forbody11_ ], [ %initv-pstep.i63, %if.stopnow.notzero61 ]
%istep37.3 = phi i64 [ %istep37.1, %forbody11_ ], [ %step.i52, %if.stopnow.notzero61 ]
%next.idx112 = add nsw i64 %istep37.3, %iidx38.3
%limit.i113 = load i64* %ilimit36, !tbaa !5
%limit.gt.idx = icmp sgt i64 %limit.i113, %next.idx112
br i1 %limit.gt.idx, label %exit_iforloop, label %updatei
updatei: ; preds = %forloop_igt12_, %forloop_ilt12_
%brnch42.5 = phi i8* [ %brnch42.3, %forloop_ilt12_ ], [ %brnch42.4, %forloop_igt12_ ]
%iidx38.4 = phi i64 [ %next.idx, %forloop_ilt12_ ], [ %next.idx112, %forloop_igt12_ ]
%istep37.4 = phi i64 [ %istep37.2, %forloop_ilt12_ ], [ %istep37.3, %forloop_igt12_ ]
%42 = load %ravi.TValue** %base, !tbaa !14
%43 = getelementptr inbounds %ravi.TValue* %42, i32 8
%var.tt.ptr = getelementptr inbounds %ravi.TValue* %42, i32 8, i32 1
%var.i = bitcast %ravi.TValue* %43 to i64*
store i64 %iidx38.4, i64* %var.i, !tbaa !15
store i32 19, i32* %var.tt.ptr, !tbaa !17
%src.value104.phi.trans.insert = getelementptr inbounds %ravi.TValue* %42, i32 8, i32 0, i32 0
%.pre174 = load double* %src.value104.phi.trans.insert, !tbaa !15
br label %forbody11_
forloop_flt12_: ; preds = %forbody11_, %if.else.done96
%brnch42.6 = phi i8* [ %brnch42.2, %forbody11_ ], [ %.173, %if.else.done96 ]
%iidx38.5 = phi i64 [ %iidx38.1, %forbody11_ ], [ %iidx38.0, %if.else.done96 ]
%istep37.5 = phi i64 [ %istep37.1, %forbody11_ ], [ %istep37.0, %if.else.done96 ]
%step.n115 = load double* %nstep41, !tbaa !5
%init.n116 = load double* %ninit40, !tbaa !5
%next.idx117 = fadd double %step.n115, %init.n116
store double %next.idx117, double* %ninit40, !tbaa !5
%limit.n118 = load double* %nlimit39, !tbaa !5
%idx.gt.limit119 = fcmp ogt double %next.idx117, %limit.n118
br i1 %idx.gt.limit119, label %exit_iforloop, label %updatef
forloop_fgt12_: ; preds = %forbody11_, %if.else.done96
%brnch42.7 = phi i8* [ %brnch42.2, %forbody11_ ], [ %.173, %if.else.done96 ]
%iidx38.6 = phi i64 [ %iidx38.1, %forbody11_ ], [ %iidx38.0, %if.else.done96 ]
%istep37.6 = phi i64 [ %istep37.1, %forbody11_ ], [ %istep37.0, %if.else.done96 ]
%step.n120 = load double* %nstep41, !tbaa !5
%init.n121 = load double* %ninit40, !tbaa !5
%next.idx122 = fadd double %step.n120, %init.n121
store double %next.idx122, double* %ninit40, !tbaa !5
%limit.n123 = load double* %nlimit39, !tbaa !5
%limit.gt.idx124 = fcmp ogt double %limit.n123, %next.idx122
br i1 %limit.gt.idx124, label %exit_iforloop, label %updatef
updatef: ; preds = %forloop_fgt12_, %forloop_flt12_
%init.n126 = phi double [ %next.idx122, %forloop_fgt12_ ], [ %next.idx117, %forloop_flt12_ ]
%brnch42.8 = phi i8* [ %brnch42.7, %forloop_fgt12_ ], [ %brnch42.6, %forloop_flt12_ ]
%iidx38.7 = phi i64 [ %iidx38.6, %forloop_fgt12_ ], [ %iidx38.5, %forloop_flt12_ ]
%istep37.7 = phi i64 [ %istep37.6, %forloop_fgt12_ ], [ %istep37.5, %forloop_flt12_ ]
%44 = load %ravi.TValue** %base, !tbaa !14
%var.tt.ptr125 = getelementptr inbounds %ravi.TValue* %44, i32 8, i32 1
%var.n = getelementptr inbounds %ravi.TValue* %44, i32 8, i32 0, i32 0
store double %init.n126, double* %var.n, !tbaa !15
store i32 3, i32* %var.tt.ptr125, !tbaa !17
br label %forbody11_
exit_iforloop: ; preds = %forloop_fgt12_, %forloop_flt12_, %forloop_igt12_, %forloop_ilt12_
%iidx38.8 = phi i64 [ %next.idx, %forloop_ilt12_ ], [ %iidx38.6, %forloop_fgt12_ ], [ %iidx38.5, %forloop_flt12_ ], [ %next.idx112, %forloop_igt12_ ]
%istep37.8 = phi i64 [ %istep37.2, %forloop_ilt12_ ], [ %istep37.6, %forloop_fgt12_ ], [ %istep37.5, %forloop_flt12_ ], [ %istep37.3, %forloop_igt12_ ]
indirectbr i8* %brnch.2, [label %forloop_ilt13_, label %forloop_igt13_, label %forloop_flt13_, label %forloop_fgt13_]
forloop_ilt13_: ; preds = %exit_iforloop, %if.stopnow.notzero
%iidx38.9 = phi i64 [ undef, %if.stopnow.notzero ], [ %iidx38.8, %exit_iforloop ]
%istep.1 = phi i64 [ %step.i, %if.stopnow.notzero ], [ %istep.0, %exit_iforloop ]
%iidx.1 = phi i64 [ %initv-pstep.i, %if.stopnow.notzero ], [ %iidx.0, %exit_iforloop ]
%brnch.3 = phi i8* [ %., %if.stopnow.notzero ], [ %brnch.2, %exit_iforloop ]
%istep37.9 = phi i64 [ undef, %if.stopnow.notzero ], [ %istep37.8, %exit_iforloop ]
%next.idx129 = add nsw i64 %iidx.1, %istep.1
%limit.i130 = load i64* %ilimit, !tbaa !5
%idx.gt.limit131 = icmp sgt i64 %next.idx129, %limit.i130
br i1 %idx.gt.limit131, label %exit_iforloop155, label %updatei137
forloop_igt13_: ; preds = %exit_iforloop, %if.stopnow.notzero
%iidx38.10 = phi i64 [ %iidx38.8, %exit_iforloop ], [ undef, %if.stopnow.notzero ]
%istep.2 = phi i64 [ %istep.0, %exit_iforloop ], [ %step.i, %if.stopnow.notzero ]
%iidx.2 = phi i64 [ %iidx.0, %exit_iforloop ], [ %initv-pstep.i, %if.stopnow.notzero ]
%brnch.4 = phi i8* [ %brnch.2, %exit_iforloop ], [ %., %if.stopnow.notzero ]
%istep37.10 = phi i64 [ %istep37.8, %exit_iforloop ], [ undef, %if.stopnow.notzero ]
%next.idx134 = add nsw i64 %iidx.2, %istep.2
%limit.i135 = load i64* %ilimit, !tbaa !5
%limit.gt.idx136 = icmp sgt i64 %limit.i135, %next.idx134
br i1 %limit.gt.idx136, label %exit_iforloop155, label %updatei137
updatei137: ; preds = %forloop_igt13_, %forloop_ilt13_
%iidx38.11 = phi i64 [ %iidx38.9, %forloop_ilt13_ ], [ %iidx38.10, %forloop_igt13_ ]
%istep.3 = phi i64 [ %istep.1, %forloop_ilt13_ ], [ %istep.2, %forloop_igt13_ ]
%iidx.3 = phi i64 [ %next.idx129, %forloop_ilt13_ ], [ %next.idx134, %forloop_igt13_ ]
%brnch.5 = phi i8* [ %brnch.3, %forloop_ilt13_ ], [ %brnch.4, %forloop_igt13_ ]
%istep37.11 = phi i64 [ %istep37.9, %forloop_ilt13_ ], [ %istep37.10, %forloop_igt13_ ]
%45 = load %ravi.TValue** %base, !tbaa !14
%46 = getelementptr inbounds %ravi.TValue* %45, i32 4
%var.tt.ptr138 = getelementptr inbounds %ravi.TValue* %45, i32 4, i32 1
%var.i139 = bitcast %ravi.TValue* %46 to i64*
store i64 %iidx.3, i64* %var.i139, !tbaa !15
store i32 19, i32* %var.tt.ptr138, !tbaa !17
%src.value.phi.trans.insert = getelementptr inbounds %ravi.TValue* %45, i32 4, i32 0, i32 0
%.pre = load double* %src.value.phi.trans.insert, !tbaa !15
br label %forbody6_
forloop_flt13_: ; preds = %exit_iforloop, %if.else.done
%iidx38.12 = phi i64 [ %iidx38.8, %exit_iforloop ], [ undef, %if.else.done ]
%istep.4 = phi i64 [ %istep.0, %exit_iforloop ], [ undef, %if.else.done ]
%iidx.4 = phi i64 [ %iidx.0, %exit_iforloop ], [ undef, %if.else.done ]
%brnch.6 = phi i8* [ %brnch.2, %exit_iforloop ], [ %.171, %if.else.done ]
%istep37.12 = phi i64 [ %istep37.8, %exit_iforloop ], [ undef, %if.else.done ]
%step.n141 = load double* %nstep, !tbaa !5
%init.n142 = load double* %ninit, !tbaa !5
%next.idx143 = fadd double %step.n141, %init.n142
store double %next.idx143, double* %ninit, !tbaa !5
%limit.n144 = load double* %nlimit, !tbaa !5
%idx.gt.limit145 = fcmp ogt double %next.idx143, %limit.n144
br i1 %idx.gt.limit145, label %exit_iforloop155, label %updatef151
forloop_fgt13_: ; preds = %exit_iforloop, %if.else.done
%iidx38.13 = phi i64 [ %iidx38.8, %exit_iforloop ], [ undef, %if.else.done ]
%istep.5 = phi i64 [ %istep.0, %exit_iforloop ], [ undef, %if.else.done ]
%iidx.5 = phi i64 [ %iidx.0, %exit_iforloop ], [ undef, %if.else.done ]
%brnch.7 = phi i8* [ %brnch.2, %exit_iforloop ], [ %.171, %if.else.done ]
%istep37.13 = phi i64 [ %istep37.8, %exit_iforloop ], [ undef, %if.else.done ]
%step.n146 = load double* %nstep, !tbaa !5
%init.n147 = load double* %ninit, !tbaa !5
%next.idx148 = fadd double %step.n146, %init.n147
store double %next.idx148, double* %ninit, !tbaa !5
%limit.n149 = load double* %nlimit, !tbaa !5
%limit.gt.idx150 = fcmp ogt double %limit.n149, %next.idx148
br i1 %limit.gt.idx150, label %exit_iforloop155, label %updatef151
updatef151: ; preds = %forloop_fgt13_, %forloop_flt13_
%init.n154 = phi double [ %next.idx148, %forloop_fgt13_ ], [ %next.idx143, %forloop_flt13_ ]
%iidx38.14 = phi i64 [ %iidx38.13, %forloop_fgt13_ ], [ %iidx38.12, %forloop_flt13_ ]
%istep.6 = phi i64 [ %istep.5, %forloop_fgt13_ ], [ %istep.4, %forloop_flt13_ ]
%iidx.6 = phi i64 [ %iidx.5, %forloop_fgt13_ ], [ %iidx.4, %forloop_flt13_ ]
%brnch.8 = phi i8* [ %brnch.7, %forloop_fgt13_ ], [ %brnch.6, %forloop_flt13_ ]
%istep37.14 = phi i64 [ %istep37.13, %forloop_fgt13_ ], [ %istep37.12, %forloop_flt13_ ]
%47 = load %ravi.TValue** %base, !tbaa !14
%var.tt.ptr152 = getelementptr inbounds %ravi.TValue* %47, i32 4, i32 1
%var.n153 = getelementptr inbounds %ravi.TValue* %47, i32 4, i32 0, i32 0
store double %init.n154, double* %var.n153, !tbaa !15
store i32 3, i32* %var.tt.ptr152, !tbaa !17
br label %forbody6_
exit_iforloop155: ; preds = %forloop_fgt13_, %forloop_flt13_, %forloop_igt13_, %forloop_ilt13_
%48 = load %ravi.TValue** %base, !tbaa !14
%49 = getelementptr inbounds %ravi.TValue* %48, i32 1
%L_top = getelementptr inbounds %ravi.lua_State* %L, i32 0, i32 4
store %ravi.TValue* %49, %ravi.TValue** %L_top, !tbaa !18
%sizep = getelementptr inbounds %ravi.Proto* %4, i32 0, i32 10
%50 = load i32* %sizep
%51 = icmp sgt i32 %50, 0
br i1 %51, label %if.then, label %if.else
if.then: ; preds = %exit_iforloop155
call void @luaF_close(%ravi.lua_State* %L, %ravi.TValue* %48)
br label %if.else
if.else: ; preds = %if.then, %exit_iforloop155
%52 = call i32 @luaD_poscall(%ravi.lua_State* %L, %ravi.TValue* %48)
%53 = icmp eq i32 %52, 0
br i1 %53, label %if.else157, label %if.then156
if.then156: ; preds = %if.else
%ci_top = getelementptr inbounds %ravi.CallInfo* %0, i32 0, i32 1
%54 = load %ravi.TValue** %ci_top
store %ravi.TValue* %54, %ravi.TValue** %L_top
br label %if.else157
if.else157: ; preds = %if.else, %if.then156
ret i32 1
}
declare i32 @luaD_poscall(%ravi.lua_State*, %ravi.TValue*)
declare void @luaF_close(%ravi.lua_State*, %ravi.TValue*)
declare void @luaG_runerror(%ravi.lua_State*, i8*)
declare i32 @luaV_forlimit(%ravi.TValue*, i64*, i64, i32*)
declare i32 @luaV_tonumber_(%ravi.TValue*, double*)
!0 = !{!"CallInfo", !1, i64 0, !1, i64 4, !1, i64 8, !1, i64 12, !4, i64 16, !5, i64 32, !6, i64 40, !2, i64 42}
!1 = !{!"any pointer", !2, i64 0}
!2 = !{!"omnipotent char", !3, i64 0}
!3 = !{!"Simple C / C++ TBAA"}
!4 = !{!"CallInfo_l", !1, i64 0, !1, i64 4, !5, i64 8}
!5 = !{!"long long", !2, i64 0}
!6 = !{!"short", !2, i64 0}
!7 = !{!0, !1, i64 0}
!8 = !{!1, !1, i64 0}
!9 = !{!10, !1, i64 12}
!10 = !{!"LClosure", !1, i64 0, !2, i64 4, !2, i64 5, !2, i64 6, !1, i64 8, !1, i64 12, !2, i64 16}
!11 = !{!12, !1, i64 44}
!12 = !{!"Proto", !1, i64 0, !2, i64 4, !2, i64 5, !2, i64 6, !2, i64 7, !2, i64 8, !13, i64 12, !13, i64 16, !13, i64 20, !13, i64 24, !13, i64 28, !13, i64 32, !13, i64 36, !13, i64 40, !1, i64 44, !1, i64 48, !1, i64 52, !1, i64 56, !1, i64 60, !1, i64 64, !1, i64 68, !1, i64 72, !1, i64 76}
!13 = !{!"int", !2, i64 0}
!14 = !{!0, !1, i64 16}
!15 = !{!16, !5, i64 0}
!16 = !{!"TValue", !5, i64 0, !13, i64 8}
!17 = !{!16, !13, i64 8}
!18 = !{!19, !1, i64 8}
!19 = !{!"lua_State", !1, i64 0, !2, i64 4, !2, i64 5, !2, i64 6, !1, i64 8, !1, i64 12, !1, i64 16, !1, i64 20, !1, i64 24, !1, i64 28, !1, i64 32, !1, i64 36, !1, i64 40, !1, i64 44, !0, i64 48, !1, i64 92, !5, i64 96, !13, i64 104, !13, i64 108, !13, i64 112, !6, i64 114, !6, i64 116, !2, i64 118, !2, i64 119}

@ -0,0 +1,21 @@
local function x()
local j = 0.0
for i=2.0,1000000000.0 do
j = i
for k=3,5 do
j = k
end
end
return j
end
x()
local t1 = os.clock()
local y = x();
local t2 = os.clock()
print(y)
assert(y == 5.0)
print("time taken ", t2-t1);

@ -338,12 +338,20 @@ void RaviCodeGenerator::compile(lua_State *L, Proto *p) {
case OP_FORPREP: {
int sbx = GETARG_sBx(i);
int j = sbx + pc + 1;
#if RAVI_CODEGEN_FORPREP2
emit_FORPREP2(&def, L_ci, proto, A, j);
#else
emit_FORPREP(&def, L_ci, proto, A, j);
#endif
} break;
case OP_FORLOOP: {
int sbx = GETARG_sBx(i);
int j = sbx + pc + 1;
#if RAVI_CODEGEN_FORPREP2
emit_FORLOOP2(&def, L_ci, proto, A, j, def.jmp_targets[pc]);
#else
emit_FORLOOP(&def, L_ci, proto, A, j);
#endif
} break;
case OP_LOADNIL: {
int B = GETARG_B(i);
@ -403,7 +411,7 @@ void RaviCodeGenerator::scan_jump_targets(RaviFunctionDef *def, Proto *p) {
else if (op == OP_FORLOOP)
targetname = "forbody";
else if (op == OP_FORPREP)
targetname = "forloop";
targetname = "forloop_ilt";
else
targetname = "tforbody";
int sbx = GETARG_sBx(i);
@ -411,17 +419,22 @@ void RaviCodeGenerator::scan_jump_targets(RaviFunctionDef *def, Proto *p) {
snprintf(temp, sizeof temp, "%s%d_", targetname, j + 1);
def->jmp_targets[j].jmp1 =
llvm::BasicBlock::Create(def->jitState->context(), temp);
#if RAVI_CODEGEN_FORPREP2
if (op == OP_FORPREP) {
// Second target is for int > limit
snprintf(temp, sizeof temp, "%s%d_", "forloop_igt", j + 1);
def->jmp_targets[j].jmp2 =
llvm::BasicBlock::Create(def->jitState->context(), "forloop_igt");
llvm::BasicBlock::Create(def->jitState->context(), temp);
// Third target is for float < limit
snprintf(temp, sizeof temp, "%s%d_", "forloop_flt", j + 1);
def->jmp_targets[j].jmp3 =
llvm::BasicBlock::Create(def->jitState->context(), "forloop_flt");
llvm::BasicBlock::Create(def->jitState->context(), temp);
// Fourth target is for flot > limit
snprintf(temp, sizeof temp, "%s%d_", "forloop_fgt", j + 1);
def->jmp_targets[j].jmp4 =
llvm::BasicBlock::Create(def->jitState->context(), "forloop_fgt");
llvm::BasicBlock::Create(def->jitState->context(), temp);
}
#endif
} break;
default:
break;

@ -2,208 +2,248 @@
namespace ravi {
void RaviCodeGenerator::emit_FORLOOP2(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Value *proto, int A, int pc, RaviBranchDef& b) {
// 7[1] FORLOOP 1 - 2; to 6
//if (ttisinteger(ra)) { /* integer loop? */
// lua_Integer step = ivalue(ra + 2);
// lua_Integer idx = ivalue(ra) + step; /* increment index */
// lua_Integer limit = ivalue(ra + 1);
// if ((0 < step) ? (idx <= limit) : (limit <= idx)) {
// ci->u.l.savedpc += GETARG_sBx(i); /* jump back */
// setivalue(ra, idx); /* update internal index... */
// setivalue(ra + 3, idx); /* ...and external index */
// }
//}
//else { /* floating loop */
// lua_Number step = fltvalue(ra + 2);
// lua_Number idx = luai_numadd(L, fltvalue(ra), step); /* inc. index */
// lua_Number limit = fltvalue(ra + 1);
// if (luai_numlt(0, step) ? luai_numle(idx, limit)
// : luai_numle(limit, idx)) {
// ci->u.l.savedpc += GETARG_sBx(i); /* jump back */
// setfltvalue(ra, idx); /* update internal index... */
// setfltvalue(ra + 3, idx); /* ...and external index */
// }
//}
// We are in b.jmp1 as this is already the current block
lua_assert(def->builder->GetInsertBlock() == b.jmp1);
// Obtain pointers to the value.i field
llvm::Value *step_int_ptr = b.istep;
llvm::Value *idx_int_ptr = b.iidx;
llvm::Value *limit_int_ptr = b.ilimit;
// Obtain pointers to the value.n field
llvm::Value *step_double_ptr = b.fstep;
llvm::Value *idx_double_ptr = b.fidx;
llvm::Value *limit_double_ptr = b.flimit;
// Create the done block
llvm::BasicBlock *exit_block = llvm::BasicBlock::Create(def->jitState->context(), "exit_iforloop");
// INTEGER CASE
// lua_Integer step = ivalue(ra + 2);
llvm::Instruction *step_int_value = def->builder->CreateLoad(step_int_ptr, "step.i");
step_int_value->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_longlongT);
// lua_Integer idx = ivalue(ra) + step; /* increment index */
llvm::Instruction *idx_int_value = def->builder->CreateLoad(idx_int_ptr, "init.i");
idx_int_value->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_longlongT);
llvm::Value *new_idx = def->builder->CreateAdd(step_int_value, idx_int_value, "next.idx", false, true);
llvm::Instruction *idx_store = def->builder->CreateStore(new_idx, idx_int_ptr);
idx_store->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_longlongT);
// lua_Integer limit = ivalue(ra + 1);
llvm::Instruction *limit_int_value = def->builder->CreateLoad(limit_int_ptr, "limit.i");
limit_int_value->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_longlongT);
// idx > limit?
llvm::Value *new_idx_gt_limit = def->builder->CreateICmpSGT(new_idx, limit_int_value, "idx.gt.limit");
// If idx > limit we are done
llvm::BasicBlock *update_block = llvm::BasicBlock::Create(
def->jitState->context(), "updatei");
def->builder->CreateCondBr(new_idx_gt_limit, exit_block, update_block);
// NOW INTEGER step < 0
def->f->getBasicBlockList().push_back(b.jmp2);
def->builder->SetInsertPoint(b.jmp2);
step_int_value = def->builder->CreateLoad(step_int_ptr, "step.i");
step_int_value->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_longlongT);
// lua_Integer idx = ivalue(ra) + step; /* increment index */
idx_int_value = def->builder->CreateLoad(idx_int_ptr, "init.i");
idx_int_value->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_longlongT);
new_idx = def->builder->CreateAdd(step_int_value, idx_int_value, "next.idx", false, true);
idx_store = def->builder->CreateStore(new_idx, idx_int_ptr);
idx_store->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_longlongT);
// lua_Integer limit = ivalue(ra + 1);
limit_int_value = def->builder->CreateLoad(limit_int_ptr, "limit.i");
limit_int_value->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_longlongT);
// limit > idx?
llvm::Value *limit_gt_idx = def->builder->CreateICmpSGT(limit_int_value, new_idx, "limit.gt.idx");
// If limit > idx we are done
def->builder->CreateCondBr(limit_gt_idx, exit_block, update_block);
// Merge into update block
def->f->getBasicBlockList().push_back(update_block);
def->builder->SetInsertPoint(update_block);
llvm::Instruction *base_ptr = def->builder->CreateLoad(def->Ci_base);
base_ptr->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_luaState_ci_baseT);
llvm::Value *rvar = emit_array_get(def, base_ptr, A + 3);
llvm::Value *rvar_tt_ptr = emit_gep(def, "var.tt.ptr", rvar, 0, 1);
llvm::Value *var_int_ptr = def->builder->CreateBitCast(rvar, def->types->plua_IntegerT, "var.i");
// setivalue(ra + 3, idx); /* ...and external index */
idx_int_value = def->builder->CreateLoad(idx_int_ptr, "init.i");
idx_int_value->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_longlongT);
idx_store = def->builder->CreateStore(idx_int_value, var_int_ptr);
idx_store->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_nT);
llvm::Instruction *idx_tt_store = def->builder->CreateStore(def->types->kInt[LUA_TNUMINT], rvar_tt_ptr);
idx_tt_store->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_ttT);
// ci->u.l.savedpc += GETARG_sBx(i); /* jump back */
def->builder->CreateBr(def->jmp_targets[pc].jmp1);
// FLOATING CASE
def->f->getBasicBlockList().push_back(b.jmp3);
def->builder->SetInsertPoint(b.jmp3);
// lua_Number step = fltvalue(ra + 2);
llvm::Instruction *step_double_value = def->builder->CreateLoad(step_double_ptr, "step.n");
step_double_value->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_longlongT);
// lua_Number idx = luai_numadd(L, fltvalue(ra), step); /* inc. index */
llvm::Instruction *idx_double_value = def->builder->CreateLoad(idx_double_ptr, "init.n");
idx_double_value->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_longlongT);
new_idx = def->builder->CreateFAdd(step_double_value, idx_double_value, "next.idx");
idx_store = def->builder->CreateStore(new_idx, idx_double_ptr);
idx_store->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_longlongT);
// lua_Number limit = fltvalue(ra + 1);
llvm::Instruction *limit_double_value = def->builder->CreateLoad(limit_double_ptr, "limit.n");
limit_double_value->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_longlongT);
// step > 0?
// idx > limit?
new_idx_gt_limit = def->builder->CreateFCmpOGT(new_idx, limit_double_value, "idx.gt.limit");
// If idx > limit we are done
update_block = llvm::BasicBlock::Create(
def->jitState->context(), "updatef");
def->builder->CreateCondBr(new_idx_gt_limit, exit_block, update_block);
def->f->getBasicBlockList().push_back(b.jmp4);
def->builder->SetInsertPoint(b.jmp4);
// lua_Number step = fltvalue(ra + 2);
step_double_value = def->builder->CreateLoad(step_double_ptr, "step.n");
step_double_value->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_longlongT);
// lua_Number idx = luai_numadd(L, fltvalue(ra), step); /* inc. index */
idx_double_value = def->builder->CreateLoad(idx_double_ptr, "init.n");
idx_double_value->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_longlongT);
new_idx = def->builder->CreateFAdd(step_double_value, idx_double_value, "next.idx");
idx_store = def->builder->CreateStore(new_idx, idx_double_ptr);
idx_store->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_longlongT);
// lua_Number limit = fltvalue(ra + 1);
limit_double_value = def->builder->CreateLoad(limit_double_ptr, "limit.n");
limit_double_value->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_longlongT);
// limit > idx?
limit_gt_idx = def->builder->CreateFCmpOGT(limit_double_value, new_idx, "limit.gt.idx");
// If limit > idx we are done
def->builder->CreateCondBr(limit_gt_idx, exit_block, update_block);
void RaviCodeGenerator::emit_FORLOOP2(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Value *proto, int A, int pc,
RaviBranchDef &b) {
// Merge into update block
def->f->getBasicBlockList().push_back(update_block);
def->builder->SetInsertPoint(update_block);
base_ptr = def->builder->CreateLoad(def->Ci_base);
base_ptr->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_luaState_ci_baseT);
rvar = emit_array_get(def, base_ptr, A + 3);
rvar_tt_ptr = emit_gep(def, "var.tt.ptr", rvar, 0, 1);
llvm::Value *var_double_ptr = def->builder->CreateBitCast(rvar, def->types->plua_NumberT, "var.n");
// setfltvalue(ra + 3, idx); /* ...and external index */
idx_double_value = def->builder->CreateLoad(idx_double_ptr, "init.n");
idx_double_value->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_longlongT);
idx_store = def->builder->CreateStore(idx_double_value, var_double_ptr);
idx_store->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_nT);
idx_tt_store = def->builder->CreateStore(def->types->kInt[LUA_TNUMFLT], rvar_tt_ptr);
idx_tt_store->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_ttT);
// ci->u.l.savedpc += GETARG_sBx(i); /* jump back */
def->builder->CreateBr(def->jmp_targets[pc].jmp1);
def->f->getBasicBlockList().push_back(exit_block);
def->builder->SetInsertPoint(exit_block);
//def->f->dump();
//assert(false);
}
// 7[1] FORLOOP 1 - 2; to 6
// if (ttisinteger(ra)) { /* integer loop? */
// lua_Integer step = ivalue(ra + 2);
// lua_Integer idx = ivalue(ra) + step; /* increment index */
// lua_Integer limit = ivalue(ra + 1);
// if ((0 < step) ? (idx <= limit) : (limit <= idx)) {
// ci->u.l.savedpc += GETARG_sBx(i); /* jump back */
// setivalue(ra, idx); /* update internal index... */
// setivalue(ra + 3, idx); /* ...and external index */
// }
//}
// else { /* floating loop */
// lua_Number step = fltvalue(ra + 2);
// lua_Number idx = luai_numadd(L, fltvalue(ra), step); /* inc. index */
// lua_Number limit = fltvalue(ra + 1);
// if (luai_numlt(0, step) ? luai_numle(idx, limit)
// : luai_numle(limit, idx)) {
// ci->u.l.savedpc += GETARG_sBx(i); /* jump back */
// setfltvalue(ra, idx); /* update internal index... */
// setfltvalue(ra + 3, idx); /* ...and external index */
// }
//}
// We are in b.jmp1 as this is already the current block
lua_assert(def->builder->GetInsertBlock() == b.jmp1);
// Obtain pointers to the value.i field
llvm::Value *step_int_ptr = b.istep;
llvm::Value *idx_int_ptr = b.iidx;
llvm::Value *limit_int_ptr = b.ilimit;
// Obtain pointers to the value.n field
llvm::Value *step_double_ptr = b.fstep;
llvm::Value *idx_double_ptr = b.fidx;
llvm::Value *limit_double_ptr = b.flimit;
// Create the done block
llvm::BasicBlock *exit_block =
llvm::BasicBlock::Create(def->jitState->context(), "exit_iforloop");
// INTEGER CASE
// lua_Integer step = ivalue(ra + 2);
llvm::Instruction *step_int_value =
def->builder->CreateLoad(step_int_ptr, "step.i");
step_int_value->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_longlongT);
// lua_Integer idx = ivalue(ra) + step; /* increment index */
llvm::Instruction *idx_int_value =
def->builder->CreateLoad(idx_int_ptr, "init.i");
idx_int_value->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_longlongT);
llvm::Value *new_idx = def->builder->CreateAdd(step_int_value, idx_int_value,
"next.idx", false, true);
llvm::Instruction *idx_store =
def->builder->CreateStore(new_idx, idx_int_ptr);
idx_store->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_longlongT);
// lua_Integer limit = ivalue(ra + 1);
llvm::Instruction *limit_int_value =
def->builder->CreateLoad(limit_int_ptr, "limit.i");
limit_int_value->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_longlongT);
// idx > limit?
llvm::Value *new_idx_gt_limit =
def->builder->CreateICmpSGT(new_idx, limit_int_value, "idx.gt.limit");
// If idx > limit we are done
llvm::BasicBlock *update_block =
llvm::BasicBlock::Create(def->jitState->context(), "updatei");
def->builder->CreateCondBr(new_idx_gt_limit, exit_block, update_block);
// NOW INTEGER step < 0
def->f->getBasicBlockList().push_back(b.jmp2);
def->builder->SetInsertPoint(b.jmp2);
step_int_value = def->builder->CreateLoad(step_int_ptr, "step.i");
step_int_value->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_longlongT);
// lua_Integer idx = ivalue(ra) + step; /* increment index */
idx_int_value = def->builder->CreateLoad(idx_int_ptr, "init.i");
idx_int_value->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_longlongT);
new_idx = def->builder->CreateAdd(step_int_value, idx_int_value, "next.idx",
false, true);
idx_store = def->builder->CreateStore(new_idx, idx_int_ptr);
idx_store->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_longlongT);
// lua_Integer limit = ivalue(ra + 1);
limit_int_value = def->builder->CreateLoad(limit_int_ptr, "limit.i");
limit_int_value->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_longlongT);
// limit > idx?
llvm::Value *limit_gt_idx =
def->builder->CreateICmpSGT(limit_int_value, new_idx, "limit.gt.idx");
// If limit > idx we are done
def->builder->CreateCondBr(limit_gt_idx, exit_block, update_block);
// Merge into update block
def->f->getBasicBlockList().push_back(update_block);
def->builder->SetInsertPoint(update_block);
llvm::Instruction *base_ptr = def->builder->CreateLoad(def->Ci_base);
base_ptr->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_luaState_ci_baseT);
llvm::Value *rvar = emit_array_get(def, base_ptr, A + 3);
llvm::Value *rvar_tt_ptr = emit_gep(def, "var.tt.ptr", rvar, 0, 1);
llvm::Value *var_int_ptr =
def->builder->CreateBitCast(rvar, def->types->plua_IntegerT, "var.i");
// setivalue(ra + 3, idx); /* ...and external index */
idx_int_value = def->builder->CreateLoad(idx_int_ptr, "init.i");
idx_int_value->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_longlongT);
idx_store = def->builder->CreateStore(idx_int_value, var_int_ptr);
idx_store->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_TValue_nT);
llvm::Instruction *idx_tt_store =
def->builder->CreateStore(def->types->kInt[LUA_TNUMINT], rvar_tt_ptr);
idx_tt_store->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_TValue_ttT);
// ci->u.l.savedpc += GETARG_sBx(i); /* jump back */
def->builder->CreateBr(def->jmp_targets[pc].jmp1);
// FLOATING CASE
def->f->getBasicBlockList().push_back(b.jmp3);
def->builder->SetInsertPoint(b.jmp3);
// lua_Number step = fltvalue(ra + 2);
llvm::Instruction *step_double_value =
def->builder->CreateLoad(step_double_ptr, "step.n");
step_double_value->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_longlongT);
// lua_Number idx = luai_numadd(L, fltvalue(ra), step); /* inc. index */
llvm::Instruction *idx_double_value =
def->builder->CreateLoad(idx_double_ptr, "init.n");
idx_double_value->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_longlongT);
new_idx =
def->builder->CreateFAdd(step_double_value, idx_double_value, "next.idx");
idx_store = def->builder->CreateStore(new_idx, idx_double_ptr);
idx_store->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_longlongT);
// lua_Number limit = fltvalue(ra + 1);
llvm::Instruction *limit_double_value =
def->builder->CreateLoad(limit_double_ptr, "limit.n");
limit_double_value->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_longlongT);
// step > 0?
// idx > limit?
new_idx_gt_limit =
def->builder->CreateFCmpOGT(new_idx, limit_double_value, "idx.gt.limit");
// If idx > limit we are done
update_block = llvm::BasicBlock::Create(def->jitState->context(), "updatef");
def->builder->CreateCondBr(new_idx_gt_limit, exit_block, update_block);
def->f->getBasicBlockList().push_back(b.jmp4);
def->builder->SetInsertPoint(b.jmp4);
// lua_Number step = fltvalue(ra + 2);
step_double_value = def->builder->CreateLoad(step_double_ptr, "step.n");
step_double_value->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_longlongT);
// lua_Number idx = luai_numadd(L, fltvalue(ra), step); /* inc. index */
idx_double_value = def->builder->CreateLoad(idx_double_ptr, "init.n");
idx_double_value->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_longlongT);
new_idx =
def->builder->CreateFAdd(step_double_value, idx_double_value, "next.idx");
idx_store = def->builder->CreateStore(new_idx, idx_double_ptr);
idx_store->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_longlongT);
// lua_Number limit = fltvalue(ra + 1);
limit_double_value = def->builder->CreateLoad(limit_double_ptr, "limit.n");
limit_double_value->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_longlongT);
// limit > idx?
limit_gt_idx =
def->builder->CreateFCmpOGT(limit_double_value, new_idx, "limit.gt.idx");
// If limit > idx we are done
def->builder->CreateCondBr(limit_gt_idx, exit_block, update_block);
// Merge into update block
def->f->getBasicBlockList().push_back(update_block);
def->builder->SetInsertPoint(update_block);
base_ptr = def->builder->CreateLoad(def->Ci_base);
base_ptr->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_luaState_ci_baseT);
rvar = emit_array_get(def, base_ptr, A + 3);
rvar_tt_ptr = emit_gep(def, "var.tt.ptr", rvar, 0, 1);
llvm::Value *var_double_ptr =
def->builder->CreateBitCast(rvar, def->types->plua_NumberT, "var.n");
// setfltvalue(ra + 3, idx); /* ...and external index */
idx_double_value = def->builder->CreateLoad(idx_double_ptr, "init.n");
idx_double_value->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_longlongT);
idx_store = def->builder->CreateStore(idx_double_value, var_double_ptr);
idx_store->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_TValue_nT);
idx_tt_store =
def->builder->CreateStore(def->types->kInt[LUA_TNUMFLT], rvar_tt_ptr);
idx_tt_store->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_TValue_ttT);
// ci->u.l.savedpc += GETARG_sBx(i); /* jump back */
def->builder->CreateBr(def->jmp_targets[pc].jmp1);
def->f->getBasicBlockList().push_back(exit_block);
def->builder->SetInsertPoint(exit_block);
// def->f->dump();
// assert(false);
}
void RaviCodeGenerator::emit_FORLOOP(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Value *proto, int A, int pc) {
// 7[1] FORLOOP 1 - 2; to 6
//if (ttisinteger(ra)) { /* integer loop? */
// if (ttisinteger(ra)) { /* integer loop? */
// lua_Integer step = ivalue(ra + 2);
// lua_Integer idx = ivalue(ra) + step; /* increment index */
// lua_Integer limit = ivalue(ra + 1);
@ -213,7 +253,7 @@ void RaviCodeGenerator::emit_FORLOOP(RaviFunctionDef *def, llvm::Value *L_ci,
// setivalue(ra + 3, idx); /* ...and external index */
// }
//}
//else { /* floating loop */
// else { /* floating loop */
// lua_Number step = fltvalue(ra + 2);
// lua_Number idx = luai_numadd(L, fltvalue(ra), step); /* inc. index */
// lua_Number limit = fltvalue(ra + 1);
@ -228,7 +268,7 @@ void RaviCodeGenerator::emit_FORLOOP(RaviFunctionDef *def, llvm::Value *L_ci,
// Load pointer to base
llvm::Instruction *base_ptr = def->builder->CreateLoad(def->Ci_base);
base_ptr->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_luaState_ci_baseT);
def->types->tbaa_luaState_ci_baseT);
// TValue *rinit = ra;
// TValue *rlimit = ra + 1;
@ -246,71 +286,92 @@ void RaviCodeGenerator::emit_FORLOOP(RaviFunctionDef *def, llvm::Value *L_ci,
llvm::Value *rvar_tt_ptr = emit_gep(def, "var.tt.ptr", rvar, 0, 1);
// Obtain pointers to the value.i field
llvm::Value *step_int_ptr = def->builder->CreateBitCast(rstep, def->types->plua_IntegerT, "step.i");
llvm::Value *idx_int_ptr = def->builder->CreateBitCast(rinit, def->types->plua_IntegerT, "init.i");
llvm::Value *limit_int_ptr = def->builder->CreateBitCast(rlimit, def->types->plua_IntegerT, "limit.i");
llvm::Value *var_int_ptr = def->builder->CreateBitCast(rvar, def->types->plua_IntegerT, "var.i");
llvm::Value *step_int_ptr =
def->builder->CreateBitCast(rstep, def->types->plua_IntegerT, "step.i");
llvm::Value *idx_int_ptr =
def->builder->CreateBitCast(rinit, def->types->plua_IntegerT, "init.i");
llvm::Value *limit_int_ptr =
def->builder->CreateBitCast(rlimit, def->types->plua_IntegerT, "limit.i");
llvm::Value *var_int_ptr =
def->builder->CreateBitCast(rvar, def->types->plua_IntegerT, "var.i");
// Obtain pointers to the value.n field
llvm::Value *step_double_ptr = def->builder->CreateBitCast(rstep, def->types->plua_NumberT, "step.n");
llvm::Value *idx_double_ptr = def->builder->CreateBitCast(rinit, def->types->plua_NumberT, "init.n");
llvm::Value *limit_double_ptr = def->builder->CreateBitCast(rlimit, def->types->plua_NumberT, "limit.n");
llvm::Value *var_double_ptr = def->builder->CreateBitCast(rvar, def->types->plua_NumberT, "var.n");
llvm::Value *step_double_ptr =
def->builder->CreateBitCast(rstep, def->types->plua_NumberT, "step.n");
llvm::Value *idx_double_ptr =
def->builder->CreateBitCast(rinit, def->types->plua_NumberT, "init.n");
llvm::Value *limit_double_ptr =
def->builder->CreateBitCast(rlimit, def->types->plua_NumberT, "limit.n");
llvm::Value *var_double_ptr =
def->builder->CreateBitCast(rvar, def->types->plua_NumberT, "var.n");
// Create the done block
llvm::BasicBlock *exit_block = llvm::BasicBlock::Create(def->jitState->context(), "exit_forloop");
llvm::BasicBlock *exit_block =
llvm::BasicBlock::Create(def->jitState->context(), "exit_forloop");
// Is index an integer?
llvm::Instruction *rinit_tt = def->builder->CreateLoad(rinit_tt_ptr);
rinit_tt->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_ttT);
llvm::Value *cmp1 =
def->builder->CreateICmpEQ(rinit_tt, def->types->kInt[LUA_TNUMINT], "is.integer");
rinit_tt->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_TValue_ttT);
llvm::Value *cmp1 = def->builder->CreateICmpEQ(
rinit_tt, def->types->kInt[LUA_TNUMINT], "is.integer");
// Setup if then else branch for integer
llvm::BasicBlock *if_integer = llvm::BasicBlock::Create(
def->jitState->context(), "if.integer", def->f);
llvm::BasicBlock *if_integer =
llvm::BasicBlock::Create(def->jitState->context(), "if.integer", def->f);
llvm::BasicBlock *else_integer =
llvm::BasicBlock::Create(def->jitState->context(), "if.not.integer");
llvm::BasicBlock::Create(def->jitState->context(), "if.not.integer");
def->builder->CreateCondBr(cmp1, if_integer, else_integer);
def->builder->SetInsertPoint(if_integer);
// INTEGER CASE
// lua_Integer step = ivalue(ra + 2);
llvm::Instruction *step_int_value = def->builder->CreateLoad(step_int_ptr, "step.i");
step_int_value->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_nT);
llvm::Instruction *step_int_value =
def->builder->CreateLoad(step_int_ptr, "step.i");
step_int_value->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_TValue_nT);
// lua_Integer idx = ivalue(ra) + step; /* increment index */
llvm::Instruction *idx_int_value = def->builder->CreateLoad(idx_int_ptr, "init.i");
idx_int_value->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_nT);
llvm::Value *new_idx = def->builder->CreateAdd(step_int_value, idx_int_value, "next.idx", false, true);
llvm::Instruction *idx_int_value =
def->builder->CreateLoad(idx_int_ptr, "init.i");
idx_int_value->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_TValue_nT);
llvm::Value *new_idx = def->builder->CreateAdd(step_int_value, idx_int_value,
"next.idx", false, true);
// lua_Integer limit = ivalue(ra + 1);
llvm::Instruction *limit_int_value = def->builder->CreateLoad(limit_int_ptr, "limit.i");
limit_int_value->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_nT);
llvm::Instruction *limit_int_value =
def->builder->CreateLoad(limit_int_ptr, "limit.i");
limit_int_value->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_TValue_nT);
// step > 0?
llvm::Value *step_gt_zero = def->builder->CreateICmpSGT(step_int_value, def->types->kluaInteger[0], "step.gt.zero");
llvm::Value *step_gt_zero = def->builder->CreateICmpSGT(
step_int_value, def->types->kluaInteger[0], "step.gt.zero");
llvm::BasicBlock *step_gt_zero_true = llvm::BasicBlock::Create(
def->jitState->context(), "step.gt.zero.true", def->f);
def->jitState->context(), "step.gt.zero.true", def->f);
llvm::BasicBlock *step_gt_zero_false =
llvm::BasicBlock::Create(def->jitState->context(), "step.gt.zero.false");
def->builder->CreateCondBr(step_gt_zero, step_gt_zero_true, step_gt_zero_false);
llvm::BasicBlock::Create(def->jitState->context(), "step.gt.zero.false");
def->builder->CreateCondBr(step_gt_zero, step_gt_zero_true,
step_gt_zero_false);
def->builder->SetInsertPoint(step_gt_zero_true);
// idx > limit?
llvm::Value *new_idx_gt_limit = def->builder->CreateICmpSGT(new_idx, limit_int_value, "idx.gt.limit");
llvm::Value *new_idx_gt_limit =
def->builder->CreateICmpSGT(new_idx, limit_int_value, "idx.gt.limit");
// If idx > limit we are done
llvm::BasicBlock *update_block = llvm::BasicBlock::Create(
def->jitState->context(), "update");
llvm::BasicBlock *update_block =
llvm::BasicBlock::Create(def->jitState->context(), "update");
def->builder->CreateCondBr(new_idx_gt_limit, exit_block, update_block);
def->f->getBasicBlockList().push_back(step_gt_zero_false);
def->builder->SetInsertPoint(step_gt_zero_false);
// limit > idx?
llvm::Value *limit_gt_idx = def->builder->CreateICmpSGT(limit_int_value, new_idx, "limit.gt.idx");
llvm::Value *limit_gt_idx =
def->builder->CreateICmpSGT(limit_int_value, new_idx, "limit.gt.idx");
// If limit > idx we are done
def->builder->CreateCondBr(limit_gt_idx, exit_block, update_block);
@ -320,17 +381,24 @@ void RaviCodeGenerator::emit_FORLOOP(RaviFunctionDef *def, llvm::Value *L_ci,
def->builder->SetInsertPoint(update_block);
// setivalue(ra, idx); /* update internal index... */
llvm::Instruction *idx_store = def->builder->CreateStore(new_idx, idx_int_ptr);
idx_store->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_nT);
llvm::Instruction *idx_store =
def->builder->CreateStore(new_idx, idx_int_ptr);
idx_store->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_TValue_nT);
llvm::Instruction *idx_tt_store;
//idx_tt_store = def->builder->CreateStore(def->types->kInt[LUA_TNUMINT], rinit_tt_ptr);
//idx_tt_store->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_ttT);
// idx_tt_store = def->builder->CreateStore(def->types->kInt[LUA_TNUMINT],
// rinit_tt_ptr);
// idx_tt_store->setMetadata(llvm::LLVMContext::MD_tbaa,
// def->types->tbaa_TValue_ttT);
// setivalue(ra + 3, idx); /* ...and external index */
idx_store = def->builder->CreateStore(new_idx, var_int_ptr);
idx_store->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_nT);
idx_tt_store = def->builder->CreateStore(def->types->kInt[LUA_TNUMINT], rvar_tt_ptr);
idx_tt_store->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_ttT);
idx_store->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_TValue_nT);
idx_tt_store =
def->builder->CreateStore(def->types->kInt[LUA_TNUMINT], rvar_tt_ptr);
idx_tt_store->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_TValue_ttT);
// ci->u.l.savedpc += GETARG_sBx(i); /* jump back */
def->builder->CreateBr(def->jmp_targets[pc].jmp1);
@ -341,41 +409,52 @@ void RaviCodeGenerator::emit_FORLOOP(RaviFunctionDef *def, llvm::Value *L_ci,
def->builder->SetInsertPoint(else_integer);
// lua_Number step = fltvalue(ra + 2);
llvm::Instruction *step_double_value = def->builder->CreateLoad(step_double_ptr, "step.n");
step_double_value->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_nT);
llvm::Instruction *step_double_value =
def->builder->CreateLoad(step_double_ptr, "step.n");
step_double_value->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_TValue_nT);
// lua_Number idx = luai_numadd(L, fltvalue(ra), step); /* inc. index */
llvm::Instruction *idx_double_value = def->builder->CreateLoad(idx_double_ptr, "init.n");
idx_double_value->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_nT);
new_idx = def->builder->CreateFAdd(step_double_value, idx_double_value, "next.idx");
llvm::Instruction *idx_double_value =
def->builder->CreateLoad(idx_double_ptr, "init.n");
idx_double_value->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_TValue_nT);
new_idx =
def->builder->CreateFAdd(step_double_value, idx_double_value, "next.idx");
// lua_Number limit = fltvalue(ra + 1);
llvm::Instruction *limit_double_value = def->builder->CreateLoad(limit_double_ptr, "limit.n");
limit_double_value->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_nT);
llvm::Instruction *limit_double_value =
def->builder->CreateLoad(limit_double_ptr, "limit.n");
limit_double_value->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_TValue_nT);
// step > 0?
step_gt_zero = def->builder->CreateFCmpOGT(step_double_value, llvm::ConstantFP::get(def->types->lua_NumberT, 0.0), "step.gt.zero");
step_gt_zero = def->builder->CreateFCmpOGT(
step_double_value, llvm::ConstantFP::get(def->types->lua_NumberT, 0.0),
"step.gt.zero");
step_gt_zero_true = llvm::BasicBlock::Create(
def->jitState->context(), "step.gt.zero.true", def->f);
step_gt_zero_true = llvm::BasicBlock::Create(def->jitState->context(),
"step.gt.zero.true", def->f);
step_gt_zero_false =
llvm::BasicBlock::Create(def->jitState->context(), "step.gt.zero.false");
def->builder->CreateCondBr(step_gt_zero, step_gt_zero_true, step_gt_zero_false);
llvm::BasicBlock::Create(def->jitState->context(), "step.gt.zero.false");
def->builder->CreateCondBr(step_gt_zero, step_gt_zero_true,
step_gt_zero_false);
def->builder->SetInsertPoint(step_gt_zero_true);
// idx > limit?
new_idx_gt_limit = def->builder->CreateFCmpOGT(new_idx, limit_double_value, "idx.gt.limit");
new_idx_gt_limit =
def->builder->CreateFCmpOGT(new_idx, limit_double_value, "idx.gt.limit");
// If idx > limit we are done
update_block = llvm::BasicBlock::Create(
def->jitState->context(), "update");
update_block = llvm::BasicBlock::Create(def->jitState->context(), "update");
def->builder->CreateCondBr(new_idx_gt_limit, exit_block, update_block);
def->f->getBasicBlockList().push_back(step_gt_zero_false);
def->builder->SetInsertPoint(step_gt_zero_false);
// limit > idx?
limit_gt_idx = def->builder->CreateFCmpOGT(limit_double_value, new_idx, "limit.gt.idx");
limit_gt_idx =
def->builder->CreateFCmpOGT(limit_double_value, new_idx, "limit.gt.idx");
// If limit > idx we are done
def->builder->CreateCondBr(limit_gt_idx, exit_block, update_block);
@ -386,22 +465,26 @@ void RaviCodeGenerator::emit_FORLOOP(RaviFunctionDef *def, llvm::Value *L_ci,
// setfltvalue(ra, idx); /* update internal index... */
idx_store = def->builder->CreateStore(new_idx, idx_double_ptr);
idx_store->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_nT);
//idx_tt_store = def->builder->CreateStore(def->types->kInt[LUA_TNUMFLT], rinit_tt_ptr);
//idx_tt_store->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_ttT);
idx_store->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_TValue_nT);
// idx_tt_store = def->builder->CreateStore(def->types->kInt[LUA_TNUMFLT],
// rinit_tt_ptr);
// idx_tt_store->setMetadata(llvm::LLVMContext::MD_tbaa,
// def->types->tbaa_TValue_ttT);
// setfltvalue(ra + 3, idx); /* ...and external index */
idx_store = def->builder->CreateStore(new_idx, var_double_ptr);
idx_store->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_nT);
idx_tt_store = def->builder->CreateStore(def->types->kInt[LUA_TNUMFLT], rvar_tt_ptr);
idx_tt_store->setMetadata(llvm::LLVMContext::MD_tbaa, def->types->tbaa_TValue_ttT);
idx_store->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_TValue_nT);
idx_tt_store =
def->builder->CreateStore(def->types->kInt[LUA_TNUMFLT], rvar_tt_ptr);
idx_tt_store->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_TValue_ttT);
// ci->u.l.savedpc += GETARG_sBx(i); /* jump back */
def->builder->CreateBr(def->jmp_targets[pc].jmp1);
def->f->getBasicBlockList().push_back(exit_block);
def->builder->SetInsertPoint(exit_block);
}
}

@ -43,30 +43,31 @@ void RaviCodeGenerator::emit_FORPREP2(RaviFunctionDef *def, llvm::Value *L_ci,
// Setup local vars on C stack and link them
// to the forloop_target so that the forloop code can access these
llvm::IRBuilder<> TmpB(def->entry, def->entry->begin());
llvm::Value *stopnow =
def->builder->CreateAlloca(def->types->C_intT, nullptr, "stopnow");
TmpB.CreateAlloca(def->types->C_intT, nullptr, "stopnow");
forloop_target.ilimit =
def->builder->CreateAlloca(def->types->lua_IntegerT, nullptr, "ilimit");
TmpB.CreateAlloca(def->types->lua_IntegerT, nullptr, "ilimit");
forloop_target.istep =
def->builder->CreateAlloca(def->types->lua_IntegerT, nullptr, "istep");
TmpB.CreateAlloca(def->types->lua_IntegerT, nullptr, "istep");
forloop_target.iidx =
def->builder->CreateAlloca(def->types->lua_IntegerT, nullptr, "iidx");
TmpB.CreateAlloca(def->types->lua_IntegerT, nullptr, "iidx");
forloop_target.flimit =
def->builder->CreateAlloca(def->types->lua_NumberT, nullptr, "nlimit");
TmpB.CreateAlloca(def->types->lua_NumberT, nullptr, "nlimit");
forloop_target.fidx =
def->builder->CreateAlloca(def->types->lua_NumberT, nullptr, "ninit");
TmpB.CreateAlloca(def->types->lua_NumberT, nullptr, "ninit");
forloop_target.fstep =
def->builder->CreateAlloca(def->types->lua_NumberT, nullptr, "nstep");
TmpB.CreateAlloca(def->types->lua_NumberT, nullptr, "nstep");
forloop_target.forloop_branch =
def->builder->CreateAlloca(def->types->C_pcharT, nullptr, "brnch");
TmpB.CreateAlloca(def->types->C_pcharT, nullptr, "brnch");
llvm::Value *isint = def->builder->CreateAlloca(
llvm::Type::getInt1Ty(def->jitState->context()), nullptr,
"loop.is.integer");
llvm::Value *isinc = def->builder->CreateAlloca(
llvm::Type::getInt1Ty(def->jitState->context()), nullptr,
"loop.increasing");
llvm::Value *isint =
TmpB.CreateAlloca(llvm::Type::getInt1Ty(def->jitState->context()),
nullptr, "loop.is.integer");
llvm::Value *isinc =
TmpB.CreateAlloca(llvm::Type::getInt1Ty(def->jitState->context()),
nullptr, "loop.increasing");
// TValue *init = ra;
// TValue *plimit = ra + 1;
@ -141,9 +142,9 @@ void RaviCodeGenerator::emit_FORPREP2(RaviFunctionDef *def, llvm::Value *L_ci,
// lua_Integer initv = (stopnow ? 0 : ivalue(init));
// Save step
llvm::Instruction *istep_store =
def->builder->CreateStore(pstep_ivalue, forloop_target.istep);
def->builder->CreateStore(pstep_ivalue, forloop_target.istep);
istep_store->setMetadata(llvm::LLVMContext::MD_tbaa,
def->types->tbaa_longlongT);
def->types->tbaa_longlongT);
// Get stopnow
llvm::Instruction *stopnow_val =
@ -492,16 +493,18 @@ void RaviCodeGenerator::emit_FORPREP(RaviFunctionDef *def, llvm::Value *L_ci,
// lua_Integer ilimit;
// int stopnow;
// lua_Number ninit; lua_Number nlimit; lua_Number nstep;
llvm::IRBuilder<> TmpB(def->entry, def->entry->begin());
llvm::Value *ilimit =
def->builder->CreateAlloca(def->types->lua_IntegerT, nullptr, "ilimit");
TmpB.CreateAlloca(def->types->lua_IntegerT, nullptr, "ilimit");
llvm::Value *stopnow =
def->builder->CreateAlloca(def->types->C_intT, nullptr, "stopnow");
TmpB.CreateAlloca(def->types->C_intT, nullptr, "stopnow");
llvm::Value *nlimit =
def->builder->CreateAlloca(def->types->lua_NumberT, nullptr, "nlimit");
TmpB.CreateAlloca(def->types->lua_NumberT, nullptr, "nlimit");
llvm::Value *ninit =
def->builder->CreateAlloca(def->types->lua_NumberT, nullptr, "ninit");
TmpB.CreateAlloca(def->types->lua_NumberT, nullptr, "ninit");
llvm::Value *nstep =
def->builder->CreateAlloca(def->types->lua_NumberT, nullptr, "nstep");
TmpB.CreateAlloca(def->types->lua_NumberT, nullptr, "nstep");
// TValue *init = ra;
// TValue *plimit = ra + 1;

@ -130,7 +130,6 @@ void *RaviJITFunctionImpl::compile() {
// Create a function pass manager for this engine
llvm::FunctionPassManager *FPM = new llvm::FunctionPassManager(module_);
llvm::PassManager *MPM = new llvm::PassManager();
// Set up the optimizer pipeline. Start with registering info about how the
// target lays out data structures.
@ -145,9 +144,10 @@ void *RaviJITFunctionImpl::compile() {
#endif
llvm::PassManagerBuilder pmb;
pmb.OptLevel = 3;
pmb.SizeLevel = 0;
#if 1
pmb.populateFunctionPassManager(*FPM);
pmb.populateModulePassManager(*MPM);
#if 0
#else
FPM->add(llvm::createTypeBasedAliasAnalysisPass());
// Provide basic AliasAnalysis support for GVN.
FPM->add(llvm::createBasicAliasAnalysisPass());
@ -168,13 +168,16 @@ void *RaviJITFunctionImpl::compile() {
// For each function in the module
// Run the FPM on this function
FPM->run(*function_);
delete FPM;
llvm::PassManager *MPM = new llvm::PassManager();
pmb.populateModulePassManager(*MPM);
MPM->run(*module_);
delete MPM;
//module_->dump();
// We don't need this anymore
delete FPM;
delete MPM;
if (ptr_)
return ptr_;

Loading…
Cancel
Save