Index: osprey/be/opt/opt_ssa.h
===================================================================
--- osprey/be/opt/opt_ssa.h	(revision 3489)
+++ osprey/be/opt/opt_ssa.h	(working copy)
@@ -107,6 +107,22 @@
 #ifdef KEY
   void      Print_ssa_ver_for_wn(WN* wn, INT indent);
 #endif
+  // Replace all references of opnd with res in wn
+  // NOTE: the wn should be an expression (rhs of a stmt)
+  void      Replace_Ref_in_WN(VER_ID opnd, VER_ID res, WN *wn);
+  // Replace all references of opnd with res in bb
+  void      Replace_Ref(VER_ID opnd, VER_ID res, BB_NODE *bb);
+  // In some cases, s2 int the following statements will be changed by SSA::Dead_store_elim to
+  // v_2 <- chi (v_1) *s1 (not live)
+  // v_3 <- chi (v_2) *s2
+  // ---> after DSE
+  // v_2 <- chi (v_1) *s1 (not live)
+  // v_3 <- chi (v_1) *s2
+  // However, later on we need to resurrect s1 in Create_CODEMAP function.
+  // This function is to fix/undo what DSE did so that we do not have two live ranges 
+  // intersecting with each other
+  void      Update_Refs_for_chi(CHI_NODE *chi);
+
 public:
             SSA(MEM_POOL *gpool,
 		MEM_POOL *lpool){mem_pool=gpool; loc_pool=lpool; }
Index: osprey/be/opt/opt_sym.h
===================================================================
--- osprey/be/opt/opt_sym.h	(revision 3489)
+++ osprey/be/opt/opt_sym.h	(working copy)
@@ -726,6 +726,7 @@
   void	   Reset_Real_use(void)	      { flags &= ~VS_REAL_USE; }
   BOOL	   Zero_vers(void)	      { return flags & VS_ZERO_VERS; }
   void	   Set_Zero_vers(void)	      { flags |= VS_ZERO_VERS; }
+  void     Reset_Zero_vers(void)      { flags &= ~VS_ZERO_VERS; }
 
   void     Print(FILE *fp, VER_ID ver_id) const;
   void     Print_use(WN *wn, FILE *fp=stderr) const;
Index: osprey/be/opt/opt_ssa.cxx
===================================================================
--- osprey/be/opt/opt_ssa.cxx	(revision 3489)
+++ osprey/be/opt/opt_ssa.cxx	(working copy)
@@ -1586,6 +1586,193 @@
   }
 }
 
