; Harbour LLVM IR - generated from tests/llvm/arrayref.prg
target triple = "x86_64-pc-linux-gnu"
%HB_SYMB = type { i8*, i64, i8*, i8* }

declare void @hb_vmExecute(i8*, %HB_SYMB*)
declare %HB_SYMB* @hb_vmProcessSymbols(%HB_SYMB*, i16, i8*, i32, i16)
declare i32 @hb_vmsh_pushnil()
declare i32 @hb_vmsh_pushlogical(i32)
declare i32 @hb_vmsh_pushint(i32)
declare i32 @hb_vmsh_pushlong(i64)
declare i32 @hb_vmsh_pushlonglong(i64)
declare i32 @hb_vmsh_pushdouble(double, i32, i32)
declare i32 @hb_vmsh_pushstring(i8*, i64)
declare i32 @hb_vmsh_pushlocal(i32)
declare i32 @hb_vmsh_poplocal(i32)
declare i32 @hb_vmsh_pushstatic(i32)
declare i32 @hb_vmsh_popstatic(i32)
declare i32 @hb_vmsh_pushsymbol(%HB_SYMB*)
declare i32 @hb_vmsh_plus()
declare i32 @hb_vmsh_minus()
declare i32 @hb_vmsh_mult()
declare i32 @hb_vmsh_divide()
declare i32 @hb_vmsh_modulus()
declare i32 @hb_vmsh_power()
declare i32 @hb_vmsh_negate()
declare i32 @hb_vmsh_equal()
declare i32 @hb_vmsh_exactlyequal()
declare i32 @hb_vmsh_notequal()
declare i32 @hb_vmsh_less()
declare i32 @hb_vmsh_lessequal()
declare i32 @hb_vmsh_greater()
declare i32 @hb_vmsh_greaterequal()
declare i32 @hb_vmsh_and()
declare i32 @hb_vmsh_or()
declare i32 @hb_vmsh_not()
declare i32 @hb_vmsh_pop()
declare i32 @hb_vmsh_duplicate()
declare i32 @hb_vmsh_frame(i32, i32)
declare i32 @hb_vmsh_function(i32)
declare i32 @hb_vmsh_do(i32)
declare i32 @hb_vmsh_retvalue()
declare i32 @hb_vmsh_poplogical(i32*)
declare i32 @hb_vmsh_fortest()
declare i32 @hb_vmsh_inc()
declare i32 @hb_vmsh_dec()
declare i32 @hb_vmsh_duplunref()
declare i32 @hb_vmsh_pushunref()
declare i32 @hb_vmsh_pluseqpop()
declare i32 @hb_vmsh_minuseqpop()
declare i32 @hb_vmsh_multeqpop()
declare i32 @hb_vmsh_diveqpop()
declare i32 @hb_vmsh_modeqpop()
declare i32 @hb_vmsh_expeqpop()
declare i32 @hb_vmsh_deceqpop()
declare i32 @hb_vmsh_inceqpop()
declare i32 @hb_vmsh_pluseq()
declare i32 @hb_vmsh_minuseq()
declare i32 @hb_vmsh_multeq()
declare i32 @hb_vmsh_diveq()
declare i32 @hb_vmsh_modeq()
declare i32 @hb_vmsh_expeq()
declare i32 @hb_vmsh_deceq()
declare i32 @hb_vmsh_inceq()
declare i32 @hb_vmsh_pushlocalref(i32)
declare i32 @hb_vmsh_pushstaticref(i32)
declare i32 @hb_vmsh_localinc(i32)
declare i32 @hb_vmsh_localdec(i32)
declare i32 @hb_vmsh_localincpush(i32)
declare i32 @hb_vmsh_localaddint(i32, i32)
declare i32 @hb_vmsh_localnearaddint(i32, i32)
declare i32 @hb_vmsh_arraypush()
declare i32 @hb_vmsh_arraypushref()
declare i32 @hb_vmsh_arraypop()
declare i32 @hb_vmsh_pushaparams()
declare i32 @hb_vmsh_arraydim(i32)
declare i32 @hb_vmsh_arraygen(i32)
declare i32 @hb_vmsh_hashgen(i32)
declare i32 @hb_vmsh_pushalias()
declare i32 @hb_vmsh_popalias()
declare i32 @hb_vmsh_swapalias()
declare i32 @hb_vmsh_pushfield(%HB_SYMB*)
declare i32 @hb_vmsh_popfield(%HB_SYMB*)
declare i32 @hb_vmsh_pushmemvar(%HB_SYMB*)
declare i32 @hb_vmsh_pushmemvarref(%HB_SYMB*)
declare i32 @hb_vmsh_popmemvar(%HB_SYMB*)
declare i32 @hb_vmsh_pushvariable(%HB_SYMB*)
declare i32 @hb_vmsh_popvariable(%HB_SYMB*)
declare i32 @hb_vmsh_pushaliasedfield(%HB_SYMB*)
declare i32 @hb_vmsh_popaliasedfield(%HB_SYMB*)
declare i32 @hb_vmsh_pushaliasedvar(%HB_SYMB*)
declare i32 @hb_vmsh_popaliasedvar(%HB_SYMB*)
declare i32 @hb_vmsh_pushself()
declare i32 @hb_vmsh_pushovarref()
declare i32 @hb_vmsh_withobjectstart()
declare i32 @hb_vmsh_withobjectend()
declare i32 @hb_vmsh_funcptr()
declare i32 @hb_vmsh_message(%HB_SYMB*)
declare i32 @hb_vmsh_withobjectmessage(%HB_SYMB*)
declare i32 @hb_vmsh_send(i32)
declare i32 @hb_vmsh_enumstart(i32, i32)
declare i32 @hb_vmsh_enumnext()
declare i32 @hb_vmsh_enumprev()
declare i32 @hb_vmsh_enumend()
declare i32 @hb_vmsh_switchidx(i8*, i32)
declare i32 @hb_vmsh_pushblock(i8*, %HB_SYMB*)
declare i32 @hb_vmsh_macropushindex()
declare i32 @hb_vmsh_macropushref()
declare i32 @hb_vmsh_macrosymbol()
declare i32 @hb_vmsh_macrotext()
declare i32 @hb_vmsh_macropop(i32)
declare i32 @hb_vmsh_macropopaliased(i32)
declare i32 @hb_vmsh_macropush(i32)
declare i32 @hb_vmsh_macropushlist(i32)
declare i32 @hb_vmsh_macropushpare(i32)
declare i32 @hb_vmsh_macropushaliased(i32)
declare i32 @hb_vmsh_macroarraygen(i32)
declare i32 @hb_vmsh_macrodo(i32)
declare i32 @hb_vmsh_macrofunc(i32)
declare i32 @hb_vmsh_macrosend(i32)
declare i32 @hb_vmsh_seqbegin(i8*)
declare i32 @hb_vmsh_seqend()
declare i32 @hb_vmsh_seqrecover()
declare i32 @hb_vmsh_seqalways(i8*)
declare i32 @hb_vmsh_alwaysbegin(i8*)
declare i32 @hb_vmsh_alwaysend()
declare i32 @hb_vmsh_seqblock()
declare void @hb_INITSTATICS()
declare void @hb_INITLINES()
declare void @HB_FUN_QOUT()

