[MachineCopyPropagation] Fix a bug with undef handling when the value is actualy...
authorQuentin Colombet <qcolombet@apple.com>
Thu, 28 May 2015 22:38:40 +0000 (22:38 +0000)
committerQuentin Colombet <qcolombet@apple.com>
Thu, 28 May 2015 22:38:40 +0000 (22:38 +0000)
Test case will follow.

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

lib/CodeGen/MachineCopyPropagation.cpp

index 43c80b7c21bf419ff21b98c74c0897df2667bc1b..602c1fa8d00fd0ca15621509dfbec4b6e5be3936 100644 (file)
@@ -252,11 +252,7 @@ bool MachineCopyPropagation::CopyPropagateBlock(MachineBasicBlock &MBB) {
         report_fatal_error("MachineCopyPropagation should be run after"
                            " register allocation!");
 
-      // Treat undef use like defs.
-      // The backends are allowed to do whatever they want with undef value
-      // and we cannot be sure this register will not be rewritten to break
-      // some false dependencies for the hardware for instance.
-      if (MO.isDef() || MO.isUndef()) {
+      if (MO.isDef()) {
         Defs.push_back(Reg);
         continue;
       }
@@ -270,6 +266,14 @@ bool MachineCopyPropagation::CopyPropagateBlock(MachineBasicBlock &MBB) {
           MaybeDeadCopies.remove(CI->second);
         }
       }
+      // Treat undef use like defs for copy propagation but not for
+      // dead copy. We would need to do a liveness check to be sure the copy
+      // is dead for undef uses.
+      // The backends are allowed to do whatever they want with undef value
+      // and we cannot be sure this register will not be rewritten to break
+      // some false dependencies for the hardware for instance.
+      if (MO.isUndef())
+        Defs.push_back(Reg);
     }
 
     // The instruction has a register mask operand which means that it clobbers