; ModuleID = 'my_array_add'
source_filename = "<string>"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
target triple = "x86_64-grtev4-linux-gnu"
@.const.my_array_add = internal constant [13 x i8] c"my_array_add\00"
@_ZN08NumbaEnv8__main__12my_array_addB2v1B38c8tJTIeFIjxB2IKSgI4CrvQClQZ6FczSBAA_3dE5ArrayIiLi1E1C7mutable7alignedE = common local_unnamed_addr global ptr null
@".const.missing Environment: _ZN08NumbaEnv8__main__12my_array_addB2v1B38c8tJTIeFIjxB2IKSgI4CrvQClQZ6FczSBAA_3dE5ArrayIiLi1E1C7mutable7alignedE" = internal constant [135 x i8] c"missing Environment: _ZN08NumbaEnv8__main__12my_array_addB2v1B38c8tJTIeFIjxB2IKSgI4CrvQClQZ6FczSBAA_3dE5ArrayIiLi1E1C7mutable7alignedE\00"
@PyExc_TypeError = external global i8
@".const.can't unbox array from PyObject into native value. The object maybe of a different type" = internal constant [89 x i8] c"can't unbox array from PyObject into native value. The object maybe of a different type\00"
@".const.`env.consts` is NULL in `read_const`" = internal constant [37 x i8] c"`env.consts` is NULL in `read_const`\00"
@.const.pickledata.93985114789184 = internal constant [32 x i8] c"\80\04\95\15\00\00\00\00\00\00\00\8C\05numpy\94\8C\07ndarray\94\93\94."
@.const.pickledata.93985114789184.sha1 = internal constant [20 x i8] c"\DF\BC\FD\D3\9F\CB&\F4\D0\C6\80\95D\87\B8\C0\B5;\B8\A3"
@PyExc_RuntimeError = external global i8
; Function Attrs: nofree norecurse nounwind memory(argmem: readwrite)
define noundef i32 @_ZN8__main__12my_array_addB2v1B38c8tJTIeFIjxB2IKSgI4CrvQClQZ6FczSBAA_3dE5ArrayIiLi1E1C7mutable7alignedE(ptr noalias writeonly captures(none) %retptr, ptr noalias readnone captures(none) %excinfo, ptr %arg.arr.0, ptr %arg.arr.1, i64 %arg.arr.2, i64 %arg.arr.3, ptr %arg.arr.4, i64 %arg.arr.5.0, i64 %arg.arr.6.0) local_unnamed_addr #0 {
B0.endif:
tail call void @NRT_incref(ptr %arg.arr.0)
%.120113.not = icmp slt i64 %arg.arr.5.0, 1
br i1 %.120113.not, label %B110, label %iter.check
iter.check: ; preds = %B0.endif
%0 = trunc i64 %arg.arr.2 to i32
%1 = add i32 %0, 1345
%min.iters.check = icmp ult i64 %arg.arr.5.0, 4
br i1 %min.iters.check, label %B72.preheader, label %vector.main.loop.iter.check
vector.main.loop.iter.check: ; preds = %iter.check
%const = bitcast i64 9223372036854775776 to i64
%min.iters.check1 = icmp ult i64 %arg.arr.5.0, 32
br i1 %min.iters.check1, label %vec.epilog.ph, label %vector.ph
vector.ph: ; preds = %vector.main.loop.iter.check
%n.vec = and i64 %arg.arr.5.0, %const
%broadcast.splatinsert = insertelement <8 x i32> poison, i32 %1, i64 0
%broadcast.splat = shufflevector <8 x i32> %broadcast.splatinsert, <8 x i32> poison, <8 x i32> zeroinitializer
br label %vector.body
vector.body: ; preds = %vector.body, %vector.ph
%index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]
%sunkaddr = mul i64 %index, 4
%sunkaddr22 = getelementptr i8, ptr %arg.arr.4, i64 %sunkaddr
%wide.load = load <8 x i32>, ptr %sunkaddr22, align 4
%sunkaddr23 = mul i64 %index, 4
%sunkaddr24 = getelementptr i8, ptr %arg.arr.4, i64 %sunkaddr23
%sunkaddr25 = getelementptr i8, ptr %sunkaddr24, i64 32
%wide.load2 = load <8 x i32>, ptr %sunkaddr25, align 4
%sunkaddr26 = mul i64 %index, 4
%sunkaddr27 = getelementptr i8, ptr %arg.arr.4, i64 %sunkaddr26
%sunkaddr28 = getelementptr i8, ptr %sunkaddr27, i64 64
%wide.load3 = load <8 x i32>, ptr %sunkaddr28, align 4
%sunkaddr29 = mul i64 %index, 4
%sunkaddr30 = getelementptr i8, ptr %arg.arr.4, i64 %sunkaddr29
%sunkaddr31 = getelementptr i8, ptr %sunkaddr30, i64 96
%wide.load4 = load <8 x i32>, ptr %sunkaddr31, align 4
%2 = add <8 x i32> %broadcast.splat, %wide.load
%3 = add <8 x i32> %broadcast.splat, %wide.load2
%4 = add <8 x i32> %broadcast.splat, %wide.load3
%5 = add <8 x i32> %broadcast.splat, %wide.load4
store <8 x i32> %2, ptr %sunkaddr22, align 4
store <8 x i32> %3, ptr %sunkaddr25, align 4
store <8 x i32> %4, ptr %sunkaddr28, align 4
store <8 x i32> %5, ptr %sunkaddr31, align 4
%index.next = add nuw i64 %index, 32
%6 = icmp eq i64 %n.vec, %index.next
br i1 %6, label %middle.block, label %vector.body, !llvm.loop !0
middle.block: ; preds = %vector.body
%cmp.n = icmp eq i64 %arg.arr.5.0, %n.vec
br i1 %cmp.n, label %B110, label %vec.epilog.iter.check
vec.epilog.iter.check: ; preds = %middle.block
%n.vec.remaining = and i64 %arg.arr.5.0, 28
%min.epilog.iters.check = icmp eq i64 %n.vec.remaining, 0
br i1 %min.epilog.iters.check, label %B72.preheader, label %vec.epilog.ph
vec.epilog.ph: ; preds = %vec.epilog.iter.check, %vector.main.loop.iter.check
%vec.epilog.resume.val = phi i64 [ %n.vec, %vec.epilog.iter.check ], [ 0, %vector.main.loop.iter.check ]
%const_mat = add i64 %const, 28
%n.vec6 = and i64 %arg.arr.5.0, %const_mat
%broadcast.splatinsert7 = insertelement <4 x i32> poison, i32 %1, i64 0
%broadcast.splat8 = shufflevector <4 x i32> %broadcast.splatinsert7, <4 x i32> poison, <4 x i32> zeroinitializer
br label %vec.epilog.vector.body
vec.epilog.vector.body: ; preds = %vec.epilog.vector.body, %vec.epilog.ph
%index9 = phi i64 [ %vec.epilog.resume.val, %vec.epilog.ph ], [ %index.next11, %vec.epilog.vector.body ]
%7 = shl i64 %index9, 2
%scevgep13 = getelementptr i8, ptr %arg.arr.4, i64 %7
%wide.load10 = load <4 x i32>, ptr %scevgep13, align 4
%8 = add <4 x i32> %broadcast.splat8, %wide.load10
store <4 x i32> %8, ptr %scevgep13, align 4
%index.next11 = add nuw i64 %index9, 4
%9 = icmp eq i64 %n.vec6, %index.next11
br i1 %9, label %vec.epilog.middle.block, label %vec.epilog.vector.body, !llvm.loop !3
vec.epilog.middle.block: ; preds = %vec.epilog.vector.body
%cmp.n12 = icmp eq i64 %arg.arr.5.0, %n.vec6
br i1 %cmp.n12, label %B110, label %B72.preheader
B72.preheader: ; preds = %vec.epilog.iter.check, %vec.epilog.middle.block, %iter.check
%.126112114.ph = phi i64 [ 0, %iter.check ], [ %n.vec, %vec.epilog.iter.check ], [ %n.vec6, %vec.epilog.middle.block ]
br label %B72
B72: ; preds = %B72.preheader, %B72
%.126112114 = phi i64 [ %.133, %B72 ], [ %.126112114.ph, %B72.preheader ]
%.133 = add nuw nsw i64 %.126112114, 1
%10 = shl i64 %.126112114, 2
%scevgep = getelementptr i8, ptr %arg.arr.4, i64 %10
%.187 = load i32, ptr %scevgep, align 4
%.221 = add i32 %1, %.187
store i32 %.221, ptr %scevgep, align 4
%exitcond.not = icmp eq i64 %arg.arr.5.0, %.133
br i1 %exitcond.not, label %B110, label %B72, !llvm.loop !4
B110: ; preds = %B72, %middle.block, %vec.epilog.middle.block, %B0.endif
store ptr %arg.arr.0, ptr %retptr, align 8
%retptr.repack99 = getelementptr inbounds nuw i8, ptr %retptr, i64 8
store ptr %arg.arr.1, ptr %retptr.repack99, align 8
%retptr.repack101 = getelementptr inbounds nuw i8, ptr %retptr, i64 16
store i64 %arg.arr.2, ptr %retptr.repack101, align 8
%retptr.repack103 = getelementptr inbounds nuw i8, ptr %retptr, i64 24
store i64 %arg.arr.3, ptr %retptr.repack103, align 8
%retptr.repack105 = getelementptr inbounds nuw i8, ptr %retptr, i64 32
store ptr %arg.arr.4, ptr %retptr.repack105, align 8
%retptr.repack107 = getelementptr inbounds nuw i8, ptr %retptr, i64 40
store i64 %arg.arr.5.0, ptr %retptr.repack107, align 8
%retptr.repack109 = getelementptr inbounds nuw i8, ptr %retptr, i64 48
store i64 %arg.arr.6.0, ptr %retptr.repack109, align 8
ret i32 0
}
define ptr @_ZN7cpython8__main__12my_array_addB2v1B38c8tJTIeFIjxB2IKSgI4CrvQClQZ6FczSBAA_3dE5ArrayIiLi1E1C7mutable7alignedE(ptr readnone captures(none) %py_closure, ptr %py_args, ptr readnone captures(none) %py_kws) local_unnamed_addr {
entry:
%.5 = alloca ptr, align 8
%.6 = call i32 (ptr, ptr, i64, i64, ...) @PyArg_UnpackTuple(ptr %py_args, ptr nonnull @.const.my_array_add, i64 1, i64 1, ptr nonnull %.5)
%.7 = icmp eq i32 %.6, 0
%.21 = alloca { ptr, ptr, i64, i64, ptr, [1 x i64], [1 x i64] }, align 8
%.43 = alloca { ptr, ptr, i64, i64, ptr, [1 x i64], [1 x i64] }, align 8
%.102 = alloca { ptr, ptr, i64, i64, ptr, [1 x i64], [1 x i64] }, align 8
br i1 %.7, label %common.ret, label %entry.endif, !prof !5
common.ret: ; preds = %entry.endif.endif.endif.endif.if.endif.endif, %entry.endif.endif.if, %entry.endif.if, %entry
%common.ret.op = phi ptr [ null, %entry.endif.if ], [ %.106, %entry.endif.endif.endif.endif.if.endif.endif ], [ null, %entry ], [ null, %entry.endif.endif.if ]
ret ptr %common.ret.op
entry.endif: ; preds = %entry
%.11 = load ptr, ptr @_ZN08NumbaEnv8__main__12my_array_addB2v1B38c8tJTIeFIjxB2IKSgI4CrvQClQZ6FczSBAA_3dE5ArrayIiLi1E1C7mutable7alignedE, align 8
%.16 = icmp eq ptr %.11, null
br i1 %.16, label %entry.endif.if, label %entry.endif.endif, !prof !5
entry.endif.if: ; preds = %entry.endif
call void @PyErr_SetString(ptr nonnull @PyExc_RuntimeError, ptr nonnull @".const.missing Environment: _ZN08NumbaEnv8__main__12my_array_addB2v1B38c8tJTIeFIjxB2IKSgI4CrvQClQZ6FczSBAA_3dE5ArrayIiLi1E1C7mutable7alignedE")
br label %common.ret
entry.endif.endif: ; preds = %entry.endif
%.20 = load ptr, ptr %.5, align 8
call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(56) %.21, i8 0, i64 56, i1 false)
%.25 = call i32 @NRT_adapt_ndarray_from_python(ptr %.20, ptr nonnull %.21)
%sunkaddr = getelementptr inbounds i8, ptr %.21, i64 24
%.29 = load i64, ptr %sunkaddr, align 8
%.30 = icmp ne i64 %.29, 4
%.31 = icmp ne i32 %.25, 0
%.32 = or i1 %.31, %.30
br i1 %.32, label %entry.endif.endif.if, label %entry.endif.endif.endif.endif, !prof !5
entry.endif.endif.if: ; preds = %entry.endif.endif
call void @PyErr_SetString(ptr nonnull @PyExc_TypeError, ptr nonnull @".const.can't unbox array from PyObject into native value. The object maybe of a different type")
br label %common.ret
entry.endif.endif.endif.endif: ; preds = %entry.endif.endif
%.36.fca.0.load = load ptr, ptr %.21, align 8
%sunkaddr1 = getelementptr inbounds i8, ptr %.21, i64 8
%.36.fca.1.load = load ptr, ptr %sunkaddr1, align 8
%sunkaddr2 = getelementptr inbounds i8, ptr %.21, i64 16
%.36.fca.2.load = load i64, ptr %sunkaddr2, align 8
%sunkaddr3 = getelementptr inbounds i8, ptr %.21, i64 32
%.36.fca.4.load = load ptr, ptr %sunkaddr3, align 8
%sunkaddr4 = getelementptr inbounds i8, ptr %.21, i64 40
%.36.fca.5.0.load = load i64, ptr %sunkaddr4, align 8
%sunkaddr5 = getelementptr inbounds i8, ptr %.21, i64 48
%.36.fca.6.0.load = load i64, ptr %sunkaddr5, align 8
call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(56) %.43, i8 0, i64 56, i1 false)
%.49 = call i32 @_ZN8__main__12my_array_addB2v1B38c8tJTIeFIjxB2IKSgI4CrvQClQZ6FczSBAA_3dE5ArrayIiLi1E1C7mutable7alignedE(ptr nonnull %.43, ptr nonnull poison, ptr %.36.fca.0.load, ptr %.36.fca.1.load, i64 %.36.fca.2.load, i64 4, ptr %.36.fca.4.load, i64 %.36.fca.5.0.load, i64 %.36.fca.6.0.load) #4
%.59.fca.0.load = load ptr, ptr %.43, align 8
%sunkaddr6 = getelementptr inbounds i8, ptr %.43, i64 8
%.59.fca.1.load = load ptr, ptr %sunkaddr6, align 8
%sunkaddr7 = getelementptr inbounds i8, ptr %.43, i64 16
%.59.fca.2.load = load i64, ptr %sunkaddr7, align 8
%sunkaddr8 = getelementptr inbounds i8, ptr %.43, i64 24
%.59.fca.3.load = load i64, ptr %sunkaddr8, align 8
%sunkaddr9 = getelementptr inbounds i8, ptr %.43, i64 32
%.59.fca.4.load = load ptr, ptr %sunkaddr9, align 8
%sunkaddr10 = getelementptr inbounds i8, ptr %.43, i64 40
%.59.fca.5.0.load = load i64, ptr %sunkaddr10, align 8
%sunkaddr11 = getelementptr inbounds i8, ptr %.43, i64 48
%.59.fca.6.0.load = load i64, ptr %sunkaddr11, align 8
call void @NRT_decref(ptr %.36.fca.0.load)
%sunkaddr12 = getelementptr i8, ptr %.11, i64 24
%.83 = load ptr, ptr %sunkaddr12, align 8
%.87.not = icmp eq ptr %.83, null
br i1 %.87.not, label %entry.endif.endif.endif.endif.if.endif.else, label %entry.endif.endif.endif.endif.if.endif.if
entry.endif.endif.endif.endif.if.endif.if: ; preds = %entry.endif.endif.endif.endif
%.89 = call ptr @PyList_GetItem(ptr nonnull %.83, i64 0)
br label %entry.endif.endif.endif.endif.if.endif.endif
entry.endif.endif.endif.endif.if.endif.else: ; preds = %entry.endif.endif.endif.endif
call void @PyErr_SetString(ptr nonnull @PyExc_RuntimeError, ptr nonnull @".const.`env.consts` is NULL in `read_const`")
br label %entry.endif.endif.endif.endif.if.endif.endif
entry.endif.endif.endif.endif.if.endif.endif: ; preds = %entry.endif.endif.endif.endif.if.endif.else, %entry.endif.endif.endif.endif.if.endif.if
%.84.0 = phi ptr [ %.89, %entry.endif.endif.endif.endif.if.endif.if ], [ null, %entry.endif.endif.endif.endif.if.endif.else ]
%.101 = call ptr @numba_unpickle(ptr nonnull @.const.pickledata.93985114789184, i32 32, ptr nonnull @.const.pickledata.93985114789184.sha1)
store ptr %.59.fca.0.load, ptr %.102, align 8
%sunkaddr13 = getelementptr inbounds i8, ptr %.102, i64 8
store ptr %.59.fca.1.load, ptr %sunkaddr13, align 8
%sunkaddr14 = getelementptr inbounds i8, ptr %.102, i64 16
store i64 %.59.fca.2.load, ptr %sunkaddr14, align 8
%sunkaddr15 = getelementptr inbounds i8, ptr %.102, i64 24
store i64 %.59.fca.3.load, ptr %sunkaddr15, align 8
%sunkaddr16 = getelementptr inbounds i8, ptr %.102, i64 32
store ptr %.59.fca.4.load, ptr %sunkaddr16, align 8
%sunkaddr17 = getelementptr inbounds i8, ptr %.102, i64 40
store i64 %.59.fca.5.0.load, ptr %sunkaddr17, align 8
%sunkaddr18 = getelementptr inbounds i8, ptr %.102, i64 48
store i64 %.59.fca.6.0.load, ptr %sunkaddr18, align 8
%.106 = call ptr @NRT_adapt_ndarray_to_python_acqref(ptr nonnull %.102, ptr %.101, i32 1, i32 1, ptr %.84.0)
call void @NRT_decref(ptr %.59.fca.0.load)
br label %common.ret
}
declare i32 @PyArg_UnpackTuple(ptr, ptr, i64, i64, ...) local_unnamed_addr
declare void @PyErr_SetString(ptr, ptr) local_unnamed_addr
; Function Attrs: mustprogress nocallback nofree nounwind willreturn memory(argmem: write)
declare void @llvm.memset.p0.i64(ptr writeonly captures(none), i8, i64, i1 immarg) #1
declare i32 @NRT_adapt_ndarray_from_python(ptr captures(none), ptr captures(none)) local_unnamed_addr
declare ptr @PyList_GetItem(ptr, i64) local_unnamed_addr
declare ptr @numba_unpickle(ptr, i32, ptr) local_unnamed_addr
declare ptr @NRT_adapt_ndarray_to_python_acqref(ptr captures(none), ptr, i32, i32, ptr) local_unnamed_addr
; Function Attrs: nofree norecurse nounwind memory(readwrite, inaccessiblemem: none)
define { ptr, ptr, i64, i64, ptr, [1 x i64], [1 x i64] } @cfunc._ZN8__main__12my_array_addB2v1B38c8tJTIeFIjxB2IKSgI4CrvQClQZ6FczSBAA_3dE5ArrayIiLi1E1C7mutable7alignedE({ ptr, ptr, i64, i64, ptr, [1 x i64], [1 x i64] } %.1) local_unnamed_addr #2 {
entry:
%.3 = alloca { ptr, ptr, i64, i64, ptr, [1 x i64], [1 x i64] }, align 8
call void @llvm.memset.p0.i64(ptr noundef nonnull align 8 dereferenceable(56) %.3, i8 0, i64 56, i1 false)
%extracted.meminfo = extractvalue { ptr, ptr, i64, i64, ptr, [1 x i64], [1 x i64] } %.1, 0
%extracted.parent = extractvalue { ptr, ptr, i64, i64, ptr, [1 x i64], [1 x i64] } %.1, 1
%extracted.nitems = extractvalue { ptr, ptr, i64, i64, ptr, [1 x i64], [1 x i64] } %.1, 2
%extracted.itemsize = extractvalue { ptr, ptr, i64, i64, ptr, [1 x i64], [1 x i64] } %.1, 3
%extracted.data = extractvalue { ptr, ptr, i64, i64, ptr, [1 x i64], [1 x i64] } %.1, 4
%extracted.shape = extractvalue { ptr, ptr, i64, i64, ptr, [1 x i64], [1 x i64] } %.1, 5
%.7 = extractvalue [1 x i64] %extracted.shape, 0
%extracted.strides = extractvalue { ptr, ptr, i64, i64, ptr, [1 x i64], [1 x i64] } %.1, 6
%.8 = extractvalue [1 x i64] %extracted.strides, 0
%.9 = call i32 @_ZN8__main__12my_array_addB2v1B38c8tJTIeFIjxB2IKSgI4CrvQClQZ6FczSBAA_3dE5ArrayIiLi1E1C7mutable7alignedE(ptr nonnull %.3, ptr nonnull poison, ptr %extracted.meminfo, ptr %extracted.parent, i64 %extracted.nitems, i64 %extracted.itemsize, ptr %extracted.data, i64 %.7, i64 %.8) #4
ret { ptr, ptr, i64, i64, ptr, [1 x i64], [1 x i64] } %.1
/* %.19.fca.0.load = load ptr, ptr %.3, align 8
%inserted.meminfo = insertvalue { ptr, ptr, i64, i64, ptr, [1 x i64], [1 x i64] } undef, ptr %.19.fca.0.load, 0
%.fca.1.gep = getelementptr inbounds nuw i8, ptr %.3, i64 8
%.19.fca.1.load = load ptr, ptr %.fca.1.gep, align 8
%inserted.parent = insertvalue { ptr, ptr, i64, i64, ptr, [1 x i64], [1 x i64] } %inserted.meminfo, ptr %.19.fca.1.load, 1
%.fca.2.gep = getelementptr inbounds nuw i8, ptr %.3, i64 16
%.19.fca.2.load = load i64, ptr %.fca.2.gep, align 8
%inserted.nitems = insertvalue { ptr, ptr, i64, i64, ptr, [1 x i64], [1 x i64] } %inserted.parent, i64 %.19.fca.2.load, 2
%.fca.3.gep = getelementptr inbounds nuw i8, ptr %.3, i64 24
%.19.fca.3.load = load i64, ptr %.fca.3.gep, align 8
%inserted.itemsize = insertvalue { ptr, ptr, i64, i64, ptr, [1 x i64], [1 x i64] } %inserted.nitems, i64 %.19.fca.3.load, 3
%.fca.4.gep = getelementptr inbounds nuw i8, ptr %.3, i64 32
%.19.fca.4.load = load ptr, ptr %.fca.4.gep, align 8
%inserted.data = insertvalue { ptr, ptr, i64, i64, ptr, [1 x i64], [1 x i64] } %inserted.itemsize, ptr %.19.fca.4.load, 4
%.fca.5.0.gep = getelementptr inbounds nuw i8, ptr %.3, i64 40
%.19.fca.5.0.load = load i64, ptr %.fca.5.0.gep, align 8
%.28 = insertvalue [1 x i64] undef, i64 %.19.fca.5.0.load, 0
%inserted.shape = insertvalue { ptr, ptr, i64, i64, ptr, [1 x i64], [1 x i64] } %inserted.data, [1 x i64] %.28, 5
%.fca.6.0.gep = getelementptr inbounds nuw i8, ptr %.3, i64 48
%.19.fca.6.0.load = load i64, ptr %.fca.6.0.gep, align 8
%.30 = insertvalue [1 x i64] undef, i64 %.19.fca.6.0.load, 0
%inserted.strides = insertvalue { ptr, ptr, i64, i64, ptr, [1 x i64], [1 x i64] } %inserted.shape, [1 x i64] %.30, 6
ret { ptr, ptr, i64, i64, ptr, [1 x i64], [1 x i64] } %inserted.strides */
}
; Function Attrs: mustprogress nofree noinline norecurse nounwind willreturn memory(argmem: readwrite)
define linkonce_odr void @NRT_incref(ptr captures(address_is_null) %.1) local_unnamed_addr #3 {
.3:
%.4 = icmp eq ptr %.1, null
br i1 %.4, label %common.ret, label %.3.endif, !prof !5
common.ret: ; preds = %.3.endif, %.3
ret void
.3.endif: ; preds = %.3
%.4.i = atomicrmw add ptr %.1, i64 1 monotonic, align 8
br label %common.ret
}
; Function Attrs: noinline
define linkonce_odr void @NRT_decref(ptr %.1) local_unnamed_addr #4 {
.3:
%.4 = icmp eq ptr %.1, null
br i1 %.4, label %common.ret1, label %.3.endif, !prof !5
common.ret1: ; preds = %.3, %.3.endif
ret void
.3.endif: ; preds = %.3
fence release
%0 = tail call i8 @llvm.x86.atomic.sub.cc.i64(ptr nonnull %.1, i64 1, i32 4)
%1 = trunc i8 %0 to i1
br i1 %1, label %.3.endif.if, label %common.ret1, !prof !5
.3.endif.if: ; preds = %.3.endif
fence acquire
tail call void @NRT_MemInfo_call_dtor(ptr nonnull %.1)
ret void
}
; Function Attrs: nounwind
declare i8 @llvm.x86.atomic.sub.cc.i64(ptr, i64, i32 immarg) #5
declare void @NRT_MemInfo_call_dtor(ptr) local_unnamed_addr
attributes #0 = { nofree norecurse nounwind memory(argmem: readwrite) }
attributes #1 = { mustprogress nocallback nofree nounwind willreturn memory(argmem: write) }
attributes #2 = { nofree norecurse nounwind memory(readwrite, inaccessiblemem: none) }
attributes #3 = { mustprogress nofree noinline norecurse nounwind willreturn memory(argmem: readwrite) }
attributes #4 = { noinline }
attributes #5 = { nounwind }
!0 = distinct !{!0, !1, !2}
!1 = !{!"llvm.loop.isvectorized", i32 1}
!2 = !{!"llvm.loop.unroll.runtime.disable"}
!3 = distinct !{!3, !1, !2}
!4 = distinct !{!4, !2, !1}
!5 = !{!"branch_weights", i32 1, i32 99}