Fix a bug in legalize where it would emit two calls to libcalls that return
authorChris Lattner <sabre@nondot.org>
Fri, 2 Sep 2005 20:26:58 +0000 (20:26 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 2 Sep 2005 20:26:58 +0000 (20:26 +0000)
i64 values on targets that need that expanded to 32-bit registers.  This fixes
PowerPC/2005-09-02-LegalizeDuplicatesCalls.ll and speeds up 189.lucas from
taking 122.72s to 81.96s on my desktop.

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

lib/CodeGen/SelectionDAG/LegalizeDAG.cpp

index 461104c1f581ff378d6c94508a2f73316070d81d..34048f8a4b62b5ca40b231dce1886cd13151ae9e 100644 (file)
@@ -1996,7 +1996,7 @@ SDOperand SelectionDAGLegalize::PromoteOp(SDOperand Op) {
   SDOperand Result;
   SDNode *Node = Op.Val;
 
-  if (!Node->hasOneUse()) {
+  if (1 || !Node->hasOneUse()) {
     std::map<SDOperand, SDOperand>::iterator I = PromotedNodes.find(Op);
     if (I != PromotedNodes.end()) return I->second;
   } else {
@@ -2709,21 +2709,24 @@ SDOperand SelectionDAGLegalize::ExpandLibCall(const char *Name, SDNode *Node,
   std::pair<SDOperand,SDOperand> CallInfo =
     TLI.LowerCallTo(InChain, RetTy, false, CallingConv::C, false,
                     Callee, Args, DAG);
-  SpliceCallInto(CallInfo.second, OutChain);
-
-  NeedsAnotherIteration = true;
 
+  SDOperand Result;
   switch (getTypeAction(CallInfo.first.getValueType())) {
   default: assert(0 && "Unknown thing");
   case Legal:
-    return CallInfo.first;
+    Result = CallInfo.first;
+    break;
   case Promote:
     assert(0 && "Cannot promote this yet!");
   case Expand:
-    SDOperand Lo;
-    ExpandOp(CallInfo.first, Lo, Hi);
-    return Lo;
+    ExpandOp(CallInfo.first, Result, Hi);
+    CallInfo.second = LegalizeOp(CallInfo.second);
+    break;
   }
+  
+  SpliceCallInto(CallInfo.second, OutChain);
+  NeedsAnotherIteration = true;
+  return Result;
 }
 
 
@@ -2845,7 +2848,7 @@ void SelectionDAGLegalize::ExpandOp(SDOperand Op, SDOperand &Lo, SDOperand &Hi){
   // If there is more than one use of this, see if we already expanded it.
   // There is no use remembering values that only have a single use, as the map
   // entries will never be reused.
-  if (!Node->hasOneUse()) {
+  if (1 || !Node->hasOneUse()) {
     std::map<SDOperand, std::pair<SDOperand, SDOperand> >::iterator I
       = ExpandedNodes.find(Op);
     if (I != ExpandedNodes.end()) {
@@ -3259,7 +3262,7 @@ void SelectionDAGLegalize::ExpandOp(SDOperand Op, SDOperand &Lo, SDOperand &Hi){
   }
 
   // Remember in a map if the values will be reused later.
-  if (!Node->hasOneUse()) {
+  if (1 || !Node->hasOneUse()) {
     bool isNew = ExpandedNodes.insert(std::make_pair(Op,
                                             std::make_pair(Lo, Hi))).second;
     assert(isNew && "Value already expanded?!?");