Changeset 15223


Ignore:
Timestamp:
12/19/19 11:13:40 (22 months ago)
Author:
Mark Evenson
Message:

Fix java.lang.VerifyError? with PROGN
(somewhat-functional-programmer)

  • Added a constant folding case if arg2 was detected as a constant (but wasn't a literal integer, such as (- 1) )
  • Fixed all with-operand-accumulation forms to have the correct types
  • Added test cases that exercise all code paths of p2-ash

<https://mailman.common-lisp.net/pipermail/armedbear-devel/2019-December/004029.html>

Location:
trunk/abcl
Files:
1 added
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abcl/src/org/armedbear/lisp/compiler-pass2.lisp

    r15141 r15223  
    42374237         (result-type (derive-compiler-type form)))
    42384238    (cond ((and (integerp arg1) (integerp arg2))
     4239           ;; test t/ash.lisp: ash-constant
    42394240           (compile-constant (ash arg1 arg2) target representation))
     4241          ((and (integerp arg1) constant-shift)
     4242           ;; test t/ash.lisp: ash-constant2
     4243           (compile-constant (ash arg1 constant-shift) target representation))
    42404244          ((and constant-shift
    42414245                ;; ishl/ishr only use the low five bits of the mask.
     
    42444248                (fixnum-type-p result-type))
    42454249           (cond ((plusp constant-shift)
     4250                  ;; test t/ash.lisp: ash-fixnum1-pos-constant-shift2
    42464251                  (with-operand-accumulation
    42474252                      ((compile-operand arg1 :int)
     
    42514256                 ((minusp constant-shift)
    42524257                  (cond ((fixnump arg2)
     4258                         ;; test t/ash.lisp: ash-fixnum1-neg-constant-shift2
    42534259                         (with-operand-accumulation
    42544260                             ((compile-operand arg1 :int)
    4255                               (accumulate-operand (representation)
     4261                              (accumulate-operand (:int)
    42564262                                (emit-push-constant-int (- arg2)))
    42574263                              (maybe-emit-clear-values arg1))))
    42584264                        (t
     4265                         ;; test t/ash.lisp: ash-fixnum1-neg-constant-shift-form2
    42594266                         (with-operand-accumulation
    42604267                             ((compile-operand arg1 :int)
    4261                               (accumulate-operand (representation :unsafe-p t)
     4268                              (accumulate-operand (:int)
    42624269                                (compile-form arg2 'stack :int)
    42634270                                (emit 'ineg))
     
    42664273                  (emit 'ishr))
    42674274                 ((zerop constant-shift)
     4275                  ;; test t/ash.lisp: ash-fixnum1-zero-shift2
    42684276                  (compile-form arg1 'stack :int)
    42694277                  (compile-form arg2 nil nil))) ; for effect
     
    42764284                (java-long-type-p result-type))
    42774285           (cond ((plusp constant-shift)
     4286                  ;; test t/ash.lisp: ash-long1-pos-constant-shift2
    42784287                  (with-operand-accumulation
    42794288                      ((compile-operand arg1 :long)
     
    42834292                 ((minusp constant-shift)
    42844293                  (cond ((fixnump arg2)
     4294                         ;; test t/ash.lisp: ash-long1-neg-constant-shift2
    42854295                         (with-operand-accumulation
    42864296                             ((compile-operand arg1 :long)
    4287                               (with-operand-accumulation (representation)
     4297                              (with-operand-accumulation (:int)
    42884298                                (emit-push-constant-int (- arg2)))
    42894299                              (maybe-emit-clear-values arg1))))
    42904300                        (t
     4301                         ;; test t/ash.lisp: ash-long1-neg-constant-shift-form2
    42914302                         (with-operand-accumulation
    42924303                             ((compile-operand arg1 :long)
    4293                               (accumulate-operand (representation :unsafe-p t)
     4304                              (accumulate-operand (:int)
    42944305                                (compile-form arg2 'stack :int)
    42954306                                (emit 'ineg))
     
    42984309                  (emit 'lshr))
    42994310                 ((zerop constant-shift)
     4311                  ;; test t/ash.lisp: ash-long1-zero-shift2
    43004312                  (compile-form arg1 'stack :long)
    43014313                  (compile-form arg2 nil nil))) ; for effect
     
    43044316          ((and (fixnum-type-p type1)
    43054317                low2 high2 (<= -31 low2 high2 0)) ; Negative shift.
    4306            (compile-forms-and-maybe-emit-clear-values arg1 'stack :int
    4307                                                       arg2 'stack :int)
    4308            (emit 'ineg)
     4318           ;; t/ash.lisp: ash-fixnum1-neg-2
     4319           (with-operand-accumulation
     4320               ((compile-operand arg1 :int)
     4321                 (accumulate-operand (:int)
     4322                   (compile-operand arg2 :int)
     4323                   (emit 'ineg))))
     4324           (maybe-emit-clear-values arg1 arg2)
    43094325           (emit 'ishr)
    43104326           (convert-representation :int representation)
     
    43144330                       (java-long-type-p type1)
    43154331                       (java-long-type-p result-type))
     4332                  ;; test t/ash.lisp: ash-long1-pos-fixnum2
    43164333                  (with-operand-accumulation
    43174334                      ((compile-operand arg1 :long)
     
    43234340                       (java-long-type-p type1)
    43244341                       (java-long-type-p result-type))
     4342                  ;; test t/ash.lisp: ash-long1-neg-fixnum2
    43254343                  (with-operand-accumulation
    43264344                      ((compile-operand arg1 :long)
    4327                         (compile-operand arg2 :int)
    4328                         (maybe-emit-clear-values arg1 arg2)))
    4329                   (emit 'ineg)
     4345                        (accumulate-operand (:int)
     4346                          (compile-operand arg2 :int)
     4347                          (emit 'ineg))))
     4348                  (maybe-emit-clear-values arg1 arg2)
    43304349                  (emit 'lshr)
    43314350                  (convert-representation :long representation))
    43324351                 (t
     4352                  ;; test t/ash.lisp ash-long1-fixnum2
    43334353                  (with-operand-accumulation
    43344354                      ((compile-operand arg1 nil)
     
    43394359           (emit-move-from-stack target representation))
    43404360          (t
     4361           ;; test t/ash.lisp: ash-regular
    43414362           (compile-function-call form target representation)))))
    43424363
Note: See TracChangeset for help on using the changeset viewer.