[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp

Chris Lattner lattner at cs.uiuc.edu
Mon Aug 29 18:57:13 PDT 2005



Changes in directory llvm/lib/Target/PowerPC:

PPC32ISelDAGToDAG.cpp updated: 1.56 -> 1.57
---
Log message:

Make sure the selector emits register register copies with flag operands
linking them to calls when appropriate, this prevents the scheduler from
pulling these copies away from the call.

This fixes Ptrdist/yacr2


---
Diffs of the changes:  (+20 -10)

 PPC32ISelDAGToDAG.cpp |   30 ++++++++++++++++++++----------
 1 files changed, 20 insertions(+), 10 deletions(-)


Index: llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp
diff -u llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.56 llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.57
--- llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp:1.56	Mon Aug 29 19:59:16 2005
+++ llvm/lib/Target/PowerPC/PPC32ISelDAGToDAG.cpp	Mon Aug 29 20:57:02 2005
@@ -1512,6 +1512,8 @@
       PPC::F8, PPC::F9, PPC::F10, PPC::F11, PPC::F12, PPC::F13
     };
     
+    SDOperand InFlag;  // Null incoming flag value.
+    
     for (unsigned i = 2, e = N->getNumOperands(); i != e; ++i) {
       unsigned DestReg = 0;
       MVT::ValueType RegTy;
@@ -1528,17 +1530,21 @@
       }
 
       if (N->getOperand(i).getOpcode() != ISD::UNDEF) {
-        SDOperand Reg = CurDAG->getRegister(DestReg, RegTy);
-        Chain = CurDAG->getNode(ISD::CopyToReg, MVT::Other, Chain, Reg,
-                                Select(N->getOperand(i)));
-        CallOperands.push_back(Reg);
+        Chain = CurDAG->getCopyToReg(Chain, DestReg,
+                                     Select(N->getOperand(i)), InFlag);
+        InFlag = Chain.getValue(1);
+        CallOperands.push_back(CurDAG->getRegister(DestReg, RegTy));
       }
     }
 
     // Finally, once everything is in registers to pass to the call, emit the
     // call itself.
-    CallOperands.push_back(Chain);
-    Chain = CurDAG->getTargetNode(CallOpcode, MVT::Other, CallOperands);
+    if (InFlag.Val)
+      CallOperands.push_back(InFlag);   // Strong dep on register copies.
+    else
+      CallOperands.push_back(Chain);    // Weak dep on whatever occurs before
+    Chain = CurDAG->getTargetNode(CallOpcode, MVT::Other, MVT::Flag,
+                                  CallOperands);
     
     std::vector<SDOperand> CallResults;
     
@@ -1548,18 +1554,22 @@
     case MVT::Other: break;
     case MVT::i32:
       if (N->getValueType(1) == MVT::i32) {
-        Chain = CurDAG->getCopyFromReg(Chain, PPC::R4, MVT::i32).getValue(1);
+        Chain = CurDAG->getCopyFromReg(Chain, PPC::R4, MVT::i32, 
+                                       Chain.getValue(1)).getValue(1);
         CallResults.push_back(Chain.getValue(0));
-        Chain = CurDAG->getCopyFromReg(Chain, PPC::R3, MVT::i32).getValue(1);
+        Chain = CurDAG->getCopyFromReg(Chain, PPC::R3, MVT::i32,
+                                       Chain.getValue(1)).getValue(1);
         CallResults.push_back(Chain.getValue(0));
       } else {
-        Chain = CurDAG->getCopyFromReg(Chain, PPC::R3, MVT::i32).getValue(1);
+        Chain = CurDAG->getCopyFromReg(Chain, PPC::R3, MVT::i32,
+                                       Chain.getValue(1)).getValue(1);
         CallResults.push_back(Chain.getValue(0));
       }
       break;
     case MVT::f32:
     case MVT::f64:
-      Chain = CurDAG->getCopyFromReg(Chain, PPC::F1, MVT::f64).getValue(1);
+      Chain = CurDAG->getCopyFromReg(Chain, PPC::F1, MVT::f64,
+                                     Chain.getValue(1)).getValue(1);
       if (N->getValueType(0) == MVT::f64)
         CallResults.push_back(Chain.getValue(0));
       else






More information about the llvm-commits mailing list