@symbols = internal global %HB_SYMB* null

@.pcode.HB_FUN_ARRAYREF = internal constant [1 x i8] c"\07"
@.pcode.HB_FUN_MAIN = internal constant [48 x i8] c"\0D\01\00\24\02\00\7A\5C\02\5C\03\04\03\00\50\01\24\03\00\B0\02\00\5F\01\5C\02\94\14\01\24\04\00\B0\03\00\5F\01\5C\02\01\14\01\24\05\00\64\6E\07"
@.pcode.HB_FUN_BUMP = internal constant [16 x i8] c"\0D\00\01\24\08\00\7E\01\64\00\24\09\00\64\6E\07"

@.sym.0 = private constant [9 x i8] c"\41\52\52\41\59\52\45\46\00"
@.sym.1 = private constant [5 x i8] c"\4D\41\49\4E\00"
@.sym.2 = private constant [5 x i8] c"\42\55\4D\50\00"
@.sym.3 = private constant [5 x i8] c"\51\4F\55\54\00"

@.modname = private constant [24 x i8] c"\74\65\73\74\73\2F\6C\6C\76\6D\2F\61\72\72\61\79\72\65\66\2E\70\72\67\00"

@symbols_table = internal global [4 x %HB_SYMB] [
  %HB_SYMB { i8* getelementptr([9 x i8], [9 x i8]* @.sym.0, i32 0, i32 0),
           i64 517,
           i8* bitcast(void()* @HB_FUN_ARRAYREF to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([5 x i8], [5 x i8]* @.sym.1, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_MAIN to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([5 x i8], [5 x i8]* @.sym.2, i32 0, i32 0),
           i64 513,
           i8* bitcast(void()* @HB_FUN_BUMP to i8*),
           i8* null },
  %HB_SYMB { i8* getelementptr([5 x i8], [5 x i8]* @.sym.3, i32 0, i32 0),
           i64 1,
           i8* bitcast(void()* @HB_FUN_QOUT to i8*),
           i8* null }
]


define void @HB_FUN_ARRAYREF() {
entry:
  br label %i0
i0:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_MAIN() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 1, i32 0)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_pushint(i32 1)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i7
i7:
  %r7 = call i32 @hb_vmsh_pushint(i32 2)
  %c7 = icmp ne i32 %r7, 0
  br i1 %c7, label %epilogue, label %i9
i9:
  %r9 = call i32 @hb_vmsh_pushint(i32 3)
  %c9 = icmp ne i32 %r9, 0
  br i1 %c9, label %epilogue, label %i11
i11:
  %r11 = call i32 @hb_vmsh_arraygen(i32 3)
  %c11 = icmp ne i32 %r11, 0
  br i1 %c11, label %epilogue, label %i14
i14:
  %r14 = call i32 @hb_vmsh_poplocal(i32 1)
  %c14 = icmp ne i32 %r14, 0
  br i1 %c14, label %epilogue, label %i16
i16:
  br label %i19
i19:
  %r19 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 2))
  %c19 = icmp ne i32 %r19, 0
  br i1 %c19, label %epilogue, label %ipfs19a