+void
+SSA::Replace_Ref_in_WN(VER_ID opnd, VER_ID res, WN *wn)
+{
+    OPCODE opc = WN_opcode(wn);
+
+    if (OPCODE_has_aux(opc)) {
+        if (WN_has_ver(wn)) {
+            VER_ID du = WN_ver(wn);
+            if (du == opnd) {
+                WN_set_ver(wn, res);
+            }
+        }
+    }
+   
+    if (WN_has_mu(wn, Cfg()->Rgn_level())) {
+        OCC_TAB_ENTRY *occ = Opt_stab()->Get_occ(wn);
+        if (occ->Is_stmt()) {
+            MU_LIST *mu_list = Opt_stab()->Get_stmt_mu_list(wn);
+            if (mu_list) {
+                MU_LIST_ITER mu_iter;
+                MU_NODE *mu_node;
+
+                FOR_ALL_NODE (mu_node, mu_iter, Init(mu_list)) {
+                    VER_ID du = mu_node->Opnd();
+
+                    if (du == opnd) {
+                        Opt_stab()->Ver_stab_entry(res)->Set_Any_use();
+                        mu_node->Set_opnd(res);
+                    }
+                }
+            }
+        } else {
+            MU_NODE *mu_node = occ->Mem_mu_node();
+            VER_ID  du = mu_node->Opnd();
+            if (du == opnd) {
+                Opt_stab()->Ver_stab_entry(res)->Set_Any_use();
+                mu_node->Set_opnd(res);
+            }
+        }
+    }
+
+    for (INT32 i = 0; i < WN_kid_count(wn); i++) {
+        Replace_Ref_in_WN(opnd, res, WN_kid(wn, i));    
+    }
+}
+
+void
+SSA::Replace_Ref(VER_ID opnd, VER_ID res, BB_NODE *bb)
+{
+    PHI_LIST_ITER phi_iter;
+    PHI_NODE *phi;
+    STMT_ITER stmt_iter;
+    BB_NODE *dom_bb;
+    BB_LIST_ITER dom_bb_iter;
+    WN *wn;
+
+    FOR_ALL_ELEM (phi, phi_iter, Init(bb->Phi_list())) {
+        for (mINT32 index = 0; index < phi->Size(); index++ ){
+            VER_ID phi_opnd = phi->Opnd(index);
+
+            if (phi_opnd == opnd) {
+                Opt_stab()->Ver_stab_entry(res)->Set_Any_use();
+                phi->Set_opnd(index, res);
+            }
+        }
+    }
+
+    FOR_ALL_ELEM (wn, stmt_iter, Init(bb->Firststmt(), bb->Laststmt())) {
+        OPCODE   opc = WN_opcode(wn);
+        OPERATOR opr = OPCODE_operator(opc);
+            
+        if (opr == OPR_COMPGOTO) {
+            Replace_Ref_in_WN(opnd, res, WN_kid0(wn));
+        } else if (!OPCODE_is_black_box(opc)) {
+            for (INT32 i = 0; i < WN_kid_count(wn); i++) {
+                Replace_Ref_in_WN(opnd, res, WN_kid(wn,i));
+            }
+        }
+
+        if (WN_has_mu(wn, Cfg()->Rgn_level())) {
+            MU_LIST *mu_list = Opt_stab()->Get_stmt_mu_list(wn);
+            if (mu_list) {
+                MU_LIST_ITER mu_iter;
+                MU_NODE *mu_node;
+                
+                FOR_ALL_NODE (mu_node, mu_iter, Init(mu_list)) {
+                    VER_ID du = mu_node->Opnd();
+                    if (du == opnd) {
+                        Opt_stab()->Ver_stab_entry(res)->Set_Any_use();
+                        mu_node->Set_opnd(res);
+                    }
+                }
+            }
+        }
+
+        if (WN_has_chi(wn, Cfg()->Rgn_level())) {
+            CHI_LIST *chi_list = Opt_stab()->Get_generic_chi_list(wn);
+            if (chi_list) {
+                CHI_LIST_ITER chi_iter;
+                CHI_NODE *chi_node;
+
+                FOR_ALL_NODE (chi_node, chi_iter, Init(chi_list)) {
+                    VER_ID du = chi_node->Opnd();
+                    if (du == opnd) {
+                        Opt_stab()->Ver_stab_entry(res)->Set_Any_use();
+                        chi_node->Set_opnd(res);
+                    }
+                }
+            }
+        }
+    }
+
+    FOR_ALL_ELEM (dom_bb, dom_bb_iter, Init(bb->Dom_bbs())) {
+        Replace_Ref(opnd, res, dom_bb);
+    }
+}
+
+void
+SSA::Update_Refs_for_chi(CHI_NODE *chi)
+{
+    VER_ID opnd, res;
+    BB_NODE *def_bb, *dom_bb;
+    BB_LIST_ITER dom_bb_iter;
+    STMTREP *sr; 
+
+    STMT_ITER stmt_iter;
+    WN *wn;
+
+    opnd = chi->Opnd();
+    res  = chi->Result();
+    def_bb = Opt_stab()->Ver_stab_entry(res)->Bb();
+    sr = Find_stmt_containing_chi(chi, def_bb);
+
+    // do the renaming first by
+    // 1. rename all the occurrences of chi->Opnd() after its def statment in current BB
+    // 2. rename all the occurrences following the DOM tree
+    FOR_ALL_ELEM (wn, stmt_iter, Init(sr->Wn(), def_bb->Laststmt())) {
+        OPCODE   opc = WN_opcode(wn);
+        OPERATOR opr = OPCODE_operator(opc);
+
+        if (opr == OPR_COMPGOTO) {
+            Replace_Ref_in_WN(opnd, res, WN_kid0(wn));
+        } else if (!OPCODE_is_black_box(opc)) {
+            for (INT32 i = 0; i < WN_kid_count(wn); i++) {
+                Replace_Ref_in_WN(opnd, res, WN_kid(wn,i));
+            }
+        }
+
+        if (WN_has_mu(wn, Cfg()->Rgn_level())) {
+            MU_LIST *mu_list = Opt_stab()->Get_stmt_mu_list(wn);
+            if (mu_list) {
+                MU_LIST_ITER mu_iter;
+                MU_NODE *mu_node;
+
+                FOR_ALL_NODE (mu_node, mu_iter, Init(mu_list)) {
+                    VER_ID du = mu_node->Opnd();
+                    if (du == opnd) {
+                        Opt_stab()->Ver_stab_entry(res)->Set_Any_use();
+                        mu_node->Set_opnd(res);
+                    }
+                }
+            }
+        }
+
+        if (WN_has_chi(wn, Cfg()->Rgn_level())) {
+            CHI_LIST *chi_list = Opt_stab()->Get_generic_chi_list(wn);
+            if (chi_list) {
+                CHI_LIST_ITER chi_iter;
+                CHI_NODE *chi_node;
+
+                FOR_ALL_NODE (chi_node, chi_iter, Init(chi_list)) {
+                    VER_ID du = chi_node->Opnd();
+                    if (du == opnd) {
+                        Opt_stab()->Ver_stab_entry(res)->Set_Any_use();
+                        chi_node->Set_opnd(res);
+                    }
+                }
+            }
+        }
+    }
+
+    FOR_ALL_ELEM (dom_bb, dom_bb_iter, Init(def_bb->Dom_bbs())) {
+        Replace_Ref(opnd, res, dom_bb);
+    }
+}
+
+
 // =======================================================================
 // Resurrect_chi - A phi node that was dead has to be resurrected
 // because ILOAD to LDID folding introduces a real use of the result of the
@@ -1596,17 +1783,21 @@
 {
   VER_ID du;
   CODEREP *cr;
+  VER_STAB_ENTRY *res;
 
   du = chi->Result();
   STMTREP *sr = Find_stmt_containing_chi(chi, _opt_stab->Ver_stab_entry(du)->Bb());
-  if (_opt_stab->Du_zero_vers(du) ) {
-    cr = Get_zero_version_CR(chi->Aux_id(), _opt_stab, du);
-    sr->Set_has_zver();
-  } else {
-    cr = Du2cr(_htable, _opt_stab, du, sr);
-    cr->Set_flag(CF_DEF_BY_CHI);
-    cr->Set_defchi(chi);
-  }
+
+  Update_Refs_for_chi(chi);
+
+  res = _opt_stab->Ver_stab_entry(du);
+
+  res->Reset_Zero_vers();
+
+  cr = Du2cr(_htable, _opt_stab, du, sr);
+  cr->Set_flag(CF_DEF_BY_CHI);
+  cr->Set_defchi(chi);
+
   chi->Set_RESULT(cr);
   chi->Set_live(TRUE);
   chi->Set_dse_dead(FALSE);
