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

Chris Lattner lattner at cs.uiuc.edu
Thu Jan 20 08:50:32 PST 2005



Changes in directory llvm/lib/Target/X86:

X86ISelPattern.cpp updated: 1.81 -> 1.82
---
Log message:

Fix a crash compiling 134.perl.


---
Diffs of the changes:  (+41 -21)

Index: llvm/lib/Target/X86/X86ISelPattern.cpp
diff -u llvm/lib/Target/X86/X86ISelPattern.cpp:1.81 llvm/lib/Target/X86/X86ISelPattern.cpp:1.82
--- llvm/lib/Target/X86/X86ISelPattern.cpp:1.81	Wed Jan 19 11:24:34 2005
+++ llvm/lib/Target/X86/X86ISelPattern.cpp	Thu Jan 20 10:50:16 2005
@@ -490,6 +490,27 @@
   return Result;
 }
 
+/// NodeTransitivelyUsesValue - Return true if N or any of its uses uses Op.
+/// The DAG cannot have cycles in it, by definition, so the visited set is not
+/// needed to prevent infinite loops.  The DAG CAN, however, have unbounded
+/// reuse, so it prevents exponential cases.
+///
+static bool NodeTransitivelyUsesValue(SDOperand N, SDOperand Op,
+                                      std::set<SDNode*> &Visited) {
+  if (N == Op) return true;                        // Found it.
+  SDNode *Node = N.Val;
+  if (Node->getNumOperands() == 0) return false;   // Leaf?
+  if (!Visited.insert(Node).second) return false;  // Already visited?
+
+  // Recurse for the first N-1 operands.
+  for (unsigned i = 1, e = Node->getNumOperands(); i != e; ++i)
+    if (NodeTransitivelyUsesValue(Node->getOperand(i), Op, Visited))
+      return true;
+
+  // Tail recurse for the last operand.
+  return NodeTransitivelyUsesValue(Node->getOperand(0), Op, Visited);
+}
+
 X86AddressMode ISel::SelectAddrExprs(const X86ISelAddressMode &IAM) {
   X86AddressMode Result;
 
@@ -497,13 +518,33 @@
   // register pressure first.
   if (IAM.BaseType == X86ISelAddressMode::RegBase &&
       IAM.Base.Reg.Val && IAM.IndexReg.Val) {
+    bool EmitBaseThenIndex;
     if (getRegPressure(IAM.Base.Reg) > getRegPressure(IAM.IndexReg)) {
+      std::set<SDNode*> Visited;
+      EmitBaseThenIndex = true;
+      // If Base ends up pointing to Index, we must emit index first.  This is
+      // because of the way we fold loads, we may end up doing bad things with
+      // the folded add.
+      if (NodeTransitivelyUsesValue(IAM.Base.Reg, IAM.IndexReg, Visited))
+        EmitBaseThenIndex = false;
+    } else {
+      std::set<SDNode*> Visited;
+      EmitBaseThenIndex = false;
+      // If Base ends up pointing to Index, we must emit index first.  This is
+      // because of the way we fold loads, we may end up doing bad things with
+      // the folded add.
+      if (NodeTransitivelyUsesValue(IAM.IndexReg, IAM.Base.Reg, Visited))
+        EmitBaseThenIndex = true;
+    }
+
+    if (EmitBaseThenIndex) {
       Result.Base.Reg = SelectExpr(IAM.Base.Reg);
       Result.IndexReg = SelectExpr(IAM.IndexReg);
     } else {
       Result.IndexReg = SelectExpr(IAM.IndexReg);
       Result.Base.Reg = SelectExpr(IAM.Base.Reg);
     }
+
   } else if (IAM.BaseType == X86ISelAddressMode::RegBase && IAM.Base.Reg.Val) {
     Result.Base.Reg = SelectExpr(IAM.Base.Reg);
   } else if (IAM.IndexReg.Val) {
@@ -1070,27 +1111,6 @@
   BuildMI(BB, Opc, 2).addReg(Tmp1).addReg(Tmp2);
 }
 
-/// NodeTransitivelyUsesValue - Return true if N or any of its uses uses Op.
-/// The DAG cannot have cycles in it, by definition, so the visited set is not
-/// needed to prevent infinite loops.  The DAG CAN, however, have unbounded
-/// reuse, so it prevents exponential cases.
-///
-static bool NodeTransitivelyUsesValue(SDOperand N, SDOperand Op,
-                                      std::set<SDNode*> &Visited) {
-  if (N == Op) return true;                        // Found it.
-  SDNode *Node = N.Val;
-  if (Node->getNumOperands() == 0) return false;   // Leaf?
-  if (!Visited.insert(Node).second) return false;  // Already visited?
-
-  // Recurse for the first N-1 operands.
-  for (unsigned i = 1, e = Node->getNumOperands(); i != e; ++i)
-    if (NodeTransitivelyUsesValue(Node->getOperand(i), Op, Visited))
-      return true;
-
-  // Tail recurse for the last operand.
-  return NodeTransitivelyUsesValue(Node->getOperand(0), Op, Visited);
-}
-
 /// isFoldableLoad - Return true if this is a load instruction that can safely
 /// be folded into an operation that uses it.
 bool ISel::isFoldableLoad(SDOperand Op, SDOperand OtherOp) {






More information about the llvm-commits mailing list