src/hotspot/share/opto/convertnode.cpp
author fyang
Mon, 21 Jan 2019 13:31:42 +0800
changeset 53456 44f41693631f
parent 48089 22c9856fc2c2
child 58421 6fc57e391539
permissions -rw-r--r--
8217359: C2 compiler triggers SIGSEGV after transformation in ConvI2LNode::Ideal Reviewed-by: thartmann Contributed-by: jitao8@huawei.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
     1
/*
53456
44f41693631f 8217359: C2 compiler triggers SIGSEGV after transformation in ConvI2LNode::Ideal
fyang
parents: 48089
diff changeset
     2
 * Copyright (c) 2014, 2019, Oracle and/or its affiliates. All rights reserved.
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
     4
 *
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
     7
 * published by the Free Software Foundation.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
     8
 *
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    13
 * accompanied this code).
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    14
 *
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    18
 *
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    21
 * questions.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    22
 *
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    23
 */
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    24
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    25
#include "precompiled.hpp"
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    26
#include "opto/addnode.hpp"
35574
2b25eb88c8d6 6675699: need comprehensive fix for unconstrained ConvI2L with narrowed type
thartmann
parents: 35551
diff changeset
    27
#include "opto/castnode.hpp"
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    28
#include "opto/convertnode.hpp"
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    29
#include "opto/matcher.hpp"
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    30
#include "opto/phaseX.hpp"
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    31
#include "opto/subnode.hpp"
29081
c61eb4914428 8072911: Remove includes of oop.inline.hpp from .hpp files
stefank
parents: 24923
diff changeset
    32
#include "runtime/sharedRuntime.hpp"
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    33
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    34
//=============================================================================
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    35
//------------------------------Identity---------------------------------------
35551
36ef3841fb34 8146629: Make phase->is_IterGVN() accessible from Node::Identity and Node::Value
thartmann
parents: 29081
diff changeset
    36
