OSDN Git Service

Fast ISel trivially coalesces away no-op casts, so check for this when
authorDan Gohman <gohman@apple.com>
Fri, 14 May 2010 22:53:18 +0000 (22:53 +0000)
committerDan Gohman <gohman@apple.com>
Fri, 14 May 2010 22:53:18 +0000 (22:53 +0000)
setting kill flags.

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

lib/CodeGen/SelectionDAG/FastISel.cpp

index 253ceca..1996c19 100644 (file)
 using namespace llvm;
 
 bool FastISel::hasTrivialKill(const Value *V) const {
-  // Don't consider constants or arguments to have trivial kills. Only
-  // instructions with a single use in the same basic block.
+  // Don't consider constants or arguments to have trivial kills.
   const Instruction *I = dyn_cast<Instruction>(V);
-  return I &&
-         I->hasOneUse() &&
+  if (!I)
+    return false;
+
+  // No-op casts are trivially coalesced by fast-isel.
+  if (const CastInst *Cast = dyn_cast<CastInst>(I))
+    if (Cast->isNoopCast(TD.getIntPtrType(Cast->getContext())) &&
+        !hasTrivialKill(Cast->getOperand(0)))
+      return false;
+
+  // Only instructions with a single use in the same basic block are considered
+  // to have trivial kills.
+  return I->hasOneUse() &&
+         !(I->getOpcode() == Instruction::BitCast ||
+           I->getOpcode() == Instruction::PtrToInt ||
+           I->getOpcode() == Instruction::IntToPtr) &&
          cast<Instruction>(I->use_begin())->getParent() == I->getParent();
 }