When the definition of an address value is in a different block
authorDan Gohman <gohman@apple.com>
Fri, 12 Nov 2010 19:14:00 +0000 (19:14 +0000)
committerDan Gohman <gohman@apple.com>
Fri, 12 Nov 2010 19:14:00 +0000 (19:14 +0000)
from the user of the address, fall back to just using the
address in a register instead of bailing out of fast-isel
altogether.

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

lib/Target/X86/X86FastISel.cpp

index b938539a7f45243778b7c06ff000709cb8895a63..ee6643336fd4f092c0126a72faec4af8959bb486 100644 (file)
@@ -320,11 +320,11 @@ bool X86FastISel::X86SelectAddress(const Value *V, X86AddressMode &AM) {
     // Don't walk into other basic blocks; it's possible we haven't
     // visited them yet, so the instructions may not yet be assigned
     // virtual registers.
-    if (FuncInfo.MBBMap[I->getParent()] != FuncInfo.MBB)
-      return false;
-
-    Opcode = I->getOpcode();
-    U = I;
+    if (FuncInfo.StaticAllocaMap.count(static_cast<const AllocaInst *>(V)) ||
+        FuncInfo.MBBMap[I->getParent()] == FuncInfo.MBB) {
+      Opcode = I->getOpcode();
+      U = I;
+    }
   } else if (const ConstantExpr *C = dyn_cast<ConstantExpr>(V)) {
     Opcode = C->getOpcode();
     U = C;