[llvm] aafde06 - [InstCombine] Turn (extractelement <1 x i64/double> (bitcast (x86_mmx))) into a single bitcast from x86_mmx to i64/double.

Craig Topper via llvm-commits llvm-commits at lists.llvm.org
Sun Nov 10 18:03:42 PST 2019


Author: Craig Topper
Date: 2019-11-10T16:25:25-08:00
New Revision: aafde063aaf09285c701c80cd4b543c2beb523e8

URL: https://github.com/llvm/llvm-project/commit/aafde063aaf09285c701c80cd4b543c2beb523e8
DIFF: https://github.com/llvm/llvm-project/commit/aafde063aaf09285c701c80cd4b543c2beb523e8.diff

LOG: [InstCombine] Turn (extractelement <1 x i64/double> (bitcast (x86_mmx))) into a single bitcast from x86_mmx to i64/double.

The _m64 type is represented in IR as <1 x i64>. The x86-64 ABI
on Linux passes <1 x i64> as a double. MMX intrinsics use x86_mmx
type in IR.These things result in a lot of bitcasts in mmx code.
There's another instcombine that tries to turn bitcast <1 x i64>
to double into extractelement and a bitcast.

The combine here tries to reverse this extractelement conversion
if we see an mmx type.

Added: 
    

Modified: 
    llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
    llvm/test/Transforms/InstCombine/bitcast-vec-canon.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp b/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
index 9c890748e5ab..824486cf0a6f 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp
@@ -435,6 +435,13 @@ Instruction *InstCombiner::visitExtractElementInst(ExtractElementInst &EI) {
         Worklist.AddValue(EE);
         return CastInst::Create(CI->getOpcode(), EE, EI.getType());
       }
+
+      // If the input is a bitcast from x86_mmx, turn into a single bitcast from
+      // the mmx type to the scalar type.
+      if (CI->getOpcode() == Instruction::BitCast &&
+          EI.getVectorOperandType()->getNumElements() == 1 &&
+          CI->getOperand(0)->getType()->isX86_MMXTy())
+        return new BitCastInst(CI->getOperand(0), EI.getType());
     }
   }
   return nullptr;

diff  --git a/llvm/test/Transforms/InstCombine/bitcast-vec-canon.ll b/llvm/test/Transforms/InstCombine/bitcast-vec-canon.ll
index 486a78529c51..21c8e78bbb16 100644
--- a/llvm/test/Transforms/InstCombine/bitcast-vec-canon.ll
+++ b/llvm/test/Transforms/InstCombine/bitcast-vec-canon.ll
@@ -59,8 +59,7 @@ define <1 x i64> @f(x86_mmx %y) {
 define double @g(x86_mmx %x) {
 ; CHECK-LABEL: @g(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[BC:%.*]] = bitcast x86_mmx %x to <1 x double>
-; CHECK-NEXT:    [[TMP0:%.*]] = extractelement <1 x double> [[BC]], i32 0
+; CHECK-NEXT:    [[TMP0:%.*]] = bitcast x86_mmx [[X:%.*]] to double
 ; CHECK-NEXT:    ret double [[TMP0]]
 ;
 entry:


        


More information about the llvm-commits mailing list