summaryrefslogtreecommitdiffstats
path: root/llvm/lib/IR
diff options
context:
space:
mode:
authorBjorn Pettersson <bjorn.a.pettersson@ericsson.com>2017-10-24 12:08:11 +0000
committerBjorn Pettersson <bjorn.a.pettersson@ericsson.com>2017-10-24 12:08:11 +0000
commit1c043a9f28629929719c7262c74f837476416d43 (patch)
tree6ab8f2b7a41b3991b03dde70cb0e1cb3845c5b48 /llvm/lib/IR
parente1285e3cdf6bd34311611070ffe2ac6a6af76276 (diff)
downloadbcm5719-llvm-1c043a9f28629929719c7262c74f837476416d43.tar.gz
bcm5719-llvm-1c043a9f28629929719c7262c74f837476416d43.zip
[ConstantFolding] Avoid assert when folding ptrtoint of vectorized GEP
Summary: Got asserts in llvm::CastInst::getCastOpcode saying: `DestBits == SrcBits && "Illegal cast to vector (wrong type or size)"' failed. Problem seemed to be that llvm::ConstantFoldCastInstruction did not handle ptrtoint cast of a getelementptr returning a vector correctly. I assume such situations are quite rare, since the GEP needs to be considered as a constant value (base pointer being null). The solution used here is to simply avoid the constant fold of ptrtoint when the value is a vector. It is not supported, and by bailing out we do not fail on assertions later on. Reviewers: craig.topper, majnemer, davide, filcab, efriedma Reviewed By: efriedma Subscribers: efriedma, filcab, llvm-commits Differential Revision: https://reviews.llvm.org/D38546 llvm-svn: 316430
Diffstat (limited to 'llvm/lib/IR')
-rw-r--r--llvm/lib/IR/ConstantFold.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/llvm/lib/IR/ConstantFold.cpp b/llvm/lib/IR/ConstantFold.cpp
index 60dd20e4659..044cc1ff449 100644
--- a/llvm/lib/IR/ConstantFold.cpp
+++ b/llvm/lib/IR/ConstantFold.cpp
@@ -629,6 +629,15 @@ Constant *llvm::ConstantFoldCastInstruction(unsigned opc, Constant *V,
if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V))
if (CE->getOpcode() == Instruction::GetElementPtr &&
CE->getOperand(0)->isNullValue()) {
+ // FIXME: Looks like getFoldedSizeOf(), getFoldedOffsetOf() and
+ // getFoldedAlignOf() don't handle the case when DestTy is a vector of
+ // pointers yet. We end up in asserts in CastInst::getCastOpcode (see
+ // test/Analysis/ConstantFolding/cast-vector.ll). I've only seen this
+ // happen in one "real" C-code test case, so it does not seem to be an
+ // important optimization to handle vectors here. For now, simply bail
+ // out.
+ if (DestTy->isVectorTy())
+ return nullptr;
GEPOperator *GEPO = cast<GEPOperator>(CE);
Type *Ty = GEPO->getSourceElementType();
if (CE->getNumOperands() == 2) {
OpenPOWER on IntegriCloud