From c4e1de3ac56be4562c236fdddf759d7895a705d7 Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Sat, 20 Sep 2025 10:52:40 +0200 Subject: [PATCH] Removed memory addresses from basic blocks --- src/codegen/executeLoad.go | 2 +- src/codegen/executeStore.go | 2 +- src/core/compileStoreField.go | 4 ++-- src/core/evaluateArray.go | 4 ++-- src/core/evaluateDot.go | 4 ++-- src/core/evaluateRight.go | 4 ++-- src/ssa/Load.go | 12 +++++------- src/ssa/Memory.go | 28 ++++++++++++++-------------- src/ssa/Store.go | 10 ++++------ 9 files changed, 33 insertions(+), 37 deletions(-) diff --git a/src/codegen/executeLoad.go b/src/codegen/executeLoad.go index 2618ccf..28db171 100644 --- a/src/codegen/executeLoad.go +++ b/src/codegen/executeLoad.go @@ -10,7 +10,7 @@ func (f *Function) executeLoad(step *Step, instr *ssa.Load) { return } - memory := instr.Memory.(*ssa.Memory) + memory := instr.Memory address := f.ValueToStep[memory.Address] index := f.ValueToStep[memory.Index] elementSize := step.Value.Type().Size() diff --git a/src/codegen/executeStore.go b/src/codegen/executeStore.go index d052bd9..f54d332 100644 --- a/src/codegen/executeStore.go +++ b/src/codegen/executeStore.go @@ -6,7 +6,7 @@ import ( ) func (f *Function) executeStore(instr *ssa.Store) { - memory := instr.Memory.(*ssa.Memory) + memory := instr.Memory address := f.ValueToStep[memory.Address] index := f.ValueToStep[memory.Index] source := f.ValueToStep[instr.Value] diff --git a/src/core/compileStoreField.go b/src/core/compileStoreField.go index 73af61b..36df0f9 100644 --- a/src/core/compileStoreField.go +++ b/src/core/compileStoreField.go @@ -55,12 +55,12 @@ func (f *Function) compileStoreField(node *ast.Assign) error { offset := f.Append(&ssa.Int{Int: int(field.Offset)}) - memory := f.Append(&ssa.Memory{ + memory := &ssa.Memory{ Address: addressValue, Index: offset, Scale: false, Typ: field.Type, - }) + } f.Append(&ssa.Store{ Memory: memory, diff --git a/src/core/evaluateArray.go b/src/core/evaluateArray.go index 192bd42..af1de02 100644 --- a/src/core/evaluateArray.go +++ b/src/core/evaluateArray.go @@ -55,13 +55,13 @@ func (f *Function) evaluateArray(expr *expression.Expression) (ssa.Value, error) indexValue = f.Append(&ssa.Int{Int: 0}) } - memory := f.Append(&ssa.Memory{ + memory := &ssa.Memory{ Address: addressValue, Index: indexValue, Scale: true, Typ: pointer.To, Source: expr.Source(), - }) + } return memory, nil } \ No newline at end of file diff --git a/src/core/evaluateDot.go b/src/core/evaluateDot.go index 3b43a7d..83da6a7 100644 --- a/src/core/evaluateDot.go +++ b/src/core/evaluateDot.go @@ -100,12 +100,12 @@ func (f *Function) evaluateDot(expr *expression.Expression) (ssa.Value, error) { field := structure.FieldByName(rightText) offset := f.Append(&ssa.Int{Int: int(field.Offset)}) - memory := f.Append(&ssa.Memory{ + memory := &ssa.Memory{ Address: leftValue, Index: offset, Scale: false, Typ: field.Type, - }) + } load := f.Append(&ssa.Load{Memory: memory}) return load, nil diff --git a/src/core/evaluateRight.go b/src/core/evaluateRight.go index 3c2949d..87cdc1d 100644 --- a/src/core/evaluateRight.go +++ b/src/core/evaluateRight.go @@ -26,12 +26,12 @@ func (f *Function) evaluateRight(expr *expression.Expression) (ssa.Value, error) fields := make([]ssa.Value, 0, len(typ.Fields)) for _, field := range typ.Fields { - fieldMemory := f.Append(&ssa.Memory{ + fieldMemory := &ssa.Memory{ Address: memory.Address, Index: f.Append(&ssa.Int{Int: int(field.Offset)}), Scale: false, Typ: field.Type, - }) + } fieldValue := f.Append(&ssa.Load{ Memory: fieldMemory, diff --git a/src/ssa/Load.go b/src/ssa/Load.go index f648edf..240ba69 100644 --- a/src/ssa/Load.go +++ b/src/ssa/Load.go @@ -8,7 +8,7 @@ import ( // Load stores a value at a given index relative to the address. type Load struct { - Memory Value + Memory *Memory Liveness Source } @@ -32,22 +32,20 @@ func (l *Load) IsPure() bool { // Inputs returns the memory address of the load. func (l *Load) Inputs() []Value { - return []Value{l.Memory} + return []Value{l.Memory.Address, l.Memory.Index} } // Replace replaces the address or index if it matches. func (l *Load) Replace(old Value, new Value) { - if l.Memory == old { - l.Memory = new - } + l.Memory.Replace(old, new) } // String returns a human-readable representation of the load. func (l *Load) String() string { - return fmt.Sprintf("load(%p)", l.Memory) + return fmt.Sprintf("load(%s)", l.Memory) } // Type returns the type of the loaded value. func (l *Load) Type() types.Type { - return l.Memory.(*Memory).Typ + return l.Memory.Typ } \ No newline at end of file diff --git a/src/ssa/Memory.go b/src/ssa/Memory.go index 555c231..9a2be65 100644 --- a/src/ssa/Memory.go +++ b/src/ssa/Memory.go @@ -28,36 +28,36 @@ func (a *Memory) Equals(v Value) bool { } // Inputs returns the address and index of the memory. -func (s *Memory) Inputs() []Value { - return []Value{s.Address, s.Index} +func (m *Memory) Inputs() []Value { + return []Value{m.Address, m.Index} } // IsPure returns false because the inputs are not consumed. -func (l *Memory) IsPure() bool { +func (m *Memory) IsPure() bool { return false } // Replace replaces the address, index, or value if it matches. -func (s *Memory) Replace(old Value, new Value) { - if s.Address == old { - s.Address = new +func (m *Memory) Replace(old Value, new Value) { + if m.Address == old { + m.Address = new } - if s.Index == old { - s.Index = new + if m.Index == old { + m.Index = new } } // String returns a human-readable representation of the memory. -func (s *Memory) String() string { - if s.Scale { - return fmt.Sprintf("memory(%db, %p + %p * %d)", s.Typ.Size(), s.Address, s.Index, s.Typ.Size()) +func (m *Memory) String() string { + if m.Scale { + return fmt.Sprintf("memory(%db, %p + %p * %d)", m.Typ.Size(), m.Address, m.Index, m.Typ.Size()) } - return fmt.Sprintf("memory(%db, %p + %p)", s.Typ.Size(), s.Address, s.Index) + return fmt.Sprintf("memory(%db, %p + %p)", m.Typ.Size(), m.Address, m.Index) } // Type returns the type of the loaded value. -func (s *Memory) Type() types.Type { - return s.Typ +func (m *Memory) Type() types.Type { + return m.Typ } \ No newline at end of file diff --git a/src/ssa/Store.go b/src/ssa/Store.go index ccc43fa..cdaea8c 100644 --- a/src/ssa/Store.go +++ b/src/ssa/Store.go @@ -8,7 +8,7 @@ import ( type Store struct { Void Value Value - Memory Value + Memory *Memory Source } @@ -25,14 +25,12 @@ func (a *Store) Equals(v Value) bool { // Inputs returns the memory address and value of the store. func (s *Store) Inputs() []Value { - return []Value{s.Memory, s.Value} + return []Value{s.Memory.Address, s.Memory.Index, s.Value} } // Replace replaces the address, index, or value if it matches. func (s *Store) Replace(old Value, new Value) { - if s.Memory == old { - s.Memory = new - } + s.Memory.Replace(old, new) if s.Value == old { s.Value = new @@ -41,5 +39,5 @@ func (s *Store) Replace(old Value, new Value) { // String returns a human-readable representation of the store. func (s *Store) String() string { - return fmt.Sprintf("store(%p, %p)", s.Memory, s.Value) + return fmt.Sprintf("store(%s, %p)", s.Memory, s.Value) } \ No newline at end of file -- 2.51.2