From 2e0201ee18c2d9eede0c9e22c9fbd9d3107a9199 Mon Sep 17 00:00:00 2001 From: Eric Christopher Date: Thu, 11 Feb 2010 17:44:04 +0000 Subject: [PATCH] Make sure that ConstantExpr offsets also aren't off of extern symbols. Thanks to Duncan Sands for the testcase! llvm-svn: 95877 --- lib/Transforms/InstCombine/InstCombineCalls.cpp | 10 ++++++++-- test/Transforms/InstCombine/objsize.ll | 15 +++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/lib/Transforms/InstCombine/InstCombineCalls.cpp b/lib/Transforms/InstCombine/InstCombineCalls.cpp index 1371fa7f1ad..43419eb9fc0 100644 --- a/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -331,9 +331,15 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) { if (CE->getOpcode() != Instruction::GetElementPtr) break; GEPOperator *GEP = cast(CE); + // Make sure we're not a constant offset from an external + // global. + Value *Operand = GEP->getPointerOperand(); + if (GlobalVariable *GV = dyn_cast(Operand)) + if (!GV->hasDefinitiveInitializer()) break; + // Get what we're pointing to and its size. const PointerType *PT = - cast(GEP->getPointerOperand()->getType()); + cast(Operand->getType()); size_t Size = TD->getTypeAllocSize(PT->getElementType()); // Get the current byte offset into the thing. @@ -345,7 +351,7 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) { Constant *RetVal = ConstantInt::get(ReturnTy, Size-Offset); return ReplaceInstUsesWith(CI, RetVal); - } + } } case Intrinsic::bswap: // bswap(bswap(x)) -> x diff --git a/test/Transforms/InstCombine/objsize.ll b/test/Transforms/InstCombine/objsize.ll index 2bcdd914e33..646baa0de06 100644 --- a/test/Transforms/InstCombine/objsize.ll +++ b/test/Transforms/InstCombine/objsize.ll @@ -48,4 +48,19 @@ define i1 @baz() nounwind { ret i1 %2 } +define void @test1(i8* %q, i32 %x) nounwind noinline { +; CHECK: @test1 +; CHECK: objectsize.i32 +entry: + %0 = call i32 @llvm.objectsize.i32(i8* getelementptr inbounds ([0 x i8]* @window, i32 0, i32 10), i1 false) ; [#uses=1] + %1 = icmp eq i32 %0, -1 ; [#uses=1] + br i1 %1, label %"47", label %"46" + +"46": ; preds = %entry + unreachable + +"47": ; preds = %entry + unreachable +} + declare i32 @llvm.objectsize.i32(i8*, i1) nounwind readonly \ No newline at end of file