Reapply: [InstSimplify] Add support for bitcasts"

This reverts commit r276700 and reapplies r276698.
The relevant clang tests have been updated.

llvm-svn: 276727
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index 981fb97..8fde9c7 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -70,6 +70,7 @@
 static Value *SimplifyOrInst(Value *, Value *, const Query &, unsigned);
 static Value *SimplifyXorInst(Value *, Value *, const Query &, unsigned);
 static Value *SimplifyTruncInst(Value *, Type *, const Query &, unsigned);
+static Value *SimplifyBitCastInst(Value *, Type *, const Query &, unsigned);
 
 /// For a boolean type, or a vector of boolean type, return false, or
 /// a vector with every element false, as appropriate for the type.
@@ -3810,6 +3811,30 @@
                              RecursionLimit);
 }
 
+static Value *SimplifyBitCastInst(Value *Op, Type *Ty, const Query &Q, unsigned) {
+  if (auto *C = dyn_cast<Constant>(Op))
+    return ConstantFoldCastOperand(Instruction::BitCast, C, Ty, Q.DL);
+
+  // bitcast x -> x
+  if (Op->getType() == Ty)
+    return Op;
+
+  // bitcast(bitcast x) -> x
+  if (auto *BC = dyn_cast<BitCastInst>(Op))
+    if (BC->getOperand(0)->getType() == Ty)
+      return BC->getOperand(0);
+
+  return nullptr;
+}
+
+Value *llvm::SimplifyBitCastInst(Value *Op, Type *Ty, const DataLayout &DL,
+                               const TargetLibraryInfo *TLI,
+                               const DominatorTree *DT, AssumptionCache *AC,
+                               const Instruction *CxtI) {
+  return ::SimplifyBitCastInst(Op, Ty, Query(DL, TLI, DT, AC, CxtI),
+                               RecursionLimit);
+}
+
 //=== Helper functions for higher up the class hierarchy.
 
 /// Given operands for a BinaryOperator, see if we can fold the result.
@@ -4280,6 +4305,10 @@
     Result =
         SimplifyTruncInst(I->getOperand(0), I->getType(), DL, TLI, DT, AC, I);
     break;
+  case Instruction::BitCast:
+    Result =
+        SimplifyBitCastInst(I->getOperand(0), I->getType(), DL, TLI, DT, AC, I);
+    break;
   }
 
   // In general, it is possible for computeKnownBits to determine all bits in a