diff options
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp | 36 | 
1 files changed, 21 insertions, 15 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index b12fc013576..1b389b92e8d 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -29,6 +29,26 @@ static Type *getPromotedType(Type *Ty) {    return Ty;  } +/// reduceToSingleValueType - Given an aggregate type which ultimately holds a +/// single scalar element, like {{{type}}} or [1 x type], return type. +static Type *reduceToSingleValueType(Type *T) { +  while (!T->isSingleValueType()) { +    if (StructType *STy = dyn_cast<StructType>(T)) { +      if (STy->getNumElements() == 1) +        T = STy->getElementType(0); +      else +        break; +    } else if (ArrayType *ATy = dyn_cast<ArrayType>(T)) { +      if (ATy->getNumElements() == 1) +        T = ATy->getElementType(); +      else +        break; +    } else +      break; +  } + +  return T; +}  Instruction *InstCombiner::SimplifyMemTransfer(MemIntrinsic *MI) {    unsigned DstAlign = getKnownAlignment(MI->getArgOperand(0), TD); @@ -80,20 +100,7 @@ Instruction *InstCombiner::SimplifyMemTransfer(MemIntrinsic *MI) {      if (TD && SrcETy->isSized() && TD->getTypeStoreSize(SrcETy) == Size) {        // The SrcETy might be something like {{{double}}} or [1 x double].  Rip        // down through these levels if so. -      while (!SrcETy->isSingleValueType()) { -        if (StructType *STy = dyn_cast<StructType>(SrcETy)) { -          if (STy->getNumElements() == 1) -            SrcETy = STy->getElementType(0); -          else -            break; -        } else if (ArrayType *ATy = dyn_cast<ArrayType>(SrcETy)) { -          if (ATy->getNumElements() == 1) -            SrcETy = ATy->getElementType(); -          else -            break; -        } else -          break; -      } +      SrcETy = reduceToSingleValueType(SrcETy);        if (SrcETy->isSingleValueType()) {          NewSrcPtrTy = PointerType::get(SrcETy, SrcAddrSp); @@ -102,7 +109,6 @@ Instruction *InstCombiner::SimplifyMemTransfer(MemIntrinsic *MI) {      }    } -    // If the memcpy/memmove provides better alignment info than we can    // infer, use it.    SrcAlign = std::max(SrcAlign, CopyAlign);  | 

