Fix 403.gcc. Finally got the check for two-address-ness correct.
authorOwen Anderson <resistor@mac.com>
Thu, 10 Jul 2008 01:53:01 +0000 (01:53 +0000)
committerOwen Anderson <resistor@mac.com>
Thu, 10 Jul 2008 01:53:01 +0000 (01:53 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53389 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/RegAllocLocal.cpp

index 3e1038daa9c9487af7f88c19e6270408db5d69bc..c3d4442a27bdcd2d1b457f082773fdd633ac6c61 100644 (file)
@@ -589,20 +589,24 @@ void RALocal::ComputeLocalLiveness(MachineBasicBlock& MBB) {
         std::map<unsigned, std::pair<MachineInstr*, unsigned> >::iterator
           last = LastUseDef.find(MO.getReg());
         if (last != LastUseDef.end()) {
-          
-          // If this is a two address instr, then we don't mark the def
-          // as killing the use.
-          if (last->second.first == I &&
-              I->getDesc().getOperandConstraint(last->second.second,
-                                                TOI::TIED_TO) == (signed)i) {
-            LastUseDef[MO.getReg()] = std::make_pair(I, i);
-            continue;
+          // Check if this is a two address instruction.  If so, then
+          // the def does not kill the use.
+          if (last->second.first == I) {
+            bool isTwoAddr = false;
+            for (unsigned j = i+1, je = I->getDesc().getNumOperands();
+                j < je; ++j) {
+              const MachineOperand &MO2 = I->getOperand(j);
+              if (MO2.isRegister() && MO2.isUse() &&
+                  MO2.getReg() == MO.getReg() &&
+                  I->getDesc().getOperandConstraint(j, TOI::TIED_TO) == (int)i)
+                isTwoAddr = true;
+            }
+
+            if (isTwoAddr) continue;
           }
-            
           
           MachineOperand& lastUD =
                       last->second.first->getOperand(last->second.second);
-          
           if (lastUD.isDef())
             lastUD.setIsDead(true);
           else if (lastUD.isUse())