[llvm-commits] [llvm] r95846 - in /llvm/trunk: lib/Transforms/InstCombine/InstCombineCalls.cpp test/Transforms/InstCombine/objsize.ll
Eric Christopher
echristo at apple.com
Wed Feb 10 17:48:54 PST 2010
Author: echristo
Date: Wed Feb 10 19:48:54 2010
New Revision: 95846
URL: http://llvm.org/viewvc/llvm-project?rev=95846&view=rev
Log:
Add ConstantExpr handling to Intrinsic::objectsize lowering.
Update testcase accordingly now that we can optimize another
section.
Modified:
llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp
llvm/trunk/test/Transforms/InstCombine/objsize.ll
Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp?rev=95846&r1=95845&r2=95846&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCalls.cpp Wed Feb 10 19:48:54 2010
@@ -308,9 +308,14 @@
Value *Op1 = II->getOperand(1);
bool Min = (cast<ConstantInt>(II->getOperand(2))->getZExtValue() == 1);
+ // We need target data for just about everything so depend on it.
if (!TD) break;
+
+ // Get to the real allocated thing and offset as fast as possible.
Op1 = Op1->stripPointerCasts();
+ // If we've stripped down to a single global variable that we
+ // can know the size of then just return that.
if (GlobalVariable *GV = dyn_cast<GlobalVariable>(Op1)) {
if (GV->hasDefinitiveInitializer()) {
Constant *C = GV->getInitializer();
@@ -320,7 +325,27 @@
Constant *RetVal = ConstantInt::get(ReturnTy, Min ? 0 : -1ULL);
return ReplaceInstUsesWith(CI, RetVal);
}
- }
+ } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Op1)) {
+
+ // Only handle constant GEPs here.
+ if (CE->getOpcode() != Instruction::GetElementPtr) break;
+ GEPOperator *GEP = cast<GEPOperator>(CE);
+
+ // Get what we're pointing to and its size.
+ const PointerType *PT =
+ cast<PointerType>(GEP->getPointerOperand()->getType());
+ size_t Size = TD->getTypeAllocSize(PT->getElementType());
+
+ // Get the current byte offset into the thing.
+ SmallVector<Value*, 8> Ops(CE->op_begin()+1, CE->op_end());
+ size_t Offset = TD->getIndexedOffset(PT, &Ops[0], Ops.size());
+
+ assert(Size >= Offset);
+
+ Constant *RetVal = ConstantInt::get(ReturnTy, Size-Offset);
+ return ReplaceInstUsesWith(CI, RetVal);
+
+ }
}
case Intrinsic::bswap:
// bswap(bswap(x)) -> x
Modified: llvm/trunk/test/Transforms/InstCombine/objsize.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/objsize.ll?rev=95846&r1=95845&r2=95846&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/objsize.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/objsize.ll Wed Feb 10 19:48:54 2010
@@ -31,10 +31,9 @@
ret i8* %2;
}
-; FIXME: Should be ret i32 0
define i32 @f() nounwind {
; CHECK: @f
-; CHECK-NEXT: llvm.objectsize.i32
+; CHECK-NEXT: ret i32 0
%1 = call i32 @llvm.objectsize.i32(i8* getelementptr ([60 x i8]* @a, i32 1, i32 0), i1 false)
ret i32 %1
}
More information about the llvm-commits
mailing list