ipfs19a:
  %r19b = call i32 @hb_vmsh_pushnil()
  %c19b = icmp ne i32 %r19b, 0
  br i1 %c19b, label %epilogue, label %i22
i22:
  %r22 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c22 = icmp ne i32 %r22, 0
  br i1 %c22, label %epilogue, label %i24
i24:
  %r24 = call i32 @hb_vmsh_pushint(i32 2)
  %c24 = icmp ne i32 %r24, 0
  br i1 %c24, label %epilogue, label %i26
i26:
  %r26 = call i32 @hb_vmsh_arraypushref()
  %c26 = icmp ne i32 %r26, 0
  br i1 %c26, label %epilogue, label %i27
i27:
  %r27 = call i32 @hb_vmsh_do(i32 1)
  %c27 = icmp ne i32 %r27, 0
  br i1 %c27, label %epilogue, label %i29
i29:
  br label %i32
i32:
  %r32 = call i32 @hb_vmsh_pushsymbol(%HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 3))
  %c32 = icmp ne i32 %r32, 0
  br i1 %c32, label %epilogue, label %ipfs32a
ipfs32a:
  %r32b = call i32 @hb_vmsh_pushnil()
  %c32b = icmp ne i32 %r32b, 0
  br i1 %c32b, label %epilogue, label %i35
i35:
  %r35 = call i32 @hb_vmsh_pushlocal(i32 1)
  %c35 = icmp ne i32 %r35, 0
  br i1 %c35, label %epilogue, label %i37
i37:
  %r37 = call i32 @hb_vmsh_pushint(i32 2)
  %c37 = icmp ne i32 %r37, 0
  br i1 %c37, label %epilogue, label %i39
i39:
  %r39 = call i32 @hb_vmsh_arraypush()
  %c39 = icmp ne i32 %r39, 0
  br i1 %c39, label %epilogue, label %i40
i40:
  %r40 = call i32 @hb_vmsh_do(i32 1)
  %c40 = icmp ne i32 %r40, 0
  br i1 %c40, label %epilogue, label %i42
i42:
  br label %i45
i45:
  %r45 = call i32 @hb_vmsh_pushnil()
  %c45 = icmp ne i32 %r45, 0
  br i1 %c45, label %epilogue, label %i46
i46:
  %r46 = call i32 @hb_vmsh_retvalue()
  %c46 = icmp ne i32 %r46, 0
  br i1 %c46, label %epilogue, label %i47
i47:
  br label %epilogue
epilogue:
  ret void
}

define void @HB_FUN_BUMP() {
entry:
  br label %i0
i0:
  %r0 = call i32 @hb_vmsh_frame(i32 0, i32 1)
  %c0 = icmp ne i32 %r0, 0
  br i1 %c0, label %epilogue, label %i3
i3:
  br label %i6
i6:
  %r6 = call i32 @hb_vmsh_localnearaddint(i32 1, i32 100)
  %c6 = icmp ne i32 %r6, 0
  br i1 %c6, label %epilogue, label %i10
i10:
  br label %i13
i13:
  %r13 = call i32 @hb_vmsh_pushnil()
  %c13 = icmp ne i32 %r13, 0
  br i1 %c13, label %epilogue, label %i14
i14:
  %r14 = call i32 @hb_vmsh_retvalue()
  %c14 = icmp ne i32 %r14, 0
  br i1 %c14, label %epilogue, label %i15
i15:
  br label %epilogue
epilogue:
  ret void
}

define internal void @hb_vm_SymbolInit() {
  %r = call %HB_SYMB* @hb_vmProcessSymbols(
    %HB_SYMB* getelementptr([4 x %HB_SYMB], [4 x %HB_SYMB]* @symbols_table, i32 0, i32 0),
    i16 4,
    i8* getelementptr([24 x i8], [24 x i8]* @.modname, i32 0, i32 0),
    i32 0, i16 3)
  store %HB_SYMB* %r, %HB_SYMB** @symbols
  ret void
}

@__hb_init_ptr = global [1 x void()*] [void()* @hb_vm_SymbolInit], section ".init_array", align 8
@llvm.used = appending global [1 x i8*] [i8* bitcast([1 x void()*]* @__hb_init_ptr to i8*)], section "llvm.metadata"
