From bbaf070bd90f32d913afa4298041a598956c09e9 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Mon, 6 Sep 2010 17:01:44 -0700 Subject: [PATCH] compiler.cfg.write-barrier: fix soundness issue with ##copy that never came up but probably should've been fixed anyway --- .../write-barrier/write-barrier-tests.factor | 61 +++++++++++++++++++ .../cfg/write-barrier/write-barrier.factor | 2 +- 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/basis/compiler/cfg/write-barrier/write-barrier-tests.factor b/basis/compiler/cfg/write-barrier/write-barrier-tests.factor index 136324ba47..b11ffa8716 100644 --- a/basis/compiler/cfg/write-barrier/write-barrier-tests.factor +++ b/basis/compiler/cfg/write-barrier/write-barrier-tests.factor @@ -91,3 +91,64 @@ IN: compiler.cfg.write-barrier.tests T{ ##write-barrier-imm f 1 } } write-barriers-step ] unit-test + +! ##copy instructions +[ + V{ + T{ ##copy f 2 1 } + T{ ##set-slot-imm f 3 1 } + T{ ##write-barrier-imm f 2 } + } +] [ + V{ + T{ ##copy f 2 1 } + T{ ##set-slot-imm f 3 1 } + T{ ##write-barrier-imm f 2 } + } write-barriers-step +] unit-test + +[ + V{ + T{ ##copy f 2 1 } + T{ ##set-slot-imm f 3 2 } + T{ ##write-barrier-imm f 1 } + } +] [ + V{ + T{ ##copy f 2 1 } + T{ ##set-slot-imm f 3 2 } + T{ ##write-barrier-imm f 1 } + } write-barriers-step +] unit-test + +[ + V{ + T{ ##copy f 2 1 } + T{ ##copy f 3 2 } + T{ ##set-slot-imm f 3 1 } + T{ ##write-barrier-imm f 2 } + } +] [ + V{ + T{ ##copy f 2 1 } + T{ ##copy f 3 2 } + T{ ##set-slot-imm f 3 1 } + T{ ##write-barrier-imm f 2 } + } write-barriers-step +] unit-test + +[ + V{ + T{ ##copy f 2 1 } + T{ ##copy f 3 2 } + T{ ##set-slot-imm f 4 1 } + T{ ##write-barrier-imm f 3 } + } +] [ + V{ + T{ ##copy f 2 1 } + T{ ##copy f 3 2 } + T{ ##set-slot-imm f 4 1 } + T{ ##write-barrier-imm f 3 } + } write-barriers-step +] unit-test diff --git a/basis/compiler/cfg/write-barrier/write-barrier.factor b/basis/compiler/cfg/write-barrier/write-barrier.factor index 95562eadca..6f8e437aa9 100644 --- a/basis/compiler/cfg/write-barrier/write-barrier.factor +++ b/basis/compiler/cfg/write-barrier/write-barrier.factor @@ -50,7 +50,7 @@ M: gc-map-insn eliminate-write-barrier fresh-allocations get clear-assoc ; M: ##copy eliminate-write-barrier - [ src>> ] [ dst>> ] bi copies get set-at t ; + [ src>> resolve-copy ] [ dst>> ] bi copies get set-at t ; M: insn eliminate-write-barrier drop t ;