Node* Conv2BNode::Identity(PhaseGVN* phase) {
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    37
  const Type *t = phase->type( in(1) );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    38
  if( t == Type::TOP ) return in(1);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    39
  if( t == TypeInt::ZERO ) return in(1);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    40
  if( t == TypeInt::ONE ) return in(1);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    41
  if( t == TypeInt::BOOL ) return in(1);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    42
  return this;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    43
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    44
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    45
//------------------------------Value------------------------------------------
35551
36ef3841fb34 8146629: Make phase->is_IterGVN() accessible from Node::Identity and Node::Value
thartmann
parents: 29081
diff changeset
    46
const Type* Conv2BNode::Value(PhaseGVN* phase) const {
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    47
  const Type *t = phase->type( in(1) );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    48
  if( t == Type::TOP ) return Type::TOP;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    49
  if( t == TypeInt::ZERO ) return TypeInt::ZERO;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    50
  if( t == TypePtr::NULL_PTR ) return TypeInt::ZERO;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    51
  const TypePtr *tp = t->isa_ptr();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    52
  if( tp != NULL ) {
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    53
    if( tp->ptr() == TypePtr::AnyNull ) return Type::TOP;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    54
    if( tp->ptr() == TypePtr::Constant) return TypeInt::ONE;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    55
    if (tp->ptr() == TypePtr::NotNull)  return TypeInt::ONE;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    56
    return TypeInt::BOOL;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    57
  }
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    58
  if (t->base() != Type::Int) return TypeInt::BOOL;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    59
  const TypeInt *ti = t->is_int();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    60
  if( ti->_hi < 0 || ti->_lo > 0 ) return TypeInt::ONE;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    61
  return TypeInt::BOOL;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    62
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    63
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    64
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    65
// The conversions operations are all Alpha sorted.  Please keep it that way!
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    66
//=============================================================================
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    67
//------------------------------Value------------------------------------------
35551
36ef3841fb34 8146629: Make phase->is_IterGVN() accessible from Node::Identity and Node::Value
thartmann
parents: 29081
diff changeset
    68
const Type* ConvD2FNode::Value(PhaseGVN* phase) const {
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    69
  const Type *t = phase->type( in(1) );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    70
  if( t == Type::TOP ) return Type::TOP;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    71
  if( t == Type::DOUBLE ) return Type::FLOAT;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    72
  const TypeD *td = t->is_double_constant();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    73
  return TypeF::make( (float)td->getd() );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    74
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    75
48089
22c9856fc2c2 8190800: Support vectorization of Math.sqrt() on floats
rlupusoru
parents: 47216
diff changeset
    76
//------------------------------Ideal------------------------------------------
22c9856fc2c2 8190800: Support vectorization of Math.sqrt() on floats
rlupusoru
parents: 47216
diff changeset
    77
// If we see pattern ConvF2D SomeDoubleOp ConvD2F, do operation as float.
22c9856fc2c2 8190800: Support vectorization of Math.sqrt() on floats
rlupusoru
parents: 47216
diff changeset
    78
Node *ConvD2FNode::Ideal(PhaseGVN *phase, bool can_reshape) {
22c9856fc2c2 8190800: Support vectorization of Math.sqrt() on floats
rlupusoru
parents: 47216
diff changeset
    79
  if ( in(1)->Opcode() == Op_SqrtD ) {
22c9856fc2c2 8190800: Support vectorization of Math.sqrt() on floats
rlupusoru
parents: 47216
diff changeset
    80
    Node* sqrtd = in(1);
22c9856fc2c2 8190800: Support vectorization of Math.sqrt() on floats
rlupusoru
parents: 47216
diff changeset
    81
    if ( sqrtd->in(1)->Opcode() == Op_ConvF2D ) {
22c9856fc2c2 8190800: Support vectorization of Math.sqrt() on floats
rlupusoru
parents: 47216
diff changeset
    82
      if ( Matcher::match_rule_supported(Op_SqrtF) ) {
22c9856fc2c2 8190800: Support vectorization of Math.sqrt() on floats
rlupusoru
parents: 47216
diff changeset
    83
        Node* convf2d = sqrtd->in(1);
22c9856fc2c2 8190800: Support vectorization of Math.sqrt() on floats
rlupusoru
parents: 47216
diff changeset
    84
        return new SqrtFNode(phase->C, sqrtd->in(0), convf2d->in(1));
22c9856fc2c2 8190800: Support vectorization of Math.sqrt() on floats
rlupusoru
parents: 47216
diff changeset
    85
      }
22c9856fc2c2 8190800: Support vectorization of Math.sqrt() on floats
rlupusoru
parents: 47216
diff changeset
    86
    }
22c9856fc2c2 8190800: Support vectorization of Math.sqrt() on floats
rlupusoru
parents: 47216
diff changeset
    87
  }
22c9856fc2c2 8190800: Support vectorization of Math.sqrt() on floats
rlupusoru
parents: 47216
diff changeset
    88
  return NULL;
22c9856fc2c2 8190800: Support vectorization of Math.sqrt() on floats
rlupusoru
parents: 47216
diff changeset
    89
}
22c9856fc2c2 8190800: Support vectorization of Math.sqrt() on floats
rlupusoru
parents: 47216
diff changeset
    90
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    91
//------------------------------Identity---------------------------------------
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    92
// Float's can be converted to doubles with no loss of bits.  Hence
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    93
// converting a float to a double and back to a float is a NOP.
35551
36ef3841fb34 8146629: Make phase->is_IterGVN() accessible from Node::Identity and Node::Value
thartmann
parents: 29081
diff changeset
    94
Node* ConvD2FNode::Identity(PhaseGVN* phase) {
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    95
  return (in(1)->Opcode() == Op_ConvF2D) ? in(1)->in(1) : this;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    96
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    97
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    98
//=============================================================================
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
    99
//------------------------------Value------------------------------------------
35551
36ef3841fb34 8146629: Make phase->is_IterGVN() accessible from Node::Identity and Node::Value
thartmann
parents: 29081
diff changeset
   100
const Type* ConvD2INode::Value(PhaseGVN* phase) const {
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   101
  const Type *t = phase->type( in(1) );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   102
  if( t == Type::TOP ) return Type::TOP;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   103
  if( t == Type::DOUBLE ) return TypeInt::INT;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   104
  const TypeD *td = t->is_double_constant();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   105
  return TypeInt::make( SharedRuntime::d2i( td->getd() ) );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   106
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   107
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   108
//------------------------------Ideal------------------------------------------
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   109
// If converting to an int type, skip any rounding nodes
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   110
Node *ConvD2INode::Ideal(PhaseGVN *phase, bool can_reshape) {
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   111
  if( in(1)->Opcode() == Op_RoundDouble )
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   112
  set_req(1,in(1)->in(1));
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   113
  return NULL;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   114
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   115
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   116
//------------------------------Identity---------------------------------------
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   117
// Int's can be converted to doubles with no loss of bits.  Hence
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   118
// converting an integer to a double and back to an integer is a NOP.
35551
36ef3841fb34 8146629: Make phase->is_IterGVN() accessible from Node::Identity and Node::Value
thartmann
parents: 29081
diff changeset
   119
Node* ConvD2INode::Identity(PhaseGVN* phase) {
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   120
  return (in(1)->Opcode() == Op_ConvI2D) ? in(1)->in(1) : this;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   121
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   122
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   123
//=============================================================================
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   124
//------------------------------Value------------------------------------------
35551
36ef3841fb34 8146629: Make phase->is_IterGVN() accessible from Node::Identity and Node::Value
thartmann
parents: 29081
diff changeset
   125
const Type* ConvD2LNode::Value(PhaseGVN* phase) const {
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   126
  const Type *t = phase->type( in(1) );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   127
  if( t == Type::TOP ) return Type::TOP;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   128
  if( t == Type::DOUBLE ) return TypeLong::LONG;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   129
  const TypeD *td = t->is_double_constant();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   130
  return TypeLong::make( SharedRuntime::d2l( td->getd() ) );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   131
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   132
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   133
//------------------------------Identity---------------------------------------
35551
36ef3841fb34 8146629: Make phase->is_IterGVN() accessible from Node::Identity and Node::Value
thartmann
parents: 29081
diff changeset
   134
Node* ConvD2LNode::Identity(PhaseGVN* phase) {
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   135
  // Remove ConvD2L->ConvL2D->ConvD2L sequences.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   136
  if( in(1)       ->Opcode() == Op_ConvL2D &&
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   137
     in(1)->in(1)->Opcode() == Op_ConvD2L )
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   138
  return in(1)->in(1);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   139
  return this;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   140
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   141
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   142
//------------------------------Ideal------------------------------------------
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   143
// If converting to an int type, skip any rounding nodes
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   144
Node *ConvD2LNode::Ideal(PhaseGVN *phase, bool can_reshape) {
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   145
  if( in(1)->Opcode() == Op_RoundDouble )
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   146
  set_req(1,in(1)->in(1));
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   147
  return NULL;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   148
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   149
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   150
//=============================================================================
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   151
//------------------------------Value------------------------------------------
35551
36ef3841fb34 8146629: Make phase->is_IterGVN() accessible from Node::Identity and Node::Value
thartmann
parents: 29081
diff changeset
   152
const Type* ConvF2DNode::Value(PhaseGVN* phase) const {
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   153
  const Type *t = phase->type( in(1) );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   154
  if( t == Type::TOP ) return Type::TOP;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   155
  if( t == Type::FLOAT ) return Type::DOUBLE;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   156
  const TypeF *tf = t->is_float_constant();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   157
  return TypeD::make( (double)tf->getf() );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   158
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   159
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   160
//=============================================================================
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   161
//------------------------------Value------------------------------------------
35551
36ef3841fb34 8146629: Make phase->is_IterGVN() accessible from Node::Identity and Node::Value
thartmann
parents: 29081
diff changeset
   162
const Type* ConvF2INode::Value(PhaseGVN* phase) const {
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   163
  const Type *t = phase->type( in(1) );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   164
  if( t == Type::TOP )       return Type::TOP;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   165
  if( t == Type::FLOAT ) return TypeInt::INT;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   166
  const TypeF *tf = t->is_float_constant();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   167
  return TypeInt::make( SharedRuntime::f2i( tf->getf() ) );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   168
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   169
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   170
//------------------------------Identity---------------------------------------
35551
36ef3841fb34 8146629: Make phase->is_IterGVN() accessible from Node::Identity and Node::Value
thartmann
parents: 29081
diff changeset
   171
Node* ConvF2INode::Identity(PhaseGVN* phase) {
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   172
  // Remove ConvF2I->ConvI2F->ConvF2I sequences.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   173
  if( in(1)       ->Opcode() == Op_ConvI2F &&
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   174
     in(1)->in(1)->Opcode() == Op_ConvF2I )
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   175
  return in(1)->in(1);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   176
  return this;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   177
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   178
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   179
//------------------------------Ideal------------------------------------------
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   180
// If converting to an int type, skip any rounding nodes
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   181
Node *ConvF2INode::Ideal(PhaseGVN *phase, bool can_reshape) {
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   182
  if( in(1)->Opcode() == Op_RoundFloat )
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   183
  set_req(1,in(1)->in(1));
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   184
  return NULL;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   185
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   186
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   187
//=============================================================================
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   188
//------------------------------Value------------------------------------------
35551
36ef3841fb34 8146629: Make phase->is_IterGVN() accessible from Node::Identity and Node::Value
thartmann
parents: 29081
diff changeset
   189
const Type* ConvF2LNode::Value(PhaseGVN* phase) const {
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   190
  const Type *t = phase->type( in(1) );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   191
  if( t == Type::TOP )       return Type::TOP;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   192
  if( t == Type::FLOAT ) return TypeLong::LONG;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   193
  const TypeF *tf = t->is_float_constant();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   194
  return TypeLong::make( SharedRuntime::f2l( tf->getf() ) );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   195
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   196
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   197
//------------------------------Identity---------------------------------------
35551
36ef3841fb34 8146629: Make phase->is_IterGVN() accessible from Node::Identity and Node::Value
thartmann
parents: 29081
diff changeset
   198
Node* ConvF2LNode::Identity(PhaseGVN* phase) {
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   199
  // Remove ConvF2L->ConvL2F->ConvF2L sequences.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   200
  if( in(1)       ->Opcode() == Op_ConvL2F &&
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   201
     in(1)->in(1)->Opcode() == Op_ConvF2L )
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   202
  return in(1)->in(1);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   203
  return this;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   204
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   205
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   206
//------------------------------Ideal------------------------------------------
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   207
// If converting to an int type, skip any rounding nodes
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   208
Node *ConvF2LNode::Ideal(PhaseGVN *phase, bool can_reshape) {
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   209
  if( in(1)->Opcode() == Op_RoundFloat )
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   210
  set_req(1,in(1)->in(1));
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   211
  return NULL;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   212
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   213
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   214
//=============================================================================
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   215
//------------------------------Value------------------------------------------
35551
36ef3841fb34 8146629: Make phase->is_IterGVN() accessible from Node::Identity and Node::Value
thartmann
parents: 29081
diff changeset
   216
const Type* ConvI2DNode::Value(PhaseGVN* phase) const {
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   217
  const Type *t = phase->type( in(1) );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   218
  if( t == Type::TOP ) return Type::TOP;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   219
  const TypeInt *ti = t->is_int();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   220
  if( ti->is_con() ) return TypeD::make( (double)ti->get_con() );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   221
  return bottom_type();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   222
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   223
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   224
//=============================================================================
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   225
//------------------------------Value------------------------------------------
35551
36ef3841fb34 8146629: Make phase->is_IterGVN() accessible from Node::Identity and Node::Value
thartmann
parents: 29081
diff changeset
   226
const Type* ConvI2FNode::Value(PhaseGVN* phase) const {
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   227
  const Type *t = phase->type( in(1) );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   228
  if( t == Type::TOP ) return Type::TOP;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   229
  const TypeInt *ti = t->is_int();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   230
  if( ti->is_con() ) return TypeF::make( (float)ti->get_con() );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   231
  return bottom_type();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   232
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   233
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   234
//------------------------------Identity---------------------------------------
35551
36ef3841fb34 8146629: Make phase->is_IterGVN() accessible from Node::Identity and Node::Value
thartmann
parents: 29081
diff changeset
   235
Node* ConvI2FNode::Identity(PhaseGVN* phase) {
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   236
  // Remove ConvI2F->ConvF2I->ConvI2F sequences.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   237
  if( in(1)       ->Opcode() == Op_ConvF2I &&
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   238
     in(1)->in(1)->Opcode() == Op_ConvI2F )
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   239
  return in(1)->in(1);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   240
  return this;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   241
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   242
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   243
//=============================================================================
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   244
//------------------------------Value------------------------------------------
35551
36ef3841fb34 8146629: Make phase->is_IterGVN() accessible from Node::Identity and Node::Value
thartmann
parents: 29081
diff changeset
   245
const Type* ConvI2LNode::Value(PhaseGVN* phase) const {
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   246
  const Type *t = phase->type( in(1) );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   247
  if( t == Type::TOP ) return Type::TOP;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   248
  const TypeInt *ti = t->is_int();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   249
  const Type* tl = TypeLong::make(ti->_lo, ti->_hi, ti->_widen);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   250
  // Join my declared type against my incoming type.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   251
  tl = tl->filter(_type);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   252
  return tl;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   253
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   254
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   255
#ifdef _LP64
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   256
static inline bool long_ranges_overlap(jlong lo1, jlong hi1,
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   257
                                       jlong lo2, jlong hi2) {
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   258
  // Two ranges overlap iff one range's low point falls in the other range.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   259
  return (lo2 <= lo1 && lo1 <= hi2) || (lo1 <= lo2 && lo2 <= hi1);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   260
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   261
#endif
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   262
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   263
//------------------------------Ideal------------------------------------------
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   264
Node *ConvI2LNode::Ideal(PhaseGVN *phase, bool can_reshape) {
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   265
  const TypeLong* this_type = this->type()->is_long();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   266
  Node* this_changed = NULL;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   267
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   268
  // If _major_progress, then more loop optimizations follow.  Do NOT
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   269
  // remove this node's type assertion until no more loop ops can happen.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   270
  // The progress bit is set in the major loop optimizations THEN comes the
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   271
  // call to IterGVN and any chance of hitting this code.  Cf. Opaque1Node.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   272
  if (can_reshape && !phase->C->major_progress()) {
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   273
    const TypeInt* in_type = phase->type(in(1))->isa_int();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   274
    if (in_type != NULL && this_type != NULL &&
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   275
        (in_type->_lo != this_type->_lo ||
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   276
         in_type->_hi != this_type->_hi)) {
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   277
          // Although this WORSENS the type, it increases GVN opportunities,
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   278
          // because I2L nodes with the same input will common up, regardless
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   279
          // of slightly differing type assertions.  Such slight differences
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   280
          // arise routinely as a result of loop unrolling, so this is a
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   281
          // post-unrolling graph cleanup.  Choose a type which depends only
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   282
          // on my input.  (Exception:  Keep a range assertion of >=0 or <0.)
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   283
          jlong lo1 = this_type->_lo;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   284
          jlong hi1 = this_type->_hi;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   285
          int   w1  = this_type->_widen;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   286
          if (lo1 != (jint)lo1 ||
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   287
              hi1 != (jint)hi1 ||
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   288
              lo1 > hi1) {
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   289
            // Overflow leads to wraparound, wraparound leads to range saturation.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   290
            lo1 = min_jint; hi1 = max_jint;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   291
          } else if (lo1 >= 0) {
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   292
            // Keep a range assertion of >=0.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   293
            lo1 = 0;        hi1 = max_jint;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   294
          } else if (hi1 < 0) {
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   295
            // Keep a range assertion of <0.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   296
            lo1 = min_jint; hi1 = -1;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   297
          } else {
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   298
            lo1 = min_jint; hi1 = max_jint;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   299
          }
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   300
          const TypeLong* wtype = TypeLong::make(MAX2((jlong)in_type->_lo, lo1),
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   301
                                                 MIN2((jlong)in_type->_hi, hi1),
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   302
                                                 MAX2((int)in_type->_widen, w1));
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   303
          if (wtype != type()) {
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   304
            set_type(wtype);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   305
            // Note: this_type still has old type value, for the logic below.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   306
            this_changed = this;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   307
          }
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   308
        }
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   309
  }
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   310
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   311
#ifdef _LP64
44331
61e01c0389ba 8177095: Range check dependent CastII/ConvI2L is prematurely eliminated
thartmann
parents: 35574
diff changeset
   312
  // Convert ConvI2L(AddI(x, y)) to AddL(ConvI2L(x), ConvI2L(y))
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   313
  // but only if x and y have subranges that cannot cause 32-bit overflow,
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   314
  // under the assumption that x+y is in my own subrange this->type().
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   315
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   316
  // This assumption is based on a constraint (i.e., type assertion)
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   317
  // established in Parse::array_addressing or perhaps elsewhere.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   318
  // This constraint has been adjoined to the "natural" type of
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   319
  // the incoming argument in(0).  We know (because of runtime
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   320
  // checks) - that the result value I2L(x+y) is in the joined range.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   321
  // Hence we can restrict the incoming terms (x, y) to values such
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   322
  // that their sum also lands in that range.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   323
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   324
  // This optimization is useful only on 64-bit systems, where we hope
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   325
  // the addition will end up subsumed in an addressing mode.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   326
  // It is necessary to do this when optimizing an unrolled array
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   327
  // copy loop such as x[i++] = y[i++].
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   328
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   329
  // On 32-bit systems, it's better to perform as much 32-bit math as
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   330
  // possible before the I2L conversion, because 32-bit math is cheaper.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   331
  // There's no common reason to "leak" a constant offset through the I2L.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   332
  // Addressing arithmetic will not absorb it as part of a 64-bit AddL.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   333
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   334
  Node* z = in(1);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   335
  int op = z->Opcode();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   336
  if (op == Op_AddI || op == Op_SubI) {
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   337
    Node* x = z->in(1);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   338
    Node* y = z->in(2);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   339
    assert (x != z && y != z, "dead loop in ConvI2LNode::Ideal");
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   340
    if (phase->type(x) == Type::TOP)  return this_changed;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   341
    if (phase->type(y) == Type::TOP)  return this_changed;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   342
    const TypeInt*  tx = phase->type(x)->is_int();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   343
    const TypeInt*  ty = phase->type(y)->is_int();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   344
    const TypeLong* tz = this_type;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   345
    jlong xlo = tx->_lo;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   346
    jlong xhi = tx->_hi;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   347
    jlong ylo = ty->_lo;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   348
    jlong yhi = ty->_hi;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   349
    jlong zlo = tz->_lo;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   350
    jlong zhi = tz->_hi;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   351
    jlong vbit = CONST64(1) << BitsPerInt;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   352
    int widen =  MAX2(tx->_widen, ty->_widen);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   353
    if (op == Op_SubI) {
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   354
      jlong ylo0 = ylo;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   355
      ylo = -yhi;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   356
      yhi = -ylo0;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   357
    }
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   358
    // See if x+y can cause positive overflow into z+2**32
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   359
    if (long_ranges_overlap(xlo+ylo, xhi+yhi, zlo+vbit, zhi+vbit)) {
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   360
      return this_changed;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   361
    }
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   362
    // See if x+y can cause negative overflow into z-2**32
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   363
    if (long_ranges_overlap(xlo+ylo, xhi+yhi, zlo-vbit, zhi-vbit)) {
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   364
      return this_changed;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   365
    }
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   366
    // Now it's always safe to assume x+y does not overflow.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   367
    // This is true even if some pairs x,y might cause overflow, as long
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   368
    // as that overflow value cannot fall into [zlo,zhi].
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   369
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   370
    // Confident that the arithmetic is "as if infinite precision",
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   371
    // we can now use z's range to put constraints on those of x and y.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   372
    // The "natural" range of x [xlo,xhi] can perhaps be narrowed to a
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   373
    // more "restricted" range by intersecting [xlo,xhi] with the
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   374
    // range obtained by subtracting y's range from the asserted range
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   375
    // of the I2L conversion.  Here's the interval arithmetic algebra:
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   376
    //    x == z-y == [zlo,zhi]-[ylo,yhi] == [zlo,zhi]+[-yhi,-ylo]
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   377
    //    => x in [zlo-yhi, zhi-ylo]
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   378
    //    => x in [zlo-yhi, zhi-ylo] INTERSECT [xlo,xhi]
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   379
    //    => x in [xlo MAX zlo-yhi, xhi MIN zhi-ylo]
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   380
    jlong rxlo = MAX2(xlo, zlo - yhi);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   381
    jlong rxhi = MIN2(xhi, zhi - ylo);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   382
    // And similarly, x changing place with y:
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   383
    jlong rylo = MAX2(ylo, zlo - xhi);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   384
    jlong ryhi = MIN2(yhi, zhi - xlo);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   385
    if (rxlo > rxhi || rylo > ryhi) {
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   386
      return this_changed;  // x or y is dying; don't mess w/ it
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   387
    }
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   388
    if (op == Op_SubI) {
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   389
      jlong rylo0 = rylo;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   390
      rylo = -ryhi;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   391
      ryhi = -rylo0;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   392
    }
35574
2b25eb88c8d6 6675699: need comprehensive fix for unconstrained ConvI2L with narrowed type
thartmann
parents: 35551
diff changeset
   393
    assert(rxlo == (int)rxlo && rxhi == (int)rxhi, "x should not overflow");
2b25eb88c8d6 6675699: need comprehensive fix for unconstrained ConvI2L with narrowed type
thartmann
parents: 35551
diff changeset
   394
    assert(rylo == (int)rylo && ryhi == (int)ryhi, "y should not overflow");
44331
61e01c0389ba 8177095: Range check dependent CastII/ConvI2L is prematurely eliminated
thartmann
parents: 35574
diff changeset
   395
    Node* cx = phase->C->constrained_convI2L(phase, x, TypeInt::make(rxlo, rxhi, widen), NULL);
53456
44f41693631f 8217359: C2 compiler triggers SIGSEGV after transformation in ConvI2LNode::Ideal
fyang
parents: 48089
diff changeset
   396
    Node *hook = new Node(1);
44f41693631f 8217359: C2 compiler triggers SIGSEGV after transformation in ConvI2LNode::Ideal
fyang
parents: 48089
diff changeset
   397
    hook->init_req(0, cx);  // Add a use to cx to prevent him from dying
44331
61e01c0389ba 8177095: Range check dependent CastII/ConvI2L is prematurely eliminated
thartmann
parents: 35574
diff changeset
   398
    Node* cy = phase->C->constrained_convI2L(phase, y, TypeInt::make(rylo, ryhi, widen), NULL);
53456
44f41693631f 8217359: C2 compiler triggers SIGSEGV after transformation in ConvI2LNode::Ideal
fyang
parents: 48089
diff changeset
   399
    hook->del_req(0);  // Just yank bogus edge
44f41693631f 8217359: C2 compiler triggers SIGSEGV after transformation in ConvI2LNode::Ideal
fyang
parents: 48089
diff changeset
   400
    hook->destruct();
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   401
    switch (op) {
24923
9631f7d691dc 8034812: remove IDX_INIT macro hack in Node class
thartmann
parents: 23528
diff changeset
   402
      case Op_AddI:  return new AddLNode(cx, cy);
9631f7d691dc 8034812: remove IDX_INIT macro hack in Node class
thartmann
parents: 23528
diff changeset
   403
      case Op_SubI:  return new SubLNode(cx, cy);
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   404
      default:       ShouldNotReachHere();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   405
    }
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   406
  }
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   407
#endif //_LP64
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   408
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   409
  return this_changed;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   410
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   411
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   412
//=============================================================================
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   413
//------------------------------Value------------------------------------------
35551
36ef3841fb34 8146629: Make phase->is_IterGVN() accessible from Node::Identity and Node::Value
thartmann
parents: 29081
diff changeset
   414
const Type* ConvL2DNode::Value(PhaseGVN* phase) const {
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   415
  const Type *t = phase->type( in(1) );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   416
  if( t == Type::TOP ) return Type::TOP;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   417
  const TypeLong *tl = t->is_long();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   418
  if( tl->is_con() ) return TypeD::make( (double)tl->get_con() );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   419
  return bottom_type();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   420
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   421
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   422
//=============================================================================
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   423
//------------------------------Value------------------------------------------
35551
36ef3841fb34 8146629: Make phase->is_IterGVN() accessible from Node::Identity and Node::Value
thartmann
parents: 29081
diff changeset
   424
const Type* ConvL2FNode::Value(PhaseGVN* phase) const {
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   425
  const Type *t = phase->type( in(1) );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   426
  if( t == Type::TOP ) return Type::TOP;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   427
  const TypeLong *tl = t->is_long();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   428
  if( tl->is_con() ) return TypeF::make( (float)tl->get_con() );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   429
  return bottom_type();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   430
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   431
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   432
//=============================================================================
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   433
//----------------------------Identity-----------------------------------------
35551
36ef3841fb34 8146629: Make phase->is_IterGVN() accessible from Node::Identity and Node::Value
thartmann
parents: 29081
diff changeset
   434
Node* ConvL2INode::Identity(PhaseGVN* phase) {
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   435
  // Convert L2I(I2L(x)) => x
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   436
  if (in(1)->Opcode() == Op_ConvI2L)  return in(1)->in(1);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   437
  return this;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   438
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   439
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   440
//------------------------------Value------------------------------------------
35551
36ef3841fb34 8146629: Make phase->is_IterGVN() accessible from Node::Identity and Node::Value
thartmann
parents: 29081
diff changeset
   441
const Type* ConvL2INode::Value(PhaseGVN* phase) const {
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   442
  const Type *t = phase->type( in(1) );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   443
  if( t == Type::TOP ) return Type::TOP;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   444
  const TypeLong *tl = t->is_long();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   445
  if (tl->is_con())
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   446
  // Easy case.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   447
  return TypeInt::make((jint)tl->get_con());
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   448
  return bottom_type();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   449
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   450
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   451
//------------------------------Ideal------------------------------------------
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   452
// Return a node which is more "ideal" than the current node.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   453
// Blow off prior masking to int
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   454
Node *ConvL2INode::Ideal(PhaseGVN *phase, bool can_reshape) {
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   455
  Node *andl = in(1);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   456
  uint andl_op = andl->Opcode();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   457
  if( andl_op == Op_AndL ) {
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   458
    // Blow off prior masking to int
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   459
    if( phase->type(andl->in(2)) == TypeLong::make( 0xFFFFFFFF ) ) {
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   460
      set_req(1,andl->in(1));
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   461
      return this;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   462
    }
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   463
  }
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   464
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   465
  // Swap with a prior add: convL2I(addL(x,y)) ==> addI(convL2I(x),convL2I(y))
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   466
  // This replaces an 'AddL' with an 'AddI'.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   467
  if( andl_op == Op_AddL ) {
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   468
    // Don't do this for nodes which have more than one user since
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   469
    // we'll end up computing the long add anyway.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   470
    if (andl->outcnt() > 1) return NULL;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   471
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   472
    Node* x = andl->in(1);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   473
    Node* y = andl->in(2);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   474
    assert( x != andl && y != andl, "dead loop in ConvL2INode::Ideal" );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   475
    if (phase->type(x) == Type::TOP)  return NULL;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   476
    if (phase->type(y) == Type::TOP)  return NULL;
24923
9631f7d691dc 8034812: remove IDX_INIT macro hack in Node class
thartmann
parents: 23528
diff changeset
   477
    Node *add1 = phase->transform(new ConvL2INode(x));
9631f7d691dc 8034812: remove IDX_INIT macro hack in Node class
thartmann
parents: 23528
diff changeset
   478
    Node *add2 = phase->transform(new ConvL2INode(y));
9631f7d691dc 8034812: remove IDX_INIT macro hack in Node class
thartmann
parents: 23528
diff changeset
   479
    return new AddINode(add1,add2);
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   480
  }
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   481
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   482
  // Disable optimization: LoadL->ConvL2I ==> LoadI.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   483
  // It causes problems (sizes of Load and Store nodes do not match)
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   484
  // in objects initialization code and Escape Analysis.
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   485
  return NULL;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   486
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   487
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   488
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   489
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   490
//=============================================================================
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   491
//------------------------------Identity---------------------------------------
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   492
// Remove redundant roundings
35551
36ef3841fb34 8146629: Make phase->is_IterGVN() accessible from Node::Identity and Node::Value
thartmann
parents: 29081
diff changeset
   493
Node* RoundFloatNode::Identity(PhaseGVN* phase) {
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   494
  assert(Matcher::strict_fp_requires_explicit_rounding, "should only generate for Intel");
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   495
  // Do not round constants
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   496
  if (phase->type(in(1))->base() == Type::FloatCon)  return in(1);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   497
  int op = in(1)->Opcode();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   498
  // Redundant rounding
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   499
  if( op == Op_RoundFloat ) return in(1);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   500
  // Already rounded
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   501
  if( op == Op_Parm ) return in(1);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   502
  if( op == Op_LoadF ) return in(1);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   503
  return this;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   504
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   505
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   506
//------------------------------Value------------------------------------------
35551
36ef3841fb34 8146629: Make phase->is_IterGVN() accessible from Node::Identity and Node::Value
thartmann
parents: 29081
diff changeset
   507
const Type* RoundFloatNode::Value(PhaseGVN* phase) const {
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   508
  return phase->type( in(1) );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   509
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   510
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   511
//=============================================================================
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   512
//------------------------------Identity---------------------------------------
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   513
// Remove redundant roundings.  Incoming arguments are already rounded.
35551
36ef3841fb34 8146629: Make phase->is_IterGVN() accessible from Node::Identity and Node::Value
thartmann
parents: 29081
diff changeset
   514
Node* RoundDoubleNode::Identity(PhaseGVN* phase) {
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   515
  assert(Matcher::strict_fp_requires_explicit_rounding, "should only generate for Intel");
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   516
  // Do not round constants
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   517
  if (phase->type(in(1))->base() == Type::DoubleCon)  return in(1);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   518
  int op = in(1)->Opcode();
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   519
  // Redundant rounding
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   520
  if( op == Op_RoundDouble ) return in(1);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   521
  // Already rounded
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   522
  if( op == Op_Parm ) return in(1);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   523
  if( op == Op_LoadD ) return in(1);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   524
  if( op == Op_ConvF2D ) return in(1);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   525
  if( op == Op_ConvI2D ) return in(1);
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   526
  return this;
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   527
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   529
//------------------------------Value------------------------------------------
35551
36ef3841fb34 8146629: Make phase->is_IterGVN() accessible from Node::Identity and Node::Value
thartmann
parents: 29081
diff changeset
   530
const Type* RoundDoubleNode::Value(PhaseGVN* phase) const {
23528
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   531
  return phase->type( in(1) );
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   532
}
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   533
8f1a7f5e8066 8001532: C2 node files refactoring
morris
parents:
diff changeset
   534