Skip to content

Commit 571447c

Browse files
aykevldeadprogram
authored andcommitted
compiler: add 'align' attribute to runtime.alloc calls
This adds something like 'align 4' to the runtime.alloc calls, so that the compiler knows the alignment of the allocation and can optimize accordingly. The optimization is very small, only 0.01% in my small test. However, my plan is to read the value in the heap-to-stack transform pass to make it more correct and let it produce slightly more optimal code.
1 parent 9cb2634 commit 571447c

File tree

6 files changed

+36
-30
lines changed

6 files changed

+36
-30
lines changed

compiler/compiler.go

+4
Original file line numberDiff line numberDiff line change
@@ -2017,6 +2017,8 @@ func (b *builder) createExpr(expr ssa.Value) (llvm.Value, error) {
20172017
sizeValue := llvm.ConstInt(b.uintptrType, size, false)
20182018
layoutValue := b.createObjectLayout(typ, expr.Pos())
20192019
buf := b.createRuntimeCall("alloc", []llvm.Value{sizeValue, layoutValue}, expr.Comment)
2020+
align := b.targetData.ABITypeAlignment(typ)
2021+
buf.AddCallSiteAttribute(0, b.ctx.CreateEnumAttribute(llvm.AttributeKindID("align"), uint64(align)))
20202022
return buf, nil
20212023
} else {
20222024
buf := llvmutil.CreateEntryBlockAlloca(b.Builder, typ, expr.Comment)
@@ -2223,6 +2225,7 @@ func (b *builder) createExpr(expr ssa.Value) (llvm.Value, error) {
22232225
sliceType := expr.Type().Underlying().(*types.Slice)
22242226
llvmElemType := b.getLLVMType(sliceType.Elem())
22252227
elemSize := b.targetData.TypeAllocSize(llvmElemType)
2228+
elemAlign := b.targetData.ABITypeAlignment(llvmElemType)
22262229
elemSizeValue := llvm.ConstInt(b.uintptrType, elemSize, false)
22272230

22282231
maxSize := b.maxSliceSize(llvmElemType)
@@ -2246,6 +2249,7 @@ func (b *builder) createExpr(expr ssa.Value) (llvm.Value, error) {
22462249
sliceSize := b.CreateBinOp(llvm.Mul, elemSizeValue, sliceCapCast, "makeslice.cap")
22472250
layoutValue := b.createObjectLayout(llvmElemType, expr.Pos())
22482251
slicePtr := b.createRuntimeCall("alloc", []llvm.Value{sliceSize, layoutValue}, "makeslice.buf")
2252+
slicePtr.AddCallSiteAttribute(0, b.ctx.CreateEnumAttribute(llvm.AttributeKindID("align"), uint64(elemAlign)))
22492253

22502254
// Extend or truncate if necessary. This is safe as we've already done
22512255
// the bounds check.

compiler/llvm.go

+2
Original file line numberDiff line numberDiff line change
@@ -127,12 +127,14 @@ func (b *builder) emitPointerPack(values []llvm.Value) llvm.Value {
127127

128128
// Packed data is bigger than a pointer, so allocate it on the heap.
129129
sizeValue := llvm.ConstInt(b.uintptrType, size, false)
130+
align := b.targetData.ABITypeAlignment(packedType)
130131
alloc := b.mod.NamedFunction("runtime.alloc")
131132
packedAlloc := b.CreateCall(alloc.GlobalValueType(), alloc, []llvm.Value{
132133
sizeValue,
133134
llvm.ConstNull(b.dataPtrType),
134135
llvm.Undef(b.dataPtrType), // unused context parameter
135136
}, "")
137+
packedAlloc.AddCallSiteAttribute(0, b.ctx.CreateEnumAttribute(llvm.AttributeKindID("align"), uint64(align)))
136138
if b.NeedsStackObjects {
137139
b.trackPointer(packedAlloc)
138140
}

compiler/testdata/gc.ll

+16-16
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,16 @@ entry:
3939
define hidden void @main.newScalar(ptr %context) unnamed_addr #2 {
4040
entry:
4141
%stackalloc = alloca i8, align 1
42-
%new = call dereferenceable(1) ptr @runtime.alloc(i32 1, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
42+
%new = call align 1 dereferenceable(1) ptr @runtime.alloc(i32 1, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
4343
call void @runtime.trackPointer(ptr nonnull %new, ptr nonnull %stackalloc, ptr undef) #3
4444
store ptr %new, ptr @main.scalar1, align 4
45-
%new1 = call dereferenceable(4) ptr @runtime.alloc(i32 4, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
45+
%new1 = call align 4 dereferenceable(4) ptr @runtime.alloc(i32 4, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
4646
call void @runtime.trackPointer(ptr nonnull %new1, ptr nonnull %stackalloc, ptr undef) #3
4747
store ptr %new1, ptr @main.scalar2, align 4
48-
%new2 = call dereferenceable(8) ptr @runtime.alloc(i32 8, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
48+
%new2 = call align 8 dereferenceable(8) ptr @runtime.alloc(i32 8, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
4949
call void @runtime.trackPointer(ptr nonnull %new2, ptr nonnull %stackalloc, ptr undef) #3
5050
store ptr %new2, ptr @main.scalar3, align 4
51-
%new3 = call dereferenceable(4) ptr @runtime.alloc(i32 4, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
51+
%new3 = call align 4 dereferenceable(4) ptr @runtime.alloc(i32 4, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
5252
call void @runtime.trackPointer(ptr nonnull %new3, ptr nonnull %stackalloc, ptr undef) #3
5353
store ptr %new3, ptr @main.scalar4, align 4
5454
ret void
@@ -58,13 +58,13 @@ entry:
5858
define hidden void @main.newArray(ptr %context) unnamed_addr #2 {
5959
entry:
6060
%stackalloc = alloca i8, align 1
61-
%new = call dereferenceable(3) ptr @runtime.alloc(i32 3, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
61+
%new = call align 1 dereferenceable(3) ptr @runtime.alloc(i32 3, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
6262
call void @runtime.trackPointer(ptr nonnull %new, ptr nonnull %stackalloc, ptr undef) #3
6363
store ptr %new, ptr @main.array1, align 4
64-
%new1 = call dereferenceable(71) ptr @runtime.alloc(i32 71, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
64+
%new1 = call align 1 dereferenceable(71) ptr @runtime.alloc(i32 71, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
6565
call void @runtime.trackPointer(ptr nonnull %new1, ptr nonnull %stackalloc, ptr undef) #3
6666
store ptr %new1, ptr @main.array2, align 4
67-
%new2 = call dereferenceable(12) ptr @runtime.alloc(i32 12, ptr nonnull inttoptr (i32 67 to ptr), ptr undef) #3
67+
%new2 = call align 4 dereferenceable(12) ptr @runtime.alloc(i32 12, ptr nonnull inttoptr (i32 67 to ptr), ptr undef) #3
6868
call void @runtime.trackPointer(ptr nonnull %new2, ptr nonnull %stackalloc, ptr undef) #3
6969
store ptr %new2, ptr @main.array3, align 4
7070
ret void
@@ -74,16 +74,16 @@ entry:
7474
define hidden void @main.newStruct(ptr %context) unnamed_addr #2 {
7575
entry:
7676
%stackalloc = alloca i8, align 1
77-
%new = call ptr @runtime.alloc(i32 0, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
77+
%new = call align 1 ptr @runtime.alloc(i32 0, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
7878
call void @runtime.trackPointer(ptr nonnull %new, ptr nonnull %stackalloc, ptr undef) #3
7979
store ptr %new, ptr @main.struct1, align 4
80-
%new1 = call dereferenceable(8) ptr @runtime.alloc(i32 8, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
80+
%new1 = call align 4 dereferenceable(8) ptr @runtime.alloc(i32 8, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
8181
call void @runtime.trackPointer(ptr nonnull %new1, ptr nonnull %stackalloc, ptr undef) #3
8282
store ptr %new1, ptr @main.struct2, align 4
83-
%new2 = call dereferenceable(248) ptr @runtime.alloc(i32 248, ptr nonnull @"runtime/gc.layout:62-2000000000000001", ptr undef) #3
83+
%new2 = call align 4 dereferenceable(248) ptr @runtime.alloc(i32 248, ptr nonnull @"runtime/gc.layout:62-2000000000000001", ptr undef) #3
8484
call void @runtime.trackPointer(ptr nonnull %new2, ptr nonnull %stackalloc, ptr undef) #3
8585
store ptr %new2, ptr @main.struct3, align 4
86-
%new3 = call dereferenceable(248) ptr @runtime.alloc(i32 248, ptr nonnull @"runtime/gc.layout:62-0001", ptr undef) #3
86+
%new3 = call align 4 dereferenceable(248) ptr @runtime.alloc(i32 248, ptr nonnull @"runtime/gc.layout:62-0001", ptr undef) #3
8787
call void @runtime.trackPointer(ptr nonnull %new3, ptr nonnull %stackalloc, ptr undef) #3
8888
store ptr %new3, ptr @main.struct4, align 4
8989
ret void
@@ -93,7 +93,7 @@ entry:
9393
define hidden ptr @main.newFuncValue(ptr %context) unnamed_addr #2 {
9494
entry:
9595
%stackalloc = alloca i8, align 1
96-
%new = call dereferenceable(8) ptr @runtime.alloc(i32 8, ptr nonnull inttoptr (i32 197 to ptr), ptr undef) #3
96+
%new = call align 4 dereferenceable(8) ptr @runtime.alloc(i32 8, ptr nonnull inttoptr (i32 197 to ptr), ptr undef) #3
9797
call void @runtime.trackPointer(ptr nonnull %new, ptr nonnull %stackalloc, ptr undef) #3
9898
ret ptr %new
9999
}
@@ -102,17 +102,17 @@ entry:
102102
define hidden void @main.makeSlice(ptr %context) unnamed_addr #2 {
103103
entry:
104104
%stackalloc = alloca i8, align 1
105-
%makeslice = call dereferenceable(5) ptr @runtime.alloc(i32 5, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
105+
%makeslice = call align 1 dereferenceable(5) ptr @runtime.alloc(i32 5, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
106106
call void @runtime.trackPointer(ptr nonnull %makeslice, ptr nonnull %stackalloc, ptr undef) #3
107107
store ptr %makeslice, ptr @main.slice1, align 4
108108
store i32 5, ptr getelementptr inbounds ({ ptr, i32, i32 }, ptr @main.slice1, i32 0, i32 1), align 4
109109
store i32 5, ptr getelementptr inbounds ({ ptr, i32, i32 }, ptr @main.slice1, i32 0, i32 2), align 4
110-
%makeslice1 = call dereferenceable(20) ptr @runtime.alloc(i32 20, ptr nonnull inttoptr (i32 67 to ptr), ptr undef) #3
110+
%makeslice1 = call align 4 dereferenceable(20) ptr @runtime.alloc(i32 20, ptr nonnull inttoptr (i32 67 to ptr), ptr undef) #3
111111
call void @runtime.trackPointer(ptr nonnull %makeslice1, ptr nonnull %stackalloc, ptr undef) #3
112112
store ptr %makeslice1, ptr @main.slice2, align 4
113113
store i32 5, ptr getelementptr inbounds ({ ptr, i32, i32 }, ptr @main.slice2, i32 0, i32 1), align 4
114114
store i32 5, ptr getelementptr inbounds ({ ptr, i32, i32 }, ptr @main.slice2, i32 0, i32 2), align 4
115-
%makeslice3 = call dereferenceable(60) ptr @runtime.alloc(i32 60, ptr nonnull inttoptr (i32 71 to ptr), ptr undef) #3
115+
%makeslice3 = call align 4 dereferenceable(60) ptr @runtime.alloc(i32 60, ptr nonnull inttoptr (i32 71 to ptr), ptr undef) #3
116116
call void @runtime.trackPointer(ptr nonnull %makeslice3, ptr nonnull %stackalloc, ptr undef) #3
117117
store ptr %makeslice3, ptr @main.slice3, align 4
118118
store i32 5, ptr getelementptr inbounds ({ ptr, i32, i32 }, ptr @main.slice3, i32 0, i32 1), align 4
@@ -124,7 +124,7 @@ entry:
124124
define hidden %runtime._interface @main.makeInterface(double %v.r, double %v.i, ptr %context) unnamed_addr #2 {
125125
entry:
126126
%stackalloc = alloca i8, align 1
127-
%0 = call dereferenceable(16) ptr @runtime.alloc(i32 16, ptr null, ptr undef) #3
127+
%0 = call align 8 dereferenceable(16) ptr @runtime.alloc(i32 16, ptr null, ptr undef) #3
128128
call void @runtime.trackPointer(ptr nonnull %0, ptr nonnull %stackalloc, ptr undef) #3
129129
store double %v.r, ptr %0, align 8
130130
%.repack1 = getelementptr inbounds { double, double }, ptr %0, i32 0, i32 1

compiler/testdata/goroutine-cortex-m-qemu-tasks.ll

+4-4
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,9 @@ entry:
6363
; Function Attrs: nounwind
6464
define hidden void @main.closureFunctionGoroutine(ptr %context) unnamed_addr #1 {
6565
entry:
66-
%n = call dereferenceable(4) ptr @runtime.alloc(i32 4, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #9
66+
%n = call align 4 dereferenceable(4) ptr @runtime.alloc(i32 4, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #9
6767
store i32 3, ptr %n, align 4
68-
%0 = call dereferenceable(8) ptr @runtime.alloc(i32 8, ptr null, ptr undef) #9
68+
%0 = call align 4 dereferenceable(8) ptr @runtime.alloc(i32 8, ptr null, ptr undef) #9
6969
store i32 5, ptr %0, align 4
7070
%1 = getelementptr inbounds { i32, ptr }, ptr %0, i32 0, i32 1
7171
store ptr %n, ptr %1, align 4
@@ -98,7 +98,7 @@ declare void @runtime.printint32(i32, ptr) #2
9898
; Function Attrs: nounwind
9999
define hidden void @main.funcGoroutine(ptr %fn.context, ptr %fn.funcptr, ptr %context) unnamed_addr #1 {
100100
entry:
101-
%0 = call dereferenceable(12) ptr @runtime.alloc(i32 12, ptr null, ptr undef) #9
101+
%0 = call align 4 dereferenceable(12) ptr @runtime.alloc(i32 12, ptr null, ptr undef) #9
102102
store i32 5, ptr %0, align 4
103103
%1 = getelementptr inbounds { i32, ptr, ptr }, ptr %0, i32 0, i32 1
104104
store ptr %fn.context, ptr %1, align 4
@@ -148,7 +148,7 @@ declare void @runtime.chanClose(ptr dereferenceable_or_null(32), ptr) #2
148148
; Function Attrs: nounwind
149149
define hidden void @main.startInterfaceMethod(ptr %itf.typecode, ptr %itf.value, ptr %context) unnamed_addr #1 {
150150
entry:
151-
%0 = call dereferenceable(16) ptr @runtime.alloc(i32 16, ptr null, ptr undef) #9
151+
%0 = call align 4 dereferenceable(16) ptr @runtime.alloc(i32 16, ptr null, ptr undef) #9
152152
store ptr %itf.value, ptr %0, align 4
153153
%1 = getelementptr inbounds { ptr, %runtime._string, ptr }, ptr %0, i32 0, i32 1
154154
store ptr @"main$string", ptr %1, align 4

compiler/testdata/goroutine-wasm-asyncify.ll

+4-4
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,12 @@ entry:
6666
define hidden void @main.closureFunctionGoroutine(ptr %context) unnamed_addr #2 {
6767
entry:
6868
%stackalloc = alloca i8, align 1
69-
%n = call dereferenceable(4) ptr @runtime.alloc(i32 4, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #9
69+
%n = call align 4 dereferenceable(4) ptr @runtime.alloc(i32 4, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #9
7070
call void @runtime.trackPointer(ptr nonnull %n, ptr nonnull %stackalloc, ptr undef) #9
7171
store i32 3, ptr %n, align 4
7272
call void @runtime.trackPointer(ptr nonnull %n, ptr nonnull %stackalloc, ptr undef) #9
7373
call void @runtime.trackPointer(ptr nonnull @"main.closureFunctionGoroutine$1", ptr nonnull %stackalloc, ptr undef) #9
74-
%0 = call dereferenceable(8) ptr @runtime.alloc(i32 8, ptr null, ptr undef) #9
74+
%0 = call align 4 dereferenceable(8) ptr @runtime.alloc(i32 8, ptr null, ptr undef) #9
7575
call void @runtime.trackPointer(ptr nonnull %0, ptr nonnull %stackalloc, ptr undef) #9
7676
store i32 5, ptr %0, align 4
7777
%1 = getelementptr inbounds { i32, ptr }, ptr %0, i32 0, i32 1
@@ -106,7 +106,7 @@ declare void @runtime.printint32(i32, ptr) #1
106106
define hidden void @main.funcGoroutine(ptr %fn.context, ptr %fn.funcptr, ptr %context) unnamed_addr #2 {
107107
entry:
108108
%stackalloc = alloca i8, align 1
109-
%0 = call dereferenceable(12) ptr @runtime.alloc(i32 12, ptr null, ptr undef) #9
109+
%0 = call align 4 dereferenceable(12) ptr @runtime.alloc(i32 12, ptr null, ptr undef) #9
110110
call void @runtime.trackPointer(ptr nonnull %0, ptr nonnull %stackalloc, ptr undef) #9
111111
store i32 5, ptr %0, align 4
112112
%1 = getelementptr inbounds { i32, ptr, ptr }, ptr %0, i32 0, i32 1
@@ -158,7 +158,7 @@ declare void @runtime.chanClose(ptr dereferenceable_or_null(32), ptr) #1
158158
define hidden void @main.startInterfaceMethod(ptr %itf.typecode, ptr %itf.value, ptr %context) unnamed_addr #2 {
159159
entry:
160160
%stackalloc = alloca i8, align 1
161-
%0 = call dereferenceable(16) ptr @runtime.alloc(i32 16, ptr null, ptr undef) #9
161+
%0 = call align 4 dereferenceable(16) ptr @runtime.alloc(i32 16, ptr null, ptr undef) #9
162162
call void @runtime.trackPointer(ptr nonnull %0, ptr nonnull %stackalloc, ptr undef) #9
163163
store ptr %itf.value, ptr %0, align 4
164164
%1 = getelementptr inbounds { ptr, %runtime._string, ptr }, ptr %0, i32 0, i32 1

compiler/testdata/slice.ll

+6-6
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ declare void @runtime.lookupPanic(ptr) #1
4848
define hidden { ptr, i32, i32 } @main.sliceAppendValues(ptr %ints.data, i32 %ints.len, i32 %ints.cap, ptr %context) unnamed_addr #2 {
4949
entry:
5050
%stackalloc = alloca i8, align 1
51-
%varargs = call dereferenceable(12) ptr @runtime.alloc(i32 12, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
51+
%varargs = call align 4 dereferenceable(12) ptr @runtime.alloc(i32 12, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
5252
call void @runtime.trackPointer(ptr nonnull %varargs, ptr nonnull %stackalloc, ptr undef) #3
5353
store i32 1, ptr %varargs, align 4
5454
%0 = getelementptr inbounds [3 x i32], ptr %varargs, i32 0, i32 1
@@ -100,7 +100,7 @@ entry:
100100
br i1 %slice.maxcap, label %slice.throw, label %slice.next
101101

102102
slice.next: ; preds = %entry
103-
%makeslice.buf = call ptr @runtime.alloc(i32 %len, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
103+
%makeslice.buf = call align 1 ptr @runtime.alloc(i32 %len, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
104104
%0 = insertvalue { ptr, i32, i32 } undef, ptr %makeslice.buf, 0
105105
%1 = insertvalue { ptr, i32, i32 } %0, i32 %len, 1
106106
%2 = insertvalue { ptr, i32, i32 } %1, i32 %len, 2
@@ -123,7 +123,7 @@ entry:
123123

124124
slice.next: ; preds = %entry
125125
%makeslice.cap = shl nuw i32 %len, 1
126-
%makeslice.buf = call ptr @runtime.alloc(i32 %makeslice.cap, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
126+
%makeslice.buf = call align 2 ptr @runtime.alloc(i32 %makeslice.cap, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
127127
%0 = insertvalue { ptr, i32, i32 } undef, ptr %makeslice.buf, 0
128128
%1 = insertvalue { ptr, i32, i32 } %0, i32 %len, 1
129129
%2 = insertvalue { ptr, i32, i32 } %1, i32 %len, 2
@@ -144,7 +144,7 @@ entry:
144144

145145
slice.next: ; preds = %entry
146146
%makeslice.cap = mul i32 %len, 3
147-
%makeslice.buf = call ptr @runtime.alloc(i32 %makeslice.cap, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
147+
%makeslice.buf = call align 1 ptr @runtime.alloc(i32 %makeslice.cap, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
148148
%0 = insertvalue { ptr, i32, i32 } undef, ptr %makeslice.buf, 0
149149
%1 = insertvalue { ptr, i32, i32 } %0, i32 %len, 1
150150
%2 = insertvalue { ptr, i32, i32 } %1, i32 %len, 2
@@ -165,7 +165,7 @@ entry:
165165

166166
slice.next: ; preds = %entry
167167
%makeslice.cap = shl nuw i32 %len, 2
168-
%makeslice.buf = call ptr @runtime.alloc(i32 %makeslice.cap, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
168+
%makeslice.buf = call align 4 ptr @runtime.alloc(i32 %makeslice.cap, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
169169
%0 = insertvalue { ptr, i32, i32 } undef, ptr %makeslice.buf, 0
170170
%1 = insertvalue { ptr, i32, i32 } %0, i32 %len, 1
171171
%2 = insertvalue { ptr, i32, i32 } %1, i32 %len, 2
@@ -216,7 +216,7 @@ declare void @runtime.sliceToArrayPointerPanic(ptr) #1
216216
define hidden ptr @main.SliceToArrayConst(ptr %context) unnamed_addr #2 {
217217
entry:
218218
%stackalloc = alloca i8, align 1
219-
%makeslice = call dereferenceable(24) ptr @runtime.alloc(i32 24, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
219+
%makeslice = call align 4 dereferenceable(24) ptr @runtime.alloc(i32 24, ptr nonnull inttoptr (i32 3 to ptr), ptr undef) #3
220220
call void @runtime.trackPointer(ptr nonnull %makeslice, ptr nonnull %stackalloc, ptr undef) #3
221221
br i1 false, label %slicetoarray.throw, label %slicetoarray.next
222222

0 commit comments

Comments
 (0)