diff options
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp | 7 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstCombine/bitcast-vec-canon.ll | 3 |
2 files changed, 8 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp b/llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp index 9c890748e5a..824486cf0a6 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 486a78529c5..21c8e78bbb1 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: |

