[llvm-commits] CVS: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp

Evan Cheng evan.cheng at apple.com
Sat May 20 02:22:20 PDT 2006



Changes in directory llvm/lib/Target/X86:

X86ISelDAGToDAG.cpp updated: 1.64 -> 1.65
---
Log message:

- Use of load's chain result should be redirected to load's chain operand.
  If it reads the chain result of the call, then the use, callseq_start,
  and call would form a cycle!
- Don't forget handle node replacement!
- There could also be a TokenFactor between the load and the callseq_start.


---
Diffs of the changes:  (+13 -3)

 X86ISelDAGToDAG.cpp |   16 +++++++++++++---
 1 files changed, 13 insertions(+), 3 deletions(-)


Index: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp
diff -u llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.64 llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.65
--- llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.64	Sat May 20 02:44:28 2006
+++ llvm/lib/Target/X86/X86ISelDAGToDAG.cpp	Sat May 20 04:21:39 2006
@@ -840,13 +840,18 @@
     case X86ISD::TAILCALL: {
       // Handle indirect call which folds a load here. This never matches by
       // the TableGen generated code since the load's chain result is read by
-      // the callseq_start node.
+      // the callseq_start node or by a TokenFactor which feeds into the
+      // callseq_start.
       SDOperand N1 = Node->getOperand(1);
       if (N1.getOpcode() == ISD::LOAD && N1.hasOneUse() &&
           !CodeGenMap.count(N1.getValue(0))) {
         SDOperand Chain = Node->getOperand(0);
         SDNode *CallStart = FindCallStartFromCall(Chain.Val);
-        if (!CallStart || CallStart->getOperand(0).Val != N1.Val)
+        if (!CallStart) break;
+        SDNode *CSOp0 = CallStart->getOperand(0).Val;
+        if (! (CSOp0 == N1.Val ||
+               (CSOp0->getOpcode() == ISD::TokenFactor &&
+                N1.Val->isOperand(CSOp0))))
           break;
         SDOperand Base, Scale, Index, Disp;
         if (SelectAddr(N1.getOperand(1), Base, Scale, Index, Disp)) {
@@ -872,8 +877,13 @@
 
           SelectionDAG::InsertISelMapEntry(CodeGenMap, N.Val,  0, Chain.Val,
                                            Chain.ResNo);
-          SelectionDAG::InsertISelMapEntry(CodeGenMap, N1.Val, 1, ResNode, 0);
           SelectionDAG::InsertISelMapEntry(CodeGenMap, N.Val,  1, ResNode, 1);
+          // CALLSEQ_START needs a chain! It can't be ResNode, that would cause
+          // a cycle. It should be the chain of the load.
+          Select(Chain, N1.getOperand(0));
+          SelectionDAG::InsertISelMapEntry(CodeGenMap, N1.Val, 1, Chain.Val,
+                                           Chain.ResNo);
+          AddHandleReplacement(N1.Val, 1, Chain.Val, Chain.ResNo);
           Result = SDOperand(ResNode, 0);
 
 #ifndef NDEBUG






More information about the llvm-commits mailing list