ConstantFoldLoadThroughGEPConstantExpr wasn't handling pointers to

packed types correctly.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25470 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Robert Bocchino 2006-01-19 23:53:23 +00:00
parent cce47faf52
commit d900c6a8b3

View File

@ -267,16 +267,29 @@ Constant *llvm::ConstantFoldLoadThroughGEPConstantExpr(Constant *C,
return 0; return 0;
} }
} else if (ConstantInt *CI = dyn_cast<ConstantInt>(I.getOperand())) { } else if (ConstantInt *CI = dyn_cast<ConstantInt>(I.getOperand())) {
const ArrayType *ATy = cast<ArrayType>(*I); if (const ArrayType *ATy = dyn_cast<ArrayType>(*I)) {
if ((uint64_t)CI->getRawValue() >= ATy->getNumElements()) return 0; if ((uint64_t)CI->getRawValue() >= ATy->getNumElements()) return 0;
if (ConstantArray *CA = dyn_cast<ConstantArray>(C)) if (ConstantArray *CA = dyn_cast<ConstantArray>(C))
C = CA->getOperand((unsigned)CI->getRawValue()); C = CA->getOperand((unsigned)CI->getRawValue());
else if (isa<ConstantAggregateZero>(C)) else if (isa<ConstantAggregateZero>(C))
C = Constant::getNullValue(ATy->getElementType()); C = Constant::getNullValue(ATy->getElementType());
else if (isa<UndefValue>(C)) else if (isa<UndefValue>(C))
C = UndefValue::get(ATy->getElementType()); C = UndefValue::get(ATy->getElementType());
else else
return 0;
} else if (const PackedType *PTy = dyn_cast<PackedType>(*I)) {
if ((uint64_t)CI->getRawValue() >= PTy->getNumElements()) return 0;
if (ConstantPacked *CP = dyn_cast<ConstantPacked>(C))
C = CP->getOperand((unsigned)CI->getRawValue());
else if (isa<ConstantAggregateZero>(C))
C = Constant::getNullValue(PTy->getElementType());
else if (isa<UndefValue>(C))
C = UndefValue::get(PTy->getElementType());
else
return 0;
} else {
return 0; return 0;
}
} else { } else {
return 0; return 0;
} }