1.1 --- a/src/share/vm/opto/divnode.cpp Tue Jun 12 10:02:36 2012 +0200 1.2 +++ b/src/share/vm/opto/divnode.cpp Tue Jun 12 09:47:23 2012 -0700 1.3 @@ -284,9 +284,14 @@ 1.4 1.5 const int N = 64; 1.6 1.7 + // Dummy node to keep intermediate nodes alive during construction 1.8 + Node* hook = new (phase->C, 4) Node(4); 1.9 + 1.10 // u0 = u & 0xFFFFFFFF; u1 = u >> 32; 1.11 Node* u0 = phase->transform(new (phase->C, 3) AndLNode(dividend, phase->longcon(0xFFFFFFFF))); 1.12 Node* u1 = phase->transform(new (phase->C, 3) RShiftLNode(dividend, phase->intcon(N / 2))); 1.13 + hook->init_req(0, u0); 1.14 + hook->init_req(1, u1); 1.15 1.16 // v0 = v & 0xFFFFFFFF; v1 = v >> 32; 1.17 Node* v0 = phase->longcon(magic_const & 0xFFFFFFFF); 1.18 @@ -299,19 +304,14 @@ 1.19 Node* u1v0 = phase->transform(new (phase->C, 3) MulLNode(u1, v0)); 1.20 Node* temp = phase->transform(new (phase->C, 3) URShiftLNode(w0, phase->intcon(N / 2))); 1.21 Node* t = phase->transform(new (phase->C, 3) AddLNode(u1v0, temp)); 1.22 + hook->init_req(2, t); 1.23 1.24 // w1 = t & 0xFFFFFFFF; 1.25 - Node* w1 = new (phase->C, 3) AndLNode(t, phase->longcon(0xFFFFFFFF)); 1.26 + Node* w1 = phase->transform(new (phase->C, 3) AndLNode(t, phase->longcon(0xFFFFFFFF))); 1.27 + hook->init_req(3, w1); 1.28 1.29 // w2 = t >> 32; 1.30 - Node* w2 = new (phase->C, 3) RShiftLNode(t, phase->intcon(N / 2)); 1.31 - 1.32 - // 6732154: Construct both w1 and w2 before transforming, so t 1.33 - // doesn't go dead prematurely. 1.34 - // 6837011: We need to transform w2 before w1 because the 1.35 - // transformation of w1 could return t. 1.36 - w2 = phase->transform(w2); 1.37 - w1 = phase->transform(w1); 1.38 + Node* w2 = phase->transform(new (phase->C, 3) RShiftLNode(t, phase->intcon(N / 2))); 1.39 1.40 // w1 = u0*v1 + w1; 1.41 Node* u0v1 = phase->transform(new (phase->C, 3) MulLNode(u0, v1)); 1.42 @@ -322,6 +322,16 @@ 1.43 Node* temp1 = phase->transform(new (phase->C, 3) AddLNode(u1v1, w2)); 1.44 Node* temp2 = phase->transform(new (phase->C, 3) RShiftLNode(w1, phase->intcon(N / 2))); 1.45 1.46 + // Remove the bogus extra edges used to keep things alive 1.47 + PhaseIterGVN* igvn = phase->is_IterGVN(); 1.48 + if (igvn != NULL) { 1.49 + igvn->remove_dead_node(hook); 1.50 + } else { 1.51 + for (int i = 0; i < 4; i++) { 1.52 + hook->set_req(i, NULL); 1.53 + } 1.54 + } 1.55 + 1.56 return new (phase->C, 3) AddLNode(temp1, temp2); 1.57 } 1.58