[llvm-commits] CVS: llvm/lib/Transforms/Scalar/InstructionCombining.cpp

Chris Lattner lattner at cs.uiuc.edu
Sun Oct 23 23:35:30 PDT 2005



Changes in directory llvm/lib/Transforms/Scalar:

InstructionCombining.cpp updated: 1.391 -> 1.392
---
Log message:

Handle allocations that, even after removing dead uses, still have more than
one use (but one is a cast).  This handles the very common case of:

 X = alloc [n x byte]
 Y = cast X to somethingbetter
 seteq X, null

In order to avoid infinite looping when there are multiple casts, we only
allow this if the xform is strictly increasing the alignment of the 
allocation.



---
Diffs of the changes:  (+15 -3)

 InstructionCombining.cpp |   18 +++++++++++++++---
 1 files changed, 15 insertions(+), 3 deletions(-)


Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp
diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.391 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.392
--- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.391	Mon Oct 24 01:26:18 2005
+++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp	Mon Oct 24 01:35:18 2005
@@ -3788,9 +3788,6 @@
     }
   }
   
-  // Finally, if the instruction now has one use, delete it.
-  if (!AI.hasOneUse()) return 0;
-  
   // Get the type really allocated and the type casted to.
   const Type *AllocElTy = AI.getAllocatedType();
   const Type *CastElTy = PTy->getElementType();
@@ -3800,6 +3797,11 @@
   unsigned CastElTyAlign = TD->getTypeSize(CastElTy);
   if (CastElTyAlign < AllocElTyAlign) return 0;
 
+  // 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;
+
   uint64_t AllocElTySize = TD->getTypeSize(AllocElTy);
   uint64_t CastElTySize = TD->getTypeSize(CastElTy);
 
@@ -3815,6 +3817,16 @@
   else
     New = new AllocaInst(CastElTy, Amt, Name);
   InsertNewInstBefore(New, 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()) {
+    AddUsesToWorkList(AI);
+    CastInst *NewCast = new CastInst(New, AI.getType(), "tmpcast");
+    InsertNewInstBefore(NewCast, AI);
+    AI.replaceAllUsesWith(NewCast);
+  }
   return ReplaceInstUsesWith(CI, New);
 }
 






More information about the llvm-commits mailing list