1/*
2 * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#include "precompiled.hpp"
26#include "c1/c1_Canonicalizer.hpp"
27#include "c1/c1_InstructionPrinter.hpp"
28#include "c1/c1_ValueStack.hpp"
29#include "ci/ciArray.hpp"
30#include "runtime/sharedRuntime.hpp"
31
32
33class PrintValueVisitor: public ValueVisitor {
34  void visit(Value* vp) {
35    (*vp)->print_line();
36  }
37};
38
39void Canonicalizer::set_canonical(Value x) {
40  assert(x != NULL, "value must exist");
41  // Note: we can not currently substitute root nodes which show up in
42  // the instruction stream (because the instruction list is embedded
43  // in the instructions).
44  if (canonical() != x) {
45#ifndef PRODUCT
46    if (!x->has_printable_bci()) {
47      x->set_printable_bci(bci());
48    }
49#endif
50    if (PrintCanonicalization) {
51      PrintValueVisitor do_print_value;
52      canonical()->input_values_do(&do_print_value);
53      canonical()->print_line();
54      tty->print_cr("canonicalized to:");
55      x->input_values_do(&do_print_value);
56      x->print_line();
57      tty->cr();
58    }
59    assert(_canonical->type()->tag() == x->type()->tag(), "types must match");
60    _canonical = x;
61  }
62}
63
64
65void Canonicalizer::move_const_to_right(Op2* x) {
66  if (x->x()->type()->is_constant() && x->is_commutative()) x->swap_operands();
67}
68
69
70void Canonicalizer::do_Op2(Op2* x) {
71  if (x->x() == x->y()) {
72    switch (x->op()) {
73    case Bytecodes::_isub: set_constant(0); return;
74    case Bytecodes::_lsub: set_constant(jlong_cast(0)); return;
75    case Bytecodes::_iand: // fall through
76    case Bytecodes::_land: // fall through
77    case Bytecodes::_ior:  // fall through
78    case Bytecodes::_lor : set_canonical(x->x()); return;
79    case Bytecodes::_ixor: set_constant(0); return;
80    case Bytecodes::_lxor: set_constant(jlong_cast(0)); return;
81    }
82  }
83
84  if (x->x()->type()->is_constant() && x->y()->type()->is_constant()) {
85    // do constant folding for selected operations
86    switch (x->type()->tag()) {
87      case intTag:
88        { jint a = x->x()->type()->as_IntConstant()->value();
89          jint b = x->y()->type()->as_IntConstant()->value();
90          switch (x->op()) {
91            case Bytecodes::_iadd: set_constant(a + b); return;
92            case Bytecodes::_isub: set_constant(a - b); return;
93            case Bytecodes::_imul: set_constant(a * b); return;
94            case Bytecodes::_idiv:
95              if (b != 0) {
96                if (a == min_jint && b == -1) {
97                  set_constant(min_jint);
98                } else {
99                  set_constant(a / b);
100                }
101                return;
102              }
103              break;
104            case Bytecodes::_irem:
105              if (b != 0) {
106                if (a == min_jint && b == -1) {
107                  set_constant(0);
108                } else {
109                  set_constant(a % b);
110                }
111                return;
112              }
113              break;
114            case Bytecodes::_iand: set_constant(a & b); return;
115            case Bytecodes::_ior : set_constant(a | b); return;
116            case Bytecodes::_ixor: set_constant(a ^ b); return;
117          }
118        }
119        break;
120      case longTag:
121        { jlong a = x->x()->type()->as_LongConstant()->value();
122          jlong b = x->y()->type()->as_LongConstant()->value();
123          switch (x->op()) {
124            case Bytecodes::_ladd: set_constant(a + b); return;
125            case Bytecodes::_lsub: set_constant(a - b); return;
126            case Bytecodes::_lmul: set_constant(a * b); return;
127            case Bytecodes::_ldiv:
128              if (b != 0) {
129                set_constant(SharedRuntime::ldiv(b, a));
130                return;
131              }
132              break;
133            case Bytecodes::_lrem:
134              if (b != 0) {
135                set_constant(SharedRuntime::lrem(b, a));
136                return;
137              }
138              break;
139            case Bytecodes::_land: set_constant(a & b); return;
140            case Bytecodes::_lor : set_constant(a | b); return;
141            case Bytecodes::_lxor: set_constant(a ^ b); return;
142          }
143        }
144        break;
145      // other cases not implemented (must be extremely careful with floats & doubles!)
146    }
147  }
148  // make sure constant is on the right side, if any
149  move_const_to_right(x);
150
151  if (x->y()->type()->is_constant()) {
152    // do constant folding for selected operations
153    switch (x->type()->tag()) {
154      case intTag:
155        if (x->y()->type()->as_IntConstant()->value() == 0) {
156          switch (x->op()) {
157            case Bytecodes::_iadd: set_canonical(x->x()); return;
158            case Bytecodes::_isub: set_canonical(x->x()); return;
159            case Bytecodes::_imul: set_constant(0); return;
160              // Note: for div and rem, make sure that C semantics
161              //       corresponds to Java semantics!
162            case Bytecodes::_iand: set_constant(0); return;
163            case Bytecodes::_ior : set_canonical(x->x()); return;
164          }
165        }
166        break;
167      case longTag:
168        if (x->y()->type()->as_LongConstant()->value() == (jlong)0) {
169          switch (x->op()) {
170            case Bytecodes::_ladd: set_canonical(x->x()); return;
171            case Bytecodes::_lsub: set_canonical(x->x()); return;
172            case Bytecodes::_lmul: set_constant((jlong)0); return;
173              // Note: for div and rem, make sure that C semantics
174              //       corresponds to Java semantics!
175            case Bytecodes::_land: set_constant((jlong)0); return;
176            case Bytecodes::_lor : set_canonical(x->x()); return;
177          }
178        }
179        break;
180    }
181  }
182}
183
184
185void Canonicalizer::do_Phi            (Phi*             x) {}
186void Canonicalizer::do_Constant       (Constant*        x) {}
187void Canonicalizer::do_Local          (Local*           x) {}
188void Canonicalizer::do_LoadField      (LoadField*       x) {}
189
190// checks if v is in the block that is currently processed by
191// GraphBuilder. This is the only block that has not BlockEnd yet.
192static bool in_current_block(Value v) {
193  int max_distance = 4;
194  while (max_distance > 0 && v != NULL && v->as_BlockEnd() == NULL) {
195    v = v->next();
196    max_distance--;
197  }
198  return v == NULL;
199}
200
201void Canonicalizer::do_StoreField     (StoreField*      x) {
202  // If a value is going to be stored into a field or array some of
203  // the conversions emitted by javac are unneeded because the fields
204  // are packed to their natural size.
205  Convert* conv = x->value()->as_Convert();
206  if (conv) {
207    Value value = NULL;
208    BasicType type = x->field()->type()->basic_type();
209    switch (conv->op()) {
210    case Bytecodes::_i2b: if (type == T_BYTE)  value = conv->value(); break;
211    case Bytecodes::_i2s: if (type == T_SHORT || type == T_BYTE) value = conv->value(); break;
212    case Bytecodes::_i2c: if (type == T_CHAR  || type == T_BYTE)  value = conv->value(); break;
213    }
214    // limit this optimization to current block
215    if (value != NULL && in_current_block(conv)) {
216      set_canonical(new StoreField(x->obj(), x->offset(), x->field(), value, x->is_static(),
217                                   x->state_before(), x->needs_patching()));
218      return;
219    }
220  }
221
222}
223
224void Canonicalizer::do_ArrayLength    (ArrayLength*     x) {
225  NewArray*  na;
226  Constant*  ct;
227  LoadField* lf;
228
229  if ((na = x->array()->as_NewArray()) != NULL) {
230    // New arrays might have the known length.
231    // Do not use the Constant itself, but create a new Constant
232    // with same value Otherwise a Constant is live over multiple
233    // blocks without being registered in a state array.
234    Constant* length;
235    if (na->length() != NULL &&
236        (length = na->length()->as_Constant()) != NULL) {
237      assert(length->type()->as_IntConstant() != NULL, "array length must be integer");
238      set_constant(length->type()->as_IntConstant()->value());
239    }
240
241  } else if ((ct = x->array()->as_Constant()) != NULL) {
242    // Constant arrays have constant lengths.
243    ArrayConstant* cnst = ct->type()->as_ArrayConstant();
244    if (cnst != NULL) {
245      set_constant(cnst->value()->length());
246    }
247
248  } else if ((lf = x->array()->as_LoadField()) != NULL) {
249    ciField* field = lf->field();
250    if (field->is_static_constant()) {
251      // Constant field loads are usually folded during parsing.
252      // But it doesn't happen with PatchALot, ScavengeRootsInCode < 2, or when
253      // holder class is being initialized during parsing (for static fields).
254      ciObject* c = field->constant_value().as_object();
255      if (!c->is_null_object()) {
256        set_constant(c->as_array()->length());
257      }
258    }
259  }
260}
261
262void Canonicalizer::do_LoadIndexed    (LoadIndexed*     x) {
263  StableArrayConstant* array = x->array()->type()->as_StableArrayConstant();
264  IntConstant* index = x->index()->type()->as_IntConstant();
265
266  assert(array == NULL || FoldStableValues, "not enabled");
267
268  // Constant fold loads from stable arrays.
269  if (!x->mismatched() && array != NULL && index != NULL) {
270    jint idx = index->value();
271    if (idx < 0 || idx >= array->value()->length()) {
272      // Leave the load as is. The range check will handle it.
273      return;
274    }
275
276    ciConstant field_val = array->value()->element_value(idx);
277    if (!field_val.is_null_or_zero()) {
278      jint dimension = array->dimension();
279      assert(dimension <= array->value()->array_type()->dimension(), "inconsistent info");
280      ValueType* value = NULL;
281      if (dimension > 1) {
282        // Preserve information about the dimension for the element.
283        assert(field_val.as_object()->is_array(), "not an array");
284        value = new StableArrayConstant(field_val.as_object()->as_array(), dimension - 1);
285      } else {
286        assert(dimension == 1, "sanity");
287        value = as_ValueType(field_val);
288      }
289      set_canonical(new Constant(value));
290    }
291  }
292}
293
294void Canonicalizer::do_StoreIndexed   (StoreIndexed*    x) {
295  // If a value is going to be stored into a field or array some of
296  // the conversions emitted by javac are unneeded because the fields
297  // are packed to their natural size.
298  Convert* conv = x->value()->as_Convert();
299  if (conv) {
300    Value value = NULL;
301    BasicType type = x->elt_type();
302    switch (conv->op()) {
303    case Bytecodes::_i2b: if (type == T_BYTE)  value = conv->value(); break;
304    case Bytecodes::_i2s: if (type == T_SHORT || type == T_BYTE) value = conv->value(); break;
305    case Bytecodes::_i2c: if (type == T_CHAR  || type == T_BYTE) value = conv->value(); break;
306    }
307    // limit this optimization to current block
308    if (value != NULL && in_current_block(conv)) {
309      set_canonical(new StoreIndexed(x->array(), x->index(), x->length(),
310                                     x->elt_type(), value, x->state_before(),
311                                     x->check_boolean()));
312      return;
313    }
314  }
315}
316
317
318void Canonicalizer::do_NegateOp(NegateOp* x) {
319  ValueType* t = x->x()->type();
320  if (t->is_constant()) {
321    switch (t->tag()) {
322      case intTag   : set_constant(-t->as_IntConstant   ()->value()); return;
323      case longTag  : set_constant(-t->as_LongConstant  ()->value()); return;
324      case floatTag : set_constant(-t->as_FloatConstant ()->value()); return;
325      case doubleTag: set_constant(-t->as_DoubleConstant()->value()); return;
326      default       : ShouldNotReachHere();
327    }
328  }
329}
330
331
332void Canonicalizer::do_ArithmeticOp   (ArithmeticOp*    x) { do_Op2(x); }
333
334
335void Canonicalizer::do_ShiftOp        (ShiftOp*         x) {
336  ValueType* t = x->x()->type();
337  ValueType* t2 = x->y()->type();
338  if (t->is_constant()) {
339    switch (t->tag()) {
340    case intTag   : if (t->as_IntConstant()->value() == 0)         { set_constant(0); return; } break;
341    case longTag  : if (t->as_LongConstant()->value() == (jlong)0) { set_constant(jlong_cast(0)); return; } break;
342    default       : ShouldNotReachHere();
343    }
344    if (t2->is_constant()) {
345      if (t->tag() == intTag) {
346        int value = t->as_IntConstant()->value();
347        int shift = t2->as_IntConstant()->value() & 31;
348        jint mask = ~(~0 << (32 - shift));
349        if (shift == 0) mask = ~0;
350        switch (x->op()) {
351          case Bytecodes::_ishl:  set_constant(value << shift); return;
352          case Bytecodes::_ishr:  set_constant(value >> shift); return;
353          case Bytecodes::_iushr: set_constant((value >> shift) & mask); return;
354        }
355      } else if (t->tag() == longTag) {
356        jlong value = t->as_LongConstant()->value();
357        int shift = t2->as_IntConstant()->value() & 63;
358        jlong mask = ~(~jlong_cast(0) << (64 - shift));
359        if (shift == 0) mask = ~jlong_cast(0);
360        switch (x->op()) {
361          case Bytecodes::_lshl:  set_constant(value << shift); return;
362          case Bytecodes::_lshr:  set_constant(value >> shift); return;
363          case Bytecodes::_lushr: set_constant((value >> shift) & mask); return;
364        }
365      }
366    }
367  }
368  if (t2->is_constant()) {
369    switch (t2->tag()) {
370      case intTag   : if (t2->as_IntConstant()->value() == 0)  set_canonical(x->x()); return;
371      case longTag  : if (t2->as_LongConstant()->value() == (jlong)0)  set_canonical(x->x()); return;
372      default       : ShouldNotReachHere();
373    }
374  }
375}
376
377
378void Canonicalizer::do_LogicOp        (LogicOp*         x) { do_Op2(x); }
379void Canonicalizer::do_CompareOp      (CompareOp*       x) {
380  if (x->x() == x->y()) {
381    switch (x->x()->type()->tag()) {
382      case longTag: set_constant(0); break;
383      case floatTag: {
384        FloatConstant* fc = x->x()->type()->as_FloatConstant();
385        if (fc) {
386          if (g_isnan(fc->value())) {
387            set_constant(x->op() == Bytecodes::_fcmpl ? -1 : 1);
388          } else {
389            set_constant(0);
390          }
391        }
392        break;
393      }
394      case doubleTag: {
395        DoubleConstant* dc = x->x()->type()->as_DoubleConstant();
396        if (dc) {
397          if (g_isnan(dc->value())) {
398            set_constant(x->op() == Bytecodes::_dcmpl ? -1 : 1);
399          } else {
400            set_constant(0);
401          }
402        }
403        break;
404      }
405    }
406  } else if (x->x()->type()->is_constant() && x->y()->type()->is_constant()) {
407    switch (x->x()->type()->tag()) {
408      case longTag: {
409        jlong vx = x->x()->type()->as_LongConstant()->value();
410        jlong vy = x->y()->type()->as_LongConstant()->value();
411        if (vx == vy)
412          set_constant(0);
413        else if (vx < vy)
414          set_constant(-1);
415        else
416          set_constant(1);
417        break;
418      }
419
420      case floatTag: {
421        float vx = x->x()->type()->as_FloatConstant()->value();
422        float vy = x->y()->type()->as_FloatConstant()->value();
423        if (g_isnan(vx) || g_isnan(vy))
424          set_constant(x->op() == Bytecodes::_fcmpl ? -1 : 1);
425        else if (vx == vy)
426          set_constant(0);
427        else if (vx < vy)
428          set_constant(-1);
429        else
430          set_constant(1);
431        break;
432      }
433
434      case doubleTag: {
435        double vx = x->x()->type()->as_DoubleConstant()->value();
436        double vy = x->y()->type()->as_DoubleConstant()->value();
437        if (g_isnan(vx) || g_isnan(vy))
438          set_constant(x->op() == Bytecodes::_dcmpl ? -1 : 1);
439        else if (vx == vy)
440          set_constant(0);
441        else if (vx < vy)
442          set_constant(-1);
443        else
444          set_constant(1);
445        break;
446      }
447    }
448
449  }
450}
451
452
453void Canonicalizer::do_IfInstanceOf(IfInstanceOf*    x) {}
454
455void Canonicalizer::do_IfOp(IfOp* x) {
456  // Caution: do not use do_Op2(x) here for now since
457  //          we map the condition to the op for now!
458  move_const_to_right(x);
459}
460
461
462void Canonicalizer::do_Intrinsic      (Intrinsic*       x) {
463  switch (x->id()) {
464  case vmIntrinsics::_floatToRawIntBits   : {
465    FloatConstant* c = x->argument_at(0)->type()->as_FloatConstant();
466    if (c != NULL) {
467      JavaValue v;
468      v.set_jfloat(c->value());
469      set_constant(v.get_jint());
470    }
471    break;
472  }
473  case vmIntrinsics::_intBitsToFloat      : {
474    IntConstant* c = x->argument_at(0)->type()->as_IntConstant();
475    if (c != NULL) {
476      JavaValue v;
477      v.set_jint(c->value());
478      set_constant(v.get_jfloat());
479    }
480    break;
481  }
482  case vmIntrinsics::_doubleToRawLongBits : {
483    DoubleConstant* c = x->argument_at(0)->type()->as_DoubleConstant();
484    if (c != NULL) {
485      JavaValue v;
486      v.set_jdouble(c->value());
487      set_constant(v.get_jlong());
488    }
489    break;
490  }
491  case vmIntrinsics::_longBitsToDouble    : {
492    LongConstant* c = x->argument_at(0)->type()->as_LongConstant();
493    if (c != NULL) {
494      JavaValue v;
495      v.set_jlong(c->value());
496      set_constant(v.get_jdouble());
497    }
498    break;
499  }
500  case vmIntrinsics::_isInstance          : {
501    assert(x->number_of_arguments() == 2, "wrong type");
502
503    InstanceConstant* c = x->argument_at(0)->type()->as_InstanceConstant();
504    if (c != NULL && !c->value()->is_null_object()) {
505      // ciInstance::java_mirror_type() returns non-NULL only for Java mirrors
506      ciType* t = c->value()->java_mirror_type();
507      if (t->is_klass()) {
508        // substitute cls.isInstance(obj) of a constant Class into
509        // an InstantOf instruction
510        InstanceOf* i = new InstanceOf(t->as_klass(), x->argument_at(1), x->state_before());
511        set_canonical(i);
512        // and try to canonicalize even further
513        do_InstanceOf(i);
514      } else {
515        assert(t->is_primitive_type(), "should be a primitive type");
516        // cls.isInstance(obj) always returns false for primitive classes
517        set_constant(0);
518      }
519    }
520    break;
521  }
522  case vmIntrinsics::_isPrimitive        : {
523    assert(x->number_of_arguments() == 1, "wrong type");
524
525    // Class.isPrimitive is known on constant classes:
526    InstanceConstant* c = x->argument_at(0)->type()->as_InstanceConstant();
527    if (c != NULL && !c->value()->is_null_object()) {
528      ciType* t = c->value()->java_mirror_type();
529      set_constant(t->is_primitive_type());
530    }
531    break;
532  }
533  }
534}
535
536void Canonicalizer::do_Convert        (Convert*         x) {
537  if (x->value()->type()->is_constant()) {
538    switch (x->op()) {
539    case Bytecodes::_i2b:  set_constant((int)((x->value()->type()->as_IntConstant()->value() << 24) >> 24)); break;
540    case Bytecodes::_i2s:  set_constant((int)((x->value()->type()->as_IntConstant()->value() << 16) >> 16)); break;
541    case Bytecodes::_i2c:  set_constant((int)(x->value()->type()->as_IntConstant()->value() & ((1<<16)-1))); break;
542    case Bytecodes::_i2l:  set_constant((jlong)(x->value()->type()->as_IntConstant()->value()));             break;
543    case Bytecodes::_i2f:  set_constant((float)(x->value()->type()->as_IntConstant()->value()));             break;
544    case Bytecodes::_i2d:  set_constant((double)(x->value()->type()->as_IntConstant()->value()));            break;
545    case Bytecodes::_l2i:  set_constant((int)(x->value()->type()->as_LongConstant()->value()));              break;
546    case Bytecodes::_l2f:  set_constant(SharedRuntime::l2f(x->value()->type()->as_LongConstant()->value())); break;
547    case Bytecodes::_l2d:  set_constant(SharedRuntime::l2d(x->value()->type()->as_LongConstant()->value())); break;
548    case Bytecodes::_f2d:  set_constant((double)(x->value()->type()->as_FloatConstant()->value()));          break;
549    case Bytecodes::_f2i:  set_constant(SharedRuntime::f2i(x->value()->type()->as_FloatConstant()->value())); break;
550    case Bytecodes::_f2l:  set_constant(SharedRuntime::f2l(x->value()->type()->as_FloatConstant()->value())); break;
551    case Bytecodes::_d2f:  set_constant((float)(x->value()->type()->as_DoubleConstant()->value()));          break;
552    case Bytecodes::_d2i:  set_constant(SharedRuntime::d2i(x->value()->type()->as_DoubleConstant()->value())); break;
553    case Bytecodes::_d2l:  set_constant(SharedRuntime::d2l(x->value()->type()->as_DoubleConstant()->value())); break;
554    default:
555      ShouldNotReachHere();
556    }
557  }
558
559  Value value = x->value();
560  BasicType type = T_ILLEGAL;
561  LoadField* lf = value->as_LoadField();
562  if (lf) {
563    type = lf->field_type();
564  } else {
565    LoadIndexed* li = value->as_LoadIndexed();
566    if (li) {
567      type = li->elt_type();
568    } else {
569      Convert* conv = value->as_Convert();
570      if (conv) {
571        switch (conv->op()) {
572          case Bytecodes::_i2b: type = T_BYTE;  break;
573          case Bytecodes::_i2s: type = T_SHORT; break;
574          case Bytecodes::_i2c: type = T_CHAR;  break;
575        }
576      }
577    }
578  }
579  if (type != T_ILLEGAL) {
580    switch (x->op()) {
581      case Bytecodes::_i2b: if (type == T_BYTE)                    set_canonical(x->value()); break;
582      case Bytecodes::_i2s: if (type == T_SHORT || type == T_BYTE) set_canonical(x->value()); break;
583      case Bytecodes::_i2c: if (type == T_CHAR)                    set_canonical(x->value()); break;
584    }
585  } else {
586    Op2* op2 = x->value()->as_Op2();
587    if (op2 && op2->op() == Bytecodes::_iand && op2->y()->type()->is_constant()) {
588      jint safebits = 0;
589      jint mask = op2->y()->type()->as_IntConstant()->value();
590      switch (x->op()) {
591        case Bytecodes::_i2b: safebits = 0x7f;   break;
592        case Bytecodes::_i2s: safebits = 0x7fff; break;
593        case Bytecodes::_i2c: safebits = 0xffff; break;
594      }
595      // When casting a masked integer to a smaller signed type, if
596      // the mask doesn't include the sign bit the cast isn't needed.
597      if (safebits && (mask & ~safebits) == 0) {
598        set_canonical(x->value());
599      }
600    }
601  }
602
603}
604
605void Canonicalizer::do_NullCheck      (NullCheck*       x) {
606  if (x->obj()->as_NewArray() != NULL || x->obj()->as_NewInstance() != NULL) {
607    set_canonical(x->obj());
608  } else {
609    Constant* con = x->obj()->as_Constant();
610    if (con) {
611      ObjectType* c = con->type()->as_ObjectType();
612      if (c && c->is_loaded()) {
613        ObjectConstant* oc = c->as_ObjectConstant();
614        if (!oc || !oc->value()->is_null_object()) {
615          set_canonical(con);
616        }
617      }
618    }
619  }
620}
621
622void Canonicalizer::do_TypeCast       (TypeCast*        x) {}
623void Canonicalizer::do_Invoke         (Invoke*          x) {}
624void Canonicalizer::do_NewInstance    (NewInstance*     x) {}
625void Canonicalizer::do_NewTypeArray   (NewTypeArray*    x) {}
626void Canonicalizer::do_NewObjectArray (NewObjectArray*  x) {}
627void Canonicalizer::do_NewMultiArray  (NewMultiArray*   x) {}
628void Canonicalizer::do_CheckCast      (CheckCast*       x) {
629  if (x->klass()->is_loaded()) {
630    Value obj = x->obj();
631    ciType* klass = obj->exact_type();
632    if (klass == NULL) klass = obj->declared_type();
633    if (klass != NULL && klass->is_loaded() && klass->is_subtype_of(x->klass())) {
634      set_canonical(obj);
635      return;
636    }
637    // checkcast of null returns null
638    if (obj->as_Constant() && obj->type()->as_ObjectType()->constant_value()->is_null_object()) {
639      set_canonical(obj);
640    }
641  }
642}
643void Canonicalizer::do_InstanceOf     (InstanceOf*      x) {
644  if (x->klass()->is_loaded()) {
645    Value obj = x->obj();
646    ciType* exact = obj->exact_type();
647    if (exact != NULL && exact->is_loaded() && (obj->as_NewInstance() || obj->as_NewArray())) {
648      set_constant(exact->is_subtype_of(x->klass()) ? 1 : 0);
649      return;
650    }
651    // instanceof null returns false
652    if (obj->as_Constant() && obj->type()->as_ObjectType()->constant_value()->is_null_object()) {
653      set_constant(0);
654    }
655  }
656
657}
658void Canonicalizer::do_MonitorEnter   (MonitorEnter*    x) {}
659void Canonicalizer::do_MonitorExit    (MonitorExit*     x) {}
660void Canonicalizer::do_BlockBegin     (BlockBegin*      x) {}
661void Canonicalizer::do_Goto           (Goto*            x) {}
662
663
664static bool is_true(jlong x, If::Condition cond, jlong y) {
665  switch (cond) {
666    case If::eql: return x == y;
667    case If::neq: return x != y;
668    case If::lss: return x <  y;
669    case If::leq: return x <= y;
670    case If::gtr: return x >  y;
671    case If::geq: return x >= y;
672  }
673  ShouldNotReachHere();
674  return false;
675}
676
677static bool is_safepoint(BlockEnd* x, BlockBegin* sux) {
678  // An Instruction with multiple successors, x, is replaced by a Goto
679  // to a single successor, sux. Is a safepoint check needed = was the
680  // instruction being replaced a safepoint and the single remaining
681  // successor a back branch?
682  return x->is_safepoint() && (sux->bci() < x->state_before()->bci());
683}
684
685void Canonicalizer::do_If(If* x) {
686  // move const to right
687  if (x->x()->type()->is_constant()) x->swap_operands();
688  // simplify
689  const Value l = x->x(); ValueType* lt = l->type();
690  const Value r = x->y(); ValueType* rt = r->type();
691
692  if (l == r && !lt->is_float_kind()) {
693    // pattern: If (a cond a) => simplify to Goto
694    BlockBegin* sux = NULL;
695    switch (x->cond()) {
696    case If::eql: sux = x->sux_for(true);  break;
697    case If::neq: sux = x->sux_for(false); break;
698    case If::lss: sux = x->sux_for(false); break;
699    case If::leq: sux = x->sux_for(true);  break;
700    case If::gtr: sux = x->sux_for(false); break;
701    case If::geq: sux = x->sux_for(true);  break;
702    default: ShouldNotReachHere();
703    }
704    // If is a safepoint then the debug information should come from the state_before of the If.
705    set_canonical(new Goto(sux, x->state_before(), is_safepoint(x, sux)));
706    return;
707  }
708
709  if (lt->is_constant() && rt->is_constant()) {
710    if (x->x()->as_Constant() != NULL) {
711      // pattern: If (lc cond rc) => simplify to: Goto
712      BlockBegin* sux = x->x()->as_Constant()->compare(x->cond(), x->y(),
713                                                       x->sux_for(true),
714                                                       x->sux_for(false));
715      if (sux != NULL) {
716        // If is a safepoint then the debug information should come from the state_before of the If.
717        set_canonical(new Goto(sux, x->state_before(), is_safepoint(x, sux)));
718      }
719    }
720  } else if (rt->as_IntConstant() != NULL) {
721    // pattern: If (l cond rc) => investigate further
722    const jint rc = rt->as_IntConstant()->value();
723    if (l->as_CompareOp() != NULL) {
724      // pattern: If ((a cmp b) cond rc) => simplify to: If (x cond y) or: Goto
725      CompareOp* cmp = l->as_CompareOp();
726      bool unordered_is_less = cmp->op() == Bytecodes::_fcmpl || cmp->op() == Bytecodes::_dcmpl;
727      BlockBegin* lss_sux = x->sux_for(is_true(-1, x->cond(), rc)); // successor for a < b
728      BlockBegin* eql_sux = x->sux_for(is_true( 0, x->cond(), rc)); // successor for a = b
729      BlockBegin* gtr_sux = x->sux_for(is_true(+1, x->cond(), rc)); // successor for a > b
730      BlockBegin* nan_sux = unordered_is_less ? lss_sux : gtr_sux ; // successor for unordered
731      // Note: At this point all successors (lss_sux, eql_sux, gtr_sux, nan_sux) are
732      //       equal to x->tsux() or x->fsux(). Furthermore, nan_sux equals either
733      //       lss_sux or gtr_sux.
734      if (lss_sux == eql_sux && eql_sux == gtr_sux) {
735        // all successors identical => simplify to: Goto
736        set_canonical(new Goto(lss_sux, x->state_before(), x->is_safepoint()));
737      } else {
738        // two successors differ and two successors are the same => simplify to: If (x cmp y)
739        // determine new condition & successors
740        If::Condition cond = If::eql;
741        BlockBegin* tsux = NULL;
742        BlockBegin* fsux = NULL;
743             if (lss_sux == eql_sux) { cond = If::leq; tsux = lss_sux; fsux = gtr_sux; }
744        else if (lss_sux == gtr_sux) { cond = If::neq; tsux = lss_sux; fsux = eql_sux; }
745        else if (eql_sux == gtr_sux) { cond = If::geq; tsux = eql_sux; fsux = lss_sux; }
746        else                         { ShouldNotReachHere();                           }
747        If* canon = new If(cmp->x(), cond, nan_sux == tsux, cmp->y(), tsux, fsux, cmp->state_before(), x->is_safepoint());
748        if (cmp->x() == cmp->y()) {
749          do_If(canon);
750        } else {
751          if (compilation()->profile_branches()) {
752            // TODO: If profiling, leave floating point comparisons unoptimized.
753            // We currently do not support profiling of the unordered case.
754            switch(cmp->op()) {
755              case Bytecodes::_fcmpl: case Bytecodes::_fcmpg:
756              case Bytecodes::_dcmpl: case Bytecodes::_dcmpg:
757                set_canonical(x);
758                return;
759            }
760          }
761          set_bci(cmp->state_before()->bci());
762          set_canonical(canon);
763        }
764      }
765    } else if (l->as_InstanceOf() != NULL) {
766      // NOTE: Code permanently disabled for now since it leaves the old InstanceOf
767      //       instruction in the graph (it is pinned). Need to fix this at some point.
768      //       It should also be left in the graph when generating a profiled method version or Goto
769      //       has to know that it was an InstanceOf.
770      return;
771      // pattern: If ((obj instanceof klass) cond rc) => simplify to: IfInstanceOf or: Goto
772      InstanceOf* inst = l->as_InstanceOf();
773      BlockBegin* is_inst_sux = x->sux_for(is_true(1, x->cond(), rc)); // successor for instanceof == 1
774      BlockBegin* no_inst_sux = x->sux_for(is_true(0, x->cond(), rc)); // successor for instanceof == 0
775      if (is_inst_sux == no_inst_sux && inst->is_loaded()) {
776        // both successors identical and klass is loaded => simplify to: Goto
777        set_canonical(new Goto(is_inst_sux, x->state_before(), x->is_safepoint()));
778      } else {
779        // successors differ => simplify to: IfInstanceOf
780        set_canonical(new IfInstanceOf(inst->klass(), inst->obj(), true, inst->state_before()->bci(), is_inst_sux, no_inst_sux));
781      }
782    }
783  } else if (rt == objectNull &&
784           (l->as_NewInstance() || l->as_NewArray() ||
785             (l->as_Local() && l->as_Local()->is_receiver()))) {
786    if (x->cond() == Instruction::eql) {
787      BlockBegin* sux = x->fsux();
788      set_canonical(new Goto(sux, x->state_before(), is_safepoint(x, sux)));
789    } else {
790      assert(x->cond() == Instruction::neq, "only other valid case");
791      BlockBegin* sux = x->tsux();
792      set_canonical(new Goto(sux, x->state_before(), is_safepoint(x, sux)));
793    }
794  }
795}
796
797
798void Canonicalizer::do_TableSwitch(TableSwitch* x) {
799  if (x->tag()->type()->is_constant()) {
800    int v = x->tag()->type()->as_IntConstant()->value();
801    BlockBegin* sux = x->default_sux();
802    if (v >= x->lo_key() && v <= x->hi_key()) {
803      sux = x->sux_at(v - x->lo_key());
804    }
805    set_canonical(new Goto(sux, x->state_before(), is_safepoint(x, sux)));
806  } else if (x->number_of_sux() == 1) {
807    // NOTE: Code permanently disabled for now since the switch statement's
808    //       tag expression may produce side-effects in which case it must
809    //       be executed.
810    return;
811    // simplify to Goto
812    set_canonical(new Goto(x->default_sux(), x->state_before(), x->is_safepoint()));
813  } else if (x->number_of_sux() == 2) {
814    // NOTE: Code permanently disabled for now since it produces two new nodes
815    //       (Constant & If) and the Canonicalizer cannot return them correctly
816    //       yet. For now we copied the corresponding code directly into the
817    //       GraphBuilder (i.e., we should never reach here).
818    return;
819    // simplify to If
820    assert(x->lo_key() == x->hi_key(), "keys must be the same");
821    Constant* key = new Constant(new IntConstant(x->lo_key()));
822    set_canonical(new If(x->tag(), If::eql, true, key, x->sux_at(0), x->default_sux(), x->state_before(), x->is_safepoint()));
823  }
824}
825
826
827void Canonicalizer::do_LookupSwitch(LookupSwitch* x) {
828  if (x->tag()->type()->is_constant()) {
829    int v = x->tag()->type()->as_IntConstant()->value();
830    BlockBegin* sux = x->default_sux();
831    for (int i = 0; i < x->length(); i++) {
832      if (v == x->key_at(i)) {
833        sux = x->sux_at(i);
834      }
835    }
836    set_canonical(new Goto(sux, x->state_before(), is_safepoint(x, sux)));
837  } else if (x->number_of_sux() == 1) {
838    // NOTE: Code permanently disabled for now since the switch statement's
839    //       tag expression may produce side-effects in which case it must
840    //       be executed.
841    return;
842    // simplify to Goto
843    set_canonical(new Goto(x->default_sux(), x->state_before(), x->is_safepoint()));
844  } else if (x->number_of_sux() == 2) {
845    // NOTE: Code permanently disabled for now since it produces two new nodes
846    //       (Constant & If) and the Canonicalizer cannot return them correctly
847    //       yet. For now we copied the corresponding code directly into the
848    //       GraphBuilder (i.e., we should never reach here).
849    return;
850    // simplify to If
851    assert(x->length() == 1, "length must be the same");
852    Constant* key = new Constant(new IntConstant(x->key_at(0)));
853    set_canonical(new If(x->tag(), If::eql, true, key, x->sux_at(0), x->default_sux(), x->state_before(), x->is_safepoint()));
854  }
855}
856
857
858void Canonicalizer::do_Return         (Return*          x) {}
859void Canonicalizer::do_Throw          (Throw*           x) {}
860void Canonicalizer::do_Base           (Base*            x) {}
861void Canonicalizer::do_OsrEntry       (OsrEntry*        x) {}
862void Canonicalizer::do_ExceptionObject(ExceptionObject* x) {}
863
864static bool match_index_and_scale(Instruction*  instr,
865                                  Instruction** index,
866                                  int*          log2_scale) {
867  // Skip conversion ops. This works only on 32bit because of the implicit l2i that the
868  // unsafe performs.
869#ifndef _LP64
870  Convert* convert = instr->as_Convert();
871  if (convert != NULL && convert->op() == Bytecodes::_i2l) {
872    assert(convert->value()->type() == intType, "invalid input type");
873    instr = convert->value();
874  }
875#endif
876
877  ShiftOp* shift = instr->as_ShiftOp();
878  if (shift != NULL) {
879    if (shift->op() == Bytecodes::_lshl) {
880      assert(shift->x()->type() == longType, "invalid input type");
881    } else {
882#ifndef _LP64
883      if (shift->op() == Bytecodes::_ishl) {
884        assert(shift->x()->type() == intType, "invalid input type");
885      } else {
886        return false;
887      }
888#else
889      return false;
890#endif
891    }
892
893
894    // Constant shift value?
895    Constant* con = shift->y()->as_Constant();
896    if (con == NULL) return false;
897    // Well-known type and value?
898    IntConstant* val = con->type()->as_IntConstant();
899    assert(val != NULL, "Should be an int constant");
900
901    *index = shift->x();
902    int tmp_scale = val->value();
903    if (tmp_scale >= 0 && tmp_scale < 4) {
904      *log2_scale = tmp_scale;
905      return true;
906    } else {
907      return false;
908    }
909  }
910
911  ArithmeticOp* arith = instr->as_ArithmeticOp();
912  if (arith != NULL) {
913    // See if either arg is a known constant
914    Constant* con = arith->x()->as_Constant();
915    if (con != NULL) {
916      *index = arith->y();
917    } else {
918      con = arith->y()->as_Constant();
919      if (con == NULL) return false;
920      *index = arith->x();
921    }
922    long const_value;
923    // Check for integer multiply
924    if (arith->op() == Bytecodes::_lmul) {
925      assert((*index)->type() == longType, "invalid input type");
926      LongConstant* val = con->type()->as_LongConstant();
927      assert(val != NULL, "expecting a long constant");
928      const_value = val->value();
929    } else {
930#ifndef _LP64
931      if (arith->op() == Bytecodes::_imul) {
932        assert((*index)->type() == intType, "invalid input type");
933        IntConstant* val = con->type()->as_IntConstant();
934        assert(val != NULL, "expecting an int constant");
935        const_value = val->value();
936      } else {
937        return false;
938      }
939#else
940      return false;
941#endif
942    }
943    switch (const_value) {
944    case 1: *log2_scale = 0; return true;
945    case 2: *log2_scale = 1; return true;
946    case 4: *log2_scale = 2; return true;
947    case 8: *log2_scale = 3; return true;
948    default:            return false;
949    }
950  }
951
952  // Unknown instruction sequence; don't touch it
953  return false;
954}
955
956
957static bool match(UnsafeRawOp* x,
958                  Instruction** base,
959                  Instruction** index,
960                  int*          log2_scale) {
961  ArithmeticOp* root = x->base()->as_ArithmeticOp();
962  if (root == NULL) return false;
963  // Limit ourselves to addition for now
964  if (root->op() != Bytecodes::_ladd) return false;
965
966  bool match_found = false;
967  // Try to find shift or scale op
968  if (match_index_and_scale(root->y(), index, log2_scale)) {
969    *base = root->x();
970    match_found = true;
971  } else if (match_index_and_scale(root->x(), index, log2_scale)) {
972    *base = root->y();
973    match_found = true;
974  } else if (NOT_LP64(root->y()->as_Convert() != NULL) LP64_ONLY(false)) {
975    // Skipping i2l works only on 32bit because of the implicit l2i that the unsafe performs.
976    // 64bit needs a real sign-extending conversion.
977    Convert* convert = root->y()->as_Convert();
978    if (convert->op() == Bytecodes::_i2l) {
979      assert(convert->value()->type() == intType, "should be an int");
980      // pick base and index, setting scale at 1
981      *base  = root->x();
982      *index = convert->value();
983      *log2_scale = 0;
984      match_found = true;
985    }
986  }
987  // The default solution
988  if (!match_found) {
989    *base = root->x();
990    *index = root->y();
991    *log2_scale = 0;
992  }
993
994  // If the value is pinned then it will be always be computed so
995  // there's no profit to reshaping the expression.
996  return !root->is_pinned();
997}
998
999
1000void Canonicalizer::do_UnsafeRawOp(UnsafeRawOp* x) {
1001  Instruction* base = NULL;
1002  Instruction* index = NULL;
1003  int          log2_scale;
1004
1005  if (match(x, &base, &index, &log2_scale)) {
1006    x->set_base(base);
1007    x->set_index(index);
1008    x->set_log2_scale(log2_scale);
1009    if (PrintUnsafeOptimization) {
1010      tty->print_cr("Canonicalizer: UnsafeRawOp id %d: base = id %d, index = id %d, log2_scale = %d",
1011                    x->id(), x->base()->id(), x->index()->id(), x->log2_scale());
1012    }
1013  }
1014}
1015
1016void Canonicalizer::do_RoundFP(RoundFP* x) {}
1017void Canonicalizer::do_UnsafeGetRaw(UnsafeGetRaw* x) { if (OptimizeUnsafes) do_UnsafeRawOp(x); }
1018void Canonicalizer::do_UnsafePutRaw(UnsafePutRaw* x) { if (OptimizeUnsafes) do_UnsafeRawOp(x); }
1019void Canonicalizer::do_UnsafeGetObject(UnsafeGetObject* x) {}
1020void Canonicalizer::do_UnsafePutObject(UnsafePutObject* x) {}
1021void Canonicalizer::do_UnsafeGetAndSetObject(UnsafeGetAndSetObject* x) {}
1022void Canonicalizer::do_ProfileCall(ProfileCall* x) {}
1023void Canonicalizer::do_ProfileReturnType(ProfileReturnType* x) {}
1024void Canonicalizer::do_ProfileInvoke(ProfileInvoke* x) {}
1025void Canonicalizer::do_RuntimeCall(RuntimeCall* x) {}
1026void Canonicalizer::do_RangeCheckPredicate(RangeCheckPredicate* x) {}
1027#ifdef ASSERT
1028void Canonicalizer::do_Assert(Assert* x) {}
1029#endif
1030void Canonicalizer::do_MemBar(MemBar* x) {}
1031