}
}
+ if (const VectorType *DestVTy = dyn_cast<VectorType>(DestTy)) {
+ if (DestVTy->getNumElements() == 1) {
+ if (!isa<VectorType>(SrcTy)) {
+ Value *Elem = InsertCastBefore(Instruction::BitCast, Src,
+ DestVTy->getElementType(), CI);
+ return InsertElementInst::Create(Context->getUndef(DestTy), Elem,
+ Context->getNullValue(Type::Int32Ty));
+ }
+ // FIXME: Canonicalize bitcast(insertelement) -> insertelement(bitcast)
+ }
+ }
+
+ if (const VectorType *SrcVTy = dyn_cast<VectorType>(SrcTy)) {
+ if (SrcVTy->getNumElements() == 1) {
+ if (!isa<VectorType>(DestTy)) {
+ Instruction *Elem =
+ new ExtractElementInst(Src, Context->getNullValue(Type::Int32Ty));
+ InsertNewInstBefore(Elem, CI);
+ return CastInst::Create(Instruction::BitCast, Elem, DestTy);
+ }
+ }
+ }
+
if (ShuffleVectorInst *SVI = dyn_cast<ShuffleVectorInst>(Src)) {
if (SVI->hasOneUse()) {
// Okay, we have (bitconvert (shuffle ..)). Check to see if this is
Context->getConstantInt(Type::Int32Ty, SrcIdx, false));
}
}
+ // FIXME: Canonicalize extractelement(bitcast) -> bitcast(extractelement)
}
return 0;
}
--- /dev/null
+; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep element | count 4
+
+define double @a(<1 x i64> %y) {
+ %c = bitcast <1 x i64> %y to double
+ ret double %c
+}
+
+define i64 @b(<1 x i64> %y) {
+ %c = bitcast <1 x i64> %y to i64
+ ret i64 %c
+}
+
+define <1 x i64> @c(double %y) {
+ %c = bitcast double %y to <1 x i64>
+ ret <1 x i64> %c
+}
+
+define <1 x i64> @d(i64 %y) {
+ %c = bitcast i64 %y to <1 x i64>
+ ret <1 x i64> %c
+}
+