From ea96ec05546566dd7bd0eb55f9be8a203a381939 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Thu, 7 Nov 2019 14:59:14 -0800 Subject: [PATCH] [InstCombine] Don't transform bitcasts between x86_mmx and v1i64 into insertelement/extractelement x86_mmx is conceptually a vector already. Don't introduce an extra conversion between it and scalar i64. I'm using VectorType::isValidElementType which checks for floating point, integer, and pointers to hopefully make this more readable than just blacklisting x86_mmx. Differential Revision: https://reviews.llvm.org/D69964 --- lib/Transforms/InstCombine/InstCombineCasts.cpp | 5 +++-- test/Transforms/InstCombine/bitcast-vec-canon.ll | 6 ++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/Transforms/InstCombine/InstCombineCasts.cpp b/lib/Transforms/InstCombine/InstCombineCasts.cpp index 65aaef28d87..0390368c4bb 100644 --- a/lib/Transforms/InstCombine/InstCombineCasts.cpp +++ b/lib/Transforms/InstCombine/InstCombineCasts.cpp @@ -2359,7 +2359,8 @@ Instruction *InstCombiner::visitBitCast(BitCastInst &CI) { } if (VectorType *DestVTy = dyn_cast(DestTy)) { - if (DestVTy->getNumElements() == 1 && !SrcTy->isVectorTy()) { + if (DestVTy->getNumElements() == 1 && + VectorType::isValidElementType(SrcTy)) { Value *Elem = Builder.CreateBitCast(Src, DestVTy->getElementType()); return InsertElementInst::Create(UndefValue::get(DestTy), Elem, Constant::getNullValue(Type::getInt32Ty(CI.getContext()))); @@ -2391,7 +2392,7 @@ Instruction *InstCombiner::visitBitCast(BitCastInst &CI) { if (SrcVTy->getNumElements() == 1) { // If our destination is not a vector, then make this a straight // scalar-scalar cast. - if (!DestTy->isVectorTy()) { + if (VectorType::isValidElementType(DestTy)) { Value *Elem = Builder.CreateExtractElement(Src, Constant::getNullValue(Type::getInt32Ty(CI.getContext()))); diff --git a/test/Transforms/InstCombine/bitcast-vec-canon.ll b/test/Transforms/InstCombine/bitcast-vec-canon.ll index 8b408e746b4..ee77e0629f4 100644 --- a/test/Transforms/InstCombine/bitcast-vec-canon.ll +++ b/test/Transforms/InstCombine/bitcast-vec-canon.ll @@ -40,8 +40,7 @@ define <1 x i64> @d(i64 %y) { define x86_mmx @e(<1 x i64> %y) { ; CHECK-LABEL: @e( -; CHECK-NEXT: [[TMP1:%.*]] = extractelement <1 x i64> %y, i32 0 -; CHECK-NEXT: [[C:%.*]] = bitcast i64 [[TMP1]] to x86_mmx +; CHECK-NEXT: [[C:%.*]] = bitcast <1 x i64> %y to x86_mmx ; CHECK-NEXT: ret x86_mmx [[C]] ; %c = bitcast <1 x i64> %y to x86_mmx @@ -50,8 +49,7 @@ define x86_mmx @e(<1 x i64> %y) { define <1 x i64> @f(x86_mmx %y) { ; CHECK-LABEL: @f( -; CHECK-NEXT: [[TMP1:%.*]] = bitcast x86_mmx %y to i64 -; CHECK-NEXT: [[C:%.*]] = insertelement <1 x i64> undef, i64 [[TMP1]], i32 0 +; CHECK-NEXT: [[C:%.*]] = bitcast x86_mmx %y to <1 x i64> ; CHECK-NEXT: ret <1 x i64> [[C]] ; %c = bitcast x86_mmx %y to <1 x i64>