Mercurial > hg > graal-jvmci-8
diff src/share/vm/adlc/formssel.cpp @ 3851:95134e034042
7063629: use cbcond in C2 generated code on T4
Summary: Use new short branch instruction in C2 generated code.
Reviewed-by: never
author | kvn |
---|---|
date | Thu, 11 Aug 2011 12:08:11 -0700 |
parents | f1c12354c3f7 |
children | 11211f7cb5a0 |
line wrap: on
line diff
--- a/src/share/vm/adlc/formssel.cpp Wed Aug 10 14:06:57 2011 -0700 +++ b/src/share/vm/adlc/formssel.cpp Thu Aug 11 12:08:11 2011 -0700 @@ -1181,6 +1181,34 @@ strcmp(reduce_result(), short_branch->reduce_result()) == 0 && _matrule->equivalent(AD.globalNames(), short_branch->_matrule)) { // The instructions are equivalent. + + // Now verify that both instructions have the same parameters and + // the same effects. Both branch forms should have the same inputs + // and resulting projections to correctly replace a long branch node + // with corresponding short branch node during code generation. + + bool different = false; + if (short_branch->_components.count() != _components.count()) { + different = true; + } else if (_components.count() > 0) { + short_branch->_components.reset(); + _components.reset(); + Component *comp; + while ((comp = _components.iter()) != NULL) { + Component *short_comp = short_branch->_components.iter(); + if (short_comp == NULL || + short_comp->_type != comp->_type || + short_comp->_usedef != comp->_usedef) { + different = true; + break; + } + } + if (short_branch->_components.iter() != NULL) + different = true; + } + if (different) { + globalAD->syntax_err(short_branch->_linenum, "Instruction %s and its short form %s have different parameters\n", _ident, short_branch->_ident); + } if (AD._short_branch_debug) { fprintf(stderr, "Instruction %s has short form %s\n", _ident, short_branch->_ident); }