src/share/vm/opto/divnode.cpp

changeset 3845
121e5708ae96
parent 2314
f95d63e2154a
child 4115
e626685e9f6c
     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  

mercurial