diff options
author | David Blaikie <dblaikie@gmail.com> | 2015-03-24 21:31:31 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2015-03-24 21:31:31 +0000 |
commit | e37e10dc5735a2757988ec1484b37606fc6b37e6 (patch) | |
tree | ec0974b8ff8d430964d0e55f4d41368390d380d2 | |
parent | 885e78cb22dcfd882c1d54082569573cc17de6c7 (diff) | |
download | bcm5719-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.cpp | 41 | ||||
-rw-r--r-- | llvm/test/Transforms/InstCombine/2007-05-14-Crash.ll | 8 |
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 +} |