Commit 5ebbabc1 authored by Craig Topper's avatar Craig Topper
Browse files

[InstCombine] Revert aafde063 and...

[InstCombine] Revert aafde063 and 6749dc34 related to bitcast handling of x86_mmx

This reverts these two commits
[InstCombine] Turn (extractelement <1 x i64/double> (bitcast (x86_mmx))) into a single bitcast from x86_mmx to i64/double.
[InstCombine] Don't transform bitcasts between x86_mmx and v1i64 into insertelement/extractelement

We're seeing at least one internal test failure related to a
bitcast that was previously before an inline assembly block
containing emms being placed after it. This leads to the mmx
state ending up not empty after the emms. IR has no way to
make any specific guarantees about this. Reverting these patches
to get back to previous behavior which at least worked for this
test.
parent 15a172be
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -2394,8 +2394,7 @@ Instruction *InstCombiner::visitBitCast(BitCastInst &CI) {
  }

  if (VectorType *DestVTy = dyn_cast<VectorType>(DestTy)) {
    if (DestVTy->getNumElements() == 1 &&
        VectorType::isValidElementType(SrcTy)) {
    if (DestVTy->getNumElements() == 1 && !SrcTy->isVectorTy()) {
      Value *Elem = Builder.CreateBitCast(Src, DestVTy->getElementType());
      return InsertElementInst::Create(UndefValue::get(DestTy), Elem,
                     Constant::getNullValue(Type::getInt32Ty(CI.getContext())));
@@ -2427,7 +2426,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 (VectorType::isValidElementType(DestTy)) {
      if (!DestTy->isVectorTy()) {
        Value *Elem =
          Builder.CreateExtractElement(Src,
                     Constant::getNullValue(Type::getInt32Ty(CI.getContext())));
+0 −7
Original line number Diff line number Diff line
@@ -435,13 +435,6 @@ 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;
+5 −3
Original line number Diff line number Diff line
@@ -40,7 +40,8 @@ define <1 x i64> @d(i64 %y) {

define x86_mmx @e(<1 x i64> %y) {
; CHECK-LABEL: @e(
; CHECK-NEXT:    [[C:%.*]] = bitcast <1 x i64> %y to x86_mmx
; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <1 x i64> %y, i32 0
; CHECK-NEXT:    [[C:%.*]] = bitcast i64 [[TMP1]] to x86_mmx
; CHECK-NEXT:    ret x86_mmx [[C]]
;
  %c = bitcast <1 x i64> %y to x86_mmx
@@ -49,7 +50,8 @@ define x86_mmx @e(<1 x i64> %y) {

define <1 x i64> @f(x86_mmx %y) {
; CHECK-LABEL: @f(
; CHECK-NEXT:    [[C:%.*]] = bitcast x86_mmx [[Y:%.*]] to <1 x i64>
; CHECK-NEXT:    [[TMP1:%.*]] = bitcast x86_mmx %y to i64
; CHECK-NEXT:    [[C:%.*]] = insertelement <1 x i64> undef, i64 [[TMP1]], i32 0
; CHECK-NEXT:    ret <1 x i64> [[C]]
;
  %c = bitcast x86_mmx %y to <1 x i64>
@@ -59,7 +61,7 @@ define <1 x i64> @f(x86_mmx %y) {
define double @g(x86_mmx %x) {
; CHECK-LABEL: @g(
; CHECK-NEXT:  entry:
; CHECK-NEXT:    [[TMP0:%.*]] = bitcast x86_mmx [[X:%.*]] to double
; CHECK-NEXT:    [[TMP0:%.*]] = bitcast x86_mmx %x to double
; CHECK-NEXT:    ret double [[TMP0]]
;
entry: