[PATCH] D69964: [InstCombine] Don't transform bitcasts between x86_mmx and v1i64 into insertelement/extractelement

Craig Topper via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 7 13:18:42 PST 2019


craig.topper created this revision.
craig.topper added reviewers: spatel, RKSimon, efriedma.
Herald added a subscriber: hiraditya.
Herald added a project: LLVM.

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.


https://reviews.llvm.org/D69964

Files:
  llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
  llvm/test/Transforms/InstCombine/bitcast-vec-canon.ll


Index: llvm/test/Transforms/InstCombine/bitcast-vec-canon.ll
===================================================================
--- llvm/test/Transforms/InstCombine/bitcast-vec-canon.ll
+++ llvm/test/Transforms/InstCombine/bitcast-vec-canon.ll
@@ -40,8 +40,7 @@
 
 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 <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>
Index: llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
===================================================================
--- llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
+++ llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
@@ -2359,7 +2359,8 @@
   }
 
   if (VectorType *DestVTy = dyn_cast<VectorType>(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 @@
     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())));


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D69964.228296.patch
Type: text/x-patch
Size: 2075 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191107/a16e86ca/attachment.bin>


More information about the llvm-commits mailing list