From 1eaa151a3c8033cd52c732008707d191cb084586 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Lindqvist?= Date: Thu, 19 May 2016 14:04:23 +0200 Subject: [PATCH] compiler.cfg.value-numbering.comparisons: docs and tests --- .../comparisons/comarisons-docs.factor | 23 +++++++++++++++++++ .../comparisons/comparisons-tests.factor | 10 ++++++++ .../comparisons/comparisons.factor | 10 +------- 3 files changed, 34 insertions(+), 9 deletions(-) create mode 100644 basis/compiler/cfg/value-numbering/comparisons/comarisons-docs.factor create mode 100644 basis/compiler/cfg/value-numbering/comparisons/comparisons-tests.factor diff --git a/basis/compiler/cfg/value-numbering/comparisons/comarisons-docs.factor b/basis/compiler/cfg/value-numbering/comparisons/comarisons-docs.factor new file mode 100644 index 0000000000..2efce41e9b --- /dev/null +++ b/basis/compiler/cfg/value-numbering/comparisons/comarisons-docs.factor @@ -0,0 +1,23 @@ +USING: compiler.cfg.instructions help.markup help.syntax kernel ; +IN: compiler.cfg.value-numbering.comparisons + +HELP: >test-branch +{ $values { "insn" insn } { "insn'" ##test-branch } } +{ $description "Converts a " { $link ##compare-integer-imm-branch } " instruction into a " { $link ##test-branch } " instruction." } ; + +HELP: rewrite-into-test? +{ $values { "insn" insn } { "?" boolean } } +{ $description "Whether the comparison instruction can be rewritten into a test instruction." } ; + +ARTICLE: "compiler.cfg.value-numbering.comparisons" "Comparisons GVN" +"Optimizations performed here:" +$nl +{ $list + "Eliminating intermediate boolean values when the result of a comparison is used by a compare-branch." + "Folding comparisons where both inputs are literal." + "Folding comparisons where both inputs are congruent." + "Converting compare instructions into compare-imm instructions." +} ; + + +ABOUT: "compiler.cfg.value-numbering.comparisons" diff --git a/basis/compiler/cfg/value-numbering/comparisons/comparisons-tests.factor b/basis/compiler/cfg/value-numbering/comparisons/comparisons-tests.factor new file mode 100644 index 0000000000..166a6315ae --- /dev/null +++ b/basis/compiler/cfg/value-numbering/comparisons/comparisons-tests.factor @@ -0,0 +1,10 @@ +USING: compiler.cfg.comparisons compiler.cfg.instructions +compiler.cfg.value-numbering.comparisons cpu.x86.assembler.operands +kernel tools.test ; +IN: compiler.cfg.value-numbering.comparisons.tests + +{ + T{ ##test-branch { src1 RAX } { src2 RAX } { cc cc= } } +} [ + RAX 0 cc= f ##compare-integer-imm-branch boa >test-branch +] unit-test diff --git a/basis/compiler/cfg/value-numbering/comparisons/comparisons.factor b/basis/compiler/cfg/value-numbering/comparisons/comparisons.factor index 9cd7d6723b..49d78af4fb 100644 --- a/basis/compiler/cfg/value-numbering/comparisons/comparisons.factor +++ b/basis/compiler/cfg/value-numbering/comparisons/comparisons.factor @@ -8,14 +8,6 @@ compiler.cfg.value-numbering.rewrite cpu.architecture kernel math math.order namespaces sequences vectors ; IN: compiler.cfg.value-numbering.comparisons -! Optimizations performed here: -! -! 1) Eliminating intermediate boolean values when the result of -! a comparison is used by a compare-branch -! 2) Folding comparisons where both inputs are literal -! 3) Folding comparisons where both inputs are congruent -! 4) Converting compare instructions into compare-imm instructions - : fold-compare-imm? ( insn -- ? ) src1>> vreg>insn literal-insn? ; @@ -101,7 +93,7 @@ UNION: general-compare-insn scalar-compare-insn ##test-vector ; : fold-compare-imm-branch ( insn -- insn/f ) evaluate-compare-imm fold-branch ; -: >test-branch ( insn -- insn ) +: >test-branch ( insn -- insn' ) [ src1>> ] [ src1>> ] [ cc>> ] tri ##test-branch new-insn ; M: ##compare-imm-branch rewrite