Make RTL:CONSTANT-COST always return positive.
authorTaylor R Campbell <campbell@mumble.net>
Tue, 15 Jan 2019 03:17:35 +0000 (03:17 +0000)
committerTaylor R Campbell <campbell@mumble.net>
Wed, 21 Aug 2019 21:34:01 +0000 (21:34 +0000)
Otherwise CSE might substitute constants for registers where at best
it's not helpful and at worst we don't have rules for it.

src/compiler/machines/aarch64/machine.scm

index 01562ecf4b4b3ea953dc090151c84a61162ec0ce..6548e90d45cb7a403dd495fec328465b61ad9731 100644 (file)
@@ -397,18 +397,22 @@ USA.
       (error "Unknown interpreter register:" locative)))
 \f
 (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)