Don't try to create a GEP when the pointee type is unsized (such GEPs

are invalid).  Fixes a crash on array1.C from the GCC testsuite when
compiled with dragonegg.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@147946 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Duncan Sands 2012-01-11 12:20:08 +00:00
parent e4bc80a14b
commit 1876abe63e
2 changed files with 14 additions and 1 deletions

View File

@ -104,7 +104,8 @@ static Constant *FoldBitCast(Constant *V, Type *DestTy) {
// the first element. If so, return the appropriate GEP instruction.
if (PointerType *PTy = dyn_cast<PointerType>(V->getType()))
if (PointerType *DPTy = dyn_cast<PointerType>(DestTy))
if (PTy->getAddressSpace() == DPTy->getAddressSpace()) {
if (PTy->getAddressSpace() == DPTy->getAddressSpace()
&& DPTy->getElementType()->isSized()) {
SmallVector<Value*, 8> IdxList;
Value *Zero =
Constant::getNullValue(Type::getInt32Ty(DPTy->getContext()));

View File

@ -0,0 +1,12 @@
; RUN: opt < %s -instcombine -disable-output
%opaque_struct = type opaque
@G = external global [0 x %opaque_struct]
declare void @foo(%opaque_struct*)
define void @bar() {
call void @foo(%opaque_struct* bitcast ([0 x %opaque_struct]* @G to %opaque_struct*))
ret void
}