From: Taylor R Campbell Date: Tue, 15 Jan 2019 03:17:35 +0000 (+0000) Subject: Make RTL:CONSTANT-COST always return positive. X-Git-Tag: mit-scheme-pucked-10.1.20~11^2~66^2~85 X-Git-Url: https://birchwood-abbey.net/git?a=commitdiff_plain;h=6150030e8b8ecd81f56aa6b8f06af663caf71fd5;p=mit-scheme.git Make RTL:CONSTANT-COST always return positive. Otherwise CSE might substitute constants for registers where at best it's not helpful and at worst we don't have rules for it. --- diff --git a/src/compiler/machines/aarch64/machine.scm b/src/compiler/machines/aarch64/machine.scm index 01562ecf4..6548e90d4 100644 --- a/src/compiler/machines/aarch64/machine.scm +++ b/src/compiler/machines/aarch64/machine.scm @@ -397,18 +397,22 @@ USA. (error "Unknown interpreter register:" locative))) (define (rtl:constant-cost expression) + ;; Register reference costs 1. If a cost is less than 1, CSE will + ;; always choose the constant over the register reference, which may + ;; not always work and is not always helpful even when it does work. + ;; ;; XXX Justify this by reference to cycle counts, &c. This really ;; depends on which instruction we're talking about -- sometimes ;; immediates are cheaper. - (let ((cost:zero 0) - (cost:imm16 1) ;MOVZ/MOVN - (cost:imm32 2) ;MOVZ/MOVN + 1*MOVK - (cost:imm48 3) ;MOVZ/MOVN + 2*MOVK - (cost:imm64 4) ;MOVZ/MOVN + 3*MOVK - (cost:add 1) - (cost:adr 1) + (let ((cost:zero 1) + (cost:imm16 2) ;MOVZ/MOVN + (cost:imm32 3) ;MOVZ/MOVN + 1*MOVK + (cost:imm48 4) ;MOVZ/MOVN + 2*MOVK + (cost:imm64 5) ;MOVZ/MOVN + 3*MOVK + (cost:add 2) + (cost:adr 2) (cost:ldr 10) - (cost:bl 2)) + (cost:bl 3)) (define (immediate-cost immediate) (cond ((zero? immediate) cost:zero)