Changeset 11711


Ignore:
Timestamp:
Feb 11, 2009, 12:07:57 AM (10 years ago)
Author:
gb
Message:

Add VINSN-SEQUENCE-HAS-ATTRIBUTE-P, which returns T if any vinsn in a
sequence has all of the attributes specified by a bitmask.

{X862,PPC2}-ELIDE-PUSHES: when peephole-optimizing unnecessary pushes/pops,
punt if anything pushed might have been discarded (e.g., for non-local exit)
in the intervening sequence. This possibly can't even happen; if it could,
it'd be in something like (OP X Y (OR Z (RETURN NIL))): the RETURN might
do some stack-cleanup, and it's simpler to keep pushing what the cleanup
expects to be there than it would be to fix the cleanup code.)

Location:
trunk/source/compiler
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/compiler/PPC/ppc2.lisp

    r11668 r11711  
    27712771                         (hard-regspec-value popped-reg)))
    27722772           (tsp-p (vinsn-attribute-p push-vinsn :tsp)))
    2773       (when (and tsp-p t)                       ; vsp case is harder.
    2774         (let* ((pushed-reg-is-set (vinsn-sequence-sets-reg-p
    2775                                    push-vinsn pop-vinsn pushed-reg))
    2776                (popped-reg-is-set (if same-reg
    2777                                     pushed-reg-is-set
    2778                                     (vinsn-sequence-sets-reg-p
    2779                                      push-vinsn pop-vinsn popped-reg))))
    2780           (unless (and pushed-reg-is-set popped-reg-is-set)
    2781             (unless same-reg
    2782               (let* ((copy (if (eq (hard-regspec-class pushed-reg)
    2783                                    hard-reg-class-fpr)
    2784                              (! copy-fpr popped-reg pushed-reg)
    2785                              (! copy-gpr popped-reg pushed-reg))))
    2786                 (remove-dll-node copy)
    2787                 (if pushed-reg-is-set
    2788                   (insert-dll-node-after copy push-vinsn)
    2789                   (insert-dll-node-before copy push-vinsn))))
    2790             (elide-vinsn push-vinsn)
    2791             (elide-vinsn pop-vinsn)))))))
     2773      (when (and tsp-p t)               ; vsp case is harder.
     2774        (unless (vinsn-sequence-has-attribute-p push-vinsn pop-vinsn :tsp :discard)
     2775          (let* ((pushed-reg-is-set (vinsn-sequence-sets-reg-p
     2776                                     push-vinsn pop-vinsn pushed-reg))
     2777                 (popped-reg-is-set (if same-reg
     2778                                      pushed-reg-is-set
     2779                                      (vinsn-sequence-sets-reg-p
     2780                                       push-vinsn pop-vinsn popped-reg))))
     2781            (unless (and pushed-reg-is-set popped-reg-is-set)
     2782              (unless same-reg
     2783                (let* ((copy (if (eq (hard-regspec-class pushed-reg)
     2784                                     hard-reg-class-fpr)
     2785                               (! copy-fpr popped-reg pushed-reg)
     2786                               (! copy-gpr popped-reg pushed-reg))))
     2787                  (remove-dll-node copy)
     2788                  (if pushed-reg-is-set
     2789                    (insert-dll-node-after copy push-vinsn)
     2790                    (insert-dll-node-before copy push-vinsn))))
     2791              (elide-vinsn push-vinsn)
     2792              (elide-vinsn pop-vinsn))))))))
    27922793               
    27932794       
  • trunk/source/compiler/X86/x862.lisp

    r11667 r11711  
    31913191           (csp-p (vinsn-attribute-p push-vinsn :csp)))
    31923192      (when csp-p                       ; vsp case is harder.
    3193         (let* ((pushed-reg-is-set (vinsn-sequence-sets-reg-p
    3194                                    push-vinsn pop-vinsn pushed-reg))
    3195                (popped-reg-is-set (if same-reg
    3196                                     pushed-reg-is-set
    3197                                     (vinsn-sequence-sets-reg-p
    3198                                      push-vinsn pop-vinsn popped-reg))))
    3199           (unless (and pushed-reg-is-set popped-reg-is-set)
    3200             (unless same-reg
    3201               (let* ((copy (if (eq (hard-regspec-class pushed-reg)
    3202                                    hard-reg-class-fpr)
    3203                              (if (= (get-regspec-mode pushed-reg)
    3204                                     hard-reg-class-fpr-mode-double)
    3205                                (! copy-double-float popped-reg pushed-reg)
    3206                                (! copy-single-float popped-reg pushed-reg))
    3207                              (! copy-gpr popped-reg pushed-reg))))
    3208                 (remove-dll-node copy)
    3209                 (if pushed-reg-is-set
    3210                   (insert-dll-node-after copy push-vinsn)
    3211                   (insert-dll-node-before copy push-vinsn))))
    3212             (elide-vinsn push-vinsn)
    3213             (elide-vinsn pop-vinsn)))))))
     3193        (unless (vinsn-sequence-has-attribute-p push-vinsn pop-vinsn :csp :discard)
     3194          (let* ((pushed-reg-is-set (vinsn-sequence-sets-reg-p
     3195                                     push-vinsn pop-vinsn pushed-reg))
     3196                 (popped-reg-is-set (if same-reg
     3197                                      pushed-reg-is-set
     3198                                      (vinsn-sequence-sets-reg-p
     3199                                       push-vinsn pop-vinsn popped-reg))))
     3200            (unless (and pushed-reg-is-set popped-reg-is-set)
     3201              (unless same-reg
     3202                (let* ((copy (if (eq (hard-regspec-class pushed-reg)
     3203                                     hard-reg-class-fpr)
     3204                               (if (= (get-regspec-mode pushed-reg)
     3205                                      hard-reg-class-fpr-mode-double)
     3206                                 (! copy-double-float popped-reg pushed-reg)
     3207                                 (! copy-single-float popped-reg pushed-reg))
     3208                               (! copy-gpr popped-reg pushed-reg))))
     3209                  (remove-dll-node copy)
     3210                  (if pushed-reg-is-set
     3211                    (insert-dll-node-after copy push-vinsn)
     3212                    (insert-dll-node-before copy push-vinsn))))
     3213              (elide-vinsn push-vinsn)
     3214              (elide-vinsn pop-vinsn))))))))
    32143215               
    32153216       
  • trunk/source/compiler/vinsn.lisp

    r11289 r11711  
    491491       
    492492
     493;;; Return T if any vinsn between START and END (exclusive) has all
     494;;; attributes set in MASK set.
     495(defun %vinsn-sequence-has-attribute-p (start end attr)
     496  (do* ((element (vinsn-succ start) (vinsn-succ element)))
     497       ((eq element end))
     498    (when (typep element 'vinsn)
     499      (when (eql attr (logand (vinsn-template-attributes (vinsn-template element))))
     500        (return t)))))
     501
     502(defmacro vinsn-sequence-has-attribute-p (start end &rest attrs)
     503  `(%vinsn-sequence-has-attribute-p ,start ,end ,(encode-vinsn-attributes attrs)))
     504
     505                               
    493506;;; Flow-graph nodes (FGNs)
    494507
Note: See TracChangeset for help on using the changeset viewer.