Mercurial > hg > truffle
diff src/share/vm/opto/ifg.cpp @ 1199:0e14bd797dad
6792161: assert("No dead instructions after post-alloc")
Reviewed-by: kvn
author | never |
---|---|
date | Thu, 28 Jan 2010 20:41:37 -0800 |
parents | 7bb995fbd3c0 |
children | c028504fdaa6 |
line wrap: on
line diff
--- a/src/share/vm/opto/ifg.cpp Thu Jan 28 16:28:28 2010 -0800 +++ b/src/share/vm/opto/ifg.cpp Thu Jan 28 20:41:37 2010 -0800 @@ -1,5 +1,5 @@ /* - * Copyright 1998-2009 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1998-2010 Sun Microsystems, 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 @@ -736,7 +736,28 @@ // the flags and assumes it's dead. This keeps the (useless) // flag-setting behavior alive while also keeping the (useful) // memory update effect. - for( uint k = ((n->Opcode() == Op_SCMemProj) ? 0:1); k < n->req(); k++ ) { + uint begin = 1; + uint end = n->req(); + if (n->Opcode() == Op_SCMemProj) { + begin = 0; + } else if (n->is_Mach()) { + switch (n->as_Mach()->ideal_Opcode()) { + case Op_MemBarAcquire: + case Op_MemBarVolatile: + if (n->len() >= MemBarNode::Precedent + 1 && + n->in(MemBarNode::Precedent) != NULL && + n->in(MemBarNode::Precedent)->outcnt() == 1) { + // This membar node is the single user of it's input + // so the input won't be considered live and this node + // would get deleted during copy elimination so force + // it to be live. + end = MemBarNode::Precedent + 1; + } + break; + } + } + + for( uint k = begin; k < end; k++ ) { Node *def = n->in(k); uint x = n2lidx(def); if( !x ) continue;