Currently we cannot handle two-address instructions of the form:
authorAlkis Evlogimenos <alkis@evlogimenos.com>
Mon, 5 Jan 2004 02:25:45 +0000 (02:25 +0000)
committerAlkis Evlogimenos <alkis@evlogimenos.com>
Mon, 5 Jan 2004 02:25:45 +0000 (02:25 +0000)
A = B op C where A == C, but this cannot really occur in practice
because of SSA form. Add an assert to check that just to be safe.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10682 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/TwoAddressInstructionPass.cpp

index 41b3cbd8ed191853828e910ff0cbfc12b333ee9f..b758e7fd224e96fb9ad11eb1ebd3d14447a55f75 100644 (file)
@@ -123,6 +123,15 @@ bool TwoAddressInstructionPass::runOnMachineFunction(MachineFunction &fn) {
             bool regAisPhysical = regA < MRegisterInfo::FirstVirtualRegister;
             bool regBisPhysical = regB < MRegisterInfo::FirstVirtualRegister;
 
+            // first make sure we do not have a use of a in the
+            // instruction (a = b + a for example) because our
+            // transofrmation will not work. This should never occur
+            // because of SSA.
+            for (unsigned i = 1; i < mi->getNumOperands(); ++i) {
+                assert(!mi->getOperand(i).isRegister() ||
+                       mi->getOperand(i).getAllocatedRegNum() != regA);
+            }
+
             const TargetRegisterClass* rc = regAisPhysical ?
                 mri_->getRegClass(regA) :
                 mf_->getSSARegMap()->getRegClass(regA);