compiler: move allocations > 256 bytes to the heap
Этот коммит содержится в:
родитель
f2fef290c9
коммит
4b2edc9a26
2 изменённых файлов: 4 добавлений и 2 удалений
|
@ -1571,8 +1571,9 @@ func (b *builder) createExpr(expr ssa.Value) (llvm.Value, error) {
|
||||||
switch expr := expr.(type) {
|
switch expr := expr.(type) {
|
||||||
case *ssa.Alloc:
|
case *ssa.Alloc:
|
||||||
typ := b.getLLVMType(expr.Type().Underlying().(*types.Pointer).Elem())
|
typ := b.getLLVMType(expr.Type().Underlying().(*types.Pointer).Elem())
|
||||||
if expr.Heap {
|
|
||||||
size := b.targetData.TypeAllocSize(typ)
|
size := b.targetData.TypeAllocSize(typ)
|
||||||
|
// Move all "large" allocations to the heap. This value is also transform.maxStackAlloc.
|
||||||
|
if expr.Heap || size > 256 {
|
||||||
// Calculate ^uintptr(0)
|
// Calculate ^uintptr(0)
|
||||||
maxSize := llvm.ConstNot(llvm.ConstInt(b.uintptrType, 0, false)).ZExtValue()
|
maxSize := llvm.ConstNot(llvm.ConstInt(b.uintptrType, 0, false)).ZExtValue()
|
||||||
if size > maxSize {
|
if size > maxSize {
|
||||||
|
|
|
@ -18,6 +18,7 @@ import (
|
||||||
// always be heap allocated.
|
// always be heap allocated.
|
||||||
//
|
//
|
||||||
// TODO: tune this, this is just a random value.
|
// TODO: tune this, this is just a random value.
|
||||||
|
// This value is also used in the compiler when translating ssa.Alloc nodes.
|
||||||
const maxStackAlloc = 256
|
const maxStackAlloc = 256
|
||||||
|
|
||||||
// OptimizeAllocs tries to replace heap allocations with stack allocations
|
// OptimizeAllocs tries to replace heap allocations with stack allocations
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче