It's not safe to rematerialize MOV32r0 etc. by simply cloning the original
authorEvan Cheng <evan.cheng@apple.com>
Mon, 10 Sep 2007 20:48:53 +0000 (20:48 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Mon, 10 Sep 2007 20:48:53 +0000 (20:48 +0000)
instruction. These are implemented with xor which will modify the conditional
code. They should be rematerialized as move instructions.

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

lib/Target/X86/X86RegisterInfo.cpp

index 442b113c36cfae87c33ba311ae011329c0640968..774531e7a7ba56f37dde3acbb4b19d036e641aec 100644 (file)
@@ -265,9 +265,28 @@ void X86RegisterInfo::reMaterialize(MachineBasicBlock &MBB,
                                     MachineBasicBlock::iterator I,
                                     unsigned DestReg,
                                     const MachineInstr *Orig) const {
-  MachineInstr *MI = Orig->clone();
-  MI->getOperand(0).setReg(DestReg);
-  MBB.insert(I, MI);
+  // MOV32r0 etc. are implemented with xor which clobbers condition code.
+  // Re-materialize them as movri instructions to avoid side effects.
+  switch (Orig->getOpcode()) {
+  case X86::MOV8r0:
+    BuildMI(MBB, I, TII.get(X86::MOV8ri), DestReg).addImm(0);
+    break;
+  case X86::MOV16r0:
+    BuildMI(MBB, I, TII.get(X86::MOV16ri), DestReg).addImm(0);
+    break;
+  case X86::MOV32r0:
+    BuildMI(MBB, I, TII.get(X86::MOV32ri), DestReg).addImm(0);
+    break;
+  case X86::MOV64r0:
+    BuildMI(MBB, I, TII.get(X86::MOV64ri32), DestReg).addImm(0);
+    break;
+  default: {
+    MachineInstr *MI = Orig->clone();
+    MI->getOperand(0).setReg(DestReg);
+    MBB.insert(I, MI);
+    break;
+  }
+  }
 }
 
 static const MachineInstrBuilder &FuseInstrAddOperand(MachineInstrBuilder &MIB,