[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