src/share/vm/opto/postaloc.cpp

changeset 3882
8c92982cbbc4
parent 3405
5da7201222d5
child 3888
424142833d10
     1.1 --- a/src/share/vm/opto/postaloc.cpp	Thu Jun 14 14:59:52 2012 -0700
     1.2 +++ b/src/share/vm/opto/postaloc.cpp	Fri Jun 15 01:25:19 2012 -0700
     1.3 @@ -1,5 +1,5 @@
     1.4  /*
     1.5 - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved.
     1.6 + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved.
     1.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     1.8   *
     1.9   * This code is free software; you can redistribute it and/or modify it
    1.10 @@ -27,13 +27,15 @@
    1.11  #include "opto/chaitin.hpp"
    1.12  #include "opto/machnode.hpp"
    1.13  
    1.14 -// see if this register kind does not requires two registers
    1.15 -static bool is_single_register(uint x) {
    1.16 -#ifdef _LP64
    1.17 -  return (x != Op_RegD && x != Op_RegL && x != Op_RegP);
    1.18 -#else
    1.19 -  return (x != Op_RegD && x != Op_RegL);
    1.20 -#endif
    1.21 +// See if this register (or pairs, or vector) already contains the value.
    1.22 +static bool register_contains_value(Node* val, OptoReg::Name reg, int n_regs,
    1.23 +                                    Node_List& value) {
    1.24 +  for (int i = 0; i < n_regs; i++) {
    1.25 +    OptoReg::Name nreg = OptoReg::add(reg,-i);
    1.26 +    if (value[nreg] != val)
    1.27 +      return false;
    1.28 +  }
    1.29 +  return true;
    1.30  }
    1.31  
    1.32  //---------------------------may_be_copy_of_callee-----------------------------
    1.33 @@ -167,9 +169,11 @@
    1.34    const RegMask &use_mask = n->in_RegMask(idx);
    1.35    bool can_use = ( RegMask::can_represent(def_reg) ? (use_mask.Member(def_reg) != 0)
    1.36                                                     : (use_mask.is_AllStack() != 0));
    1.37 -  // Check for a copy to or from a misaligned pair.
    1.38 -  can_use = can_use && !use_mask.is_misaligned_Pair() && !def_lrg.mask().is_misaligned_Pair();
    1.39 -
    1.40 +  if (!RegMask::is_vector(def->ideal_reg())) {
    1.41 +    // Check for a copy to or from a misaligned pair.
    1.42 +    // It is workaround for a sparc with misaligned pairs.
    1.43 +    can_use = can_use && !use_mask.is_misaligned_pair() && !def_lrg.mask().is_misaligned_pair();
    1.44 +  }
    1.45    if (!can_use)
    1.46      return 0;
    1.47  
    1.48 @@ -263,18 +267,16 @@
    1.49      val = skip_copies(n->in(k));
    1.50    }
    1.51  
    1.52 -  if( val == x ) return blk_adjust; // No progress?
    1.53 +  if (val == x) return blk_adjust; // No progress?
    1.54  
    1.55 -  bool single = is_single_register(val->ideal_reg());
    1.56 +  int n_regs = RegMask::num_registers(val->ideal_reg());
    1.57    uint val_idx = n2lidx(val);
    1.58    OptoReg::Name val_reg = lrgs(val_idx).reg();
    1.59  
    1.60    // See if it happens to already be in the correct register!
    1.61    // (either Phi's direct register, or the common case of the name
    1.62    // never-clobbered original-def register)
    1.63 -  if( value[val_reg] == val &&
    1.64 -      // Doubles check both halves
    1.65 -      ( single || value[val_reg-1] == val ) ) {
    1.66 +  if (register_contains_value(val, val_reg, n_regs, value)) {
    1.67      blk_adjust += use_prior_register(n,k,regnd[val_reg],current_block,value,regnd);
    1.68      if( n->in(k) == regnd[val_reg] ) // Success!  Quit trying
    1.69        return blk_adjust;
    1.70 @@ -306,7 +308,7 @@
    1.71      }
    1.72  
    1.73      Node *vv = value[reg];
    1.74 -    if( !single ) {             // Doubles check for aligned-adjacent pair
    1.75 +    if (n_regs > 1) {             // Doubles check for aligned-adjacent pair
    1.76        if( (reg&1)==0 ) continue;  // Wrong half of a pair
    1.77        if( vv != value[reg-1] ) continue; // Not a complete pair
    1.78      }
    1.79 @@ -526,8 +528,9 @@
    1.80        if( pidx ) {
    1.81          value.map(preg,phi);
    1.82          regnd.map(preg,phi);
    1.83 -        OptoReg::Name preg_lo = OptoReg::add(preg,-1);
    1.84 -        if( !is_single_register(phi->ideal_reg()) ) {
    1.85 +        int n_regs = RegMask::num_registers(phi->ideal_reg());
    1.86 +        for (int l = 1; l < n_regs; l++) {
    1.87 +          OptoReg::Name preg_lo = OptoReg::add(preg,-l);
    1.88            value.map(preg_lo,phi);
    1.89            regnd.map(preg_lo,phi);
    1.90          }
    1.91 @@ -568,13 +571,17 @@
    1.92              value.map(ureg,valdef); // record improved reaching-def info
    1.93              regnd.map(ureg,   def);
    1.94              // Record other half of doubles
    1.95 -            OptoReg::Name ureg_lo = OptoReg::add(ureg,-1);
    1.96 -            if( !is_single_register(def->ideal_reg()) &&
    1.97 -                ( !RegMask::can_represent(ureg_lo) ||
    1.98 -                  lrgs(useidx).mask().Member(ureg_lo) ) && // Nearly always adjacent
    1.99 -                !value[ureg_lo] ) {
   1.100 -              value.map(ureg_lo,valdef); // record improved reaching-def info
   1.101 -              regnd.map(ureg_lo,   def);
   1.102 +            uint def_ideal_reg = def->ideal_reg();
   1.103 +            int n_regs = RegMask::num_registers(def_ideal_reg);
   1.104 +            bool is_vec = RegMask::is_vector(def_ideal_reg);
   1.105 +            for (int l = 1; l < n_regs; l++) {
   1.106 +              OptoReg::Name ureg_lo = OptoReg::add(ureg,-l);
   1.107 +              if (!value[ureg_lo] &&
   1.108 +                  (!RegMask::can_represent(ureg_lo) ||
   1.109 +                   lrgs(useidx).mask().Member(ureg_lo))) { // Nearly always adjacent
   1.110 +                value.map(ureg_lo,valdef); // record improved reaching-def info
   1.111 +                regnd.map(ureg_lo,   def);
   1.112 +              }
   1.113              }
   1.114            }
   1.115          }
   1.116 @@ -607,7 +614,8 @@
   1.117        }
   1.118  
   1.119        uint n_ideal_reg = n->ideal_reg();
   1.120 -      if( is_single_register(n_ideal_reg) ) {
   1.121 +      int n_regs = RegMask::num_registers(n_ideal_reg);
   1.122 +      if (n_regs == 1) {
   1.123          // If Node 'n' does not change the value mapped by the register,
   1.124          // then 'n' is a useless copy.  Do not update the register->node
   1.125          // mapping so 'n' will go dead.
   1.126 @@ -625,6 +633,25 @@
   1.127            assert( n->is_Copy(), "" );
   1.128            j -= replace_and_yank_if_dead(n, nreg, b, value, regnd);
   1.129          }
   1.130 +      } else if (RegMask::is_vector(n_ideal_reg)) {
   1.131 +        // If Node 'n' does not change the value mapped by the register,
   1.132 +        // then 'n' is a useless copy.  Do not update the register->node
   1.133 +        // mapping so 'n' will go dead.
   1.134 +        if (!register_contains_value(val, nreg, n_regs, value)) {
   1.135 +          // Update the mapping: record new Node defined by the register
   1.136 +          regnd.map(nreg,n);
   1.137 +          // Update mapping for defined *value*, which is the defined
   1.138 +          // Node after skipping all copies.
   1.139 +          value.map(nreg,val);
   1.140 +          for (int l = 1; l < n_regs; l++) {
   1.141 +            OptoReg::Name nreg_lo = OptoReg::add(nreg,-l);
   1.142 +            regnd.map(nreg_lo, n );
   1.143 +            value.map(nreg_lo,val);
   1.144 +          }
   1.145 +        } else if (n->is_Copy()) {
   1.146 +          // Note: vector can't be constant and can't be copy of calee.
   1.147 +          j -= replace_and_yank_if_dead(n, nreg, b, value, regnd);
   1.148 +        }
   1.149        } else {
   1.150          // If the value occupies a register pair, record same info
   1.151          // in both registers.

mercurial