
An allocated object is never nil, so there is no need for a nil check. This probably does not result in any better optimization (the nil check is easily optimized away by LLVM because the result of runtime.alloc is marked nonnull) but it makes the slice tests a bit cleaner.
88 строки
3,9 КиБ
LLVM
88 строки
3,9 КиБ
LLVM
; ModuleID = 'slice.go'
|
|
source_filename = "slice.go"
|
|
target datalayout = "e-m:e-p:32:32-p270:32:32-p271:32:32-p272:64:64-f64:32:64-f80:32-n8:16:32-S128"
|
|
target triple = "i686--linux"
|
|
|
|
declare noalias nonnull i8* @runtime.alloc(i32, i8*, i8*)
|
|
|
|
define hidden void @main.init(i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
ret void
|
|
}
|
|
|
|
define hidden i32 @main.sliceLen(i32* %ints.data, i32 %ints.len, i32 %ints.cap, i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
ret i32 %ints.len
|
|
}
|
|
|
|
define hidden i32 @main.sliceCap(i32* %ints.data, i32 %ints.len, i32 %ints.cap, i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
ret i32 %ints.cap
|
|
}
|
|
|
|
define hidden i32 @main.sliceElement(i32* %ints.data, i32 %ints.len, i32 %ints.cap, i32 %index, i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
%.not = icmp ult i32 %index, %ints.len
|
|
br i1 %.not, label %lookup.next, label %lookup.throw
|
|
|
|
lookup.throw: ; preds = %entry
|
|
call void @runtime.lookupPanic(i8* undef, i8* null)
|
|
unreachable
|
|
|
|
lookup.next: ; preds = %entry
|
|
%0 = getelementptr inbounds i32, i32* %ints.data, i32 %index
|
|
%1 = load i32, i32* %0, align 4
|
|
ret i32 %1
|
|
}
|
|
|
|
declare void @runtime.lookupPanic(i8*, i8*)
|
|
|
|
define hidden { i32*, i32, i32 } @main.sliceAppendValues(i32* %ints.data, i32 %ints.len, i32 %ints.cap, i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
%varargs = call i8* @runtime.alloc(i32 12, i8* undef, i8* null)
|
|
%0 = bitcast i8* %varargs to i32*
|
|
store i32 1, i32* %0, align 4
|
|
%1 = getelementptr inbounds i8, i8* %varargs, i32 4
|
|
%2 = bitcast i8* %1 to i32*
|
|
store i32 2, i32* %2, align 4
|
|
%3 = getelementptr inbounds i8, i8* %varargs, i32 8
|
|
%4 = bitcast i8* %3 to i32*
|
|
store i32 3, i32* %4, align 4
|
|
%append.srcPtr = bitcast i32* %ints.data to i8*
|
|
%append.new = call { i8*, i32, i32 } @runtime.sliceAppend(i8* %append.srcPtr, i8* nonnull %varargs, i32 %ints.len, i32 %ints.cap, i32 3, i32 4, i8* undef, i8* null)
|
|
%append.newPtr = extractvalue { i8*, i32, i32 } %append.new, 0
|
|
%append.newBuf = bitcast i8* %append.newPtr to i32*
|
|
%append.newLen = extractvalue { i8*, i32, i32 } %append.new, 1
|
|
%append.newCap = extractvalue { i8*, i32, i32 } %append.new, 2
|
|
%5 = insertvalue { i32*, i32, i32 } undef, i32* %append.newBuf, 0
|
|
%6 = insertvalue { i32*, i32, i32 } %5, i32 %append.newLen, 1
|
|
%7 = insertvalue { i32*, i32, i32 } %6, i32 %append.newCap, 2
|
|
ret { i32*, i32, i32 } %7
|
|
}
|
|
|
|
declare { i8*, i32, i32 } @runtime.sliceAppend(i8*, i8*, i32, i32, i32, i32, i8*, i8*)
|
|
|
|
define hidden { i32*, i32, i32 } @main.sliceAppendSlice(i32* %ints.data, i32 %ints.len, i32 %ints.cap, i32* %added.data, i32 %added.len, i32 %added.cap, i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
%append.srcPtr = bitcast i32* %ints.data to i8*
|
|
%append.srcPtr1 = bitcast i32* %added.data to i8*
|
|
%append.new = call { i8*, i32, i32 } @runtime.sliceAppend(i8* %append.srcPtr, i8* %append.srcPtr1, i32 %ints.len, i32 %ints.cap, i32 %added.len, i32 4, i8* undef, i8* null)
|
|
%append.newPtr = extractvalue { i8*, i32, i32 } %append.new, 0
|
|
%append.newBuf = bitcast i8* %append.newPtr to i32*
|
|
%append.newLen = extractvalue { i8*, i32, i32 } %append.new, 1
|
|
%append.newCap = extractvalue { i8*, i32, i32 } %append.new, 2
|
|
%0 = insertvalue { i32*, i32, i32 } undef, i32* %append.newBuf, 0
|
|
%1 = insertvalue { i32*, i32, i32 } %0, i32 %append.newLen, 1
|
|
%2 = insertvalue { i32*, i32, i32 } %1, i32 %append.newCap, 2
|
|
ret { i32*, i32, i32 } %2
|
|
}
|
|
|
|
define hidden i32 @main.sliceCopy(i32* %dst.data, i32 %dst.len, i32 %dst.cap, i32* %src.data, i32 %src.len, i32 %src.cap, i8* %context, i8* %parentHandle) unnamed_addr {
|
|
entry:
|
|
%copy.dstPtr = bitcast i32* %dst.data to i8*
|
|
%copy.srcPtr = bitcast i32* %src.data to i8*
|
|
%copy.n = call i32 @runtime.sliceCopy(i8* %copy.dstPtr, i8* %copy.srcPtr, i32 %dst.len, i32 %src.len, i32 4, i8* undef, i8* null)
|
|
ret i32 %copy.n
|
|
}
|
|
|
|
declare i32 @runtime.sliceCopy(i8*, i8*, i32, i32, i32, i8*, i8*)
|