summaryrefslogtreecommitdiff
path: root/module
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2024-09-23 15:57:23 +0200
committerAndy Wingo <wingo@pobox.com>2024-09-23 16:00:54 +0200
commit5e6288c9304b60f1875a44808ee3858e3d6efc83 (patch)
tree68257e66c09b3bf5e5767352b5a53cdb7d5a807d /module
parentd6af34c0e085d785e89a64089de9779282874a2f (diff)
downloadguile-5e6288c9304b60f1875a44808ee3858e3d6efc83.tar.gz
Narrow parameter of logand/immediate if no bits used
* module/language/cps/specialize-numbers.scm (specialize-operations): Narrow ulogand/immediate param according to used bits.
Diffstat (limited to 'module')
-rw-r--r--module/language/cps/specialize-numbers.scm8
1 files changed, 5 insertions, 3 deletions
diff --git a/module/language/cps/specialize-numbers.scm b/module/language/cps/specialize-numbers.scm
index 4ec88871c..f93250756 100644
--- a/module/language/cps/specialize-numbers.scm
+++ b/module/language/cps/specialize-numbers.scm
@@ -1,6 +1,6 @@
;;; Continuation-passing style (CPS) intermediate language (IL)
-;; Copyright (C) 2015-2021, 2023 Free Software Foundation, Inc.
+;; Copyright (C) 2015-2021,2023-2024 Free Software Foundation, Inc.
;;;; This library is free software; you can redistribute it and/or
;;;; modify it under the terms of the GNU Lesser General Public
@@ -561,9 +561,11 @@ BITS indicating the significant bits needed for a variable. BITS may be
(specialize-unop cps k src op param a
(unbox-u64 a) (box-u64 result))))
- (('logand/immediate (? u64-result? ) param (? u64-operand? a))
+ (('logand/immediate (? u64-result?) param (? u64-operand? a))
(specialize-unop cps k src 'ulogand/immediate
- (logand param (1- (ash 1 64)))
+ (logand param
+ (or (intmap-ref sigbits result) -1)
+ (1- (ash 1 64)))
a
(unbox-u64 a) (box-u64 result)))