summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineVectorOps.cpp7
-rw-r--r--llvm/test/Transforms/InstCombine/bitcast-vec-canon.ll3
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:
OpenPOWER on IntegriCloud