Loosen up these checks to allow direct uses of ESP
authorChris Lattner <sabre@nondot.org>
Wed, 25 Jan 2006 08:00:36 +0000 (08:00 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 25 Jan 2006 08:00:36 +0000 (08:00 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25595 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86ISelPattern.cpp

index 2a2ebd97739d31f942124e786d14096bff883a28..46b0e8dc18de15355d72595a061f6abb7fda5247 100644 (file)
@@ -2903,13 +2903,21 @@ static SDOperand GetAdjustedArgumentStores(SDOperand Chain, int Offset,
   if (OrigDest.getOpcode() == ISD::CopyFromReg) {
     OrigOffset = 0;
     assert(cast<RegisterSDNode>(OrigDest.getOperand(1))->getReg() == X86::ESP);
-  } else {
+  } else if (OrigDest.getOpcode() == ISD::ADD &&
+             isa<ConstantSDNode>(OrigDest.getOperand(1)) &&
+             OrigDest.getOperand(0).getOpcode() == ISD::CopyFromReg &&
+             cast<RegisterSDNode>(OrigDest.getOperand(0).getOperand(1))->getReg()
+                   == X86::ESP) {
+    // We expect only (ESP+C)
+    OrigOffset = cast<ConstantSDNode>(OrigDest.getOperand(1))->getValue();
+  } else if (OrigDest.getOpcode() == ISD::Register) {
     // We expect only (ESP+C)
+    OrigOffset = 0;
+  } else {
     assert(OrigDest.getOpcode() == ISD::ADD &&
            isa<ConstantSDNode>(OrigDest.getOperand(1)) &&
-           OrigDest.getOperand(0).getOpcode() == ISD::CopyFromReg &&
-           cast<RegisterSDNode>(OrigDest.getOperand(0).getOperand(1))->getReg()
-                 == X86::ESP);
+           OrigDest.getOperand(0).getOpcode() == ISD::Register &&
+           cast<RegisterSDNode>(OrigDest.getOperand(0))->getReg() == X86::ESP);
     OrigOffset = cast<ConstantSDNode>(OrigDest.getOperand(1))->getValue();
   }