Revert "Remove an InstCombine that seems to have become redundant."
authorDavid Blaikie <dblaikie@gmail.com>
Tue, 24 Mar 2015 21:50:35 +0000 (21:50 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Tue, 24 Mar 2015 21:50:35 +0000 (21:50 +0000)
Assertion fires in compiler-rt. Guess it does fire..

This reverts commit r233116.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@233121 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/InstCombine/InstCombineCasts.cpp
test/Transforms/InstCombine/2007-05-14-Crash.ll

index 94883cab12a8c09344e9bd60013c080a76f81253..0625d8deca0b5b3d5953978c767745d6cca7fe3e 100644 (file)
@@ -1455,20 +1455,35 @@ 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.
-    // 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);
+    unsigned AS = GEP->getPointerAddressSpace();
+    unsigned OffsetBits = DL.getPointerSizeInBits(AS);
+    APInt Offset(OffsetBits, 0);
     BitCastInst *BCI = dyn_cast<BitCastInst>(GEP->getOperand(0));
-    SmallVector<Value *, 8> NewIndices;
-    assert(!BCI || !GEP->hasOneUse() ||
-           !GEP->accumulateConstantOffset(DL, Offset) ||
-           !FindElementAtOffset(BCI->getOperand(0)->getType(),
-                                Offset.getSExtValue(), NewIndices));
-#endif
+    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());
+      }
+    }
   }
 
   return commonCastTransforms(CI);
index 056ff2cf826454a1aaa8c9e5b5808b920bba43f5..a3d216591439630b0991b904f1fab687fc20fa03 100644 (file)
@@ -15,10 +15,4 @@ 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
-}
+