6680594: Load + Load isn't canonicalized leading to missed GVN opportunities
Reviewed-by: kvn, jrose
--- a/hotspot/src/share/vm/opto/addnode.cpp Wed Mar 26 12:25:06 2008 -0700
+++ b/hotspot/src/share/vm/opto/addnode.cpp Fri Mar 28 09:00:39 2008 -0700
@@ -70,9 +70,14 @@
// Convert "Load+x" into "x+Load".
// Now check for loads
- if( in2->is_Load() ) return false;
- // Left is a Load and Right is not; move it right.
- if( in1->is_Load() ) {
+ if (in2->is_Load()) {
+ if (!in1->is_Load()) {
+ // already x+Load to return
+ return false;
+ }
+ // both are loads, so fall through to sort inputs by idx
+ } else if( in1->is_Load() ) {
+ // Left is a Load and Right is not; move it right.
add->swap_edges(1, 2);
return true;
}