From 2fb7d3d583d15cea366881bb3bd13d6604115ec5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Inf=C3=BChr?= Date: Sun, 27 Oct 2024 22:14:07 +0100 Subject: [PATCH] boots: Start removing duplicate stores as well --- pkgs/boots/load_elimination.dora | 13 +++++++++++++ tests/opt/load-elimination.dora | 11 +++++++++++ 2 files changed, 24 insertions(+) diff --git a/pkgs/boots/load_elimination.dora b/pkgs/boots/load_elimination.dora index 17a225ef0..73374b5de 100644 --- a/pkgs/boots/load_elimination.dora +++ b/pkgs/boots/load_elimination.dora @@ -64,9 +64,22 @@ pub fn performLoadElimination(ci: CompilationInfo, graph: Graph) { if inst.hasClassInfo() { let class_info = inst.getClassInfo(); let field_offset = inst.getOffset(); + + let object = inst.getInput(0).getValue(); + let field = Field(object, class_info, field_offset); + let cur_value = data.class_values.get(field); + data.class_values.retainIf(|field: Field, value: Inst|: Bool { field.class_info != class_info || field.offset != field_offset }); + + let new_value = inst.getInput(1).getValue(); + if cur_value is Some(cur_value) && cur_value == new_value { + assert(!inst.hasUses()); + inst.remove(); + } + + data.class_values.insert(field, new_value); } } else if op.isCall() { diff --git a/tests/opt/load-elimination.dora b/tests/opt/load-elimination.dora index 673dace76..01a3d74ba 100644 --- a/tests/opt/load-elimination.dora +++ b/tests/opt/load-elimination.dora @@ -14,6 +14,9 @@ fn main() { let x = Foo(100, 300); assert(f3(x, x) == 200); + + let x = Foo(100, 300); + assert(f4(x, 12) == 12); } @Optimize @@ -34,3 +37,11 @@ fn f3(foo: Foo, foo2: Foo): Int { foo2.b = 10; x + foo.a } + +@Optimize +fn f4(foo: Foo, value: Int): Int { + let tmp = foo.a; + foo.a = value; + foo.a = value; + foo.a +}