summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Blaikie <dblaikie@gmail.com>2015-03-24 21:31:31 +0000
committerDavid Blaikie <dblaikie@gmail.com>2015-03-24 21:31:31 +0000
commite37e10dc5735a2757988ec1484b37606fc6b37e6 (patch)
treeec0974b8ff8d430964d0e55f4d41368390d380d2
parent885e78cb22dcfd882c1d54082569573cc17de6c7 (diff)
downloadbcm5719-llvm-e37e10dc5735a2757988ec1484b37606fc6b37e6.tar.gz
bcm5719-llvm-e37e10dc5735a2757988ec1484b37606fc6b37e6.zip
Remove an InstCombine that seems to have become redundant.
Assert that this doesn't fire - I'll remove all of this later, but just leaving it in for a while in case this is firing & we just don't have test coverage. llvm-svn: 233116
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp41
-rw-r--r--llvm/test/Transforms/InstCombine/2007-05-14-Crash.ll8
2 files changed, 20 insertions, 29 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
index 0625d8deca0..94883cab12a 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
@@ -1455,35 +1455,20 @@ Instruction *InstCombiner::commonPointerCastTransforms(CastInst &CI) {
// GEP computes a constant offset, see if we can convert these three
// instructions into fewer. This typically happens with unions and other
// non-type-safe code.
- unsigned AS = GEP->getPointerAddressSpace();
- unsigned OffsetBits = DL.getPointerSizeInBits(AS);
- APInt Offset(OffsetBits, 0);
+ // Looks like this never actually fires due to bitcast+gep folding happening
+ // in InstCombiner::visitGetElementPtrInst where the bitcast operand to a
+ // gep is folded into the gep if possible, before we consider whether that
+ // gep is used in a bitcast as well.
+ // Let's assert that this wouldn't fire just to be sure.
+#ifndef NDEBUG
+ APInt Offset(DL.getPointerSizeInBits(GEP->getPointerAddressSpace()), 0);
BitCastInst *BCI = dyn_cast<BitCastInst>(GEP->getOperand(0));
- if (GEP->hasOneUse() && BCI && GEP->accumulateConstantOffset(DL, Offset)) {
- // FIXME: This is insufficiently tested - just a no-crash test
- // (test/Transforms/InstCombine/2007-05-14-Crash.ll)
- //
- // Get the base pointer input of the bitcast, and the type it points to.
- Value *OrigBase = BCI->getOperand(0);
- SmallVector<Value*, 8> NewIndices;
- if (FindElementAtOffset(OrigBase->getType(), Offset.getSExtValue(),
- NewIndices)) {
- // FIXME: This codepath is completely untested - could be unreachable
- // for all I know.
- // If we were able to index down into an element, create the GEP
- // and bitcast the result. This eliminates one bitcast, potentially
- // two.
- Value *NGEP = cast<GEPOperator>(GEP)->isInBounds() ?
- Builder->CreateInBoundsGEP(OrigBase, NewIndices) :
- Builder->CreateGEP(OrigBase, NewIndices);
- NGEP->takeName(GEP);
-
- if (isa<BitCastInst>(CI))
- return new BitCastInst(NGEP, CI.getType());
- assert(isa<PtrToIntInst>(CI));
- return new PtrToIntInst(NGEP, CI.getType());
- }
- }
+ SmallVector<Value *, 8> NewIndices;
+ assert(!BCI || !GEP->hasOneUse() ||
+ !GEP->accumulateConstantOffset(DL, Offset) ||
+ !FindElementAtOffset(BCI->getOperand(0)->getType(),
+ Offset.getSExtValue(), NewIndices));
+#endif
}
return commonCastTransforms(CI);
diff --git a/llvm/test/Transforms/InstCombine/2007-05-14-Crash.ll b/llvm/test/Transforms/InstCombine/2007-05-14-Crash.ll
index a3d21659143..056ff2cf826 100644
--- a/llvm/test/Transforms/InstCombine/2007-05-14-Crash.ll
+++ b/llvm/test/Transforms/InstCombine/2007-05-14-Crash.ll
@@ -15,4 +15,10 @@ entry:
ret i8* %tmp35
}
-
+define i32* @bar(%struct.abc* %abc) {
+entry:
+ %tmp1 = bitcast %struct.abc* %abc to %struct.def*
+ %tmp3 = getelementptr %struct.def, %struct.def* %tmp1, i32 0, i32 1
+ %tmp35 = bitcast %struct.abc* %tmp3 to i32*
+ ret i32* %tmp35
+}
OpenPOWER on IntegriCloud