Fix another case where a dbg.declare meant something
authorDale Johannesen <dalej@apple.com>
Thu, 5 Mar 2009 00:39:02 +0000 (00:39 +0000)
committerDale Johannesen <dalej@apple.com>
Thu, 5 Mar 2009 00:39:02 +0000 (00:39 +0000)
had 2 uses instead of 1.

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

lib/Transforms/Scalar/InstructionCombining.cpp

index 66ac48181e64a7bd9639f39ec97aea1bf0ca17d0..1679b9f4bcae46c60fc056ac13d32d2fc87c1d94 100644 (file)
@@ -7502,8 +7502,10 @@ Instruction *InstCombiner::PromoteCastOfAllocation(BitCastInst &CI,
 
   // If the allocation has multiple uses, only promote it if we are strictly
   // increasing the alignment of the resultant allocation.  If we keep it the
-  // same, we open the door to infinite loops of various kinds.
-  if (!AI.hasOneUse() && CastElTyAlign == AllocElTyAlign) return 0;
+  // same, we open the door to infinite loops of various kinds.  (A reference
+  // from a dbg.declare doesn't count as a use for this purpose.)
+  if (!AI.hasOneUse() && !hasOneUsePlusDeclare(&AI) &&
+      CastElTyAlign == AllocElTyAlign) return 0;
 
   uint64_t AllocElTySize = TD->getTypePaddedSize(AllocElTy);
   uint64_t CastElTySize = TD->getTypePaddedSize(CastElTy);
@@ -7551,10 +7553,15 @@ Instruction *InstCombiner::PromoteCastOfAllocation(BitCastInst &CI,
   InsertNewInstBefore(New, AI);
   New->takeName(&AI);
   
-  // If the allocation has multiple uses, insert a cast and change all things
-  // that used it to use the new cast.  This will also hack on CI, but it will
-  // die soon.
-  if (!AI.hasOneUse()) {
+  // If the allocation has one real use plus a dbg.declare, just remove the
+  // declare.
+  if (DbgDeclareInst *DI = hasOneUsePlusDeclare(&AI)) {
+    EraseInstFromFunction(*DI);
+  }
+  // If the allocation has multiple real uses, insert a cast and change all
+  // things that used it to use the new cast.  This will also hack on CI, but it
+  // will die soon.
+  else if (!AI.hasOneUse()) {
     AddUsesToWorkList(AI);
     // New is the allocation instruction, pointer typed. AI is the original
     // allocation instruction, also pointer typed. Thus, cast to use is BitCast.