提交 064d51d6 编写于 作者: K kevinw

Merge

/* /*
* Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -103,11 +103,12 @@ public class ClassLoaderStats extends Tool { ...@@ -103,11 +103,12 @@ public class ClassLoaderStats extends Tool {
} }
SystemDictionary dict = VM.getVM().getSystemDictionary(); SystemDictionary dict = VM.getVM().getSystemDictionary();
dict.classesDo(new SystemDictionary.ClassAndLoaderVisitor() { dict.classesDo(new SystemDictionary.ClassVisitor() {
public void visit(Klass k, Oop loader) { public void visit(Klass k) {
if (! (k instanceof InstanceKlass)) { if (! (k instanceof InstanceKlass)) {
return; return;
} }
Oop loader = ((InstanceKlass) k).getClassLoader();
LoaderData ld = (loader != null) ? (LoaderData)loaderMap.get(loader) LoaderData ld = (loader != null) ? (LoaderData)loaderMap.get(loader)
: bootstrapLoaderData; : bootstrapLoaderData;
if (ld != null) { if (ld != null) {
......
/* /*
* Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2004, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -804,6 +804,16 @@ delete tmp; ...@@ -804,6 +804,16 @@ delete tmp;
// VM type to SA class map // VM type to SA class map
var vmType2Class = new Object(); var vmType2Class = new Object();
// C2 only classes
try{
vmType2Class["ExceptionBlob"] = sapkg.code.ExceptionBlob;
vmType2Class["UncommonTrapBlob"] = sapkg.code.UncommonTrapBlob;
} catch(e) {
// Ignore exception. C2 specific objects might be not
// available in client VM
}
// This is *not* exhaustive. Add more if needed. // This is *not* exhaustive. Add more if needed.
// code blobs // code blobs
vmType2Class["BufferBlob"] = sapkg.code.BufferBlob; vmType2Class["BufferBlob"] = sapkg.code.BufferBlob;
...@@ -812,10 +822,8 @@ vmType2Class["RuntimeStub"] = sapkg.code.RuntimeStub; ...@@ -812,10 +822,8 @@ vmType2Class["RuntimeStub"] = sapkg.code.RuntimeStub;
vmType2Class["SafepointBlob"] = sapkg.code.SafepointBlob; vmType2Class["SafepointBlob"] = sapkg.code.SafepointBlob;
vmType2Class["C2IAdapter"] = sapkg.code.C2IAdapter; vmType2Class["C2IAdapter"] = sapkg.code.C2IAdapter;
vmType2Class["DeoptimizationBlob"] = sapkg.code.DeoptimizationBlob; vmType2Class["DeoptimizationBlob"] = sapkg.code.DeoptimizationBlob;
vmType2Class["ExceptionBlob"] = sapkg.code.ExceptionBlob;
vmType2Class["I2CAdapter"] = sapkg.code.I2CAdapter; vmType2Class["I2CAdapter"] = sapkg.code.I2CAdapter;
vmType2Class["OSRAdapter"] = sapkg.code.OSRAdapter; vmType2Class["OSRAdapter"] = sapkg.code.OSRAdapter;
vmType2Class["UncommonTrapBlob"] = sapkg.code.UncommonTrapBlob;
vmType2Class["PCDesc"] = sapkg.code.PCDesc; vmType2Class["PCDesc"] = sapkg.code.PCDesc;
// interpreter // interpreter
......
/* /*
* Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -389,18 +389,17 @@ void OopMapSet::all_do(const frame *fr, const RegisterMap *reg_map, ...@@ -389,18 +389,17 @@ void OopMapSet::all_do(const frame *fr, const RegisterMap *reg_map,
omv = oms.current(); omv = oms.current();
oop* loc = fr->oopmapreg_to_location(omv.reg(),reg_map); oop* loc = fr->oopmapreg_to_location(omv.reg(),reg_map);
if ( loc != NULL ) { if ( loc != NULL ) {
oop *base_loc = fr->oopmapreg_to_location(omv.content_reg(), reg_map);
oop *derived_loc = loc; oop *derived_loc = loc;
oop val = *base_loc; oop *base_loc = fr->oopmapreg_to_location(omv.content_reg(), reg_map);
if (val == (oop)NULL || Universe::is_narrow_oop_base(val)) {
// Ignore NULL oops and decoded NULL narrow oops which // Ignore NULL oops and decoded NULL narrow oops which
// equal to Universe::narrow_oop_base when a narrow oop // equal to Universe::narrow_oop_base when a narrow oop
// implicit null check is used in compiled code. // implicit null check is used in compiled code.
// The narrow_oop_base could be NULL or be the address // The narrow_oop_base could be NULL or be the address
// of the page below heap depending on compressed oops mode. // of the page below heap depending on compressed oops mode.
} else if (base_loc != NULL && *base_loc != (oop)NULL && !Universe::is_narrow_oop_base(*base_loc)) {
derived_oop_fn(base_loc, derived_loc); derived_oop_fn(base_loc, derived_loc);
} }
}
oms.next(); oms.next();
} while (!oms.is_done()); } while (!oms.is_done());
} }
......
/* /*
* Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -1773,6 +1773,12 @@ void PhaseIdealLoop::replace_parallel_iv(IdealLoopTree *loop) { ...@@ -1773,6 +1773,12 @@ void PhaseIdealLoop::replace_parallel_iv(IdealLoopTree *loop) {
Node *init2 = phi2->in( LoopNode::EntryControl ); Node *init2 = phi2->in( LoopNode::EntryControl );
int stride_con2 = incr2->in(2)->get_int(); int stride_con2 = incr2->in(2)->get_int();
// The ratio of the two strides cannot be represented as an int
// if stride_con2 is min_int and stride_con is -1.
if (stride_con2 == min_jint && stride_con == -1) {
continue;
}
// The general case here gets a little tricky. We want to find the // The general case here gets a little tricky. We want to find the
// GCD of all possible parallel IV's and make a new IV using this // GCD of all possible parallel IV's and make a new IV using this
// GCD for the loop. Then all possible IVs are simple multiples of // GCD for the loop. Then all possible IVs are simple multiples of
......
/* /*
* Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -257,19 +257,29 @@ public: ...@@ -257,19 +257,29 @@ public:
Node *incr() const { Node *tmp = cmp_node(); return (tmp && tmp->req()==3) ? tmp->in(1) : NULL; } Node *incr() const { Node *tmp = cmp_node(); return (tmp && tmp->req()==3) ? tmp->in(1) : NULL; }
Node *limit() const { Node *tmp = cmp_node(); return (tmp && tmp->req()==3) ? tmp->in(2) : NULL; } Node *limit() const { Node *tmp = cmp_node(); return (tmp && tmp->req()==3) ? tmp->in(2) : NULL; }
Node *stride() const { Node *tmp = incr (); return (tmp && tmp->req()==3) ? tmp->in(2) : NULL; } Node *stride() const { Node *tmp = incr (); return (tmp && tmp->req()==3) ? tmp->in(2) : NULL; }
Node *phi() const { Node *tmp = incr (); return (tmp && tmp->req()==3) ? tmp->in(1) : NULL; }
Node *init_trip() const { Node *tmp = phi (); return (tmp && tmp->req()==3) ? tmp->in(1) : NULL; } Node *init_trip() const { Node *tmp = phi (); return (tmp && tmp->req()==3) ? tmp->in(1) : NULL; }
int stride_con() const; int stride_con() const;
bool stride_is_con() const { Node *tmp = stride (); return (tmp != NULL && tmp->is_Con()); } bool stride_is_con() const { Node *tmp = stride (); return (tmp != NULL && tmp->is_Con()); }
BoolTest::mask test_trip() const { return in(TestValue)->as_Bool()->_test._test; } BoolTest::mask test_trip() const { return in(TestValue)->as_Bool()->_test._test; }
PhiNode *phi() const {
Node *tmp = incr();
if (tmp && tmp->req() == 3) {
Node* phi = tmp->in(1);
if (phi->is_Phi()) {
return phi->as_Phi();
}
}
return NULL;
}
CountedLoopNode *loopnode() const { CountedLoopNode *loopnode() const {
// The CountedLoopNode that goes with this CountedLoopEndNode may // The CountedLoopNode that goes with this CountedLoopEndNode may
// have been optimized out by the IGVN so be cautious with the // have been optimized out by the IGVN so be cautious with the
// pattern matching on the graph // pattern matching on the graph
if (phi() == NULL) { PhiNode* iv_phi = phi();
if (iv_phi == NULL) {
return NULL; return NULL;
} }
Node *ln = phi()->in(0); Node *ln = iv_phi->in(0);
if (ln->is_CountedLoop() && ln->as_CountedLoop()->loopexit() == this) { if (ln->is_CountedLoop() && ln->as_CountedLoop()->loopexit() == this) {
return (CountedLoopNode*)ln; return (CountedLoopNode*)ln;
} }
......
/* /*
* Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -1416,6 +1416,27 @@ void PhaseIterGVN::add_users_to_worklist0( Node *n ) { ...@@ -1416,6 +1416,27 @@ void PhaseIterGVN::add_users_to_worklist0( Node *n ) {
} }
} }
// Return counted loop Phi if as a counted loop exit condition, cmp
// compares the the induction variable with n
static PhiNode* countedloop_phi_from_cmp(CmpINode* cmp, Node* n) {
for (DUIterator_Fast imax, i = cmp->fast_outs(imax); i < imax; i++) {
Node* bol = cmp->fast_out(i);
for (DUIterator_Fast i2max, i2 = bol->fast_outs(i2max); i2 < i2max; i2++) {
Node* iff = bol->fast_out(i2);
if (iff->is_CountedLoopEnd()) {
CountedLoopEndNode* cle = iff->as_CountedLoopEnd();
if (cle->limit() == n) {
PhiNode* phi = cle->phi();
if (phi != NULL) {
return phi;
}
}
}
}
}
return NULL;
}
void PhaseIterGVN::add_users_to_worklist( Node *n ) { void PhaseIterGVN::add_users_to_worklist( Node *n ) {
add_users_to_worklist0(n); add_users_to_worklist0(n);
...@@ -1445,18 +1466,7 @@ void PhaseIterGVN::add_users_to_worklist( Node *n ) { ...@@ -1445,18 +1466,7 @@ void PhaseIterGVN::add_users_to_worklist( Node *n ) {
Node* bol = use->raw_out(0); Node* bol = use->raw_out(0);
if (bol->outcnt() > 0) { if (bol->outcnt() > 0) {
Node* iff = bol->raw_out(0); Node* iff = bol->raw_out(0);
if (use_op == Op_CmpI && if (iff->outcnt() == 2) {
iff->is_CountedLoopEnd()) {
CountedLoopEndNode* cle = iff->as_CountedLoopEnd();
if (cle->limit() == n && cle->phi() != NULL) {
// If an opaque node feeds into the limit condition of a
// CountedLoop, we need to process the Phi node for the
// induction variable when the opaque node is removed:
// the range of values taken by the Phi is now known and
// so its type is also known.
_worklist.push(cle->phi());
}
} else if (iff->outcnt() == 2) {
// Look for the 'is_x2logic' pattern: "x ? : 0 : 1" and put the // Look for the 'is_x2logic' pattern: "x ? : 0 : 1" and put the
// phi merging either 0 or 1 onto the worklist // phi merging either 0 or 1 onto the worklist
Node* ifproj0 = iff->raw_out(0); Node* ifproj0 = iff->raw_out(0);
...@@ -1471,6 +1481,15 @@ void PhaseIterGVN::add_users_to_worklist( Node *n ) { ...@@ -1471,6 +1481,15 @@ void PhaseIterGVN::add_users_to_worklist( Node *n ) {
} }
} }
if (use_op == Op_CmpI) { if (use_op == Op_CmpI) {
Node* phi = countedloop_phi_from_cmp((CmpINode*)use, n);
if (phi != NULL) {
// If an opaque node feeds into the limit condition of a
// CountedLoop, we need to process the Phi node for the
// induction variable when the opaque node is removed:
// the range of values taken by the Phi is now known and
// so its type is also known.
_worklist.push(phi);
}
Node* in1 = use->in(1); Node* in1 = use->in(1);
for (uint i = 0; i < in1->outcnt(); i++) { for (uint i = 0; i < in1->outcnt(); i++) {
if (in1->raw_out(i)->Opcode() == Op_CastII) { if (in1->raw_out(i)->Opcode() == Op_CastII) {
...@@ -1659,6 +1678,15 @@ void PhaseCCP::analyze() { ...@@ -1659,6 +1678,15 @@ void PhaseCCP::analyze() {
} }
} }
} }
// If n is used in a counted loop exit condition then the type
// of the counted loop's Phi depends on the type of n. See
// PhiNode::Value().
if (m_op == Op_CmpI) {
PhiNode* phi = countedloop_phi_from_cmp((CmpINode*)m, n);
if (phi != NULL) {
worklist.push(phi);
}
}
} }
} }
} }
......
/* /*
* Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -417,7 +417,7 @@ public: ...@@ -417,7 +417,7 @@ public:
// Phase for iteratively performing local, pessimistic GVN-style optimizations. // Phase for iteratively performing local, pessimistic GVN-style optimizations.
// and ideal transformations on the graph. // and ideal transformations on the graph.
class PhaseIterGVN : public PhaseGVN { class PhaseIterGVN : public PhaseGVN {
private: private:
bool _delay_transform; // When true simply register the node when calling transform bool _delay_transform; // When true simply register the node when calling transform
// instead of actually optimizing it // instead of actually optimizing it
......
...@@ -4156,6 +4156,11 @@ jint Arguments::apply_ergo() { ...@@ -4156,6 +4156,11 @@ jint Arguments::apply_ergo() {
warning("Setting CompressedClassSpaceSize has no effect when compressed class pointers are not used"); warning("Setting CompressedClassSpaceSize has no effect when compressed class pointers are not used");
} }
if (UseOnStackReplacement && !UseLoopCounter) {
warning("On-stack-replacement requires loop counters; enabling loop counters");
FLAG_SET_DEFAULT(UseLoopCounter, true);
}
#ifndef PRODUCT #ifndef PRODUCT
if (CompileTheWorld) { if (CompileTheWorld) {
// Force NmethodSweeper to sweep whole CodeCache each time. // Force NmethodSweeper to sweep whole CodeCache each time.
......
/*
* Copyright 2016 Google, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8166742
* @summary C2 IV elimination throws FPE
* @run main/othervm -XX:-TieredCompilation -XX:-BackgroundCompilation TestImpossibleIV
* @author Chuck Rasbold rasbold@google.com
*/
/*
* Use -XX:-TieredCompilation to get C2 only.
* Use -XX:-BackgroundCompilation to wait for compilation before test exit.
*/
public class TestImpossibleIV {
static private void testMethod() {
int sum = 0;
// A unit count-down loop which has an induction variable with
// MIN_VALUE stride.
for (int i = 100000; i >= 0; i--) {
sum += Integer.MIN_VALUE;
}
}
public static void main(String[] args) {
testMethod();
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册