compiler: add some more slice tests
Этот коммит содержится в:
родитель
71d1b70ab7
коммит
2709d38d63
2 изменённых файлов: 109 добавлений и 0 удалений
16
compiler/testdata/slice.go
предоставленный
16
compiler/testdata/slice.go
предоставленный
|
@ -7,3 +7,19 @@ func sliceLen(ints []int) int {
|
||||||
func sliceCap(ints []int) int {
|
func sliceCap(ints []int) int {
|
||||||
return cap(ints)
|
return cap(ints)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func sliceElement(ints []int, index int) int {
|
||||||
|
return ints[index]
|
||||||
|
}
|
||||||
|
|
||||||
|
func sliceAppendValues(ints []int) []int {
|
||||||
|
return append(ints, 1, 2, 3)
|
||||||
|
}
|
||||||
|
|
||||||
|
func sliceAppendSlice(ints, added []int) []int {
|
||||||
|
return append(ints, added...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func sliceCopy(dst, src []int) int {
|
||||||
|
return copy(dst, src)
|
||||||
|
}
|
||||||
|
|
93
compiler/testdata/slice.ll
предоставленный
93
compiler/testdata/slice.ll
предоставленный
|
@ -19,3 +19,96 @@ define hidden i32 @main.sliceCap(i32* %ints.data, i32 %ints.len, i32 %ints.cap,
|
||||||
entry:
|
entry:
|
||||||
ret i32 %ints.cap
|
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)
|
||||||
|
br i1 false, label %gep.throw, label %gep.next
|
||||||
|
|
||||||
|
gep.throw: ; preds = %entry
|
||||||
|
unreachable
|
||||||
|
|
||||||
|
gep.next: ; preds = %entry
|
||||||
|
%0 = bitcast i8* %varargs to i32*
|
||||||
|
store i32 1, i32* %0, align 4
|
||||||
|
br i1 false, label %gep.throw1, label %gep.next2
|
||||||
|
|
||||||
|
gep.throw1: ; preds = %gep.next
|
||||||
|
unreachable
|
||||||
|
|
||||||
|
gep.next2: ; preds = %gep.next
|
||||||
|
%1 = getelementptr inbounds i8, i8* %varargs, i32 4
|
||||||
|
%2 = bitcast i8* %1 to i32*
|
||||||
|
store i32 2, i32* %2, align 4
|
||||||
|
br i1 false, label %gep.throw3, label %gep.next4
|
||||||
|
|
||||||
|
gep.throw3: ; preds = %gep.next2
|
||||||
|
unreachable
|
||||||
|
|
||||||
|
gep.next4: ; preds = %gep.next2
|
||||||
|
%3 = getelementptr inbounds i8, i8* %varargs, i32 8
|
||||||
|
%4 = bitcast i8* %3 to i32*
|
||||||
|
store i32 3, i32* %4, align 4
|
||||||
|
br i1 false, label %slice.throw, label %slice.next
|
||||||
|
|
||||||
|
slice.throw: ; preds = %gep.next4
|
||||||
|
unreachable
|
||||||
|
|
||||||
|
slice.next: ; preds = %gep.next4
|
||||||
|
%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 void @runtime.nilPanic(i8*, i8*)
|
||||||
|
|
||||||
|
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*)
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче