InstCombineCalls.cpp revision 0b8c9a80f20772c3793201ab5b251d3520b9cea3
1d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek//===- InstCombineCalls.cpp -----------------------------------------------===//
2d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek//
3d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek//                     The LLVM Compiler Infrastructure
4d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek//
5d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek// This file is distributed under the University of Illinois Open Source
6d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek// License. See LICENSE.TXT for details.
7d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek//
8d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek//===----------------------------------------------------------------------===//
9d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek//
10d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek// This file implements the visitCall and visitInvoke functions.
11d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek//
12d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek//===----------------------------------------------------------------------===//
13d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek
14d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek#include "InstCombine.h"
15d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek#include "llvm/ADT/Statistic.h"
16d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek#include "llvm/Analysis/MemoryBuiltins.h"
17d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek#include "llvm/IR/DataLayout.h"
18d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek#include "llvm/Support/CallSite.h"
1988145034694ed5267fa6fa5febc54fadc02bd479Steve Naroff#include "llvm/Support/PatternMatch.h"
203d31560343856c573376a04558a7111e7afad4f7Chandler Carruth#include "llvm/Transforms/Utils/BuildLibCalls.h"
210a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor#include "llvm/Transforms/Utils/Local.h"
2288145034694ed5267fa6fa5febc54fadc02bd479Steve Naroffusing namespace llvm;
23d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenekusing namespace PatternMatch;
24d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek
25d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted KremenekSTATISTIC(NumSimplified, "Number of library calls simplified");
26d2fa56687f8bd5ac6ebf9d9468d0efd714986a54Ted Kremenek
2788145034694ed5267fa6fa5febc54fadc02bd479Steve Naroff/// getPromotedType - Return the specified type promoted as it would be to pass
282e06fc877a633abea3b40a64950c7316dac29ca8John Thompson/// though a va_arg area.
292e06fc877a633abea3b40a64950c7316dac29ca8John Thompsonstatic Type *getPromotedType(Type *Ty) {
302e06fc877a633abea3b40a64950c7316dac29ca8John Thompson  if (IntegerType* ITy = dyn_cast<IntegerType>(Ty)) {
312e06fc877a633abea3b40a64950c7316dac29ca8John Thompson    if (ITy->getBitWidth() < 32)
322e06fc877a633abea3b40a64950c7316dac29ca8John Thompson      return Type::getInt32Ty(Ty->getContext());
332e06fc877a633abea3b40a64950c7316dac29ca8John Thompson  }
342e06fc877a633abea3b40a64950c7316dac29ca8John Thompson  return Ty;
352e06fc877a633abea3b40a64950c7316dac29ca8John Thompson}
362e06fc877a633abea3b40a64950c7316dac29ca8John Thompson
372e06fc877a633abea3b40a64950c7316dac29ca8John Thompson/// reduceToSingleValueType - Given an aggregate type which ultimately holds a
3820d416c36b46dd19ee0b1ea2d0266ae43be86e51Douglas Gregor/// single scalar element, like {{{type}}} or [1 x type], return type.
3920d416c36b46dd19ee0b1ea2d0266ae43be86e51Douglas Gregorstatic Type *reduceToSingleValueType(Type *T) {
401efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar  while (!T->isSingleValueType()) {
41f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor    if (StructType *STy = dyn_cast<StructType>(T)) {
42f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor      if (STy->getNumElements() == 1)
43f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor        T = STy->getElementType(0);
44f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor      else
45f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor        break;
461efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar    } else if (ArrayType *ATy = dyn_cast<ArrayType>(T)) {
47f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor      if (ATy->getNumElements() == 1)
48f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor        T = ATy->getElementType();
49f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor      else
501efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar        break;
511efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar    } else
52f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor      break;
5320d416c36b46dd19ee0b1ea2d0266ae43be86e51Douglas Gregor  }
5420d416c36b46dd19ee0b1ea2d0266ae43be86e51Douglas Gregor
5520d416c36b46dd19ee0b1ea2d0266ae43be86e51Douglas Gregor  return T;
561efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar}
577f17376e0931a337d544b75d9030bc92763be287Douglas Gregor
587f17376e0931a337d544b75d9030bc92763be287Douglas GregorInstruction *InstCombiner::SimplifyMemTransfer(MemIntrinsic *MI) {
597f17376e0931a337d544b75d9030bc92763be287Douglas Gregor  unsigned DstAlign = getKnownAlignment(MI->getArgOperand(0), TD);
607f17376e0931a337d544b75d9030bc92763be287Douglas Gregor  unsigned SrcAlign = getKnownAlignment(MI->getArgOperand(1), TD);
617f17376e0931a337d544b75d9030bc92763be287Douglas Gregor  unsigned MinAlign = std::min(DstAlign, SrcAlign);
62600866cc7d6d9ec2e27d4b6d6ec461f6463b5ab6Steve Naroff  unsigned CopyAlign = MI->getAlignment();
637f17376e0931a337d544b75d9030bc92763be287Douglas Gregor
647f17376e0931a337d544b75d9030bc92763be287Douglas Gregor  if (CopyAlign < MinAlign) {
657f17376e0931a337d544b75d9030bc92763be287Douglas Gregor    MI->setAlignment(ConstantInt::get(MI->getAlignmentType(),
6650398199fb10e196a8d92fbf7a062dbe42ed88fdSteve Naroff                                             MinAlign, false));
67600866cc7d6d9ec2e27d4b6d6ec461f6463b5ab6Steve Naroff    return MI;
687f17376e0931a337d544b75d9030bc92763be287Douglas Gregor  }
69c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
70c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  // If MemCpyInst length is 1/2/4/8 bytes then replace memcpy with
717f17376e0931a337d544b75d9030bc92763be287Douglas Gregor  // load/store.
72c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  ConstantInt *MemOpLength = dyn_cast<ConstantInt>(MI->getArgOperand(2));
731efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar  if (MemOpLength == 0) return 0;
74735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor
75735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor  // Source and destination pointer types are always "i8*" for intrinsic.  See
76735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor  // if the size is something we can handle with a single primitive load/store.
77735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor  // A single load+store correctly handles overlapping memory in the memmove
78735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor  // case.
79735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor  uint64_t Size = MemOpLength->getLimitedValue();
80735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor  assert(Size && "0-sized memory transfering should be removed already.");
81735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor
821efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar  if (Size > 8 || (Size&(Size-1)))
831efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar    return 0;  // If not 1/2/4/8 bytes, exit.
84735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor
85735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor  // Use an integer load+store unless we can find something better.
86735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor  unsigned SrcAddrSp =
87735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor    cast<PointerType>(MI->getArgOperand(1)->getType())->getAddressSpace();
88735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor  unsigned DstAddrSp =
891efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar    cast<PointerType>(MI->getArgOperand(0)->getType())->getAddressSpace();
90c8dfe5ece04e683106eb96c58a2999f70b53ac21Douglas Gregor
91735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor  IntegerType* IntType = IntegerType::get(MI->getContext(), Size<<3);
92735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor  Type *NewSrcPtrTy = PointerType::get(IntType, SrcAddrSp);
93735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor  Type *NewDstPtrTy = PointerType::get(IntType, DstAddrSp);
94735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor
95c8dfe5ece04e683106eb96c58a2999f70b53ac21Douglas Gregor  // Memcpy forces the use of i8* for the source and destination.  That means
96735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor  // that if you're using memcpy to move one double around, you'll get a cast
97735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor  // from double* to i8*.  We'd much rather use a double load+store rather than
98735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor  // an i64 load+store, here because this improves the odds that the source or
99735df88a38e80c1ca70daa889aa516b8b9f54b50Douglas Gregor  // dest address will be promotable.  See if we can find a better type than the
100076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne  // integer datatype.
101076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne  Value *StrippedDest = MI->getArgOperand(0)->stripPointerCasts();
102076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne  MDNode *CopyMD = 0;
103076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne  if (StrippedDest != MI->getArgOperand(0)) {
104076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne    Type *SrcETy = cast<PointerType>(StrippedDest->getType())
10558ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor                                    ->getElementType();
106076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne    if (TD && SrcETy->isSized() && TD->getTypeStoreSize(SrcETy) == Size) {
107076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne      // The SrcETy might be something like {{{double}}} or [1 x double].  Rip
108076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne      // down through these levels if so.
10958ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor      SrcETy = reduceToSingleValueType(SrcETy);
110076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne
111076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne      if (SrcETy->isSingleValueType()) {
112076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne        NewSrcPtrTy = PointerType::get(SrcETy, SrcAddrSp);
113076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne        NewDstPtrTy = PointerType::get(SrcETy, DstAddrSp);
11458ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor
115076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne        // If the memcpy has metadata describing the members, see if we can
116076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne        // get the TBAA tag describing our copy.
117076c22a99ed82e11b59e8fbf57d8467ceb3fec77Peter Collingbourne        if (MDNode *M = MI->getMetadata(LLVMContext::MD_tbaa_struct)) {
11858ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor          if (M->getNumOperands() == 3 &&
11958ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor              M->getOperand(0) &&
12058ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor              isa<ConstantInt>(M->getOperand(0)) &&
1217f17376e0931a337d544b75d9030bc92763be287Douglas Gregor              cast<ConstantInt>(M->getOperand(0))->isNullValue() &&
1227f17376e0931a337d544b75d9030bc92763be287Douglas Gregor              M->getOperand(1) &&
1237f17376e0931a337d544b75d9030bc92763be287Douglas Gregor              isa<ConstantInt>(M->getOperand(1)) &&
1247f17376e0931a337d544b75d9030bc92763be287Douglas Gregor              cast<ConstantInt>(M->getOperand(1))->getValue() == Size &&
1257f17376e0931a337d544b75d9030bc92763be287Douglas Gregor              M->getOperand(2) &&
1261efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar              isa<MDNode>(M->getOperand(2)))
1277f17376e0931a337d544b75d9030bc92763be287Douglas Gregor            CopyMD = cast<MDNode>(M->getOperand(2));
1287f17376e0931a337d544b75d9030bc92763be287Douglas Gregor        }
1297f17376e0931a337d544b75d9030bc92763be287Douglas Gregor      }
1307f17376e0931a337d544b75d9030bc92763be287Douglas Gregor    }
1317f17376e0931a337d544b75d9030bc92763be287Douglas Gregor  }
1327f17376e0931a337d544b75d9030bc92763be287Douglas Gregor
1337f17376e0931a337d544b75d9030bc92763be287Douglas Gregor  // If the memcpy/memmove provides better alignment info than we can
134ef0cef6cec8de5fc60e469a93436eed7212e0dc2Steve Naroff  // infer, use it.
135ef0cef6cec8de5fc60e469a93436eed7212e0dc2Steve Naroff  SrcAlign = std::max(SrcAlign, CopyAlign);
136ef0cef6cec8de5fc60e469a93436eed7212e0dc2Steve Naroff  DstAlign = std::max(DstAlign, CopyAlign);
137ef0cef6cec8de5fc60e469a93436eed7212e0dc2Steve Naroff
138ef0cef6cec8de5fc60e469a93436eed7212e0dc2Steve Naroff  Value *Src = Builder->CreateBitCast(MI->getArgOperand(1), NewSrcPtrTy);
139ef0cef6cec8de5fc60e469a93436eed7212e0dc2Steve Naroff  Value *Dest = Builder->CreateBitCast(MI->getArgOperand(0), NewDstPtrTy);
140ef0cef6cec8de5fc60e469a93436eed7212e0dc2Steve Naroff  LoadInst *L = Builder->CreateLoad(Src, MI->isVolatile());
141ef0cef6cec8de5fc60e469a93436eed7212e0dc2Steve Naroff  L->setAlignment(SrcAlign);
1427f17376e0931a337d544b75d9030bc92763be287Douglas Gregor  if (CopyMD)
1437f17376e0931a337d544b75d9030bc92763be287Douglas Gregor    L->setMetadata(LLVMContext::MD_tbaa, CopyMD);
1447f17376e0931a337d544b75d9030bc92763be287Douglas Gregor  StoreInst *S = Builder->CreateStore(L, Dest, MI->isVolatile());
145ef0cef6cec8de5fc60e469a93436eed7212e0dc2Steve Naroff  S->setAlignment(DstAlign);
146ef0cef6cec8de5fc60e469a93436eed7212e0dc2Steve Naroff  if (CopyMD)
1477f17376e0931a337d544b75d9030bc92763be287Douglas Gregor    S->setMetadata(LLVMContext::MD_tbaa, CopyMD);
1487f17376e0931a337d544b75d9030bc92763be287Douglas Gregor
1497f17376e0931a337d544b75d9030bc92763be287Douglas Gregor  // Set the size of the copy to 0, it will be deleted on the next iteration.
150ef0cef6cec8de5fc60e469a93436eed7212e0dc2Steve Naroff  MI->setArgOperand(2, Constant::getNullValue(MemOpLength->getType()));
151ef0cef6cec8de5fc60e469a93436eed7212e0dc2Steve Naroff  return MI;
1527f17376e0931a337d544b75d9030bc92763be287Douglas Gregor}
1537f17376e0931a337d544b75d9030bc92763be287Douglas Gregor
1547f17376e0931a337d544b75d9030bc92763be287Douglas GregorInstruction *InstCombiner::SimplifyMemSet(MemSetInst *MI) {
1551efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar  unsigned Alignment = getKnownAlignment(MI->getDest(), TD);
1561efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar  if (MI->getAlignment() < Alignment) {
157e56b4baeba5097852e04bc41ca2e0396cf729955Steve Naroff    MI->setAlignment(ConstantInt::get(MI->getAlignmentType(),
158e56b4baeba5097852e04bc41ca2e0396cf729955Steve Naroff                                             Alignment, false));
159e56b4baeba5097852e04bc41ca2e0396cf729955Steve Naroff    return MI;
160e56b4baeba5097852e04bc41ca2e0396cf729955Steve Naroff  }
161e56b4baeba5097852e04bc41ca2e0396cf729955Steve Naroff
1621efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar  // Extract the length and alignment and fill if they are constant.
163e56b4baeba5097852e04bc41ca2e0396cf729955Steve Naroff  ConstantInt *LenC = dyn_cast<ConstantInt>(MI->getLength());
164e56b4baeba5097852e04bc41ca2e0396cf729955Steve Naroff  ConstantInt *FillC = dyn_cast<ConstantInt>(MI->getValue());
165e56b4baeba5097852e04bc41ca2e0396cf729955Steve Naroff  if (!LenC || !FillC || !FillC->getType()->isIntegerTy(8))
166b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff    return 0;
167b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff  uint64_t Len = LenC->getLimitedValue();
1680a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor  Alignment = MI->getAlignment();
1690a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor  assert(Len && "0-sized memory setting should be removed already.");
170b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff
171b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff  // memset(s,c,n) -> store s, c (for n=1,2,4,8)
172b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff  if (Len <= 8 && isPowerOf2_32((uint32_t)Len)) {
173b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff    Type *ITy = IntegerType::get(MI->getContext(), Len*8);  // n=1 -> i8.
174b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff
175b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff    Value *Dest = MI->getDest();
1761efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar    unsigned DstAddrSp = cast<PointerType>(Dest->getType())->getAddressSpace();
177002a528ab0189fc60cfbf9328962c96ccbe567eeDouglas Gregor    Type *NewDstPtrTy = PointerType::get(ITy, DstAddrSp);
178b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff    Dest = Builder->CreateBitCast(Dest, NewDstPtrTy);
179b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff
180b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff    // Alignment 0 is identity for alignment 1 for memset, but not store.
181b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff    if (Alignment == 0) Alignment = 1;
182fd9f23464bfd35314c87c4df410f3937d59eb96dDaniel Dunbar
183fd9f23464bfd35314c87c4df410f3937d59eb96dDaniel Dunbar    // Extract the fill value and store.
184fd9f23464bfd35314c87c4df410f3937d59eb96dDaniel Dunbar    uint64_t Fill = FillC->getZExtValue()*0x0101010101010101ULL;
185b2cd48756119f4d8d2a865b4b3e0e8efd02e26a0Douglas Gregor    StoreInst *S = Builder->CreateStore(ConstantInt::get(ITy, Fill), Dest,
186b2cd48756119f4d8d2a865b4b3e0e8efd02e26a0Douglas Gregor                                        MI->isVolatile());
187b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff    S->setAlignment(Alignment);
188b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff
189b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff    // Set the size of the copy to 0, it will be deleted on the next iteration.
190b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff    MI->setLength(Constant::getNullValue(LenC->getType()));
191b4ece6377d95e35a8df01cd010d910c34d690f67Steve Naroff    return MI;
192e56b4baeba5097852e04bc41ca2e0396cf729955Steve Naroff  }
1930a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor
1940a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor  return 0;
195896b70ffc348f6e2c680b5fb5841984d5785b7b5Ted Kremenek}
1960087e1a12b67b6bb032a72ea485a863daeccf55bDouglas Gregor
1970087e1a12b67b6bb032a72ea485a863daeccf55bDouglas Gregor/// visitCallInst - CallInst simplification.  This mostly only handles folding
1980087e1a12b67b6bb032a72ea485a863daeccf55bDouglas Gregor/// of intrinsic instructions.  For normal calls, it allows visitCallSite to do
1990087e1a12b67b6bb032a72ea485a863daeccf55bDouglas Gregor/// the heavy lifting.
2000087e1a12b67b6bb032a72ea485a863daeccf55bDouglas Gregor///
2010087e1a12b67b6bb032a72ea485a863daeccf55bDouglas GregorInstruction *InstCombiner::visitCallInst(CallInst &CI) {
2028506dde586459887b7e14e23a30af8ac5be5adb6Daniel Dunbar  if (isFreeCall(&CI, TLI))
2031efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar    return visitFree(CI);
2041efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar
205c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  // If the caller function is nounwind, mark the call as nounwind, even if the
206f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor  // callee isn't.
207f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor  if (CI.getParent()->getParent()->doesNotThrow() &&
208f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor      !CI.doesNotThrow()) {
2091efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar    CI.setDoesNotThrow();
210f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor    return &CI;
211f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor  }
212f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor
213f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor  IntrinsicInst *II = dyn_cast<IntrinsicInst>(&CI);
2141efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar  if (!II) return visitCallSite(&CI);
215f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor
216f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor  // Intrinsics cannot occur in an invoke, so handle them here instead of in
217f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor  // visitCallSite.
21888145034694ed5267fa6fa5febc54fadc02bd479Steve Naroff  if (MemIntrinsic *MI = dyn_cast<MemIntrinsic>(II)) {
21974844072411bae91d5dbb89955d200cbe1e0a1c8Ted Kremenek    bool Changed = false;
2201efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar
221f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor    // memmove/cpy/set of zero bytes is a noop.
222f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor    if (Constant *NumBytes = dyn_cast<Constant>(MI->getLength())) {
223f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor      if (NumBytes->isNullValue())
22408b0e8daeb683686b876d72674962ad96df21d45Douglas Gregor        return EraseInstFromFunction(CI);
22588145034694ed5267fa6fa5febc54fadc02bd479Steve Naroff
2263c7313d96cd4a18cd8c1fcd3ddd8128c2fcbe58fDouglas Gregor      if (ConstantInt *CI = dyn_cast<ConstantInt>(NumBytes))
227b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor        if (CI->getZExtValue() == 1) {
228b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor          // Replace the instruction with just byte operations.  We would
229b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor          // transform other cases to loads/stores, but we don't know if
2301efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar          // alignment is sufficient.
231b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor        }
232b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor    }
233b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor
234b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor    // No other transformations apply to volatile transfers.
235b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor    if (MI->isVolatile())
2361efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar      return 0;
237b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor
2381efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar    // If we have a memmove and the source operation is a constant global,
239b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor    // then the source and dest pointers can't alias, so we can change this
240f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor    // into a call to memcpy.
241f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor    if (MemMoveInst *MMI = dyn_cast<MemMoveInst>(MI)) {
242f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor      if (GlobalVariable *GVSrc = dyn_cast<GlobalVariable>(MMI->getSource()))
243f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor        if (GVSrc->isConstant()) {
244f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor          Module *M = CI.getParent()->getParent()->getParent();
245f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor          Intrinsic::ID MemCpyID = Intrinsic::memcpy;
246f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor          Type *Tys[3] = { CI.getArgOperand(0)->getType(),
247f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor                           CI.getArgOperand(1)->getType(),
248f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor                           CI.getArgOperand(2)->getType() };
249f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor          CI.setCalledFunction(Intrinsic::getDeclaration(M, MemCpyID, Tys));
250f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor          Changed = true;
251f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor        }
252f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor    }
253f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor
254f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor    if (MemTransferInst *MTI = dyn_cast<MemTransferInst>(MI)) {
2551efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar      // memmove(x,x,size) -> noop.
256f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor      if (MTI->getSource() == MTI->getDest())
2571db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor        return EraseInstFromFunction(CI);
2581db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor    }
2591db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor
2601db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor    // If we can determine a pointer alignment that is bigger than currently
2611db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor    // set, update the alignment.
2623c7313d96cd4a18cd8c1fcd3ddd8128c2fcbe58fDouglas Gregor    if (isa<MemTransferInst>(MI)) {
2633c7313d96cd4a18cd8c1fcd3ddd8128c2fcbe58fDouglas Gregor      if (Instruction *I = SimplifyMemTransfer(MI))
2645352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        return I;
2651db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor    } else if (MemSetInst *MSI = dyn_cast<MemSetInst>(MI)) {
2663c7313d96cd4a18cd8c1fcd3ddd8128c2fcbe58fDouglas Gregor      if (Instruction *I = SimplifyMemSet(MSI))
267fe6fd3d41a7f48317d6856c9327b6cead32c3498Ted Kremenek        return I;
2683c7313d96cd4a18cd8c1fcd3ddd8128c2fcbe58fDouglas Gregor    }
269d52864bd33c66aacc84133460d8c9c0dfcdd5c18Daniel Dunbar
2703c7313d96cd4a18cd8c1fcd3ddd8128c2fcbe58fDouglas Gregor    if (Changed) return II;
2711db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor  }
2721db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor
2733c7313d96cd4a18cd8c1fcd3ddd8128c2fcbe58fDouglas Gregor  switch (II->getIntrinsicID()) {
2743c7313d96cd4a18cd8c1fcd3ddd8128c2fcbe58fDouglas Gregor  default: break;
2755352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  case Intrinsic::objectsize: {
2761db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor    uint64_t Size;
2771db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor    if (getObjectSize(II->getArgOperand(0), Size, TD, TLI))
2783c7313d96cd4a18cd8c1fcd3ddd8128c2fcbe58fDouglas Gregor      return ReplaceInstUsesWith(CI, ConstantInt::get(CI.getType(), Size));
279fe6fd3d41a7f48317d6856c9327b6cead32c3498Ted Kremenek    return 0;
2801db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor  }
281b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor  case Intrinsic::bswap: {
282b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor    Value *IIOperand = II->getArgOperand(0);
283b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor    Value *X = 0;
2841efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar
285b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor    // bswap(bswap(x)) -> x
286b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor    if (match(IIOperand, m_BSwap(m_Value(X))))
2871efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar        return ReplaceInstUsesWith(CI, X);
288b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor
289b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor    // bswap(trunc(bswap(x))) -> trunc(lshr(x, c))
290b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor    if (match(IIOperand, m_Trunc(m_BSwap(m_Value(X))))) {
291b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor      unsigned C = X->getType()->getPrimitiveSizeInBits() -
292b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor        IIOperand->getType()->getPrimitiveSizeInBits();
293b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor      Value *CV = ConstantInt::get(X->getType(), C);
294b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor      Value *V = Builder->CreateLShr(X, CV);
2951efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar      return new TruncInst(V, IIOperand->getType());
296b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor    }
2971efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar    break;
2981efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar  }
299b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor
300b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor  case Intrinsic::powi:
301b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor    if (ConstantInt *Power = dyn_cast<ConstantInt>(II->getArgOperand(1))) {
302b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor      // powi(x, 0) -> 1.0
303b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor      if (Power->isZero())
30483889a7f1f338e343ef72aeeef9c27f7b62c0f0fDavid Chisnall        return ReplaceInstUsesWith(CI, ConstantFP::get(CI.getType(), 1.0));
30583889a7f1f338e343ef72aeeef9c27f7b62c0f0fDavid Chisnall      // powi(x, 1) -> x
30683889a7f1f338e343ef72aeeef9c27f7b62c0f0fDavid Chisnall      if (Power->isOne())
30783889a7f1f338e343ef72aeeef9c27f7b62c0f0fDavid Chisnall        return ReplaceInstUsesWith(CI, II->getArgOperand(0));
30883889a7f1f338e343ef72aeeef9c27f7b62c0f0fDavid Chisnall      // powi(x, -1) -> 1/x
30983889a7f1f338e343ef72aeeef9c27f7b62c0f0fDavid Chisnall      if (Power->isAllOnesValue())
31083889a7f1f338e343ef72aeeef9c27f7b62c0f0fDavid Chisnall        return BinaryOperator::CreateFDiv(ConstantFP::get(CI.getType(), 1.0),
3111efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar                                          II->getArgOperand(0));
312b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor    }
3135352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    break;
3145352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  case Intrinsic::cttz: {
3155352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    // If all bits below the first known one are known zero,
316896b70ffc348f6e2c680b5fb5841984d5785b7b5Ted Kremenek    // this value is constant.
3175352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    IntegerType *IT = dyn_cast<IntegerType>(II->getArgOperand(0)->getType());
318b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor    // FIXME: Try to simplify vectors of integers.
319b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor    if (!IT) break;
320b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor    uint32_t BitWidth = IT->getBitWidth();
321b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor    APInt KnownZero(BitWidth, 0);
322b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor    APInt KnownOne(BitWidth, 0);
3231efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar    ComputeMaskedBits(II->getArgOperand(0), KnownZero, KnownOne);
324b979034b100be14de2223f2b8f6cc7a3275cbe4fDouglas Gregor    unsigned TrailingZeros = KnownOne.countTrailingZeros();
32546766dc31c09d89024de5aba9e22112a56eadbdfDouglas Gregor    APInt Mask(APInt::getLowBitsSet(BitWidth, TrailingZeros));
32646766dc31c09d89024de5aba9e22112a56eadbdfDouglas Gregor    if ((Mask & KnownZero) == Mask)
3271db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor      return ReplaceInstUsesWith(CI, ConstantInt::get(IT,
3281efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar                                 APInt(BitWidth, TrailingZeros)));
3291efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar
3301db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor    }
3311efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar    break;
3321db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor  case Intrinsic::ctlz: {
3331db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor    // If all bits above the first known one are known zero,
3341efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar    // this value is constant.
3351db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor    IntegerType *IT = dyn_cast<IntegerType>(II->getArgOperand(0)->getType());
3361db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor    // FIXME: Try to simplify vectors of integers.
3371efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar    if (!IT) break;
3381efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar    uint32_t BitWidth = IT->getBitWidth();
33946766dc31c09d89024de5aba9e22112a56eadbdfDouglas Gregor    APInt KnownZero(BitWidth, 0);
34046766dc31c09d89024de5aba9e22112a56eadbdfDouglas Gregor    APInt KnownOne(BitWidth, 0);
34146766dc31c09d89024de5aba9e22112a56eadbdfDouglas Gregor    ComputeMaskedBits(II->getArgOperand(0), KnownZero, KnownOne);
3421db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor    unsigned LeadingZeros = KnownOne.countLeadingZeros();
3431db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor    APInt Mask(APInt::getHighBitsSet(BitWidth, LeadingZeros));
3441db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor    if ((Mask & KnownZero) == Mask)
3451db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor      return ReplaceInstUsesWith(CI, ConstantInt::get(IT,
34646766dc31c09d89024de5aba9e22112a56eadbdfDouglas Gregor                                 APInt(BitWidth, LeadingZeros)));
34746766dc31c09d89024de5aba9e22112a56eadbdfDouglas Gregor
348e69517ce61638f12c9abe4605753a45275ac4e37Douglas Gregor    }
349e69517ce61638f12c9abe4605753a45275ac4e37Douglas Gregor    break;
3501efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar  case Intrinsic::uadd_with_overflow: {
3511efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar    Value *LHS = II->getArgOperand(0), *RHS = II->getArgOperand(1);
3521db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor    IntegerType *IT = cast<IntegerType>(II->getArgOperand(0)->getType());
3531db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor    uint32_t BitWidth = IT->getBitWidth();
3541db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor    APInt LHSKnownZero(BitWidth, 0);
3551db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor    APInt LHSKnownOne(BitWidth, 0);
3561efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar    ComputeMaskedBits(LHS, LHSKnownZero, LHSKnownOne);
3571efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar    bool LHSKnownNegative = LHSKnownOne[BitWidth - 1];
3581db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor    bool LHSKnownPositive = LHSKnownZero[BitWidth - 1];
3591db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor
3601db19dea8d221f27be46332d668d1e2decb7f1abDouglas Gregor    if (LHSKnownNegative || LHSKnownPositive) {
361f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor      APInt RHSKnownZero(BitWidth, 0);
362f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor      APInt RHSKnownOne(BitWidth, 0);
363f55254472e496340cbb4f0a24cff398e441475b5Douglas Gregor      ComputeMaskedBits(RHS, RHSKnownZero, RHSKnownOne);
364c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      bool RHSKnownNegative = RHSKnownOne[BitWidth - 1];
365c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      bool RHSKnownPositive = RHSKnownZero[BitWidth - 1];
3665352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor      if (LHSKnownNegative && RHSKnownNegative) {
3675352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        // The sign bit is set in both cases: this MUST overflow.
3685352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        // Create a simple add instruction, and insert it into the struct.
3695352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        Value *Add = Builder->CreateAdd(LHS, RHS);
3705352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        Add->takeName(&CI);
3715352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        Constant *V[] = {
3725352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor          UndefValue::get(LHS->getType()),
3735352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor          ConstantInt::getTrue(II->getContext())
3745352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        };
3755352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        StructType *ST = cast<StructType>(II->getType());
376896b70ffc348f6e2c680b5fb5841984d5785b7b5Ted Kremenek        Constant *Struct = ConstantStruct::get(ST, V);
3775352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        return InsertValueInst::Create(Struct, Add, 0);
3785352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor      }
3795352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor
380896b70ffc348f6e2c680b5fb5841984d5785b7b5Ted Kremenek      if (LHSKnownPositive && RHSKnownPositive) {
3815352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        // The sign bit is clear in both cases: this CANNOT overflow.
3825352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        // Create a simple add instruction, and insert it into the struct.
3835352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        Value *Add = Builder->CreateNUWAdd(LHS, RHS);
3845352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        Add->takeName(&CI);
3855352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        Constant *V[] = {
3865352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor          UndefValue::get(LHS->getType()),
3875352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor          ConstantInt::getFalse(II->getContext())
3885352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        };
3895352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        StructType *ST = cast<StructType>(II->getType());
3905352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        Constant *Struct = ConstantStruct::get(ST, V);
3915352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        return InsertValueInst::Create(Struct, Add, 0);
3925352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor      }
3935352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    }
3945352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  }
3955352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  // FALL THROUGH uadd into sadd
3965352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  case Intrinsic::sadd_with_overflow:
3975352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    // Canonicalize constants into the RHS.
3985352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    if (isa<Constant>(II->getArgOperand(0)) &&
3995352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        !isa<Constant>(II->getArgOperand(1))) {
4005352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor      Value *LHS = II->getArgOperand(0);
4015352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor      II->setArgOperand(0, II->getArgOperand(1));
4025352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor      II->setArgOperand(1, LHS);
4035352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor      return II;
4045352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    }
4055352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor
4065352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    // X + undef -> undef
4075352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    if (isa<UndefValue>(II->getArgOperand(1)))
4085352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor      return ReplaceInstUsesWith(CI, UndefValue::get(II->getType()));
4095352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor
4105352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    if (ConstantInt *RHS = dyn_cast<ConstantInt>(II->getArgOperand(1))) {
4115352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor      // X + 0 -> {X, false}
4125352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor      if (RHS->isZero()) {
413a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor        Constant *V[] = {
414a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor          UndefValue::get(II->getArgOperand(0)->getType()),
415a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor          ConstantInt::getFalse(II->getContext())
416a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor        };
417a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor        Constant *Struct =
418a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor          ConstantStruct::get(cast<StructType>(II->getType()), V);
419a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor        return InsertValueInst::Create(Struct, II->getArgOperand(0), 0);
4205352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor      }
421a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor    }
422a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor    break;
4235352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  case Intrinsic::usub_with_overflow:
424a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor  case Intrinsic::ssub_with_overflow:
425a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor    // undef - X -> undef
4265352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    // X - undef -> undef
427a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor    if (isa<UndefValue>(II->getArgOperand(0)) ||
428a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor        isa<UndefValue>(II->getArgOperand(1)))
429a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor      return ReplaceInstUsesWith(CI, UndefValue::get(II->getType()));
430a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor
431a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor    if (ConstantInt *RHS = dyn_cast<ConstantInt>(II->getArgOperand(1))) {
432a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor      // X - 0 -> {X, false}
433a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor      if (RHS->isZero()) {
4345352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        Constant *V[] = {
4355352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor          UndefValue::get(II->getArgOperand(0)->getType()),
4360a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor          ConstantInt::getFalse(II->getContext())
4370a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor        };
4380a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor        Constant *Struct =
4390a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor          ConstantStruct::get(cast<StructType>(II->getType()), V);
4400a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor        return InsertValueInst::Create(Struct, II->getArgOperand(0), 0);
4410a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor      }
4420a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    }
4430a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    break;
4440a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor  case Intrinsic::umul_with_overflow: {
4450a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    Value *LHS = II->getArgOperand(0), *RHS = II->getArgOperand(1);
4460a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    unsigned BitWidth = cast<IntegerType>(LHS->getType())->getBitWidth();
4470a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor
4480a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    APInt LHSKnownZero(BitWidth, 0);
4490a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    APInt LHSKnownOne(BitWidth, 0);
4500a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    ComputeMaskedBits(LHS, LHSKnownZero, LHSKnownOne);
4510a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    APInt RHSKnownZero(BitWidth, 0);
4520a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    APInt RHSKnownOne(BitWidth, 0);
4530a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    ComputeMaskedBits(RHS, RHSKnownZero, RHSKnownOne);
4540a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor
4550a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    // Get the largest possible values for each operand.
4560a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    APInt LHSMax = ~LHSKnownZero;
4570a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    APInt RHSMax = ~RHSKnownZero;
4580a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor
4590a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    // If multiplying the maximum values does not overflow then we can turn
4600a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    // this into a plain NUW mul.
4610a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    bool Overflow;
4620a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    LHSMax.umul_ov(RHSMax, Overflow);
4630a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    if (!Overflow) {
4640a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor      Value *Mul = Builder->CreateNUWMul(LHS, RHS, "umul_with_overflow");
4650a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor      Constant *V[] = {
4660a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor        UndefValue::get(LHS->getType()),
4670a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor        Builder->getFalse()
4680a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor      };
4690a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor      Constant *Struct = ConstantStruct::get(cast<StructType>(II->getType()),V);
470896b70ffc348f6e2c680b5fb5841984d5785b7b5Ted Kremenek      return InsertValueInst::Create(Struct, Mul, 0);
4710a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    }
4720a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor  } // FALL THROUGH
4730a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor  case Intrinsic::smul_with_overflow:
4740a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    // Canonicalize constants into the RHS.
4750a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    if (isa<Constant>(II->getArgOperand(0)) &&
4760a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor        !isa<Constant>(II->getArgOperand(1))) {
477274f1906f12ebf8fcc179701deeda6d3271120c1Douglas Gregor      Value *LHS = II->getArgOperand(0);
4780a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor      II->setArgOperand(0, II->getArgOperand(1));
479274f1906f12ebf8fcc179701deeda6d3271120c1Douglas Gregor      II->setArgOperand(1, LHS);
480896b70ffc348f6e2c680b5fb5841984d5785b7b5Ted Kremenek      return II;
481896b70ffc348f6e2c680b5fb5841984d5785b7b5Ted Kremenek    }
4820a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor
4830a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    // X * undef -> undef
4840a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    if (isa<UndefValue>(II->getArgOperand(1)))
4850a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor      return ReplaceInstUsesWith(CI, UndefValue::get(II->getType()));
486896b70ffc348f6e2c680b5fb5841984d5785b7b5Ted Kremenek
4870a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    if (ConstantInt *RHSI = dyn_cast<ConstantInt>(II->getArgOperand(1))) {
488274f1906f12ebf8fcc179701deeda6d3271120c1Douglas Gregor      // X*0 -> {0, false}
489274f1906f12ebf8fcc179701deeda6d3271120c1Douglas Gregor      if (RHSI->isZero())
4900a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor        return ReplaceInstUsesWith(CI, Constant::getNullValue(II->getType()));
491274f1906f12ebf8fcc179701deeda6d3271120c1Douglas Gregor
492274f1906f12ebf8fcc179701deeda6d3271120c1Douglas Gregor      // X * 1 -> {X, false}
4930a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor      if (RHSI->equalsInt(1)) {
4940a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor        Constant *V[] = {
4950a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor          UndefValue::get(II->getArgOperand(0)->getType()),
4960a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor          ConstantInt::getFalse(II->getContext())
4970a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor        };
4980a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor        Constant *Struct =
4990a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor          ConstantStruct::get(cast<StructType>(II->getType()), V);
5000a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor        return InsertValueInst::Create(Struct, II->getArgOperand(0), 0);
5010a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor      }
5020a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    }
5030a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    break;
5040a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor  case Intrinsic::ppc_altivec_lvx:
5050a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor  case Intrinsic::ppc_altivec_lvxl:
5060a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    // Turn PPC lvx -> load if the pointer is known aligned.
5070a812cf707da15dadd19fdeb0178b9707f4e01a6Douglas Gregor    if (getOrEnforceKnownAlignment(II->getArgOperand(0), 16, TD) >= 16) {
5085352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor      Value *Ptr = Builder->CreateBitCast(II->getArgOperand(0),
5095352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor                                         PointerType::getUnqual(II->getType()));
510896b70ffc348f6e2c680b5fb5841984d5785b7b5Ted Kremenek      return new LoadInst(Ptr);
5115352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    }
5125352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    break;
5135352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  case Intrinsic::ppc_altivec_stvx:
5145352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  case Intrinsic::ppc_altivec_stvxl:
5155352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    // Turn stvx -> store if the pointer is known aligned.
5165352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    if (getOrEnforceKnownAlignment(II->getArgOperand(1), 16, TD) >= 16) {
5175352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor      Type *OpPtrTy =
5185352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        PointerType::getUnqual(II->getArgOperand(0)->getType());
5195352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor      Value *Ptr = Builder->CreateBitCast(II->getArgOperand(1), OpPtrTy);
5205352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor      return new StoreInst(II->getArgOperand(0), Ptr);
5215352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    }
5225352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    break;
5235352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  case Intrinsic::x86_sse_storeu_ps:
5245352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  case Intrinsic::x86_sse2_storeu_pd:
525a3890baf1256ff26081306c7fef70202f8223f41Douglas Gregor  case Intrinsic::x86_sse2_storeu_dq:
526a3890baf1256ff26081306c7fef70202f8223f41Douglas Gregor    // Turn X86 storeu -> store if the pointer is known aligned.
527a3890baf1256ff26081306c7fef70202f8223f41Douglas Gregor    if (getOrEnforceKnownAlignment(II->getArgOperand(0), 16, TD) >= 16) {
528a3890baf1256ff26081306c7fef70202f8223f41Douglas Gregor      Type *OpPtrTy =
529a3890baf1256ff26081306c7fef70202f8223f41Douglas Gregor        PointerType::getUnqual(II->getArgOperand(1)->getType());
530a3890baf1256ff26081306c7fef70202f8223f41Douglas Gregor      Value *Ptr = Builder->CreateBitCast(II->getArgOperand(0), OpPtrTy);
531896b70ffc348f6e2c680b5fb5841984d5785b7b5Ted Kremenek      return new StoreInst(II->getArgOperand(1), Ptr);
5325352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    }
533a3890baf1256ff26081306c7fef70202f8223f41Douglas Gregor    break;
5345352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor
535a3890baf1256ff26081306c7fef70202f8223f41Douglas Gregor  case Intrinsic::x86_sse_cvtss2si:
5365352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  case Intrinsic::x86_sse_cvtss2si64:
537896b70ffc348f6e2c680b5fb5841984d5785b7b5Ted Kremenek  case Intrinsic::x86_sse_cvttss2si:
5385352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  case Intrinsic::x86_sse_cvttss2si64:
539a3890baf1256ff26081306c7fef70202f8223f41Douglas Gregor  case Intrinsic::x86_sse2_cvtsd2si:
5405352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  case Intrinsic::x86_sse2_cvtsd2si64:
541896b70ffc348f6e2c680b5fb5841984d5785b7b5Ted Kremenek  case Intrinsic::x86_sse2_cvttsd2si:
5425352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  case Intrinsic::x86_sse2_cvttsd2si64: {
543a3890baf1256ff26081306c7fef70202f8223f41Douglas Gregor    // These intrinsics only demand the 0th element of their input vectors. If
5445352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    // we can simplify the input based on that, do so now.
545896b70ffc348f6e2c680b5fb5841984d5785b7b5Ted Kremenek    unsigned VWidth =
546a3890baf1256ff26081306c7fef70202f8223f41Douglas Gregor      cast<VectorType>(II->getArgOperand(0)->getType())->getNumElements();
5475352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    APInt DemandedElts(VWidth, 1);
5485352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    APInt UndefElts(VWidth, 0);
5495352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    if (Value *V = SimplifyDemandedVectorElts(II->getArgOperand(0),
5505352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor                                              DemandedElts, UndefElts)) {
5515352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor      II->setArgOperand(0, V);
5525352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor      return II;
5535352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    }
5545352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    break;
555473d7019bb54f8a2f0140dca9e9644a935cc6b20Douglas Gregor  }
5565352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor
557473d7019bb54f8a2f0140dca9e9644a935cc6b20Douglas Gregor
558473d7019bb54f8a2f0140dca9e9644a935cc6b20Douglas Gregor  case Intrinsic::x86_sse41_pmovsxbw:
559473d7019bb54f8a2f0140dca9e9644a935cc6b20Douglas Gregor  case Intrinsic::x86_sse41_pmovsxwd:
560473d7019bb54f8a2f0140dca9e9644a935cc6b20Douglas Gregor  case Intrinsic::x86_sse41_pmovsxdq:
561473d7019bb54f8a2f0140dca9e9644a935cc6b20Douglas Gregor  case Intrinsic::x86_sse41_pmovzxbw:
562473d7019bb54f8a2f0140dca9e9644a935cc6b20Douglas Gregor  case Intrinsic::x86_sse41_pmovzxwd:
563473d7019bb54f8a2f0140dca9e9644a935cc6b20Douglas Gregor  case Intrinsic::x86_sse41_pmovzxdq: {
564473d7019bb54f8a2f0140dca9e9644a935cc6b20Douglas Gregor    // pmov{s|z}x ignores the upper half of their input vectors.
565473d7019bb54f8a2f0140dca9e9644a935cc6b20Douglas Gregor    unsigned VWidth =
5665352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor      cast<VectorType>(II->getArgOperand(0)->getType())->getNumElements();
567473d7019bb54f8a2f0140dca9e9644a935cc6b20Douglas Gregor    unsigned LowHalfElts = VWidth / 2;
5685352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    APInt InputDemandedElts(APInt::getBitsSet(VWidth, 0, LowHalfElts));
569473d7019bb54f8a2f0140dca9e9644a935cc6b20Douglas Gregor    APInt UndefElts(VWidth, 0);
5705352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    if (Value *TmpV = SimplifyDemandedVectorElts(II->getArgOperand(0),
571473d7019bb54f8a2f0140dca9e9644a935cc6b20Douglas Gregor                                                 InputDemandedElts,
572473d7019bb54f8a2f0140dca9e9644a935cc6b20Douglas Gregor                                                 UndefElts)) {
573473d7019bb54f8a2f0140dca9e9644a935cc6b20Douglas Gregor      II->setArgOperand(0, TmpV);
574473d7019bb54f8a2f0140dca9e9644a935cc6b20Douglas Gregor      return II;
5755352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    }
576473d7019bb54f8a2f0140dca9e9644a935cc6b20Douglas Gregor    break;
577473d7019bb54f8a2f0140dca9e9644a935cc6b20Douglas Gregor  }
5785352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor
579896b70ffc348f6e2c680b5fb5841984d5785b7b5Ted Kremenek  case Intrinsic::ppc_altivec_vperm:
580473d7019bb54f8a2f0140dca9e9644a935cc6b20Douglas Gregor    // Turn vperm(V1,V2,mask) -> shuffle(V1,V2,mask) if mask is a constant.
581473d7019bb54f8a2f0140dca9e9644a935cc6b20Douglas Gregor    if (Constant *Mask = dyn_cast<Constant>(II->getArgOperand(2))) {
5825352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor      assert(Mask->getType()->getVectorNumElements() == 16 &&
5835352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor             "Bad type for intrinsic!");
5845352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor
5855352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor      // Check that all of the elements are integer constants or undefs.
5865352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor      bool AllEltsOk = true;
5875352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor      for (unsigned i = 0; i != 16; ++i) {
5885352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        Constant *Elt = Mask->getAggregateElement(i);
5895352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        if (Elt == 0 ||
5905352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor            !(isa<ConstantInt>(Elt) || isa<UndefValue>(Elt))) {
5915352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor          AllEltsOk = false;
5925352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor          break;
5935352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        }
5945352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor      }
5955352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor
596896b70ffc348f6e2c680b5fb5841984d5785b7b5Ted Kremenek      if (AllEltsOk) {
5975352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        // Cast the input vectors to byte vectors.
5985352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        Value *Op0 = Builder->CreateBitCast(II->getArgOperand(0),
5995352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor                                            Mask->getType());
6005352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        Value *Op1 = Builder->CreateBitCast(II->getArgOperand(1),
6015352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor                                            Mask->getType());
6025352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        Value *Result = UndefValue::get(Op0->getType());
6035352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor
6045352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        // Only extract each element once.
6055352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        Value *ExtractedElts[32];
6065352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        memset(ExtractedElts, 0, sizeof(ExtractedElts));
6075352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor
6085352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        for (unsigned i = 0; i != 16; ++i) {
6095352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor          if (isa<UndefValue>(Mask->getAggregateElement(i)))
6105352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor            continue;
6115352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor          unsigned Idx =
6125352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor            cast<ConstantInt>(Mask->getAggregateElement(i))->getZExtValue();
6135352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor          Idx &= 31;  // Match the hardware behavior.
6145352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor
6155352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor          if (ExtractedElts[Idx] == 0) {
6165352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor            ExtractedElts[Idx] =
6175352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor              Builder->CreateExtractElement(Idx < 16 ? Op0 : Op1,
6185352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor                                            Builder->getInt32(Idx&15));
6195352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor          }
6205352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor
6215352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor          // Insert this value into the result vector.
6225352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor          Result = Builder->CreateInsertElement(Result, ExtractedElts[Idx],
6235352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor                                                Builder->getInt32(i));
6245352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        }
6255352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        return CastInst::Create(Instruction::BitCast, Result, CI.getType());
6265352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor      }
6275352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    }
628c6f530defd937faa1c00998e60deea6368526961Ted Kremenek    break;
629c6f530defd937faa1c00998e60deea6368526961Ted Kremenek
630c6f530defd937faa1c00998e60deea6368526961Ted Kremenek  case Intrinsic::arm_neon_vld1:
6315352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  case Intrinsic::arm_neon_vld2:
6325352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  case Intrinsic::arm_neon_vld3:
6335352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  case Intrinsic::arm_neon_vld4:
6345352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  case Intrinsic::arm_neon_vld2lane:
6355352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  case Intrinsic::arm_neon_vld3lane:
6365352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  case Intrinsic::arm_neon_vld4lane:
6375352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  case Intrinsic::arm_neon_vst1:
6385352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  case Intrinsic::arm_neon_vst2:
6395352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  case Intrinsic::arm_neon_vst3:
6405352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  case Intrinsic::arm_neon_vst4:
6415352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  case Intrinsic::arm_neon_vst2lane:
6425352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  case Intrinsic::arm_neon_vst3lane:
6432ef6944d529c94824f5bf96f65665f5bee30f5a2Douglas Gregor  case Intrinsic::arm_neon_vst4lane: {
6445352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    unsigned MemAlign = getKnownAlignment(II->getArgOperand(0), TD);
645a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor    unsigned AlignArg = II->getNumArgOperands() - 1;
646896b70ffc348f6e2c680b5fb5841984d5785b7b5Ted Kremenek    ConstantInt *IntrAlign = dyn_cast<ConstantInt>(II->getArgOperand(AlignArg));
6475352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    if (IntrAlign && IntrAlign->getZExtValue() < MemAlign) {
6485352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor      II->setArgOperand(AlignArg,
6495352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor                        ConstantInt::get(Type::getInt32Ty(II->getContext()),
650896b70ffc348f6e2c680b5fb5841984d5785b7b5Ted Kremenek                                         MemAlign, false));
651a88084b78fd4ca5d3d858c14b02414f8cc399f02Douglas Gregor      return II;
6525352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    }
65344c181aec37789f25f6c15543c164416f72e562aDouglas Gregor    break;
65444c181aec37789f25f6c15543c164416f72e562aDouglas Gregor  }
65544c181aec37789f25f6c15543c164416f72e562aDouglas Gregor
65644c181aec37789f25f6c15543c164416f72e562aDouglas Gregor  case Intrinsic::arm_neon_vmulls:
65744c181aec37789f25f6c15543c164416f72e562aDouglas Gregor  case Intrinsic::arm_neon_vmullu: {
65844c181aec37789f25f6c15543c164416f72e562aDouglas Gregor    Value *Arg0 = II->getArgOperand(0);
65944c181aec37789f25f6c15543c164416f72e562aDouglas Gregor    Value *Arg1 = II->getArgOperand(1);
6605a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor
6615a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor    // Handle mul by zero first:
6625a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor    if (isa<ConstantAggregateZero>(Arg0) || isa<ConstantAggregateZero>(Arg1)) {
6635a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor      return ReplaceInstUsesWith(CI, ConstantAggregateZero::get(II->getType()));
6645a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor    }
6655a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor
6665a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor    // Check for constant LHS & RHS - in this case we just simplify.
6675a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor    bool Zext = (II->getIntrinsicID() == Intrinsic::arm_neon_vmullu);
6685a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor    VectorType *NewVT = cast<VectorType>(II->getType());
6695a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor    unsigned NewWidth = NewVT->getElementType()->getIntegerBitWidth();
6705a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor    if (ConstantDataVector *CV0 = dyn_cast<ConstantDataVector>(Arg0)) {
6715a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor      if (ConstantDataVector *CV1 = dyn_cast<ConstantDataVector>(Arg1)) {
6725a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor        VectorType* VT = cast<VectorType>(CV0->getType());
6735a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor        SmallVector<Constant*, 4> NewElems;
6745a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor        for (unsigned i = 0; i < VT->getNumElements(); ++i) {
6755a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor          APInt CV0E =
6765a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor            (cast<ConstantInt>(CV0->getAggregateElement(i)))->getValue();
67744c181aec37789f25f6c15543c164416f72e562aDouglas Gregor          CV0E = Zext ? CV0E.zext(NewWidth) : CV0E.sext(NewWidth);
67844c181aec37789f25f6c15543c164416f72e562aDouglas Gregor          APInt CV1E =
67944c181aec37789f25f6c15543c164416f72e562aDouglas Gregor            (cast<ConstantInt>(CV1->getAggregateElement(i)))->getValue();
680b1c031be513705d924038f497279b9b599868ba1Douglas Gregor          CV1E = Zext ? CV1E.zext(NewWidth) : CV1E.sext(NewWidth);
68144c181aec37789f25f6c15543c164416f72e562aDouglas Gregor          NewElems.push_back(
682b1c031be513705d924038f497279b9b599868ba1Douglas Gregor            ConstantInt::get(NewVT->getElementType(), CV0E * CV1E));
683b1c031be513705d924038f497279b9b599868ba1Douglas Gregor        }
684b1c031be513705d924038f497279b9b599868ba1Douglas Gregor        return ReplaceInstUsesWith(CI, ConstantVector::get(NewElems));
685b1c031be513705d924038f497279b9b599868ba1Douglas Gregor      }
686b1c031be513705d924038f497279b9b599868ba1Douglas Gregor
687b1c031be513705d924038f497279b9b599868ba1Douglas Gregor      // Couldn't simplify - cannonicalize constant to the RHS.
688b1c031be513705d924038f497279b9b599868ba1Douglas Gregor      std::swap(Arg0, Arg1);
68944c181aec37789f25f6c15543c164416f72e562aDouglas Gregor    }
690b1c031be513705d924038f497279b9b599868ba1Douglas Gregor
69144c181aec37789f25f6c15543c164416f72e562aDouglas Gregor    // Handle mul by one:
69244c181aec37789f25f6c15543c164416f72e562aDouglas Gregor    if (ConstantDataVector *CV1 = dyn_cast<ConstantDataVector>(Arg1)) {
69344c181aec37789f25f6c15543c164416f72e562aDouglas Gregor      if (ConstantInt *Splat =
69444c181aec37789f25f6c15543c164416f72e562aDouglas Gregor            dyn_cast_or_null<ConstantInt>(CV1->getSplatValue())) {
69544c181aec37789f25f6c15543c164416f72e562aDouglas Gregor        if (Splat->isOne()) {
69644c181aec37789f25f6c15543c164416f72e562aDouglas Gregor          if (Zext)
69744c181aec37789f25f6c15543c164416f72e562aDouglas Gregor            return CastInst::CreateZExtOrBitCast(Arg0, II->getType());
69844c181aec37789f25f6c15543c164416f72e562aDouglas Gregor          // else
69944c181aec37789f25f6c15543c164416f72e562aDouglas Gregor          return CastInst::CreateSExtOrBitCast(Arg0, II->getType());
70044c181aec37789f25f6c15543c164416f72e562aDouglas Gregor        }
70144c181aec37789f25f6c15543c164416f72e562aDouglas Gregor      }
70244c181aec37789f25f6c15543c164416f72e562aDouglas Gregor    }
70344c181aec37789f25f6c15543c164416f72e562aDouglas Gregor
70444c181aec37789f25f6c15543c164416f72e562aDouglas Gregor    break;
70544c181aec37789f25f6c15543c164416f72e562aDouglas Gregor  }
706e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor
707e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor  case Intrinsic::stackrestore: {
708e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor    // If the save is right next to the restore, remove the restore.  This can
709e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor    // happen when variable allocas are DCE'd.
710e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor    if (IntrinsicInst *SS = dyn_cast<IntrinsicInst>(II->getArgOperand(0))) {
711e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor      if (SS->getIntrinsicID() == Intrinsic::stacksave) {
712e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor        BasicBlock::iterator BI = SS;
713e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor        if (&*++BI == II)
714e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor          return EraseInstFromFunction(CI);
715e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor      }
71699ba202f659e1885fa5ee114f97c97cf6a857491Douglas Gregor    }
71799ba202f659e1885fa5ee114f97c97cf6a857491Douglas Gregor
71899ba202f659e1885fa5ee114f97c97cf6a857491Douglas Gregor    // Scan down this block to see if there is another stack restore in the
71999ba202f659e1885fa5ee114f97c97cf6a857491Douglas Gregor    // same block without an intervening call/alloca.
72099ba202f659e1885fa5ee114f97c97cf6a857491Douglas Gregor    BasicBlock::iterator BI = II;
72199ba202f659e1885fa5ee114f97c97cf6a857491Douglas Gregor    TerminatorInst *TI = II->getParent()->getTerminator();
72299ba202f659e1885fa5ee114f97c97cf6a857491Douglas Gregor    bool CannotRemove = false;
72399ba202f659e1885fa5ee114f97c97cf6a857491Douglas Gregor    for (++BI; &*BI != TI; ++BI) {
72499ba202f659e1885fa5ee114f97c97cf6a857491Douglas Gregor      if (isa<AllocaInst>(BI)) {
72599ba202f659e1885fa5ee114f97c97cf6a857491Douglas Gregor        CannotRemove = true;
72699ba202f659e1885fa5ee114f97c97cf6a857491Douglas Gregor        break;
72799ba202f659e1885fa5ee114f97c97cf6a857491Douglas Gregor      }
72899ba202f659e1885fa5ee114f97c97cf6a857491Douglas Gregor      if (CallInst *BCI = dyn_cast<CallInst>(BI)) {
72999ba202f659e1885fa5ee114f97c97cf6a857491Douglas Gregor        if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(BCI)) {
73099ba202f659e1885fa5ee114f97c97cf6a857491Douglas Gregor          // If there is a stackrestore below this one, remove this one.
73199ba202f659e1885fa5ee114f97c97cf6a857491Douglas Gregor          if (II->getIntrinsicID() == Intrinsic::stackrestore)
7325a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor            return EraseInstFromFunction(CI);
7335a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor          // Otherwise, ignore the intrinsic.
7345a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor        } else {
735b1c031be513705d924038f497279b9b599868ba1Douglas Gregor          // If we found a non-intrinsic call, we can't remove the stack
736b1c031be513705d924038f497279b9b599868ba1Douglas Gregor          // restore.
737b1c031be513705d924038f497279b9b599868ba1Douglas Gregor          CannotRemove = true;
738b1c031be513705d924038f497279b9b599868ba1Douglas Gregor          break;
739b1c031be513705d924038f497279b9b599868ba1Douglas Gregor        }
740b1c031be513705d924038f497279b9b599868ba1Douglas Gregor      }
741b1c031be513705d924038f497279b9b599868ba1Douglas Gregor    }
742b1c031be513705d924038f497279b9b599868ba1Douglas Gregor
743b1c031be513705d924038f497279b9b599868ba1Douglas Gregor    // If the stack restore is in a return, resume, or unwind block and if there
744b1c031be513705d924038f497279b9b599868ba1Douglas Gregor    // are no allocas or calls between the restore and the return, nuke the
745b1c031be513705d924038f497279b9b599868ba1Douglas Gregor    // restore.
746e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor    if (!CannotRemove && (isa<ReturnInst>(TI) || isa<ResumeInst>(TI)))
747b1c031be513705d924038f497279b9b599868ba1Douglas Gregor      return EraseInstFromFunction(CI);
748b1c031be513705d924038f497279b9b599868ba1Douglas Gregor    break;
7495a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor  }
7505a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor  }
7515a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor
7525a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor  return visitCallSite(II);
7535a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor}
7545a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor
7555a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor// InvokeInst simplification
7565a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor//
7575a43021ac491bf091494167127772a20d9a9bb48Douglas GregorInstruction *InstCombiner::visitInvokeInst(InvokeInst &II) {
7585a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor  return visitCallSite(&II);
7595a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor}
7605a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor
7615a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor/// isSafeToEliminateVarargsCast - If this cast does not affect the value
7625a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor/// passed through the varargs area, we can eliminate the use of the cast.
7635a43021ac491bf091494167127772a20d9a9bb48Douglas Gregorstatic bool isSafeToEliminateVarargsCast(const CallSite CS,
7645a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor                                         const CastInst * const CI,
7655a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor                                         const DataLayout * const TD,
7665a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor                                         const int ix) {
7675a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor  if (!CI->isLosslessCast())
7685a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor    return false;
7695a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor
7705a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor  // The size of ByVal arguments is derived from the type, so we
7715a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor  // can't change to a type with a different size.  If the size were
7725a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor  // passed explicitly we could avoid this check.
7735a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor  if (!CS.isByValArgument(ix))
7741abc6bca3d7fb0e7b1e40fbcad6cfb5e10594548Douglas Gregor    return true;
7755a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor
7765a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor  Type* SrcTy =
7775a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor            cast<PointerType>(CI->getOperand(0)->getType())->getElementType();
7785a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor  Type* DstTy = cast<PointerType>(CI->getType())->getElementType();
7795a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor  if (!SrcTy->isSized() || !DstTy->isSized())
7805a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor    return false;
7815a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor  if (!TD || TD->getTypeAllocSize(SrcTy) != TD->getTypeAllocSize(DstTy))
7825a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor    return false;
7835a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor  return true;
7845a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor}
7855a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor
7865a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor// Try to fold some different type of calls here.
7875a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor// Currently we're only working with the checking functions, memcpy_chk,
7885a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor// mempcpy_chk, memmove_chk, memset_chk, strcpy_chk, stpcpy_chk, strncpy_chk,
7895a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor// strcat_chk and strncat_chk.
7905a43021ac491bf091494167127772a20d9a9bb48Douglas GregorInstruction *InstCombiner::tryOptimizeCall(CallInst *CI, const DataLayout *TD) {
7915a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor  if (CI->getCalledFunction() == 0) return 0;
7922ef6944d529c94824f5bf96f65665f5bee30f5a2Douglas Gregor
7935a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor  if (Value *With = Simplifier->optimizeCall(CI)) {
7945a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor    ++NumSimplified;
7955a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor    return CI->use_empty() ? CI : ReplaceInstUsesWith(*CI, With);
7965a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor  }
7975a43021ac491bf091494167127772a20d9a9bb48Douglas Gregor
7985352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  return 0;
7991999844e7a18786e61e619e1dc6c789827541863Douglas Gregor}
8001999844e7a18786e61e619e1dc6c789827541863Douglas Gregor
8011999844e7a18786e61e619e1dc6c789827541863Douglas Gregorstatic IntrinsicInst *FindInitTrampolineFromAlloca(Value *TrampMem) {
8021999844e7a18786e61e619e1dc6c789827541863Douglas Gregor  // Strip off at most one level of pointer casts, looking for an alloca.  This
8031999844e7a18786e61e619e1dc6c789827541863Douglas Gregor  // is good enough in practice and simpler than handling any number of casts.
8041999844e7a18786e61e619e1dc6c789827541863Douglas Gregor  Value *Underlying = TrampMem->stripPointerCasts();
8051999844e7a18786e61e619e1dc6c789827541863Douglas Gregor  if (Underlying != TrampMem &&
8061999844e7a18786e61e619e1dc6c789827541863Douglas Gregor      (!Underlying->hasOneUse() || *Underlying->use_begin() != TrampMem))
8071999844e7a18786e61e619e1dc6c789827541863Douglas Gregor    return 0;
8081999844e7a18786e61e619e1dc6c789827541863Douglas Gregor  if (!isa<AllocaInst>(Underlying))
8091999844e7a18786e61e619e1dc6c789827541863Douglas Gregor    return 0;
8101999844e7a18786e61e619e1dc6c789827541863Douglas Gregor
8111999844e7a18786e61e619e1dc6c789827541863Douglas Gregor  IntrinsicInst *InitTrampoline = 0;
8121999844e7a18786e61e619e1dc6c789827541863Douglas Gregor  for (Value::use_iterator I = TrampMem->use_begin(), E = TrampMem->use_end();
8131999844e7a18786e61e619e1dc6c789827541863Douglas Gregor       I != E; I++) {
8141999844e7a18786e61e619e1dc6c789827541863Douglas Gregor    IntrinsicInst *II = dyn_cast<IntrinsicInst>(*I);
8151999844e7a18786e61e619e1dc6c789827541863Douglas Gregor    if (!II)
8161999844e7a18786e61e619e1dc6c789827541863Douglas Gregor      return 0;
8171999844e7a18786e61e619e1dc6c789827541863Douglas Gregor    if (II->getIntrinsicID() == Intrinsic::init_trampoline) {
8181999844e7a18786e61e619e1dc6c789827541863Douglas Gregor      if (InitTrampoline)
8191999844e7a18786e61e619e1dc6c789827541863Douglas Gregor        // More than one init_trampoline writes to this value.  Give up.
8201999844e7a18786e61e619e1dc6c789827541863Douglas Gregor        return 0;
8211999844e7a18786e61e619e1dc6c789827541863Douglas Gregor      InitTrampoline = II;
8221999844e7a18786e61e619e1dc6c789827541863Douglas Gregor      continue;
8231999844e7a18786e61e619e1dc6c789827541863Douglas Gregor    }
8247ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor    if (II->getIntrinsicID() == Intrinsic::adjust_trampoline)
8257ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor      // Allow any number of calls to adjust.trampoline.
8267ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor      continue;
8277ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor    return 0;
8287ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor  }
8297ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor
8307ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor  // No call to init.trampoline found.
8317ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor  if (!InitTrampoline)
8327ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor    return 0;
8337ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor
8347ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor  // Check that the alloca is being used in the expected way.
8351999844e7a18786e61e619e1dc6c789827541863Douglas Gregor  if (InitTrampoline->getOperand(0) != TrampMem)
8367ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor    return 0;
8377ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor
8381999844e7a18786e61e619e1dc6c789827541863Douglas Gregor  return InitTrampoline;
8391999844e7a18786e61e619e1dc6c789827541863Douglas Gregor}
8401999844e7a18786e61e619e1dc6c789827541863Douglas Gregor
8411999844e7a18786e61e619e1dc6c789827541863Douglas Gregorstatic IntrinsicInst *FindInitTrampolineFromBB(IntrinsicInst *AdjustTramp,
8427ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor                                               Value *TrampMem) {
8437ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor  // Visit all the previous instructions in the basic block, and try to find a
8447ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor  // init.trampoline which has a direct path to the adjust.trampoline.
8457ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor  for (BasicBlock::iterator I = AdjustTramp,
8461999844e7a18786e61e619e1dc6c789827541863Douglas Gregor       E = AdjustTramp->getParent()->begin(); I != E; ) {
8471999844e7a18786e61e619e1dc6c789827541863Douglas Gregor    Instruction *Inst = --I;
8487ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor    if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(I))
8497ae2faafd30524ef5f863bb3b8701977888839bbDouglas Gregor      if (II->getIntrinsicID() == Intrinsic::init_trampoline &&
8505352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor          II->getOperand(0) == TrampMem)
8515352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor        return II;
8525352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    if (Inst->mayWriteToMemory())
853896b70ffc348f6e2c680b5fb5841984d5785b7b5Ted Kremenek      return 0;
8545352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor  }
855e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor  return 0;
856e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor}
857e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor
858e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor// Given a call to llvm.adjust.trampoline, find and return the corresponding
859e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor// call to llvm.init.trampoline if the call to the trampoline can be optimized
860e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor// to a direct call to a function.  Otherwise return NULL.
861e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor//
862e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregorstatic IntrinsicInst *FindInitTrampoline(Value *Callee) {
863e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor  Callee = Callee->stripPointerCasts();
864e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor  IntrinsicInst *AdjustTramp = dyn_cast<IntrinsicInst>(Callee);
865e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor  if (!AdjustTramp ||
866e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor      AdjustTramp->getIntrinsicID() != Intrinsic::adjust_trampoline)
867e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor    return 0;
868e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor
869e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor  Value *TrampMem = AdjustTramp->getOperand(0);
870e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor
871e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor  if (IntrinsicInst *IT = FindInitTrampolineFromAlloca(TrampMem))
872e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor    return IT;
873e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor  if (IntrinsicInst *IT = FindInitTrampolineFromBB(AdjustTramp, TrampMem))
874e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor    return IT;
875e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor  return 0;
876e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor}
877e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor
878e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor// visitCallSite - Improvements for call and invoke instructions.
879e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor//
880e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas GregorInstruction *InstCombiner::visitCallSite(CallSite CS) {
881abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor  if (isAllocLikeFn(CS.getInstruction(), TLI))
882abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor    return visitAllocSite(*CS.getInstruction());
883abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor
884abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor  bool Changed = false;
885abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor
886abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor  // If the callee is a pointer to a function, attempt to move any casts to the
887abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor  // arguments of the call/invoke.
888abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor  Value *Callee = CS.getCalledValue();
889abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor  if (!isa<Function>(Callee) && transformConstExprCastCall(CS))
890abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor    return 0;
891abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor
892abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor  if (Function *CalleeF = dyn_cast<Function>(Callee))
893abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor    // If the call and callee calling conventions don't match, this call must
894abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor    // be unreachable, as the call is undefined.
895abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor    if (CalleeF->getCallingConv() != CS.getCallingConv() &&
896abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor        // Only do this for calls to a function with a body.  A prototype may
897abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor        // not actually end up matching the implementation's calling conv for a
898abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor        // variety of reasons (e.g. it may be written in assembly).
899abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor        !CalleeF->isDeclaration()) {
900abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor      Instruction *OldCall = CS.getInstruction();
901abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor      new StoreInst(ConstantInt::getTrue(Callee->getContext()),
902abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor                UndefValue::get(Type::getInt1PtrTy(Callee->getContext())),
903abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor                                  OldCall);
904abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor      // If OldCall does not return void then replaceAllUsesWith undef.
905abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor      // This allows ValueHandlers and custom metadata to adjust itself.
906abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor      if (!OldCall->getType()->isVoidTy())
907abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor        ReplaceInstUsesWith(*OldCall, UndefValue::get(OldCall->getType()));
908abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor      if (isa<CallInst>(OldCall))
909e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor        return EraseInstFromFunction(*OldCall);
910e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor
911e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor      // We cannot remove an invoke, because it would change the CFG, just
912e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor      // change the callee to a null pointer.
913abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor      cast<InvokeInst>(OldCall)->setCalledFunction(
914abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor                                    Constant::getNullValue(CalleeF->getType()));
915abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor      return 0;
916abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor    }
917abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor
918abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor  if (isa<ConstantPointerNull>(Callee) || isa<UndefValue>(Callee)) {
919abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor    // If CS does not return void then replaceAllUsesWith undef.
920e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor    // This allows ValueHandlers and custom metadata to adjust itself.
921e1e13bf568a7e37c95eda6fcfa626659a06e67b1Douglas Gregor    if (!CS.getInstruction()->getType()->isVoidTy())
922abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor      ReplaceInstUsesWith(*CS.getInstruction(),
923abc563f554951259bbe0315055cad92ee14d87e4Douglas Gregor                          UndefValue::get(CS.getInstruction()->getType()));
9245352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor
9255352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor    if (isa<InvokeInst>(CS.getInstruction())) {
926896b70ffc348f6e2c680b5fb5841984d5785b7b5Ted Kremenek      // Can't remove an invoke because we cannot change the CFG.
9275352ac06d8f6194825bb2a99ffa009b61bafb503Douglas Gregor      return 0;
928c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    }
929c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
930c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    // This instruction is not reachable, just remove it.  We insert a store to
931c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    // undef so that we know that this code is not reachable, despite the fact
9321efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar    // that we can't modify the CFG here.
933c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    new StoreInst(ConstantInt::getTrue(Callee->getContext()),
9341efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar                  UndefValue::get(Type::getInt1PtrTy(Callee->getContext())),
935c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor                  CS.getInstruction());
936c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
937c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    return EraseInstFromFunction(*CS.getInstruction());
938c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  }
939c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
940c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  if (IntrinsicInst *II = FindInitTrampoline(Callee))
941c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    return transformCallThroughTrampoline(CS, II);
942c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
9431efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar  PointerType *PTy = cast<PointerType>(Callee->getType());
944c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  FunctionType *FTy = cast<FunctionType>(PTy->getElementType());
945c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  if (FTy->isVarArg()) {
946c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    int ix = FTy->getNumParams();
947c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    // See if we can optimize any arguments passed through the varargs area of
948c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    // the call.
949c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    for (CallSite::arg_iterator I = CS.arg_begin()+FTy->getNumParams(),
9501efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar           E = CS.arg_end(); I != E; ++I, ++ix) {
951c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      CastInst *CI = dyn_cast<CastInst>(*I);
952c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      if (CI && isSafeToEliminateVarargsCast(CS, CI, TD, ix)) {
953c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor        *I = CI->getOperand(0);
954c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor        Changed = true;
955c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      }
956c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    }
957c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  }
958c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
959c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  if (isa<InlineAsm>(Callee) && !CS.doesNotThrow()) {
960c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    // Inline asm calls cannot throw - mark them 'nounwind'.
961c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    CS.setDoesNotThrow();
962c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    Changed = true;
963c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  }
964c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
965c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  // Try to optimize the call if possible, we require DataLayout for most of
966c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  // this.  None of these calls are seen as possibly dead so go ahead and
967c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  // delete the instruction now.
968c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  if (CallInst *CI = dyn_cast<CallInst>(CS.getInstruction())) {
969c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    Instruction *I = tryOptimizeCall(CI, TD);
970c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    // If we changed something return the result, etc. Otherwise let
971c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    // the fallthrough check.
972c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    if (I) return EraseInstFromFunction(*I);
973c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  }
974c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
975c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  return Changed ? CS.getInstruction() : 0;
976c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor}
977c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
978c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor// transformConstExprCastCall - If the callee is a constexpr cast of a function,
979c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor// attempt to move the cast to the arguments of the call/invoke.
980c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor//
981c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregorbool InstCombiner::transformConstExprCastCall(CallSite CS) {
982c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  Function *Callee =
9838bd5a69999cfd06b6b5a58fdd04e4f802b2df5a4Ted Kremenek    dyn_cast<Function>(CS.getCalledValue()->stripPointerCasts());
9848bd5a69999cfd06b6b5a58fdd04e4f802b2df5a4Ted Kremenek  if (Callee == 0)
9858f06e0e9fec3ca501e5fb129f413adbfc88e82f8Ted Kremenek    return false;
9868f06e0e9fec3ca501e5fb129f413adbfc88e82f8Ted Kremenek  Instruction *Caller = CS.getInstruction();
987a0536d8dd900bb48ea886bd68d777b03b061c068Ted Kremenek  const AttributeSet &CallerPAL = CS.getAttributes();
988a0536d8dd900bb48ea886bd68d777b03b061c068Ted Kremenek
98901829d3afafdfd355cbe93537bc408aeeed964c6Douglas Gregor  // Okay, this is a cast from a function to a different type.  Unless doing so
99001829d3afafdfd355cbe93537bc408aeeed964c6Douglas Gregor  // would cause a type conversion of one of our arguments, change this call to
99101829d3afafdfd355cbe93537bc408aeeed964c6Douglas Gregor  // be a direct call with arguments casted to the appropriate types.
99201829d3afafdfd355cbe93537bc408aeeed964c6Douglas Gregor  //
99301829d3afafdfd355cbe93537bc408aeeed964c6Douglas Gregor  FunctionType *FT = Callee->getFunctionType();
99401829d3afafdfd355cbe93537bc408aeeed964c6Douglas Gregor  Type *OldRetTy = Caller->getType();
995fe72e9ceeae6cc8669cd8bb722425300190638eaDouglas Gregor  Type *NewRetTy = FT->getReturnType();
996fe72e9ceeae6cc8669cd8bb722425300190638eaDouglas Gregor
997fe72e9ceeae6cc8669cd8bb722425300190638eaDouglas Gregor  if (NewRetTy->isStructTy())
998fe72e9ceeae6cc8669cd8bb722425300190638eaDouglas Gregor    return false; // TODO: Handle multiple return values.
999fe72e9ceeae6cc8669cd8bb722425300190638eaDouglas Gregor
1000fe72e9ceeae6cc8669cd8bb722425300190638eaDouglas Gregor  // Check to see if we are changing the return type...
1001fe72e9ceeae6cc8669cd8bb722425300190638eaDouglas Gregor  if (OldRetTy != NewRetTy) {
1002fe72e9ceeae6cc8669cd8bb722425300190638eaDouglas Gregor    if (Callee->isDeclaration() &&
100339d6f07b056c31e1e6b5946165ed4b23e7887f22Douglas Gregor        // Conversion is ok if changing from one pointer type to another or from
100439d6f07b056c31e1e6b5946165ed4b23e7887f22Douglas Gregor        // a pointer to an integer of the same size.
100574dbe640021d96a8dbb85c592471c04449ade81cDouglas Gregor        !((OldRetTy->isPointerTy() || !TD ||
100674dbe640021d96a8dbb85c592471c04449ade81cDouglas Gregor           OldRetTy == TD->getIntPtrType(Caller->getContext())) &&
10076931900f43cea558c6974075256c07728dbfecc6Douglas Gregor          (NewRetTy->isPointerTy() || !TD ||
10086931900f43cea558c6974075256c07728dbfecc6Douglas Gregor           NewRetTy == TD->getIntPtrType(Caller->getContext()))))
10090a35bceb7768fc0be62cb644a4e31d8bfd9fb44aDouglas Gregor      return false;   // Cannot transform this return value.
10100a35bceb7768fc0be62cb644a4e31d8bfd9fb44aDouglas Gregor
10117e24256c95afb64b4d5abf201a0f9f0527cb4cf3Douglas Gregor    if (!Caller->use_empty() &&
10127e24256c95afb64b4d5abf201a0f9f0527cb4cf3Douglas Gregor        // void -> non-void is handled specially
101350aa6acd0b8d40c8956372a69e0a73f0802a5494Ted Kremenek        !NewRetTy->isVoidTy() && !CastInst::isCastable(NewRetTy, OldRetTy))
10147e24256c95afb64b4d5abf201a0f9f0527cb4cf3Douglas Gregor      return false;   // Cannot transform this return value.
10151efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar
1016c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    if (!CallerPAL.isEmpty() && !Caller->use_empty()) {
1017c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      AttrBuilder RAttrs = CallerPAL.getRetAttributes();
10181efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar      if (RAttrs.hasAttributes(Attribute::typeIncompatible(NewRetTy)))
1019c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor        return false;   // Attribute not compatible with transformed value.
1020c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    }
1021c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
1022c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    // If the callsite is an invoke instruction, and the return value is used by
1023c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    // a PHI node in a successor, we cannot change the return type of the call
1024c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    // because there is no place to put the cast instruction (without breaking
1025c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    // the critical edge).  Bail out in this case.
1026c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    if (!Caller->use_empty())
1027c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      if (InvokeInst *II = dyn_cast<InvokeInst>(Caller))
1028c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor        for (Value::use_iterator UI = II->use_begin(), E = II->use_end();
1029c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor             UI != E; ++UI)
1030c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor          if (PHINode *PN = dyn_cast<PHINode>(*UI))
1031c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor            if (PN->getParent() == II->getNormalDest() ||
1032c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor                PN->getParent() == II->getUnwindDest())
1033c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor              return false;
1034c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  }
1035c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
1036c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  unsigned NumActualArgs = unsigned(CS.arg_end()-CS.arg_begin());
10373064ef9e604d19a0cfd0d8e3ed3055bfd83f88fdTed Kremenek  unsigned NumCommonArgs = std::min(FT->getNumParams(), NumActualArgs);
10380b36e614aa19df72885d5e0de996f7fbb9874ec3Douglas Gregor
1039a67e03fdf1ae8a1f92463a307d0b6281f1161f40Douglas Gregor  CallSite::arg_iterator AI = CS.arg_begin();
1040a67e03fdf1ae8a1f92463a307d0b6281f1161f40Douglas Gregor  for (unsigned i = 0, e = NumCommonArgs; i != e; ++i, ++AI) {
10410b36e614aa19df72885d5e0de996f7fbb9874ec3Douglas Gregor    Type *ParamTy = FT->getParamType(i);
10420b36e614aa19df72885d5e0de996f7fbb9874ec3Douglas Gregor    Type *ActTy = (*AI)->getType();
10436931900f43cea558c6974075256c07728dbfecc6Douglas Gregor
10446931900f43cea558c6974075256c07728dbfecc6Douglas Gregor    if (!CastInst::isCastable(ActTy, ParamTy))
10456931900f43cea558c6974075256c07728dbfecc6Douglas Gregor      return false;   // Cannot transform this parameter value.
10466931900f43cea558c6974075256c07728dbfecc6Douglas Gregor
1047a67e03fdf1ae8a1f92463a307d0b6281f1161f40Douglas Gregor    Attribute Attrs = CallerPAL.getParamAttributes(i + 1);
104836897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor    if (AttrBuilder(Attrs).
104936897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor          hasAttributes(Attribute::typeIncompatible(ParamTy)))
1050a67e03fdf1ae8a1f92463a307d0b6281f1161f40Douglas Gregor      return false;   // Attribute not compatible with transformed value.
1051a67e03fdf1ae8a1f92463a307d0b6281f1161f40Douglas Gregor
105236897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor    // If the parameter is passed as a byval argument, then we have to have a
105336897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor    // sized type and the sized type has to have the same size as the old type.
105436897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor    if (ParamTy != ActTy && Attrs.hasAttribute(Attribute::ByVal)) {
105536897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor      PointerType *ParamPTy = dyn_cast<PointerType>(ParamTy);
105636897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor      if (ParamPTy == 0 || !ParamPTy->getElementType()->isSized() || TD == 0)
105736897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor        return false;
105836897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor
105936897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor      Type *CurElTy = cast<PointerType>(ActTy)->getElementType();
106036897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor      if (TD->getTypeAllocSize(CurElTy) !=
106136897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor          TD->getTypeAllocSize(ParamPTy->getElementType()))
106236897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor        return false;
106336897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor    }
106436897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor
106536897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor    // Converting from one pointer type to another or between a pointer and an
106636897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor    // integer of the same size is safe even if we do not have a body.
106736897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor    bool isConvertible = ActTy == ParamTy ||
106836897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor      (TD && ((ParamTy->isPointerTy() ||
10691f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor      ParamTy == TD->getIntPtrType(Caller->getContext())) &&
10701f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor              (ActTy->isPointerTy() ||
10711f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor              ActTy == TD->getIntPtrType(Caller->getContext()))));
10721f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor    if (Callee->isDeclaration() && !isConvertible) return false;
10731f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor  }
10741f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor
10751f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor  if (Callee->isDeclaration()) {
10761f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor    // Do not delete arguments unless we have a function body.
10771f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor    if (FT->getNumParams() < NumActualArgs && !FT->isVarArg())
10781f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor      return false;
10791f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor
10801f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor    // If the callee is just a declaration, don't change the varargsness of the
10811f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor    // call.  We don't want to introduce a varargs call where one doesn't
10821f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor    // already exist.
10831f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor    PointerType *APTy = cast<PointerType>(CS.getCalledValue()->getType());
10841f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor    if (FT->isVarArg()!=cast<FunctionType>(APTy->getElementType())->isVarArg())
10851f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor      return false;
10861f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor
10871f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor    // If both the callee and the cast type are varargs, we still have to make
10881f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor    // sure the number of fixed parameters are the same or we have the same
10891f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor    // ABI issues as if we introduce a varargs call.
10901f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor    if (FT->isVarArg() &&
10911f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor        cast<FunctionType>(APTy->getElementType())->isVarArg() &&
10921f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor        FT->getNumParams() !=
10931f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor        cast<FunctionType>(APTy->getElementType())->getNumParams())
10941f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor      return false;
10951f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor  }
10961f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor
10971f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor  if (FT->getNumParams() < NumActualArgs && FT->isVarArg() &&
10981f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor      !CallerPAL.isEmpty())
10991f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor    // In this case we have more arguments than the new function type, but we
11001f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor    // won't be dropping them.  Check that these extra arguments have attributes
11011f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor    // that are compatible with being a vararg call argument.
11021f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor    for (unsigned i = CallerPAL.getNumSlots(); i; --i) {
11031f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor      if (CallerPAL.getSlot(i - 1).Index <= FT->getNumParams())
11041f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor        break;
11051f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor      Attribute PAttrs = CallerPAL.getSlot(i - 1).Attrs;
11061f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor      // Check if it has an attribute that's incompatible with varargs.
11071f60d9ea523fc321d811fe880ba9a1ec74fa8f9bDouglas Gregor      if (PAttrs.hasAttribute(Attribute::StructRet))
11081efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar        return false;
1109c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    }
1110c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
1111c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
1112c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  // Okay, we decided that this is a safe thing to do: go ahead and start
1113c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  // inserting cast instructions as necessary.
1114ebfa339321f8a4df9d5011e591a615d5765107d5Ted Kremenek  std::vector<Value*> Args;
1115ebfa339321f8a4df9d5011e591a615d5765107d5Ted Kremenek  Args.reserve(NumActualArgs);
11161efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar  SmallVector<AttributeWithIndex, 8> attrVec;
1117c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  attrVec.reserve(NumCommonArgs);
1118c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
11191efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar  // Get any return attributes.
1120c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  AttrBuilder RAttrs = CallerPAL.getRetAttributes();
1121c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
11221efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar  // If the return value is not being used, the type may not be compatible
1123c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  // with the existing attributes.  Wipe out any problematic attributes.
1124c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  RAttrs.removeAttributes(Attribute::typeIncompatible(NewRetTy));
1125c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
1126c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  // Add the new return attributes.
1127c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  if (RAttrs.hasAttributes())
1128c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    attrVec.push_back(
1129c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      AttributeWithIndex::get(AttributeSet::ReturnIndex,
11301efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar                              Attribute::get(FT->getContext(), RAttrs)));
1131c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
1132c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  AI = CS.arg_begin();
1133c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  for (unsigned i = 0; i != NumCommonArgs; ++i, ++AI) {
1134c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    Type *ParamTy = FT->getParamType(i);
1135c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    if ((*AI)->getType() == ParamTy) {
11361efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar      Args.push_back(*AI);
1137c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    } else {
1138c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      Instruction::CastOps opcode = CastInst::getCastOpcode(*AI,
1139c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor          false, ParamTy, false);
1140c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      Args.push_back(Builder->CreateCast(opcode, *AI, ParamTy));
1141c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    }
11421efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar
1143c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    // Add any parameter attributes.
1144c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    Attribute PAttrs = CallerPAL.getParamAttributes(i + 1);
11451efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar    if (PAttrs.hasAttributes())
1146c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      attrVec.push_back(AttributeWithIndex::get(i + 1, PAttrs));
1147c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  }
1148c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
11491ee6cad59f017601ea54fbb4f62a6e8d69897e3eTed Kremenek  // If the function takes more arguments than the call was taking, add them
11501ee6cad59f017601ea54fbb4f62a6e8d69897e3eTed Kremenek  // now.
11511ee6cad59f017601ea54fbb4f62a6e8d69897e3eTed Kremenek  for (unsigned i = NumCommonArgs; i != FT->getNumParams(); ++i)
11521ee6cad59f017601ea54fbb4f62a6e8d69897e3eTed Kremenek    Args.push_back(Constant::getNullValue(FT->getParamType(i)));
11531ee6cad59f017601ea54fbb4f62a6e8d69897e3eTed Kremenek
11541efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar  // If we are removing arguments to the function, emit an obnoxious warning.
1155c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  if (FT->getNumParams() < NumActualArgs) {
1156c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    // TODO: if (!FT->isVarArg()) this call may be unreachable. PR14722
1157c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    if (FT->isVarArg()) {
1158c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      // Add all of the arguments in their promoted form to the arg list.
1159c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      for (unsigned i = FT->getNumParams(); i != NumActualArgs; ++i, ++AI) {
1160c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor        Type *PTy = getPromotedType((*AI)->getType());
1161c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor        if (PTy != (*AI)->getType()) {
1162c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor          // Must promote to pass through va_arg area!
1163c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor          Instruction::CastOps opcode =
1164c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor            CastInst::getCastOpcode(*AI, false, PTy, false);
1165c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor          Args.push_back(Builder->CreateCast(opcode, *AI, PTy));
1166c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor        } else {
116736897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor          Args.push_back(*AI);
116836897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor        }
116936897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor
117036897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor        // Add any parameter attributes.
117136897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor        Attribute PAttrs = CallerPAL.getParamAttributes(i + 1);
117236897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor        if (PAttrs.hasAttributes())
117336897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor          attrVec.push_back(AttributeWithIndex::get(i + 1, PAttrs));
117436897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor      }
117536897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor    }
117636897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor  }
117736897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor
117836897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor  Attribute FnAttrs = CallerPAL.getFnAttributes();
117936897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor  if (FnAttrs.hasAttributes())
118036897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor    attrVec.push_back(AttributeWithIndex::get(AttributeSet::FunctionIndex,
118136897b05ca2886e287f01802614bc10cbadcec22Douglas Gregor                                              FnAttrs));
11821efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar
1183c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  if (NewRetTy->isVoidTy())
1184c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    Caller->setName("");   // Void type should not have a name.
1185c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
1186c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  const AttributeSet &NewCallerPAL = AttributeSet::get(Callee->getContext(),
1187c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor                                                     attrVec);
1188c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
1189e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek  Instruction *NC;
1190e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek  if (InvokeInst *II = dyn_cast<InvokeInst>(Caller)) {
1191e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek    NC = Builder->CreateInvoke(Callee, II->getNormalDest(),
1192e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek                               II->getUnwindDest(), Args);
1193e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek    NC->takeName(II);
1194e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek    cast<InvokeInst>(NC)->setCallingConv(II->getCallingConv());
1195e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek    cast<InvokeInst>(NC)->setAttributes(NewCallerPAL);
1196e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek  } else {
1197e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek    CallInst *CI = cast<CallInst>(Caller);
1198e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek    NC = Builder->CreateCall(Callee, Args);
1199e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek    NC->takeName(CI);
1200e77f443dbca8cdc23e5aa94a2653367e4a7cbe47Ted Kremenek    if (CI->isTailCall())
1201857e918a8a40deb128840308a318bf623d68295fTed Kremenek      cast<CallInst>(NC)->setTailCall();
1202857e918a8a40deb128840308a318bf623d68295fTed Kremenek    cast<CallInst>(NC)->setCallingConv(CI->getCallingConv());
12039f1e3ff3b3095967e2b92b57a53524e2d6bb141cDouglas Gregor    cast<CallInst>(NC)->setAttributes(NewCallerPAL);
12049f1e3ff3b3095967e2b92b57a53524e2d6bb141cDouglas Gregor  }
12059f1e3ff3b3095967e2b92b57a53524e2d6bb141cDouglas Gregor
1206572feb2a190b5e8b04fb06c4ac50ee0f61e93ff0Douglas Gregor  // Insert a cast of the return type as necessary.
1207572feb2a190b5e8b04fb06c4ac50ee0f61e93ff0Douglas Gregor  Value *NV = NC;
1208ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor  if (OldRetTy != NV->getType() && !Caller->use_empty()) {
12099f1e3ff3b3095967e2b92b57a53524e2d6bb141cDouglas Gregor    if (!NV->getType()->isVoidTy()) {
1210ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor      Instruction::CastOps opcode =
1211c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor        CastInst::getCastOpcode(NC, false, OldRetTy, false);
1212c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      NV = NC = CastInst::Create(opcode, NC, OldRetTy);
1213c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      NC->setDebugLoc(Caller->getDebugLoc());
1214c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
1215c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      // If this is an invoke instruction, we should insert it after the first
1216c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      // non-phi, instruction in the normal successor block.
12171efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar      if (InvokeInst *II = dyn_cast<InvokeInst>(Caller)) {
1218c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor        BasicBlock::iterator I = II->getNormalDest()->getFirstInsertionPt();
1219c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor        InsertNewInstBefore(NC, *I);
1220c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      } else {
1221c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor        // Otherwise, it's a call, just insert cast right after the call.
1222c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor        InsertNewInstBefore(NC, *Caller);
1223c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      }
1224c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      Worklist.AddUsersToWorkList(*Caller);
1225c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    } else {
1226c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      NV = UndefValue::get(Caller->getType());
1227c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    }
1228c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  }
1229c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
1230c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  if (!Caller->use_empty())
1231c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    ReplaceInstUsesWith(*Caller, NV);
1232c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
1233c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  EraseInstFromFunction(*Caller);
12341efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar  return true;
1235c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor}
1236c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
1237c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor// transformCallThroughTrampoline - Turn a call to a function created by
1238c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor// init_trampoline / adjust_trampoline intrinsic pair into a direct call to the
1239c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor// underlying function.
1240c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor//
12411efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel DunbarInstruction *
1242c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas GregorInstCombiner::transformCallThroughTrampoline(CallSite CS,
1243c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor                                             IntrinsicInst *Tramp) {
1244c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  Value *Callee = CS.getCalledValue();
1245c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  PointerType *PTy = cast<PointerType>(Callee->getType());
12461efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar  FunctionType *FTy = cast<FunctionType>(PTy->getElementType());
1247c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  const AttributeSet &Attrs = CS.getAttributes();
1248c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
1249c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  // If the call already has the 'nest' attribute somewhere then give up -
1250c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  // otherwise 'nest' would occur twice after splicing in the chain.
1251c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  if (Attrs.hasAttrSomewhere(Attribute::Nest))
1252c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    return 0;
1253c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
1254c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  assert(Tramp &&
1255c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor         "transformCallThroughTrampoline called with incorrect CallSite.");
1256c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
1257c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  Function *NestF =cast<Function>(Tramp->getArgOperand(1)->stripPointerCasts());
1258c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  PointerType *NestFPTy = cast<PointerType>(NestF->getType());
12591efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar  FunctionType *NestFTy = cast<FunctionType>(NestFPTy->getElementType());
1260c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
1261c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  const AttributeSet &NestAttrs = NestF->getAttributes();
1262c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor  if (!NestAttrs.isEmpty()) {
1263c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    unsigned NestIdx = 1;
1264c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    Type *NestTy = 0;
1265c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    Attribute NestAttr;
1266c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
1267c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    // Look for a parameter marked with the 'nest' attribute.
1268c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    for (FunctionType::param_iterator I = NestFTy->param_begin(),
1269c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor         E = NestFTy->param_end(); I != E; ++NestIdx, ++I)
1270c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      if (NestAttrs.getParamAttributes(NestIdx).hasAttribute(Attribute::Nest)){
1271c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor        // Record the parameter type and any other attributes.
1272c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor        NestTy = *I;
1273c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor        NestAttr = NestAttrs.getParamAttributes(NestIdx);
1274c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor        break;
1275c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      }
1276c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
1277c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor    if (NestTy) {
1278c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      Instruction *Caller = CS.getInstruction();
1279c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      std::vector<Value*> NewArgs;
1280c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      NewArgs.reserve(unsigned(CS.arg_end()-CS.arg_begin())+1);
1281c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
1282c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      SmallVector<AttributeWithIndex, 8> NewAttrs;
1283c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      NewAttrs.reserve(Attrs.getNumSlots() + 1);
1284c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
1285c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      // Insert the nest argument into the call argument list, which may
1286c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      // mean appending it.  Likewise for attributes.
1287c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor
1288c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      // Add any result attributes.
1289c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      Attribute Attr = Attrs.getRetAttributes();
1290c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      if (Attr.hasAttributes())
12911efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar        NewAttrs.push_back(AttributeWithIndex::get(AttributeSet::ReturnIndex,
1292c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor                                                   Attr));
12931efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar
1294c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor      {
1295c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor        unsigned Idx = 1;
1296c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor        CallSite::arg_iterator I = CS.arg_begin(), E = CS.arg_end();
12971efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar        do {
12981efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar          if (Idx == NestIdx) {
1299c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor            // Add the chain argument and attributes.
1300c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor            Value *NestVal = Tramp->getArgOperand(2);
13011efcf3d137c11fb6b21c385911e0d2ca59ca94c3Daniel Dunbar            if (NestVal->getType() != NestTy)
1302ad6eff611a4391f89fd6c458db16993f76e7f5d0Ted Kremenek              NestVal = Builder->CreateBitCast(NestVal, NestTy, "nest");
13039f1e3ff3b3095967e2b92b57a53524e2d6bb141cDouglas Gregor            NewArgs.push_back(NestVal);
13049f1e3ff3b3095967e2b92b57a53524e2d6bb141cDouglas Gregor            NewAttrs.push_back(AttributeWithIndex::get(NestIdx, NestAttr));
13059f1e3ff3b3095967e2b92b57a53524e2d6bb141cDouglas Gregor          }
13069f1e3ff3b3095967e2b92b57a53524e2d6bb141cDouglas Gregor
13079f1e3ff3b3095967e2b92b57a53524e2d6bb141cDouglas Gregor          if (I == E)
13089f1e3ff3b3095967e2b92b57a53524e2d6bb141cDouglas Gregor            break;
1309ad6eff611a4391f89fd6c458db16993f76e7f5d0Ted Kremenek
1310ad6eff611a4391f89fd6c458db16993f76e7f5d0Ted Kremenek          // Add the original argument and attributes.
1311ad6eff611a4391f89fd6c458db16993f76e7f5d0Ted Kremenek          NewArgs.push_back(*I);
1312ad6eff611a4391f89fd6c458db16993f76e7f5d0Ted Kremenek          Attr = Attrs.getParamAttributes(Idx);
1313ad6eff611a4391f89fd6c458db16993f76e7f5d0Ted Kremenek          if (Attr.hasAttributes())
1314c42fefa51f7555bb3644a7cde2ca4bfd0d848d74Douglas Gregor            NewAttrs.push_back
131516b4259aecaa22b642d35d36fd89965ed700c1e0Ted Kremenek              (AttributeWithIndex::get(Idx + (Idx >= NestIdx), Attr));
131616b4259aecaa22b642d35d36fd89965ed700c1e0Ted Kremenek
131716b4259aecaa22b642d35d36fd89965ed700c1e0Ted Kremenek          ++Idx, ++I;
131816b4259aecaa22b642d35d36fd89965ed700c1e0Ted Kremenek        } while (1);
131916b4259aecaa22b642d35d36fd89965ed700c1e0Ted Kremenek      }
132016b4259aecaa22b642d35d36fd89965ed700c1e0Ted Kremenek
132116b4259aecaa22b642d35d36fd89965ed700c1e0Ted Kremenek      // Add any function attributes.
132216b4259aecaa22b642d35d36fd89965ed700c1e0Ted Kremenek      Attr = Attrs.getFnAttributes();
132316b4259aecaa22b642d35d36fd89965ed700c1e0Ted Kremenek      if (Attr.hasAttributes())
132416b4259aecaa22b642d35d36fd89965ed700c1e0Ted Kremenek        NewAttrs.push_back(AttributeWithIndex::get(AttributeSet::FunctionIndex,
132516b4259aecaa22b642d35d36fd89965ed700c1e0Ted Kremenek                                                   Attr));
132616b4259aecaa22b642d35d36fd89965ed700c1e0Ted Kremenek
132716b4259aecaa22b642d35d36fd89965ed700c1e0Ted Kremenek      // The trampoline may have been bitcast to a bogus type (FTy).
132816b4259aecaa22b642d35d36fd89965ed700c1e0Ted Kremenek      // Handle this by synthesizing a new function type, equal to FTy
132916b4259aecaa22b642d35d36fd89965ed700c1e0Ted Kremenek      // with the chain parameter inserted.
133016b4259aecaa22b642d35d36fd89965ed700c1e0Ted Kremenek
133116b4259aecaa22b642d35d36fd89965ed700c1e0Ted Kremenek      std::vector<Type*> NewTypes;
133216b4259aecaa22b642d35d36fd89965ed700c1e0Ted Kremenek      NewTypes.reserve(FTy->getNumParams()+1);
133316b4259aecaa22b642d35d36fd89965ed700c1e0Ted Kremenek
133416b4259aecaa22b642d35d36fd89965ed700c1e0Ted Kremenek      // Insert the chain's type into the list of parameter types, which may
133516b4259aecaa22b642d35d36fd89965ed700c1e0Ted Kremenek      // mean appending it.
133645e1dae500bba7a9ef5b8206263a5609c07c6f03Ted Kremenek      {
133716b4259aecaa22b642d35d36fd89965ed700c1e0Ted Kremenek        unsigned Idx = 1;
133816b4259aecaa22b642d35d36fd89965ed700c1e0Ted Kremenek        FunctionType::param_iterator I = FTy->param_begin(),
133916b4259aecaa22b642d35d36fd89965ed700c1e0Ted Kremenek          E = FTy->param_end();
134016b4259aecaa22b642d35d36fd89965ed700c1e0Ted Kremenek
134158ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor        do {
134258ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor          if (Idx == NestIdx)
134358ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor            // Add the chain's type.
134458ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor            NewTypes.push_back(NestTy);
134558ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor
134658ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor          if (I == E)
134758ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor            break;
134858ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor
134958ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor          // Add the original type.
135058ddb60f409125eda5436c4a1f070f7fa4744295Douglas Gregor          NewTypes.push_back(*I);
135145e1dae500bba7a9ef5b8206263a5609c07c6f03Ted Kremenek
135245e1dae500bba7a9ef5b8206263a5609c07c6f03Ted Kremenek          ++Idx, ++I;
135345e1dae500bba7a9ef5b8206263a5609c07c6f03Ted Kremenek        } while (1);
13546cd1e7cb04d1da66e8b5675062152ff60bbc354fTed Kremenek      }
135545e1dae500bba7a9ef5b8206263a5609c07c6f03Ted Kremenek
135645e1dae500bba7a9ef5b8206263a5609c07c6f03Ted Kremenek      // Replace the trampoline call with a direct call.  Let the generic
13576cd1e7cb04d1da66e8b5675062152ff60bbc354fTed Kremenek      // code sort out any function type mismatches.
135845e1dae500bba7a9ef5b8206263a5609c07c6f03Ted Kremenek      FunctionType *NewFTy = FunctionType::get(FTy->getReturnType(), NewTypes,
135945e1dae500bba7a9ef5b8206263a5609c07c6f03Ted Kremenek                                                FTy->isVarArg());
136045e1dae500bba7a9ef5b8206263a5609c07c6f03Ted Kremenek      Constant *NewCallee =
136145e1dae500bba7a9ef5b8206263a5609c07c6f03Ted Kremenek        NestF->getType() == PointerType::getUnqual(NewFTy) ?
136245e1dae500bba7a9ef5b8206263a5609c07c6f03Ted Kremenek        NestF : ConstantExpr::getBitCast(NestF,
136345e1dae500bba7a9ef5b8206263a5609c07c6f03Ted Kremenek                                         PointerType::getUnqual(NewFTy));
136445e1dae500bba7a9ef5b8206263a5609c07c6f03Ted Kremenek      const AttributeSet &NewPAL = AttributeSet::get(FTy->getContext(), NewAttrs);
13652be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor
13662be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor      Instruction *NewCaller;
13672be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor      if (InvokeInst *II = dyn_cast<InvokeInst>(Caller)) {
13682be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor        NewCaller = InvokeInst::Create(NewCallee,
13692be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor                                       II->getNormalDest(), II->getUnwindDest(),
13702be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor                                       NewArgs);
13712be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor        cast<InvokeInst>(NewCaller)->setCallingConv(II->getCallingConv());
13722be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor        cast<InvokeInst>(NewCaller)->setAttributes(NewPAL);
13732be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor      } else {
13742be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor        NewCaller = CallInst::Create(NewCallee, NewArgs);
13752be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor        if (cast<CallInst>(Caller)->isTailCall())
13762be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor          cast<CallInst>(NewCaller)->setTailCall();
13772be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor        cast<CallInst>(NewCaller)->
13782be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor          setCallingConv(cast<CallInst>(Caller)->getCallingConv());
13792be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor        cast<CallInst>(NewCaller)->setAttributes(NewPAL);
13802be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor      }
13812be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor
13822be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor      return NewCaller;
13832be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor    }
13842be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor  }
13852be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor
13862be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor  // Replace the trampoline call with a direct call.  Since there is no 'nest'
13872be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor  // parameter, there is no need to adjust the argument list.  Let the generic
13882be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor  // code sort out any function type mismatches.
13892be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor  Constant *NewCallee =
13902be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor    NestF->getType() == PTy ? NestF :
13912be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor                              ConstantExpr::getBitCast(NestF, PTy);
13922be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor  CS.setCalledFunction(NewCallee);
13932be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor  return CS.getInstruction();
13942be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor}
13952be5bc9ad3981347a000742f81b91ab3080f1214Douglas Gregor