AutoUpgrade.cpp revision f93f7b2446bec3febc30b7136e18704664bd98cc
16994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth//===-- AutoUpgrade.cpp - Implement auto-upgrade helper functions ---------===//
26994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth//
36994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth//                     The LLVM Compiler Infrastructure
46994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
76994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth//
86994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth//===----------------------------------------------------------------------===//
96994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth//
106994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth// This file implements the auto-upgrade helper functions
116994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth//
126994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth//===----------------------------------------------------------------------===//
136994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth
146994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth#include "llvm/AutoUpgrade.h"
15d04764a8acabe0b3f0452b3099bc5964ba783884Anders Carlsson#include "llvm/Constants.h"
166994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth#include "llvm/Function.h"
17f81b57694b3c34a79b1464ffd21e6768c8d22662Owen Anderson#include "llvm/LLVMContext.h"
186994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth#include "llvm/Module.h"
19e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel#include "llvm/IntrinsicInst.h"
2058d74910c6b82e622ecbb57d6644d48fec5a5c0fChris Lattner#include "llvm/ADT/SmallVector.h"
21bb6eabf4f5b518a333ab4cedce910962ff935e3aGabor Greif#include "llvm/Support/CallSite.h"
22c25e7581b9b8088910da31702d4ca21c4734c6d7Torok Edwin#include "llvm/Support/ErrorHandling.h"
236d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher#include "llvm/Support/IRBuilder.h"
24ae9f3a3b7c915f725aef5a7250e88eaeddda03c6Anton Korobeynikov#include <cstring>
256994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruthusing namespace llvm;
266994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth
276994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth
28f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Chengstatic bool UpgradeIntrinsicFunction1(Function *F, Function *&NewFn) {
296994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth  assert(F && "Illegal to upgrade a non-existent Function.");
306994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth
316994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth  // Get the Function's name.
326994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth  const std::string& Name = F->getName();
336994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth
346994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth  // Convenience
356994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth  const FunctionType *FTy = F->getFunctionType();
366994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth
376994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth  // Quickly eliminate it, if it's not a candidate.
386994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth  if (Name.length() <= 8 || Name[0] != 'l' || Name[1] != 'l' ||
396994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      Name[2] != 'v' || Name[3] != 'm' || Name[4] != '.')
40f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng    return false;
416994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth
426994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth  Module *M = F->getParent();
436994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth  switch (Name[5]) {
446994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth  default: break;
4528873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang  case 'a':
46e3b3a7241c01f26613694e53b26b01abf764ddfcMon P Wang    // This upgrades the llvm.atomic.lcs, llvm.atomic.las, llvm.atomic.lss,
47e3b3a7241c01f26613694e53b26b01abf764ddfcMon P Wang    // and atomics with default address spaces to their new names to their new
48e3b3a7241c01f26613694e53b26b01abf764ddfcMon P Wang    // function name (e.g. llvm.atomic.add.i32 => llvm.atomic.add.i32.p0i32)
49e3b3a7241c01f26613694e53b26b01abf764ddfcMon P Wang    if (Name.compare(5,7,"atomic.",7) == 0) {
5028873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang      if (Name.compare(12,3,"lcs",3) == 0) {
5128873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang        std::string::size_type delim = Name.find('.',12);
52e3b3a7241c01f26613694e53b26b01abf764ddfcMon P Wang        F->setName("llvm.atomic.cmp.swap" + Name.substr(delim) +
53e3b3a7241c01f26613694e53b26b01abf764ddfcMon P Wang                   ".p0" + Name.substr(delim+1));
5428873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang        NewFn = F;
5528873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang        return true;
5628873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang      }
5728873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang      else if (Name.compare(12,3,"las",3) == 0) {
5828873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang        std::string::size_type delim = Name.find('.',12);
59e3b3a7241c01f26613694e53b26b01abf764ddfcMon P Wang        F->setName("llvm.atomic.load.add"+Name.substr(delim)
60e3b3a7241c01f26613694e53b26b01abf764ddfcMon P Wang                   + ".p0" + Name.substr(delim+1));
6128873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang        NewFn = F;
6228873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang        return true;
6328873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang      }
6428873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang      else if (Name.compare(12,3,"lss",3) == 0) {
6528873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang        std::string::size_type delim = Name.find('.',12);
66e3b3a7241c01f26613694e53b26b01abf764ddfcMon P Wang        F->setName("llvm.atomic.load.sub"+Name.substr(delim)
67e3b3a7241c01f26613694e53b26b01abf764ddfcMon P Wang                   + ".p0" + Name.substr(delim+1));
68e3b3a7241c01f26613694e53b26b01abf764ddfcMon P Wang        NewFn = F;
69e3b3a7241c01f26613694e53b26b01abf764ddfcMon P Wang        return true;
70e3b3a7241c01f26613694e53b26b01abf764ddfcMon P Wang      }
71e3b3a7241c01f26613694e53b26b01abf764ddfcMon P Wang      else if (Name.rfind(".p") == std::string::npos) {
72e3b3a7241c01f26613694e53b26b01abf764ddfcMon P Wang        // We don't have an address space qualifier so this has be upgraded
73e3b3a7241c01f26613694e53b26b01abf764ddfcMon P Wang        // to the new name.  Copy the type name at the end of the intrinsic
74e3b3a7241c01f26613694e53b26b01abf764ddfcMon P Wang        // and add to it
75e3b3a7241c01f26613694e53b26b01abf764ddfcMon P Wang        std::string::size_type delim = Name.find_last_of('.');
76e3b3a7241c01f26613694e53b26b01abf764ddfcMon P Wang        assert(delim != std::string::npos && "can not find type");
77e3b3a7241c01f26613694e53b26b01abf764ddfcMon P Wang        F->setName(Name + ".p0" + Name.substr(delim+1));
7828873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang        NewFn = F;
7928873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang        return true;
8028873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang      }
81b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson    } else if (Name.compare(5, 9, "arm.neon.", 9) == 0) {
8204d6c289ab28114af5471c4dc38cbf7b7127d3c3Bob Wilson      if (((Name.compare(14, 5, "vmovl", 5) == 0 ||
8304d6c289ab28114af5471c4dc38cbf7b7127d3c3Bob Wilson            Name.compare(14, 5, "vaddl", 5) == 0 ||
84eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson            Name.compare(14, 5, "vsubl", 5) == 0 ||
85eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson            Name.compare(14, 5, "vaddw", 5) == 0 ||
86eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson            Name.compare(14, 5, "vsubw", 5) == 0 ||
87d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson            Name.compare(14, 5, "vmlal", 5) == 0 ||
88eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson            Name.compare(14, 5, "vmlsl", 5) == 0 ||
89eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson            Name.compare(14, 5, "vabdl", 5) == 0 ||
90eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson            Name.compare(14, 5, "vabal", 5) == 0) &&
91d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson           (Name.compare(19, 2, "s.", 2) == 0 ||
92d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson            Name.compare(19, 2, "u.", 2) == 0)) ||
93d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson
94eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson          (Name.compare(14, 4, "vaba", 4) == 0 &&
95eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson           (Name.compare(18, 2, "s.", 2) == 0 ||
96eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson            Name.compare(18, 2, "u.", 2) == 0)) ||
97eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson
98973a074345add36c046c0f0bfea0156a532ab479Bob Wilson          (Name.compare(14, 6, "vmovn.", 6) == 0)) {
9904d6c289ab28114af5471c4dc38cbf7b7127d3c3Bob Wilson
100b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson        // Calls to these are transformed into IR without intrinsics.
101b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson        NewFn = 0;
102b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson        return true;
103b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson      }
1047a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson      // Old versions of NEON ld/st intrinsics are missing alignment arguments.
1057a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson      bool isVLd = (Name.compare(14, 3, "vld", 3) == 0);
1067a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson      bool isVSt = (Name.compare(14, 3, "vst", 3) == 0);
1077a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson      if (isVLd || isVSt) {
1087a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson        unsigned NumVecs = Name.at(17) - '0';
1097a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson        if (NumVecs == 0 || NumVecs > 4)
1107a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson          return false;
1117a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson        bool isLaneOp = (Name.compare(18, 5, "lane.", 5) == 0);
1127a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson        if (!isLaneOp && Name.at(18) != '.')
1137a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson          return false;
1147a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson        unsigned ExpectedArgs = 2; // for the address and alignment
1157a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson        if (isVSt || isLaneOp)
1167a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson          ExpectedArgs += NumVecs;
1177a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson        if (isLaneOp)
1187a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson          ExpectedArgs += 1; // for the lane number
1197a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson        unsigned NumP = FTy->getNumParams();
1207a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson        if (NumP != ExpectedArgs - 1)
1217a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson          return false;
1227a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson
1237a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson        // Change the name of the old (bad) intrinsic, because
1247a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson        // its type is incorrect, but we cannot overload that name.
1257a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson        F->setName("");
1267a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson
1277a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson        // One argument is missing: add the alignment argument.
1287a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson        std::vector<const Type*> NewParams;
1297a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson        for (unsigned p = 0; p < NumP; ++p)
1307a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson          NewParams.push_back(FTy->getParamType(p));
1317a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson        NewParams.push_back(Type::getInt32Ty(F->getContext()));
1327a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson        FunctionType *NewFTy = FunctionType::get(FTy->getReturnType(),
1337a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson                                                 NewParams, false);
1347a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson        NewFn = cast<Function>(M->getOrInsertFunction(Name, NewFTy));
1357a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson        return true;
1367a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson      }
13728873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang    }
13828873106309db515d58889a4c4fa3e0a92d1b60eMon P Wang    break;
1396994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth  case 'b':
1406994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    //  This upgrades the name of the llvm.bswap intrinsic function to only use
1416994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    //  a single type name for overloading. We only care about the old format
1426994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    //  'llvm.bswap.i*.i*', so check for 'bswap.' and then for there being
1436994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    //  a '.' after 'bswap.'
1446994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    if (Name.compare(5,6,"bswap.",6) == 0) {
1456994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      std::string::size_type delim = Name.find('.',11);
1466994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth
1476994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      if (delim != std::string::npos) {
1486994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth        //  Construct the new name as 'llvm.bswap' + '.i*'
1496994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth        F->setName(Name.substr(0,10)+Name.substr(delim));
150f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng        NewFn = F;
151f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng        return true;
1526994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      }
1536994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    }
1546994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    break;
1556994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth
1566994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth  case 'c':
1576994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    //  We only want to fix the 'llvm.ct*' intrinsics which do not have the
1586994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    //  correct return type, so we check for the name, and then check if the
1596994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    //  return type does not match the parameter type.
1606994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    if ( (Name.compare(5,5,"ctpop",5) == 0 ||
1616994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth          Name.compare(5,4,"ctlz",4) == 0 ||
1626994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth          Name.compare(5,4,"cttz",4) == 0) &&
1636994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth        FTy->getReturnType() != FTy->getParamType(0)) {
1646994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      //  We first need to change the name of the old (bad) intrinsic, because
1656994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      //  its type is incorrect, but we cannot overload that name. We
1666994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      //  arbitrarily unique it here allowing us to construct a correctly named
1676994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      //  and typed function below.
1686994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      F->setName("");
1696994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth
1706994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      //  Now construct the new intrinsic with the correct name and type. We
1716994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      //  leave the old function around in order to query its type, whatever it
1726994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      //  may be, and correctly convert up to the new type.
173f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng      NewFn = cast<Function>(M->getOrInsertFunction(Name,
174f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng                                                    FTy->getParamType(0),
175f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng                                                    FTy->getParamType(0),
176f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng                                                    (Type *)0));
177f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng      return true;
1786994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    }
1796994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    break;
1806994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth
181b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands  case 'e':
182b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands    //  The old llvm.eh.selector.i32 is equivalent to the new llvm.eh.selector.
183b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands    if (Name.compare("llvm.eh.selector.i32") == 0) {
184b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands      F->setName("llvm.eh.selector");
185b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands      NewFn = F;
186b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands      return true;
187b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands    }
188b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands    //  The old llvm.eh.typeid.for.i32 is equivalent to llvm.eh.typeid.for.
189b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands    if (Name.compare("llvm.eh.typeid.for.i32") == 0) {
190b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands      F->setName("llvm.eh.typeid.for");
191b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands      NewFn = F;
192b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands      return true;
193b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands    }
194b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands    //  Convert the old llvm.eh.selector.i64 to a call to llvm.eh.selector.
195b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands    if (Name.compare("llvm.eh.selector.i64") == 0) {
196b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands      NewFn = Intrinsic::getDeclaration(M, Intrinsic::eh_selector);
197b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands      return true;
198b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands    }
199b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands    //  Convert the old llvm.eh.typeid.for.i64 to a call to llvm.eh.typeid.for.
200b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands    if (Name.compare("llvm.eh.typeid.for.i64") == 0) {
201b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands      NewFn = Intrinsic::getDeclaration(M, Intrinsic::eh_typeid_for);
202b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands      return true;
203b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands    }
204b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands    break;
205b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands
20620adc9dc4650313f017b27d9818eb2176238113dMon P Wang  case 'm': {
20720adc9dc4650313f017b27d9818eb2176238113dMon P Wang    // This upgrades the llvm.memcpy, llvm.memmove, and llvm.memset to the
20820adc9dc4650313f017b27d9818eb2176238113dMon P Wang    // new format that allows overloading the pointer for different address
20920adc9dc4650313f017b27d9818eb2176238113dMon P Wang    // space (e.g., llvm.memcpy.i16 => llvm.memcpy.p0i8.p0i8.i16)
21020adc9dc4650313f017b27d9818eb2176238113dMon P Wang    const char* NewFnName = NULL;
21120adc9dc4650313f017b27d9818eb2176238113dMon P Wang    if (Name.compare(5,8,"memcpy.i",8) == 0) {
21220adc9dc4650313f017b27d9818eb2176238113dMon P Wang      if (Name[13] == '8')
21320adc9dc4650313f017b27d9818eb2176238113dMon P Wang        NewFnName = "llvm.memcpy.p0i8.p0i8.i8";
21420adc9dc4650313f017b27d9818eb2176238113dMon P Wang      else if (Name.compare(13,2,"16") == 0)
21520adc9dc4650313f017b27d9818eb2176238113dMon P Wang        NewFnName = "llvm.memcpy.p0i8.p0i8.i16";
21620adc9dc4650313f017b27d9818eb2176238113dMon P Wang      else if (Name.compare(13,2,"32") == 0)
21720adc9dc4650313f017b27d9818eb2176238113dMon P Wang        NewFnName = "llvm.memcpy.p0i8.p0i8.i32";
21820adc9dc4650313f017b27d9818eb2176238113dMon P Wang      else if (Name.compare(13,2,"64") == 0)
21920adc9dc4650313f017b27d9818eb2176238113dMon P Wang        NewFnName = "llvm.memcpy.p0i8.p0i8.i64";
22020adc9dc4650313f017b27d9818eb2176238113dMon P Wang    } else if (Name.compare(5,9,"memmove.i",9) == 0) {
22120adc9dc4650313f017b27d9818eb2176238113dMon P Wang      if (Name[14] == '8')
22220adc9dc4650313f017b27d9818eb2176238113dMon P Wang        NewFnName = "llvm.memmove.p0i8.p0i8.i8";
22320adc9dc4650313f017b27d9818eb2176238113dMon P Wang      else if (Name.compare(14,2,"16") == 0)
22420adc9dc4650313f017b27d9818eb2176238113dMon P Wang        NewFnName = "llvm.memmove.p0i8.p0i8.i16";
22520adc9dc4650313f017b27d9818eb2176238113dMon P Wang      else if (Name.compare(14,2,"32") == 0)
22620adc9dc4650313f017b27d9818eb2176238113dMon P Wang        NewFnName = "llvm.memmove.p0i8.p0i8.i32";
22720adc9dc4650313f017b27d9818eb2176238113dMon P Wang      else if (Name.compare(14,2,"64") == 0)
22820adc9dc4650313f017b27d9818eb2176238113dMon P Wang        NewFnName = "llvm.memmove.p0i8.p0i8.i64";
22920adc9dc4650313f017b27d9818eb2176238113dMon P Wang    }
23020adc9dc4650313f017b27d9818eb2176238113dMon P Wang    else if (Name.compare(5,8,"memset.i",8) == 0) {
23120adc9dc4650313f017b27d9818eb2176238113dMon P Wang      if (Name[13] == '8')
23220adc9dc4650313f017b27d9818eb2176238113dMon P Wang        NewFnName = "llvm.memset.p0i8.i8";
23320adc9dc4650313f017b27d9818eb2176238113dMon P Wang      else if (Name.compare(13,2,"16") == 0)
23420adc9dc4650313f017b27d9818eb2176238113dMon P Wang        NewFnName = "llvm.memset.p0i8.i16";
23520adc9dc4650313f017b27d9818eb2176238113dMon P Wang      else if (Name.compare(13,2,"32") == 0)
23620adc9dc4650313f017b27d9818eb2176238113dMon P Wang        NewFnName = "llvm.memset.p0i8.i32";
23720adc9dc4650313f017b27d9818eb2176238113dMon P Wang      else if (Name.compare(13,2,"64") == 0)
23820adc9dc4650313f017b27d9818eb2176238113dMon P Wang        NewFnName = "llvm.memset.p0i8.i64";
23920adc9dc4650313f017b27d9818eb2176238113dMon P Wang    }
24020adc9dc4650313f017b27d9818eb2176238113dMon P Wang    if (NewFnName) {
24120adc9dc4650313f017b27d9818eb2176238113dMon P Wang      NewFn = cast<Function>(M->getOrInsertFunction(NewFnName,
24220adc9dc4650313f017b27d9818eb2176238113dMon P Wang                                            FTy->getReturnType(),
24320adc9dc4650313f017b27d9818eb2176238113dMon P Wang                                            FTy->getParamType(0),
24420adc9dc4650313f017b27d9818eb2176238113dMon P Wang                                            FTy->getParamType(1),
24520adc9dc4650313f017b27d9818eb2176238113dMon P Wang                                            FTy->getParamType(2),
24620adc9dc4650313f017b27d9818eb2176238113dMon P Wang                                            FTy->getParamType(3),
24720adc9dc4650313f017b27d9818eb2176238113dMon P Wang                                            Type::getInt1Ty(F->getContext()),
24820adc9dc4650313f017b27d9818eb2176238113dMon P Wang                                            (Type *)0));
24920adc9dc4650313f017b27d9818eb2176238113dMon P Wang      return true;
25020adc9dc4650313f017b27d9818eb2176238113dMon P Wang    }
25120adc9dc4650313f017b27d9818eb2176238113dMon P Wang    break;
25220adc9dc4650313f017b27d9818eb2176238113dMon P Wang  }
2536994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth  case 'p':
2546994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    //  This upgrades the llvm.part.select overloaded intrinsic names to only
2556994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    //  use one type specifier in the name. We only care about the old format
2566994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    //  'llvm.part.select.i*.i*', and solve as above with bswap.
2576994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    if (Name.compare(5,12,"part.select.",12) == 0) {
2586994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      std::string::size_type delim = Name.find('.',17);
2596994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth
2606994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      if (delim != std::string::npos) {
2616994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth        //  Construct a new name as 'llvm.part.select' + '.i*'
2626994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth        F->setName(Name.substr(0,16)+Name.substr(delim));
263f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng        NewFn = F;
264f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng        return true;
2656994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      }
2666994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      break;
2676994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    }
2686994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth
2696994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    //  This upgrades the llvm.part.set intrinsics similarly as above, however
2706994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    //  we care about 'llvm.part.set.i*.i*.i*', but only the first two types
2716994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    //  must match. There is an additional type specifier after these two
2726994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    //  matching types that we must retain when upgrading.  Thus, we require
2736994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    //  finding 2 periods, not just one, after the intrinsic name.
2746994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    if (Name.compare(5,9,"part.set.",9) == 0) {
2756994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      std::string::size_type delim = Name.find('.',14);
2766994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth
2776994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      if (delim != std::string::npos &&
2786994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth          Name.find('.',delim+1) != std::string::npos) {
2796994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth        //  Construct a new name as 'llvm.part.select' + '.i*.i*'
2806994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth        F->setName(Name.substr(0,13)+Name.substr(delim));
281f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng        NewFn = F;
282f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng        return true;
2836994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      }
2846994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      break;
2856994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    }
2866994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth
2876994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    break;
288d04764a8acabe0b3f0452b3099bc5964ba783884Anders Carlsson  case 'x':
289d04764a8acabe0b3f0452b3099bc5964ba783884Anders Carlsson    // This fixes all MMX shift intrinsic instructions to take a
2900488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    // x86_mmx instead of a v1i64, v2i32, v4i16, or v8i8.
2910488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    if (Name.compare(5, 8, "x86.mmx.", 8) == 0) {
2920488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      const Type *X86_MMXTy = VectorType::getX86_MMXTy(FTy->getContext());
2930488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
2940488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      if (Name.compare(13, 4, "padd", 4) == 0   ||
2950488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          Name.compare(13, 4, "psub", 4) == 0   ||
2960488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          Name.compare(13, 4, "pmul", 4) == 0   ||
2970488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          Name.compare(13, 5, "pmadd", 5) == 0  ||
2980488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          Name.compare(13, 4, "pand", 4) == 0   ||
2990488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          Name.compare(13, 3, "por", 3) == 0    ||
3000488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          Name.compare(13, 4, "pxor", 4) == 0   ||
3010488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          Name.compare(13, 4, "pavg", 4) == 0   ||
3020488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          Name.compare(13, 4, "pmax", 4) == 0   ||
3030488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          Name.compare(13, 4, "pmin", 4) == 0   ||
3040488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          Name.compare(13, 4, "psad", 4) == 0   ||
3050488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          Name.compare(13, 4, "psll", 4) == 0   ||
3060488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          Name.compare(13, 4, "psrl", 4) == 0   ||
3070488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          Name.compare(13, 4, "psra", 4) == 0   ||
3080488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          Name.compare(13, 4, "pack", 4) == 0   ||
3090488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          Name.compare(13, 6, "punpck", 6) == 0 ||
3100488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          Name.compare(13, 4, "pcmp", 4) == 0) {
3110488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        assert(FTy->getNumParams() == 2 && "MMX intrinsic takes 2 args!");
3120488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        const Type *SecondParamTy = X86_MMXTy;
3130488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
3140488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        if (Name.compare(13, 5, "pslli", 5) == 0 ||
3150488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen            Name.compare(13, 5, "psrli", 5) == 0 ||
3160488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen            Name.compare(13, 5, "psrai", 5) == 0)
3170488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          SecondParamTy = FTy->getParamType(1);
3180488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
3190488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        // Don't do anything if it has the correct types.
3200488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        if (FTy->getReturnType() == X86_MMXTy &&
3210488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen            FTy->getParamType(0) == X86_MMXTy &&
3220488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen            FTy->getParamType(1) == SecondParamTy)
3230488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          break;
3240488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
3250488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        // We first need to change the name of the old (bad) intrinsic, because
3260488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        // its type is incorrect, but we cannot overload that name. We
3270488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        // arbitrarily unique it here allowing us to construct a correctly named
3280488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        // and typed function below.
3290488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        F->setName("");
3300488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
3310488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        // Now construct the new intrinsic with the correct name and type. We
3320488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        // leave the old function around in order to query its type, whatever it
3330488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        // may be, and correctly convert up to the new type.
3340488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        NewFn = cast<Function>(M->getOrInsertFunction(Name,
3350488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      X86_MMXTy, X86_MMXTy,
3360488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      SecondParamTy, (Type*)0));
3370488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        return true;
3380488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      }
3390488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
3400488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      if (Name.compare(13, 8, "maskmovq", 8) == 0) {
3410488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        // Don't do anything if it has the correct types.
3420488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        if (FTy->getParamType(0) == X86_MMXTy &&
3430488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen            FTy->getParamType(1) == X86_MMXTy)
3440488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          break;
3450488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
3460488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        F->setName("");
3470488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        NewFn = cast<Function>(M->getOrInsertFunction(Name,
3480488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      FTy->getReturnType(),
3490488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      X86_MMXTy,
3500488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      X86_MMXTy,
3510488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      FTy->getParamType(2),
3520488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      (Type*)0));
3530488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        return true;
3540488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      }
3550488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
3560488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      if (Name.compare(13, 8, "pmovmskb", 8) == 0) {
3570488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        if (FTy->getParamType(0) == X86_MMXTy)
3580488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          break;
3590488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
3600488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        F->setName("");
3610488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        NewFn = cast<Function>(M->getOrInsertFunction(Name,
3620488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      FTy->getReturnType(),
3630488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      X86_MMXTy,
3640488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      (Type*)0));
3650488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        return true;
3660488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      }
3670488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
3680488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      if (Name.compare(13, 5, "movnt", 5) == 0) {
3690488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        if (FTy->getParamType(1) == X86_MMXTy)
3700488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          break;
3710488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
3720488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        F->setName("");
3730488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        NewFn = cast<Function>(M->getOrInsertFunction(Name,
3740488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      FTy->getReturnType(),
3750488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      FTy->getParamType(0),
3760488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      X86_MMXTy,
3770488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      (Type*)0));
3780488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        return true;
3790488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      }
3800488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
3810488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      if (Name.compare(13, 7, "palignr", 7) == 0) {
3820488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        if (FTy->getReturnType() == X86_MMXTy &&
3830488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen            FTy->getParamType(0) == X86_MMXTy &&
3840488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen            FTy->getParamType(1) == X86_MMXTy)
3850488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          break;
3860488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
3870488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        F->setName("");
3880488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        NewFn = cast<Function>(M->getOrInsertFunction(Name,
3890488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      X86_MMXTy,
3900488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      X86_MMXTy,
3910488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      X86_MMXTy,
3920488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      FTy->getParamType(2),
3930488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      (Type*)0));
3940488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        return true;
3950488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      }
3960488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
3970488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      if (Name.compare(13, 5, "pextr", 5) == 0) {
3980488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        if (FTy->getParamType(0) == X86_MMXTy)
3990488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          break;
4000488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
4010488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        F->setName("");
4020488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        NewFn = cast<Function>(M->getOrInsertFunction(Name,
4030488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      FTy->getReturnType(),
4040488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      X86_MMXTy,
4050488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      FTy->getParamType(1),
4060488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      (Type*)0));
4070488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        return true;
4080488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      }
4090488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
4100488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      if (Name.compare(13, 5, "pinsr", 5) == 0) {
4110488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        if (FTy->getReturnType() == X86_MMXTy &&
4120488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen            FTy->getParamType(0) == X86_MMXTy)
4130488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          break;
4140488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
4150488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        F->setName("");
4160488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        NewFn = cast<Function>(M->getOrInsertFunction(Name,
4170488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      X86_MMXTy,
4180488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      X86_MMXTy,
4190488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      FTy->getParamType(1),
4200488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      FTy->getParamType(2),
4210488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      (Type*)0));
4220488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        return true;
4230488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      }
4240488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
4250488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      if (Name.compare(13, 12, "cvtsi32.si64", 12) == 0) {
4260488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        if (FTy->getReturnType() == X86_MMXTy)
4270488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          break;
4280488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
4290488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        F->setName("");
4300488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        NewFn = cast<Function>(M->getOrInsertFunction(Name,
4310488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      X86_MMXTy,
4320488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      FTy->getParamType(0),
4330488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      (Type*)0));
4340488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        return true;
4350488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      }
4360488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
4370488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      if (Name.compare(13, 12, "cvtsi64.si32", 12) == 0) {
4380488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        if (FTy->getParamType(0) == X86_MMXTy)
4390488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          break;
4400488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
4410488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        F->setName("");
4420488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        NewFn = cast<Function>(M->getOrInsertFunction(Name,
4430488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      FTy->getReturnType(),
4440488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      X86_MMXTy,
4450488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      (Type*)0));
4460488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        return true;
4470488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      }
4480488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
4490488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      if (Name.compare(13, 8, "vec.init", 8) == 0) {
4500488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        if (FTy->getReturnType() == X86_MMXTy)
4510488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          break;
4520488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
4530488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        F->setName("");
4540488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
4550488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        if (Name.compare(21, 2, ".b", 2) == 0)
4560488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          NewFn = cast<Function>(M->getOrInsertFunction(Name,
4570488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                        X86_MMXTy,
4580488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                        FTy->getParamType(0),
4590488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                        FTy->getParamType(1),
4600488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                        FTy->getParamType(2),
4610488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                        FTy->getParamType(3),
4620488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                        FTy->getParamType(4),
4630488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                        FTy->getParamType(5),
4640488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                        FTy->getParamType(6),
4650488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                        FTy->getParamType(7),
4660488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                        (Type*)0));
4670488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        else if (Name.compare(21, 2, ".w", 2) == 0)
4680488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          NewFn = cast<Function>(M->getOrInsertFunction(Name,
4690488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                        X86_MMXTy,
4700488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                        FTy->getParamType(0),
4710488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                        FTy->getParamType(1),
4720488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                        FTy->getParamType(2),
4730488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                        FTy->getParamType(3),
4740488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                        (Type*)0));
4750488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        else if (Name.compare(21, 2, ".d", 2) == 0)
4760488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          NewFn = cast<Function>(M->getOrInsertFunction(Name,
4770488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                        X86_MMXTy,
4780488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                        FTy->getParamType(0),
4790488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                        FTy->getParamType(1),
4800488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                        (Type*)0));
4810488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        return true;
4820488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      }
4830488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
4840488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
4850488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      if (Name.compare(13, 9, "vec.ext.d", 9) == 0) {
4860488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        if (FTy->getReturnType() == X86_MMXTy &&
4870488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen            FTy->getParamType(0) == X86_MMXTy)
4880488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          break;
4890488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
4900488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        F->setName("");
4910488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        NewFn = cast<Function>(M->getOrInsertFunction(Name,
4920488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      X86_MMXTy,
4930488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      X86_MMXTy,
4940488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      FTy->getParamType(1),
4950488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                      (Type*)0));
4960488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        return true;
4970488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      }
4980488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
4990488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      if (Name.compare(13, 9, "emms", 4) == 0 ||
5000488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen          Name.compare(13, 9, "femms", 5) == 0) {
5010488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        NewFn = 0;
502d04764a8acabe0b3f0452b3099bc5964ba783884Anders Carlsson        break;
5030488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      }
504d04764a8acabe0b3f0452b3099bc5964ba783884Anders Carlsson
5050488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      // We really shouldn't get here ever.
5060488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      assert(0 && "Invalid MMX intrinsic!");
5070488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      break;
5084797f61657fc32d2e4e806f9f8faadf3fee3e64cEvan Cheng    } else if (Name.compare(5,17,"x86.sse2.loadh.pd",17) == 0 ||
5094797f61657fc32d2e4e806f9f8faadf3fee3e64cEvan Cheng               Name.compare(5,17,"x86.sse2.loadl.pd",17) == 0 ||
510e716bb1c59fe64c663d1d352e0e3889a28dbaca2Evan Cheng               Name.compare(5,16,"x86.sse2.movl.dq",16) == 0 ||
511e716bb1c59fe64c663d1d352e0e3889a28dbaca2Evan Cheng               Name.compare(5,15,"x86.sse2.movs.d",15) == 0 ||
512e716bb1c59fe64c663d1d352e0e3889a28dbaca2Evan Cheng               Name.compare(5,16,"x86.sse2.shuf.pd",16) == 0 ||
513e716bb1c59fe64c663d1d352e0e3889a28dbaca2Evan Cheng               Name.compare(5,18,"x86.sse2.unpckh.pd",18) == 0 ||
514a31593901de573813d1d8e7884a152011641a713Evan Cheng               Name.compare(5,18,"x86.sse2.unpckl.pd",18) == 0 ||
515a31593901de573813d1d8e7884a152011641a713Evan Cheng               Name.compare(5,20,"x86.sse2.punpckh.qdq",20) == 0 ||
516a31593901de573813d1d8e7884a152011641a713Evan Cheng               Name.compare(5,20,"x86.sse2.punpckl.qdq",20) == 0) {
5174797f61657fc32d2e4e806f9f8faadf3fee3e64cEvan Cheng      // Calls to these intrinsics are transformed into ShuffleVector's.
518f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng      NewFn = 0;
519f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng      return true;
5208258d0b4bfd5fe40c29fa19e24c23ba3ac157e23Eric Christopher    } else if (Name.compare(5, 16, "x86.sse41.pmulld", 16) == 0) {
5218258d0b4bfd5fe40c29fa19e24c23ba3ac157e23Eric Christopher      // Calls to these intrinsics are transformed into vector multiplies.
5228258d0b4bfd5fe40c29fa19e24c23ba3ac157e23Eric Christopher      NewFn = 0;
5238258d0b4bfd5fe40c29fa19e24c23ba3ac157e23Eric Christopher      return true;
5246d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher    } else if (Name.compare(5, 18, "x86.ssse3.palign.r", 18) == 0 ||
5256d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher               Name.compare(5, 22, "x86.ssse3.palign.r.128", 22) == 0) {
5266d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      // Calls to these intrinsics are transformed into vector shuffles, shifts,
5276d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      // or 0.
5286d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      NewFn = 0;
5296d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      return true;
530f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling    } else if (Name.compare(5, 16, "x86.sse.loadu.ps", 16) == 0 ||
531f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling               Name.compare(5, 17, "x86.sse2.loadu.dq", 17) == 0 ||
532f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling               Name.compare(5, 17, "x86.sse2.loadu.pd", 17) == 0) {
533f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling      // Calls to these instructions are transformed into unaligned loads.
534f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling      NewFn = 0;
535f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling      return true;
5366cf6c79e8281835898cd105a30efedd44b554000Bill Wendling    } else if (Name.compare(5, 17, "x86.ssse3.pshuf.w", 17) == 0) {
5376cf6c79e8281835898cd105a30efedd44b554000Bill Wendling      // This is an SSE/MMX instruction.
5386cf6c79e8281835898cd105a30efedd44b554000Bill Wendling      const Type *X86_MMXTy = VectorType::getX86_MMXTy(FTy->getContext());
5396cf6c79e8281835898cd105a30efedd44b554000Bill Wendling      NewFn =
5406cf6c79e8281835898cd105a30efedd44b554000Bill Wendling        cast<Function>(M->getOrInsertFunction("llvm.x86.sse.pshuf.w",
5416cf6c79e8281835898cd105a30efedd44b554000Bill Wendling                                              X86_MMXTy,
5426cf6c79e8281835898cd105a30efedd44b554000Bill Wendling                                              X86_MMXTy,
5436cf6c79e8281835898cd105a30efedd44b554000Bill Wendling                                              Type::getInt8Ty(F->getContext()),
5446cf6c79e8281835898cd105a30efedd44b554000Bill Wendling                                              (Type*)0));
5456cf6c79e8281835898cd105a30efedd44b554000Bill Wendling      return true;
546d04764a8acabe0b3f0452b3099bc5964ba783884Anders Carlsson    }
547f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng
548d04764a8acabe0b3f0452b3099bc5964ba783884Anders Carlsson    break;
5496994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth  }
5506994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth
5516994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth  //  This may not belong here. This function is effectively being overloaded
5526994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth  //  to both detect an intrinsic which needs upgrading, and to provide the
5536994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth  //  upgraded form of the intrinsic. We should perhaps have two separate
5546994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth  //  functions for this.
555f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng  return false;
5566994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth}
5576994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth
558f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Chengbool llvm::UpgradeIntrinsicFunction(Function *F, Function *&NewFn) {
559f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng  NewFn = 0;
560f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng  bool Upgraded = UpgradeIntrinsicFunction1(F, NewFn);
561a3355ffb3d30d19d226bbb75707991c60f236e37Duncan Sands
562a3355ffb3d30d19d226bbb75707991c60f236e37Duncan Sands  // Upgrade intrinsic attributes.  This does not change the function.
563f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng  if (NewFn)
564f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng    F = NewFn;
56549de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen  if (unsigned id = F->getIntrinsicID())
5660598866c052147c31b808391f58434ce3dbfb838Devang Patel    F->setAttributes(Intrinsic::getAttributes((Intrinsic::ID)id));
567a3355ffb3d30d19d226bbb75707991c60f236e37Duncan Sands  return Upgraded;
568a3355ffb3d30d19d226bbb75707991c60f236e37Duncan Sands}
569a3355ffb3d30d19d226bbb75707991c60f236e37Duncan Sands
570de49f360ec4780acb382a3ae923d1716fdb0dc03Bill Wendlingbool llvm::UpgradeGlobalVariable(GlobalVariable *GV) {
571f9e49e86ee9f06c2808c6e57723c5650615e689dBill Wendling  StringRef Name(GV->getName());
572ebd3e5f4cc8656191ee56c028930c0092815518fBill Wendling
573ebd3e5f4cc8656191ee56c028930c0092815518fBill Wendling  // We are only upgrading one symbol here.
574de49f360ec4780acb382a3ae923d1716fdb0dc03Bill Wendling  if (Name == ".llvm.eh.catch.all.value") {
575de49f360ec4780acb382a3ae923d1716fdb0dc03Bill Wendling    GV->setName("llvm.eh.catch.all.value");
576de49f360ec4780acb382a3ae923d1716fdb0dc03Bill Wendling    return true;
577de49f360ec4780acb382a3ae923d1716fdb0dc03Bill Wendling  }
578de49f360ec4780acb382a3ae923d1716fdb0dc03Bill Wendling
579de49f360ec4780acb382a3ae923d1716fdb0dc03Bill Wendling  return false;
580de49f360ec4780acb382a3ae923d1716fdb0dc03Bill Wendling}
581de49f360ec4780acb382a3ae923d1716fdb0dc03Bill Wendling
582d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson/// ExtendNEONArgs - For NEON "long" and "wide" operations, where the results
583d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson/// have vector elements twice as big as one or both source operands, do the
584d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson/// sign- or zero-extension that used to be handled by intrinsics.  The
585d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson/// extended values are returned via V0 and V1.
586d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilsonstatic void ExtendNEONArgs(CallInst *CI, Value *Arg0, Value *Arg1,
587d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson                           Value *&V0, Value *&V1) {
588d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson  Function *F = CI->getCalledFunction();
589d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson  const std::string& Name = F->getName();
590d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson  bool isLong = (Name.at(18) == 'l');
591d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson  bool isSigned = (Name.at(19) == 's');
592d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson
593d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson  if (isSigned) {
594d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson    if (isLong)
595d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson      V0 = new SExtInst(Arg0, CI->getType(), "", CI);
596d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson    else
597d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson      V0 = Arg0;
598d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson    V1 = new SExtInst(Arg1, CI->getType(), "", CI);
599d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson  } else {
600d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson    if (isLong)
601d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson      V0 = new ZExtInst(Arg0, CI->getType(), "", CI);
602d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson    else
603d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson      V0 = Arg0;
604d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson    V1 = new ZExtInst(Arg1, CI->getType(), "", CI);
605d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson  }
606d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson}
607d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson
608eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson/// CallVABD - As part of expanding a call to one of the old NEON vabdl, vaba,
609eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson/// or vabal intrinsics, construct a call to a vabd intrinsic.  Examine the
610eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson/// name of the old intrinsic to determine whether to use a signed or unsigned
611eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson/// vabd intrinsic.  Get the type from the old call instruction, adjusted for
612eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson/// half-size vector elements if the old intrinsic was vabdl or vabal.
613eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilsonstatic Instruction *CallVABD(CallInst *CI, Value *Arg0, Value *Arg1) {
614eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson  Function *F = CI->getCalledFunction();
615eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson  const std::string& Name = F->getName();
616eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson  bool isLong = (Name.at(18) == 'l');
617eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson  bool isSigned = (Name.at(isLong ? 19 : 18) == 's');
618eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson
619eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson  Intrinsic::ID intID;
620eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson  if (isSigned)
621eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson    intID = Intrinsic::arm_neon_vabds;
622eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson  else
623eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson    intID = Intrinsic::arm_neon_vabdu;
624eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson
625eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson  const Type *Ty = CI->getType();
626eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson  if (isLong)
627eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson    Ty = VectorType::getTruncatedElementVectorType(cast<const VectorType>(Ty));
628eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson
629eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson  Function *VABD = Intrinsic::getDeclaration(F->getParent(), intID, &Ty, 1);
630eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson  Value *Operands[2];
631eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson  Operands[0] = Arg0;
632eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson  Operands[1] = Arg1;
633eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson  return CallInst::Create(VABD, Operands, Operands+2,
634eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson                          "upgraded."+CI->getName(), CI);
635eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson}
636eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson
6370488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen/// ConstructNewCallInst - Construct a new CallInst with the signature of NewFn.
6380488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesenstatic void ConstructNewCallInst(Function *NewFn, CallInst *OldCI,
6390488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                 Value **Operands, unsigned NumOps,
6400488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                 bool AssignName = true) {
6410488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  // Construct a new CallInst.
6420488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  CallInst *NewCI =
6430488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    CallInst::Create(NewFn, Operands, Operands + NumOps,
6440488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                     AssignName ? "upgraded." + OldCI->getName() : "", OldCI);
6450488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
6460488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  NewCI->setTailCall(OldCI->isTailCall());
6470488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  NewCI->setCallingConv(OldCI->getCallingConv());
6480488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
6496cf6c79e8281835898cd105a30efedd44b554000Bill Wendling  // Handle any uses of the old CallInst. If the type has changed, add a cast.
6500488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  if (!OldCI->use_empty()) {
6510488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    if (OldCI->getType() != NewCI->getType()) {
6520488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      Function *OldFn = OldCI->getCalledFunction();
6530488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      CastInst *RetCast =
6540488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen        CastInst::Create(CastInst::getCastOpcode(NewCI, true,
6550488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                                 OldFn->getReturnType(), true),
6560488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                         NewCI, OldFn->getReturnType(), NewCI->getName(),OldCI);
6576cf6c79e8281835898cd105a30efedd44b554000Bill Wendling
6586cf6c79e8281835898cd105a30efedd44b554000Bill Wendling      // Replace all uses of the old call with the new cast which has the
6596cf6c79e8281835898cd105a30efedd44b554000Bill Wendling      // correct type.
6606cf6c79e8281835898cd105a30efedd44b554000Bill Wendling      OldCI->replaceAllUsesWith(RetCast);
6616cf6c79e8281835898cd105a30efedd44b554000Bill Wendling    } else {
6626cf6c79e8281835898cd105a30efedd44b554000Bill Wendling      OldCI->replaceAllUsesWith(NewCI);
6630488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    }
6640488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  }
6656cf6c79e8281835898cd105a30efedd44b554000Bill Wendling
6660488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  // Clean up the old call now that it has been completely upgraded.
6670488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  OldCI->eraseFromParent();
6680488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen}
6690488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
6706994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth// UpgradeIntrinsicCall - Upgrade a call to an old intrinsic to be a call the
6716994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth// upgraded intrinsic. All argument and return casting must be provided in
6726994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth// order to seamlessly integrate with existing context.
6736994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruthvoid llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) {
6746994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth  Function *F = CI->getCalledFunction();
6751d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  LLVMContext &C = CI->getContext();
676bb6eabf4f5b518a333ab4cedce910962ff935e3aGabor Greif  ImmutableCallSite CS(CI);
677bb6eabf4f5b518a333ab4cedce910962ff935e3aGabor Greif
6786994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth  assert(F && "CallInst has no function associated with it.");
679f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng
680f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng  if (!NewFn) {
681b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson    // Get the Function's name.
682b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson    const std::string& Name = F->getName();
683b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson
684b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson    // Upgrade ARM NEON intrinsics.
685b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson    if (Name.compare(5, 9, "arm.neon.", 9) == 0) {
686b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson      Instruction *NewI;
687d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson      Value *V0, *V1;
688b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson      if (Name.compare(14, 7, "vmovls.", 7) == 0) {
689b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson        NewI = new SExtInst(CI->getArgOperand(0), CI->getType(),
690b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson                            "upgraded." + CI->getName(), CI);
691b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson      } else if (Name.compare(14, 7, "vmovlu.", 7) == 0) {
692b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson        NewI = new ZExtInst(CI->getArgOperand(0), CI->getType(),
693b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson                            "upgraded." + CI->getName(), CI);
694d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson      } else if (Name.compare(14, 4, "vadd", 4) == 0) {
695d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson        ExtendNEONArgs(CI, CI->getArgOperand(0), CI->getArgOperand(1), V0, V1);
696d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson        NewI = BinaryOperator::CreateAdd(V0, V1, "upgraded."+CI->getName(), CI);
697d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson      } else if (Name.compare(14, 4, "vsub", 4) == 0) {
698d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson        ExtendNEONArgs(CI, CI->getArgOperand(0), CI->getArgOperand(1), V0, V1);
699d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson        NewI = BinaryOperator::CreateSub(V0, V1,"upgraded."+CI->getName(),CI);
700d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson      } else if (Name.compare(14, 4, "vmul", 4) == 0) {
701d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson        ExtendNEONArgs(CI, CI->getArgOperand(0), CI->getArgOperand(1), V0, V1);
702d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson        NewI = BinaryOperator::CreateMul(V0, V1,"upgraded."+CI->getName(),CI);
703d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson      } else if (Name.compare(14, 4, "vmla", 4) == 0) {
704d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson        ExtendNEONArgs(CI, CI->getArgOperand(1), CI->getArgOperand(2), V0, V1);
705d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson        Instruction *MulI = BinaryOperator::CreateMul(V0, V1, "", CI);
706d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson        NewI = BinaryOperator::CreateAdd(CI->getArgOperand(0), MulI,
707d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson                                         "upgraded."+CI->getName(), CI);
708d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson      } else if (Name.compare(14, 4, "vmls", 4) == 0) {
709d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson        ExtendNEONArgs(CI, CI->getArgOperand(1), CI->getArgOperand(2), V0, V1);
710d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson        Instruction *MulI = BinaryOperator::CreateMul(V0, V1, "", CI);
711d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson        NewI = BinaryOperator::CreateSub(CI->getArgOperand(0), MulI,
712d0b69cf1198dadbb7bdfc385334b67f60f756539Bob Wilson                                         "upgraded."+CI->getName(), CI);
713eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson      } else if (Name.compare(14, 4, "vabd", 4) == 0) {
714eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson        NewI = CallVABD(CI, CI->getArgOperand(0), CI->getArgOperand(1));
715eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson        NewI = new ZExtInst(NewI, CI->getType(), "upgraded."+CI->getName(), CI);
716eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson      } else if (Name.compare(14, 4, "vaba", 4) == 0) {
717eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson        NewI = CallVABD(CI, CI->getArgOperand(1), CI->getArgOperand(2));
718eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson        if (Name.at(18) == 'l')
719eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson          NewI = new ZExtInst(NewI, CI->getType(), "", CI);
720eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson        NewI = BinaryOperator::CreateAdd(CI->getArgOperand(0), NewI,
721eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson                                         "upgraded."+CI->getName(), CI);
722973a074345add36c046c0f0bfea0156a532ab479Bob Wilson      } else if (Name.compare(14, 6, "vmovn.", 6) == 0) {
723973a074345add36c046c0f0bfea0156a532ab479Bob Wilson        NewI = new TruncInst(CI->getArgOperand(0), CI->getType(),
724973a074345add36c046c0f0bfea0156a532ab479Bob Wilson                             "upgraded." + CI->getName(), CI);
725b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson      } else {
726b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson        llvm_unreachable("Unknown arm.neon function for CallInst upgrade.");
727b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson      }
728b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson      // Replace any uses of the old CallInst.
729b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson      if (!CI->use_empty())
730b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson        CI->replaceAllUsesWith(NewI);
731b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson      CI->eraseFromParent();
732b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson      return;
733b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson    }
734b31a11b466281b7e01cfde007b2041eefa2341e4Bob Wilson
7354797f61657fc32d2e4e806f9f8faadf3fee3e64cEvan Cheng    bool isLoadH = false, isLoadL = false, isMovL = false;
736e716bb1c59fe64c663d1d352e0e3889a28dbaca2Evan Cheng    bool isMovSD = false, isShufPD = false;
737e716bb1c59fe64c663d1d352e0e3889a28dbaca2Evan Cheng    bool isUnpckhPD = false, isUnpcklPD = false;
738a31593901de573813d1d8e7884a152011641a713Evan Cheng    bool isPunpckhQPD = false, isPunpcklQPD = false;
73903d7651c3652e1f0cc86e79b26585d86818da9cfDaniel Dunbar    if (F->getName() == "llvm.x86.sse2.loadh.pd")
7404797f61657fc32d2e4e806f9f8faadf3fee3e64cEvan Cheng      isLoadH = true;
74103d7651c3652e1f0cc86e79b26585d86818da9cfDaniel Dunbar    else if (F->getName() == "llvm.x86.sse2.loadl.pd")
7424797f61657fc32d2e4e806f9f8faadf3fee3e64cEvan Cheng      isLoadL = true;
74303d7651c3652e1f0cc86e79b26585d86818da9cfDaniel Dunbar    else if (F->getName() == "llvm.x86.sse2.movl.dq")
7444797f61657fc32d2e4e806f9f8faadf3fee3e64cEvan Cheng      isMovL = true;
74503d7651c3652e1f0cc86e79b26585d86818da9cfDaniel Dunbar    else if (F->getName() == "llvm.x86.sse2.movs.d")
746e716bb1c59fe64c663d1d352e0e3889a28dbaca2Evan Cheng      isMovSD = true;
74703d7651c3652e1f0cc86e79b26585d86818da9cfDaniel Dunbar    else if (F->getName() == "llvm.x86.sse2.shuf.pd")
748e716bb1c59fe64c663d1d352e0e3889a28dbaca2Evan Cheng      isShufPD = true;
74903d7651c3652e1f0cc86e79b26585d86818da9cfDaniel Dunbar    else if (F->getName() == "llvm.x86.sse2.unpckh.pd")
750e716bb1c59fe64c663d1d352e0e3889a28dbaca2Evan Cheng      isUnpckhPD = true;
75103d7651c3652e1f0cc86e79b26585d86818da9cfDaniel Dunbar    else if (F->getName() == "llvm.x86.sse2.unpckl.pd")
752e716bb1c59fe64c663d1d352e0e3889a28dbaca2Evan Cheng      isUnpcklPD = true;
75303d7651c3652e1f0cc86e79b26585d86818da9cfDaniel Dunbar    else if (F->getName() ==  "llvm.x86.sse2.punpckh.qdq")
754a31593901de573813d1d8e7884a152011641a713Evan Cheng      isPunpckhQPD = true;
75503d7651c3652e1f0cc86e79b26585d86818da9cfDaniel Dunbar    else if (F->getName() ==  "llvm.x86.sse2.punpckl.qdq")
756a31593901de573813d1d8e7884a152011641a713Evan Cheng      isPunpcklQPD = true;
7574797f61657fc32d2e4e806f9f8faadf3fee3e64cEvan Cheng
758e716bb1c59fe64c663d1d352e0e3889a28dbaca2Evan Cheng    if (isLoadH || isLoadL || isMovL || isMovSD || isShufPD ||
759a31593901de573813d1d8e7884a152011641a713Evan Cheng        isUnpckhPD || isUnpcklPD || isPunpckhQPD || isPunpcklQPD) {
760f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng      std::vector<Constant*> Idxs;
761f2937ac4eddb5ced78a1d73206de020c6d9e440fGabor Greif      Value *Op0 = CI->getArgOperand(0);
762e716bb1c59fe64c663d1d352e0e3889a28dbaca2Evan Cheng      ShuffleVectorInst *SI = NULL;
7634797f61657fc32d2e4e806f9f8faadf3fee3e64cEvan Cheng      if (isLoadH || isLoadL) {
7649e9a0d5fc26878e51a58a8b57900fcbf952c2691Owen Anderson        Value *Op1 = UndefValue::get(Op0->getType());
765f2937ac4eddb5ced78a1d73206de020c6d9e440fGabor Greif        Value *Addr = new BitCastInst(CI->getArgOperand(1),
766ac53a0b272452013124bfc70480aea5e41b60f40Duncan Sands                                  Type::getDoublePtrTy(C),
7674797f61657fc32d2e4e806f9f8faadf3fee3e64cEvan Cheng                                      "upgraded.", CI);
7684797f61657fc32d2e4e806f9f8faadf3fee3e64cEvan Cheng        Value *Load = new LoadInst(Addr, "upgraded.", false, 8, CI);
7691d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson        Value *Idx = ConstantInt::get(Type::getInt32Ty(C), 0);
7704797f61657fc32d2e4e806f9f8faadf3fee3e64cEvan Cheng        Op1 = InsertElementInst::Create(Op1, Load, Idx, "upgraded.", CI);
7714797f61657fc32d2e4e806f9f8faadf3fee3e64cEvan Cheng
7724797f61657fc32d2e4e806f9f8faadf3fee3e64cEvan Cheng        if (isLoadH) {
7731d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson          Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 0));
7741d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson          Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 2));
7754797f61657fc32d2e4e806f9f8faadf3fee3e64cEvan Cheng        } else {
7761d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson          Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 2));
7771d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson          Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 1));
7784797f61657fc32d2e4e806f9f8faadf3fee3e64cEvan Cheng        }
779af7ec975870f92245f1f1484ac80a1e2db6a0afaOwen Anderson        Value *Mask = ConstantVector::get(Idxs);
7804797f61657fc32d2e4e806f9f8faadf3fee3e64cEvan Cheng        SI = new ShuffleVectorInst(Op0, Op1, Mask, "upgraded.", CI);
781e716bb1c59fe64c663d1d352e0e3889a28dbaca2Evan Cheng      } else if (isMovL) {
7821d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson        Constant *Zero = ConstantInt::get(Type::getInt32Ty(C), 0);
7834797f61657fc32d2e4e806f9f8faadf3fee3e64cEvan Cheng        Idxs.push_back(Zero);
7844797f61657fc32d2e4e806f9f8faadf3fee3e64cEvan Cheng        Idxs.push_back(Zero);
7854797f61657fc32d2e4e806f9f8faadf3fee3e64cEvan Cheng        Idxs.push_back(Zero);
7864797f61657fc32d2e4e806f9f8faadf3fee3e64cEvan Cheng        Idxs.push_back(Zero);
787af7ec975870f92245f1f1484ac80a1e2db6a0afaOwen Anderson        Value *ZeroV = ConstantVector::get(Idxs);
788f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng
7894797f61657fc32d2e4e806f9f8faadf3fee3e64cEvan Cheng        Idxs.clear();
7901d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson        Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 4));
7911d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson        Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 5));
7921d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson        Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 2));
7931d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson        Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 3));
794af7ec975870f92245f1f1484ac80a1e2db6a0afaOwen Anderson        Value *Mask = ConstantVector::get(Idxs);
7954797f61657fc32d2e4e806f9f8faadf3fee3e64cEvan Cheng        SI = new ShuffleVectorInst(ZeroV, Op0, Mask, "upgraded.", CI);
796a31593901de573813d1d8e7884a152011641a713Evan Cheng      } else if (isMovSD ||
797a31593901de573813d1d8e7884a152011641a713Evan Cheng                 isUnpckhPD || isUnpcklPD || isPunpckhQPD || isPunpcklQPD) {
798f2937ac4eddb5ced78a1d73206de020c6d9e440fGabor Greif        Value *Op1 = CI->getArgOperand(1);
799e716bb1c59fe64c663d1d352e0e3889a28dbaca2Evan Cheng        if (isMovSD) {
8001d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson          Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 2));
8011d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson          Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 1));
802a31593901de573813d1d8e7884a152011641a713Evan Cheng        } else if (isUnpckhPD || isPunpckhQPD) {
8031d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson          Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 1));
8041d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson          Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 3));
805e716bb1c59fe64c663d1d352e0e3889a28dbaca2Evan Cheng        } else {
8061d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson          Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 0));
8071d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson          Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 2));
808e716bb1c59fe64c663d1d352e0e3889a28dbaca2Evan Cheng        }
809af7ec975870f92245f1f1484ac80a1e2db6a0afaOwen Anderson        Value *Mask = ConstantVector::get(Idxs);
810e716bb1c59fe64c663d1d352e0e3889a28dbaca2Evan Cheng        SI = new ShuffleVectorInst(Op0, Op1, Mask, "upgraded.", CI);
811e716bb1c59fe64c663d1d352e0e3889a28dbaca2Evan Cheng      } else if (isShufPD) {
812f2937ac4eddb5ced78a1d73206de020c6d9e440fGabor Greif        Value *Op1 = CI->getArgOperand(1);
813a399781289092fcdceb58b21174229f4373c4191Gabor Greif        unsigned MaskVal =
814a399781289092fcdceb58b21174229f4373c4191Gabor Greif                        cast<ConstantInt>(CI->getArgOperand(2))->getZExtValue();
8151d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson        Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), MaskVal & 1));
8161d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson        Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C),
817f81b57694b3c34a79b1464ffd21e6768c8d22662Owen Anderson                                               ((MaskVal >> 1) & 1)+2));
818af7ec975870f92245f1f1484ac80a1e2db6a0afaOwen Anderson        Value *Mask = ConstantVector::get(Idxs);
819e716bb1c59fe64c663d1d352e0e3889a28dbaca2Evan Cheng        SI = new ShuffleVectorInst(Op0, Op1, Mask, "upgraded.", CI);
8204797f61657fc32d2e4e806f9f8faadf3fee3e64cEvan Cheng      }
821f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng
822e716bb1c59fe64c663d1d352e0e3889a28dbaca2Evan Cheng      assert(SI && "Unexpected!");
823e716bb1c59fe64c663d1d352e0e3889a28dbaca2Evan Cheng
824f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng      // Handle any uses of the old CallInst.
825f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng      if (!CI->use_empty())
826f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng        //  Replace all uses of the old call with the new cast which has the
827f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng        //  correct type.
828f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng        CI->replaceAllUsesWith(SI);
829f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng
830f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng      //  Clean up the old call now that it has been completely upgraded.
831f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng      CI->eraseFromParent();
8328258d0b4bfd5fe40c29fa19e24c23ba3ac157e23Eric Christopher    } else if (F->getName() == "llvm.x86.sse41.pmulld") {
8338258d0b4bfd5fe40c29fa19e24c23ba3ac157e23Eric Christopher      // Upgrade this set of intrinsics into vector multiplies.
834f2937ac4eddb5ced78a1d73206de020c6d9e440fGabor Greif      Instruction *Mul = BinaryOperator::CreateMul(CI->getArgOperand(0),
835f2937ac4eddb5ced78a1d73206de020c6d9e440fGabor Greif                                                   CI->getArgOperand(1),
8368258d0b4bfd5fe40c29fa19e24c23ba3ac157e23Eric Christopher                                                   CI->getName(),
8378258d0b4bfd5fe40c29fa19e24c23ba3ac157e23Eric Christopher                                                   CI);
8388258d0b4bfd5fe40c29fa19e24c23ba3ac157e23Eric Christopher      // Fix up all the uses with our new multiply.
8398258d0b4bfd5fe40c29fa19e24c23ba3ac157e23Eric Christopher      if (!CI->use_empty())
8408258d0b4bfd5fe40c29fa19e24c23ba3ac157e23Eric Christopher        CI->replaceAllUsesWith(Mul);
8418258d0b4bfd5fe40c29fa19e24c23ba3ac157e23Eric Christopher
8428258d0b4bfd5fe40c29fa19e24c23ba3ac157e23Eric Christopher      // Remove upgraded multiply.
8438258d0b4bfd5fe40c29fa19e24c23ba3ac157e23Eric Christopher      CI->eraseFromParent();
8446d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher    } else if (F->getName() == "llvm.x86.ssse3.palign.r") {
845cfbb7d43299a2ce94b83ced4a1cbcfe69e387b52Gabor Greif      Value *Op1 = CI->getArgOperand(0);
846cfbb7d43299a2ce94b83ced4a1cbcfe69e387b52Gabor Greif      Value *Op2 = CI->getArgOperand(1);
847cfbb7d43299a2ce94b83ced4a1cbcfe69e387b52Gabor Greif      Value *Op3 = CI->getArgOperand(2);
8486d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      unsigned shiftVal = cast<ConstantInt>(Op3)->getZExtValue();
8496d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      Value *Rep;
8506d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      IRBuilder<> Builder(C);
8516d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      Builder.SetInsertPoint(CI->getParent(), CI);
8526d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher
8536d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      // If palignr is shifting the pair of input vectors less than 9 bytes,
8546d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      // emit a shuffle instruction.
8556d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      if (shiftVal <= 8) {
8566d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        const Type *IntTy = Type::getInt32Ty(C);
8576d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        const Type *EltTy = Type::getInt8Ty(C);
8586d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        const Type *VecTy = VectorType::get(EltTy, 8);
8596d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher
8606d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        Op2 = Builder.CreateBitCast(Op2, VecTy);
8616d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        Op1 = Builder.CreateBitCast(Op1, VecTy);
8626d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher
8636d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        llvm::SmallVector<llvm::Constant*, 8> Indices;
8646d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        for (unsigned i = 0; i != 8; ++i)
8656d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher          Indices.push_back(ConstantInt::get(IntTy, shiftVal + i));
8666d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher
8672ca5c8644e6c35b3a7910a576ed89cddb7b82c3bChris Lattner        Value *SV = ConstantVector::get(Indices);
8686d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        Rep = Builder.CreateShuffleVector(Op2, Op1, SV, "palignr");
8696d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        Rep = Builder.CreateBitCast(Rep, F->getReturnType());
8706d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      }
8716d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher
8726d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      // If palignr is shifting the pair of input vectors more than 8 but less
8736d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      // than 16 bytes, emit a logical right shift of the destination.
8746d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      else if (shiftVal < 16) {
8756d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        // MMX has these as 1 x i64 vectors for some odd optimization reasons.
8766d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        const Type *EltTy = Type::getInt64Ty(C);
8776d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        const Type *VecTy = VectorType::get(EltTy, 1);
8786d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher
8796d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        Op1 = Builder.CreateBitCast(Op1, VecTy, "cast");
8806d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        Op2 = ConstantInt::get(VecTy, (shiftVal-8) * 8);
8816d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher
8826d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        // create i32 constant
8836d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        Function *I =
8846d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher          Intrinsic::getDeclaration(F->getParent(), Intrinsic::x86_mmx_psrl_q);
8856d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        Rep = Builder.CreateCall2(I, Op1, Op2, "palignr");
8866d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      }
8876d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher
8886d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      // If palignr is shifting the pair of vectors more than 32 bytes, emit zero.
8896d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      else {
8906d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        Rep = Constant::getNullValue(F->getReturnType());
8916d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      }
8926d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher
8936d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      // Replace any uses with our new instruction.
8946d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      if (!CI->use_empty())
8956d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        CI->replaceAllUsesWith(Rep);
8966d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher
8976d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      // Remove upgraded instruction.
8986d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      CI->eraseFromParent();
8996d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher
9006d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher    } else if (F->getName() == "llvm.x86.ssse3.palign.r.128") {
901cfbb7d43299a2ce94b83ced4a1cbcfe69e387b52Gabor Greif      Value *Op1 = CI->getArgOperand(0);
902cfbb7d43299a2ce94b83ced4a1cbcfe69e387b52Gabor Greif      Value *Op2 = CI->getArgOperand(1);
903cfbb7d43299a2ce94b83ced4a1cbcfe69e387b52Gabor Greif      Value *Op3 = CI->getArgOperand(2);
9046d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      unsigned shiftVal = cast<ConstantInt>(Op3)->getZExtValue();
9056d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      Value *Rep;
9066d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      IRBuilder<> Builder(C);
9076d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      Builder.SetInsertPoint(CI->getParent(), CI);
9086d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher
9096d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      // If palignr is shifting the pair of input vectors less than 17 bytes,
9106d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      // emit a shuffle instruction.
9116d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      if (shiftVal <= 16) {
9126d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        const Type *IntTy = Type::getInt32Ty(C);
9136d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        const Type *EltTy = Type::getInt8Ty(C);
9146d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        const Type *VecTy = VectorType::get(EltTy, 16);
9156d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher
9166d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        Op2 = Builder.CreateBitCast(Op2, VecTy);
9176d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        Op1 = Builder.CreateBitCast(Op1, VecTy);
9186d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher
9196d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        llvm::SmallVector<llvm::Constant*, 16> Indices;
9206d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        for (unsigned i = 0; i != 16; ++i)
9216d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher          Indices.push_back(ConstantInt::get(IntTy, shiftVal + i));
9226d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher
9232ca5c8644e6c35b3a7910a576ed89cddb7b82c3bChris Lattner        Value *SV = ConstantVector::get(Indices);
9246d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        Rep = Builder.CreateShuffleVector(Op2, Op1, SV, "palignr");
9256d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        Rep = Builder.CreateBitCast(Rep, F->getReturnType());
9266d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      }
9276d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher
9286d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      // If palignr is shifting the pair of input vectors more than 16 but less
9296d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      // than 32 bytes, emit a logical right shift of the destination.
9306d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      else if (shiftVal < 32) {
9316d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        const Type *EltTy = Type::getInt64Ty(C);
9326d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        const Type *VecTy = VectorType::get(EltTy, 2);
9336d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        const Type *IntTy = Type::getInt32Ty(C);
9346d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher
9356d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        Op1 = Builder.CreateBitCast(Op1, VecTy, "cast");
9366d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        Op2 = ConstantInt::get(IntTy, (shiftVal-16) * 8);
9376d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher
9386d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        // create i32 constant
9396d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        Function *I =
9406d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher          Intrinsic::getDeclaration(F->getParent(), Intrinsic::x86_sse2_psrl_dq);
9416d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        Rep = Builder.CreateCall2(I, Op1, Op2, "palignr");
9426d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      }
9436d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher
9446d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      // If palignr is shifting the pair of vectors more than 32 bytes, emit zero.
9456d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      else {
9466d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        Rep = Constant::getNullValue(F->getReturnType());
9476d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      }
9486d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher
9496d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      // Replace any uses with our new instruction.
9506d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      if (!CI->use_empty())
9516d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher        CI->replaceAllUsesWith(Rep);
9526d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher
9536d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      // Remove upgraded instruction.
9546d972fd087a29dcb063b86e3b81957d9e19ff8f1Eric Christopher      CI->eraseFromParent();
955f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling
956f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling    } else if (F->getName() == "llvm.x86.sse.loadu.ps" ||
957f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling               F->getName() == "llvm.x86.sse2.loadu.dq" ||
958f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling               F->getName() == "llvm.x86.sse2.loadu.pd") {
959f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling      // Convert to a native, unaligned load.
960f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling      const Type *VecTy = CI->getType();
961f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling      const Type *IntTy = IntegerType::get(C, 128);
962f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling      IRBuilder<> Builder(C);
963f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling      Builder.SetInsertPoint(CI->getParent(), CI);
964f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling
965f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling      Value *BC = Builder.CreateBitCast(CI->getArgOperand(0),
966f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling                                        PointerType::getUnqual(IntTy),
967f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling                                        "cast");
968f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling      LoadInst *LI = Builder.CreateLoad(BC, CI->getName());
969f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling      LI->setAlignment(1);      // Unaligned load.
970f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling      BC = Builder.CreateBitCast(LI, VecTy, "new.cast");
971f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling
972f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling      // Fix up all the uses with our new load.
973f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling      if (!CI->use_empty())
974f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling        CI->replaceAllUsesWith(BC);
975f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling
976f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling      // Remove intrinsic.
977f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling      CI->eraseFromParent();
978a5cecd0a130f7ebc4787f8f5b3e8959e41786673Evan Cheng    } else {
979c23197a26f34f559ea9797de51e187087c039c42Torok Edwin      llvm_unreachable("Unknown function for CallInst upgrade.");
980f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng    }
981f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng    return;
982f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng  }
983f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng
984051a950000e21935165db56695e35bade668193bGabor Greif  switch (NewFn->getIntrinsicID()) {
985eb0c3d372906df9c61a31651a0ba278034447e94Bob Wilson  default: llvm_unreachable("Unknown function for CallInst upgrade.");
9867a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson  case Intrinsic::arm_neon_vld1:
9877a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson  case Intrinsic::arm_neon_vld2:
9887a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson  case Intrinsic::arm_neon_vld3:
9897a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson  case Intrinsic::arm_neon_vld4:
9907a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson  case Intrinsic::arm_neon_vst1:
9917a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson  case Intrinsic::arm_neon_vst2:
9927a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson  case Intrinsic::arm_neon_vst3:
9937a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson  case Intrinsic::arm_neon_vst4:
9947a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson  case Intrinsic::arm_neon_vld2lane:
9957a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson  case Intrinsic::arm_neon_vld3lane:
9967a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson  case Intrinsic::arm_neon_vld4lane:
9977a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson  case Intrinsic::arm_neon_vst2lane:
9987a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson  case Intrinsic::arm_neon_vst3lane:
9997a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson  case Intrinsic::arm_neon_vst4lane: {
10007a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson    // Add a default alignment argument of 1.
10017a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson    SmallVector<Value*, 8> Operands(CS.arg_begin(), CS.arg_end());
10027a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson    Operands.push_back(ConstantInt::get(Type::getInt32Ty(C), 1));
10037a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson    CallInst *NewCI = CallInst::Create(NewFn, Operands.begin(), Operands.end(),
10047a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson                                       CI->getName(), CI);
10057a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson    NewCI->setTailCall(CI->isTailCall());
10067a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson    NewCI->setCallingConv(CI->getCallingConv());
10077a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson
10087a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson    //  Handle any uses of the old CallInst.
10097a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson    if (!CI->use_empty())
10107a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson      //  Replace all uses of the old call with the new cast which has the
10117a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson      //  correct type.
10127a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson      CI->replaceAllUsesWith(NewCI);
10137a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson
10147a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson    //  Clean up the old call now that it has been completely upgraded.
10157a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson    CI->eraseFromParent();
10167a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson    break;
10177a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson  }
10187a9ef44b3b4ddd2dd9a7f92fc8b46c5e5bed6a81Bob Wilson
10190488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_padd_b:
10200488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_padd_w:
10210488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_padd_d:
10220488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_padd_q:
10230488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_padds_b:
10240488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_padds_w:
10250488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_paddus_b:
10260488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_paddus_w:
10270488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_psub_b:
10280488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_psub_w:
10290488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_psub_d:
10300488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_psub_q:
10310488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_psubs_b:
10320488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_psubs_w:
10330488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_psubus_b:
10340488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_psubus_w:
10350488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_pmulh_w:
10360488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_pmull_w:
10370488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_pmulhu_w:
10380488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_pmulu_dq:
10390488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_pmadd_wd:
10400488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_pand:
10410488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_pandn:
10420488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_por:
10430488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_pxor:
10440488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_pavg_b:
10450488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_pavg_w:
10460488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_pmaxu_b:
10470488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_pmaxs_w:
10480488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_pminu_b:
10490488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_pmins_w:
10500488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_psad_bw:
10510488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_psll_w:
1052d04764a8acabe0b3f0452b3099bc5964ba783884Anders Carlsson  case Intrinsic::x86_mmx_psll_d:
1053d04764a8acabe0b3f0452b3099bc5964ba783884Anders Carlsson  case Intrinsic::x86_mmx_psll_q:
10540488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_pslli_w:
10550488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_pslli_d:
10560488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_pslli_q:
10570488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_psrl_w:
1058d04764a8acabe0b3f0452b3099bc5964ba783884Anders Carlsson  case Intrinsic::x86_mmx_psrl_d:
1059d04764a8acabe0b3f0452b3099bc5964ba783884Anders Carlsson  case Intrinsic::x86_mmx_psrl_q:
10600488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_psrli_w:
10610488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_psrli_d:
10620488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_psrli_q:
10630488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_psra_w:
10640488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_psra_d:
10650488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_psrai_w:
10660488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_psrai_d:
10670488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_packsswb:
10680488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_packssdw:
10690488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_packuswb:
10700488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_punpckhbw:
10710488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_punpckhwd:
10720488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_punpckhdq:
10730488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_punpcklbw:
10740488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_punpcklwd:
10750488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_punpckldq:
10760488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_pcmpeq_b:
10770488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_pcmpeq_w:
10780488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_pcmpeq_d:
10790488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_pcmpgt_b:
10800488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_pcmpgt_w:
10810488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_pcmpgt_d: {
108258d74910c6b82e622ecbb57d6644d48fec5a5c0fChris Lattner    Value *Operands[2];
1083d04764a8acabe0b3f0452b3099bc5964ba783884Anders Carlsson
10840488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    // Cast the operand to the X86 MMX type.
10850488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    Operands[0] = new BitCastInst(CI->getArgOperand(0),
10860488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                  NewFn->getFunctionType()->getParamType(0),
10870488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                  "upgraded.", CI);
10880488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
10890488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    switch (NewFn->getIntrinsicID()) {
10900488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    default:
10910488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      // Cast to the X86 MMX type.
10920488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      Operands[1] = new BitCastInst(CI->getArgOperand(1),
10930488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                    NewFn->getFunctionType()->getParamType(1),
10940488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                    "upgraded.", CI);
10950488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      break;
10960488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    case Intrinsic::x86_mmx_pslli_w:
10970488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    case Intrinsic::x86_mmx_pslli_d:
10980488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    case Intrinsic::x86_mmx_pslli_q:
10990488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    case Intrinsic::x86_mmx_psrli_w:
11000488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    case Intrinsic::x86_mmx_psrli_d:
11010488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    case Intrinsic::x86_mmx_psrli_q:
11020488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    case Intrinsic::x86_mmx_psrai_w:
11030488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    case Intrinsic::x86_mmx_psrai_d:
11040488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      // These take an i32 as their second parameter.
11050488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      Operands[1] = CI->getArgOperand(1);
11060488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen      break;
11070488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    }
11080488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
11090488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    ConstructNewCallInst(NewFn, CI, Operands, 2);
11100488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    break;
11110488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  }
11120488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_maskmovq: {
11130488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    Value *Operands[3];
11140488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
11150488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    // Cast the operands to the X86 MMX type.
11160488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    Operands[0] = new BitCastInst(CI->getArgOperand(0),
11170488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                  NewFn->getFunctionType()->getParamType(0),
11180488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                  "upgraded.", CI);
11190488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    Operands[1] = new BitCastInst(CI->getArgOperand(1),
11200488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                  NewFn->getFunctionType()->getParamType(1),
11210488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                  "upgraded.", CI);
11220488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    Operands[2] = CI->getArgOperand(2);
11230488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
11240488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    ConstructNewCallInst(NewFn, CI, Operands, 3, false);
11250488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    break;
11260488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  }
11270488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_pmovmskb: {
11280488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    Value *Operands[1];
11290488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
11300488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    // Cast the operand to the X86 MMX type.
11310488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    Operands[0] = new BitCastInst(CI->getArgOperand(0),
11320488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                  NewFn->getFunctionType()->getParamType(0),
11330488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                  "upgraded.", CI);
11340488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
11350488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    ConstructNewCallInst(NewFn, CI, Operands, 1);
11360488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    break;
11370488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  }
11380488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_movnt_dq: {
11390488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    Value *Operands[2];
11400488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
1141f2937ac4eddb5ced78a1d73206de020c6d9e440fGabor Greif    Operands[0] = CI->getArgOperand(0);
11420488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
11430488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    // Cast the operand to the X86 MMX type.
11440488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    Operands[1] = new BitCastInst(CI->getArgOperand(1),
11450488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                  NewFn->getFunctionType()->getParamType(1),
11460488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                  "upgraded.", CI);
11470488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
11480488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    ConstructNewCallInst(NewFn, CI, Operands, 2, false);
1149d04764a8acabe0b3f0452b3099bc5964ba783884Anders Carlsson    break;
11500488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  }
11510488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_palignr_b: {
11520488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    Value *Operands[3];
11530488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
11540488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    // Cast the operands to the X86 MMX type.
11550488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    Operands[0] = new BitCastInst(CI->getArgOperand(0),
11560488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                  NewFn->getFunctionType()->getParamType(0),
11570488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                  "upgraded.", CI);
11580488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    Operands[1] = new BitCastInst(CI->getArgOperand(1),
11590488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                  NewFn->getFunctionType()->getParamType(1),
11600488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                  "upgraded.", CI);
11610488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    Operands[2] = CI->getArgOperand(2);
11620488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
11630488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    ConstructNewCallInst(NewFn, CI, Operands, 3);
11640488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    break;
11650488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  }
11660488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_pextr_w: {
11670488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    Value *Operands[2];
11680488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
11690488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    // Cast the operands to the X86 MMX type.
11700488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    Operands[0] = new BitCastInst(CI->getArgOperand(0),
11710488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                  NewFn->getFunctionType()->getParamType(0),
11720488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                  "upgraded.", CI);
11730488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    Operands[1] = CI->getArgOperand(1);
11740488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
11750488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    ConstructNewCallInst(NewFn, CI, Operands, 2);
11760488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    break;
11770488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  }
11780488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  case Intrinsic::x86_mmx_pinsr_w: {
11790488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    Value *Operands[3];
11800488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
11810488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    // Cast the operands to the X86 MMX type.
11820488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    Operands[0] = new BitCastInst(CI->getArgOperand(0),
11830488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                  NewFn->getFunctionType()->getParamType(0),
11840488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen                                  "upgraded.", CI);
11850488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    Operands[1] = CI->getArgOperand(1);
11860488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    Operands[2] = CI->getArgOperand(2);
11870488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen
11880488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    ConstructNewCallInst(NewFn, CI, Operands, 3);
11890488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen    break;
11900488fb649a56b7fc89a5814df5308813f9e5a85dDale Johannesen  }
11916cf6c79e8281835898cd105a30efedd44b554000Bill Wendling  case Intrinsic::x86_sse_pshuf_w: {
11926cf6c79e8281835898cd105a30efedd44b554000Bill Wendling    IRBuilder<> Builder(C);
11936cf6c79e8281835898cd105a30efedd44b554000Bill Wendling    Builder.SetInsertPoint(CI->getParent(), CI);
11946cf6c79e8281835898cd105a30efedd44b554000Bill Wendling
11956cf6c79e8281835898cd105a30efedd44b554000Bill Wendling    // Cast the operand to the X86 MMX type.
11966cf6c79e8281835898cd105a30efedd44b554000Bill Wendling    Value *Operands[2];
11976cf6c79e8281835898cd105a30efedd44b554000Bill Wendling    Operands[0] =
11986cf6c79e8281835898cd105a30efedd44b554000Bill Wendling      Builder.CreateBitCast(CI->getArgOperand(0),
11996cf6c79e8281835898cd105a30efedd44b554000Bill Wendling                            NewFn->getFunctionType()->getParamType(0),
12006cf6c79e8281835898cd105a30efedd44b554000Bill Wendling                            "upgraded.");
12016cf6c79e8281835898cd105a30efedd44b554000Bill Wendling    Operands[1] =
12026cf6c79e8281835898cd105a30efedd44b554000Bill Wendling      Builder.CreateTrunc(CI->getArgOperand(1),
12036cf6c79e8281835898cd105a30efedd44b554000Bill Wendling                          Type::getInt8Ty(C),
12046cf6c79e8281835898cd105a30efedd44b554000Bill Wendling                          "upgraded.");
12056cf6c79e8281835898cd105a30efedd44b554000Bill Wendling
12066cf6c79e8281835898cd105a30efedd44b554000Bill Wendling    ConstructNewCallInst(NewFn, CI, Operands, 2);
12076cf6c79e8281835898cd105a30efedd44b554000Bill Wendling    break;
12086cf6c79e8281835898cd105a30efedd44b554000Bill Wendling  }
12096cf6c79e8281835898cd105a30efedd44b554000Bill Wendling
12106994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth  case Intrinsic::ctlz:
12116994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth  case Intrinsic::ctpop:
1212051a950000e21935165db56695e35bade668193bGabor Greif  case Intrinsic::cttz: {
1213bb6eabf4f5b518a333ab4cedce910962ff935e3aGabor Greif    //  Build a small vector of the original arguments.
1214bb6eabf4f5b518a333ab4cedce910962ff935e3aGabor Greif    SmallVector<Value*, 8> Operands(CS.arg_begin(), CS.arg_end());
12156994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth
12166994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    //  Construct a new CallInst
1217051a950000e21935165db56695e35bade668193bGabor Greif    CallInst *NewCI = CallInst::Create(NewFn, Operands.begin(), Operands.end(),
1218051a950000e21935165db56695e35bade668193bGabor Greif                                       "upgraded."+CI->getName(), CI);
12196994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    NewCI->setTailCall(CI->isTailCall());
12206994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    NewCI->setCallingConv(CI->getCallingConv());
12216994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth
12226994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    //  Handle any uses of the old CallInst.
12236994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    if (!CI->use_empty()) {
12246994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      //  Check for sign extend parameter attributes on the return values.
12250598866c052147c31b808391f58434ce3dbfb838Devang Patel      bool SrcSExt = NewFn->getAttributes().paramHasAttr(0, Attribute::SExt);
12260598866c052147c31b808391f58434ce3dbfb838Devang Patel      bool DestSExt = F->getAttributes().paramHasAttr(0, Attribute::SExt);
12276994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth
12286994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      //  Construct an appropriate cast from the new return type to the old.
12297cbd8a3e92221437048b484d5ef9c0a22d0f8c58Gabor Greif      CastInst *RetCast = CastInst::Create(
12306994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth                            CastInst::getCastOpcode(NewCI, SrcSExt,
12316994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth                                                    F->getReturnType(),
12326994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth                                                    DestSExt),
12336994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth                            NewCI, F->getReturnType(),
12346994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth                            NewCI->getName(), CI);
12356994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      NewCI->moveBefore(RetCast);
12366994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth
12376994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      //  Replace all uses of the old call with the new cast which has the
12386994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      //  correct type.
12396994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      CI->replaceAllUsesWith(RetCast);
12406994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    }
12416994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth
12426994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    //  Clean up the old call now that it has been completely upgraded.
12436994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    CI->eraseFromParent();
1244051a950000e21935165db56695e35bade668193bGabor Greif  }
1245051a950000e21935165db56695e35bade668193bGabor Greif  break;
1246b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands  case Intrinsic::eh_selector:
1247b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands  case Intrinsic::eh_typeid_for: {
1248b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands    // Only the return type changed.
1249bb6eabf4f5b518a333ab4cedce910962ff935e3aGabor Greif    SmallVector<Value*, 8> Operands(CS.arg_begin(), CS.arg_end());
1250b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands    CallInst *NewCI = CallInst::Create(NewFn, Operands.begin(), Operands.end(),
1251b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands                                       "upgraded." + CI->getName(), CI);
1252b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands    NewCI->setTailCall(CI->isTailCall());
1253b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands    NewCI->setCallingConv(CI->getCallingConv());
1254b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands
1255b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands    //  Handle any uses of the old CallInst.
1256b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands    if (!CI->use_empty()) {
1257b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands      //  Construct an appropriate cast from the new return type to the old.
1258b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands      CastInst *RetCast =
1259b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands        CastInst::Create(CastInst::getCastOpcode(NewCI, true,
1260b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands                                                 F->getReturnType(), true),
1261b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands                         NewCI, F->getReturnType(), NewCI->getName(), CI);
1262b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands      CI->replaceAllUsesWith(RetCast);
1263b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands    }
1264b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands    CI->eraseFromParent();
1265b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands  }
1266b01bbdcc1af27bd90b552bb1b62b48916e0d4be3Duncan Sands  break;
126720adc9dc4650313f017b27d9818eb2176238113dMon P Wang  case Intrinsic::memcpy:
126820adc9dc4650313f017b27d9818eb2176238113dMon P Wang  case Intrinsic::memmove:
126920adc9dc4650313f017b27d9818eb2176238113dMon P Wang  case Intrinsic::memset: {
127020adc9dc4650313f017b27d9818eb2176238113dMon P Wang    // Add isVolatile
127120adc9dc4650313f017b27d9818eb2176238113dMon P Wang    const llvm::Type *I1Ty = llvm::Type::getInt1Ty(CI->getContext());
1272f2937ac4eddb5ced78a1d73206de020c6d9e440fGabor Greif    Value *Operands[5] = { CI->getArgOperand(0), CI->getArgOperand(1),
1273f2937ac4eddb5ced78a1d73206de020c6d9e440fGabor Greif                           CI->getArgOperand(2), CI->getArgOperand(3),
127420adc9dc4650313f017b27d9818eb2176238113dMon P Wang                           llvm::ConstantInt::get(I1Ty, 0) };
127520adc9dc4650313f017b27d9818eb2176238113dMon P Wang    CallInst *NewCI = CallInst::Create(NewFn, Operands, Operands+5,
127620adc9dc4650313f017b27d9818eb2176238113dMon P Wang                                       CI->getName(), CI);
127720adc9dc4650313f017b27d9818eb2176238113dMon P Wang    NewCI->setTailCall(CI->isTailCall());
127820adc9dc4650313f017b27d9818eb2176238113dMon P Wang    NewCI->setCallingConv(CI->getCallingConv());
127920adc9dc4650313f017b27d9818eb2176238113dMon P Wang    //  Handle any uses of the old CallInst.
128020adc9dc4650313f017b27d9818eb2176238113dMon P Wang    if (!CI->use_empty())
128120adc9dc4650313f017b27d9818eb2176238113dMon P Wang      //  Replace all uses of the old call with the new cast which has the
128220adc9dc4650313f017b27d9818eb2176238113dMon P Wang      //  correct type.
128320adc9dc4650313f017b27d9818eb2176238113dMon P Wang      CI->replaceAllUsesWith(NewCI);
128420adc9dc4650313f017b27d9818eb2176238113dMon P Wang
128520adc9dc4650313f017b27d9818eb2176238113dMon P Wang    //  Clean up the old call now that it has been completely upgraded.
128620adc9dc4650313f017b27d9818eb2176238113dMon P Wang    CI->eraseFromParent();
128720adc9dc4650313f017b27d9818eb2176238113dMon P Wang    break;
128820adc9dc4650313f017b27d9818eb2176238113dMon P Wang  }
12896994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth  }
12906994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth}
12916994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth
12926994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth// This tests each Function to determine if it needs upgrading. When we find
12936994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth// one we are interested in, we then upgrade all calls to reflect the new
12946994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth// function.
12956994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruthvoid llvm::UpgradeCallsToIntrinsic(Function* F) {
12966994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth  assert(F && "Illegal attempt to upgrade a non-existent intrinsic.");
12976994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth
12986994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth  // Upgrade the function and check if it is a totaly new function.
1299f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng  Function* NewFn;
1300f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng  if (UpgradeIntrinsicFunction(F, NewFn)) {
13016994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    if (NewFn != F) {
13026994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      // Replace all uses to the old function with the new one if necessary.
13036994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      for (Value::use_iterator UI = F->use_begin(), UE = F->use_end();
13046994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth           UI != UE; ) {
13056994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth        if (CallInst* CI = dyn_cast<CallInst>(*UI++))
13066994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth          UpgradeIntrinsicCall(CI, NewFn);
13076994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      }
13086994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      // Remove old function, no longer used, from the module.
13096994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth      F->eraseFromParent();
13106994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth    }
13116994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth  }
13126994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth}
1313e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel
1314771150accba7ab3480746a451710ac81f950fac2Victor Hernandez/// This function strips all debug info intrinsics, except for llvm.dbg.declare.
1315771150accba7ab3480746a451710ac81f950fac2Victor Hernandez/// If an llvm.dbg.declare intrinsic is invalid, then this function simply
1316771150accba7ab3480746a451710ac81f950fac2Victor Hernandez/// strips that use.
1317e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patelvoid llvm::CheckDebugInfoIntrinsics(Module *M) {
1318e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel
1319e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel
1320e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel  if (Function *FuncStart = M->getFunction("llvm.dbg.func.start")) {
132144a29e066a24e88bdf127e88be4380a5f259c4b4Devang Patel    while (!FuncStart->use_empty()) {
132244a29e066a24e88bdf127e88be4380a5f259c4b4Devang Patel      CallInst *CI = cast<CallInst>(FuncStart->use_back());
132344a29e066a24e88bdf127e88be4380a5f259c4b4Devang Patel      CI->eraseFromParent();
1324e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel    }
132544a29e066a24e88bdf127e88be4380a5f259c4b4Devang Patel    FuncStart->eraseFromParent();
1326e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel  }
132744a29e066a24e88bdf127e88be4380a5f259c4b4Devang Patel
1328e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel  if (Function *StopPoint = M->getFunction("llvm.dbg.stoppoint")) {
132944a29e066a24e88bdf127e88be4380a5f259c4b4Devang Patel    while (!StopPoint->use_empty()) {
133044a29e066a24e88bdf127e88be4380a5f259c4b4Devang Patel      CallInst *CI = cast<CallInst>(StopPoint->use_back());
133144a29e066a24e88bdf127e88be4380a5f259c4b4Devang Patel      CI->eraseFromParent();
1332e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel    }
133344a29e066a24e88bdf127e88be4380a5f259c4b4Devang Patel    StopPoint->eraseFromParent();
1334e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel  }
1335e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel
1336e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel  if (Function *RegionStart = M->getFunction("llvm.dbg.region.start")) {
133744a29e066a24e88bdf127e88be4380a5f259c4b4Devang Patel    while (!RegionStart->use_empty()) {
133844a29e066a24e88bdf127e88be4380a5f259c4b4Devang Patel      CallInst *CI = cast<CallInst>(RegionStart->use_back());
133944a29e066a24e88bdf127e88be4380a5f259c4b4Devang Patel      CI->eraseFromParent();
1340e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel    }
134144a29e066a24e88bdf127e88be4380a5f259c4b4Devang Patel    RegionStart->eraseFromParent();
1342e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel  }
1343e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel
1344e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel  if (Function *RegionEnd = M->getFunction("llvm.dbg.region.end")) {
134544a29e066a24e88bdf127e88be4380a5f259c4b4Devang Patel    while (!RegionEnd->use_empty()) {
134644a29e066a24e88bdf127e88be4380a5f259c4b4Devang Patel      CallInst *CI = cast<CallInst>(RegionEnd->use_back());
134744a29e066a24e88bdf127e88be4380a5f259c4b4Devang Patel      CI->eraseFromParent();
1348e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel    }
134944a29e066a24e88bdf127e88be4380a5f259c4b4Devang Patel    RegionEnd->eraseFromParent();
1350e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel  }
1351e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel
1352e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel  if (Function *Declare = M->getFunction("llvm.dbg.declare")) {
1353e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel    if (!Declare->use_empty()) {
1354e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel      DbgDeclareInst *DDI = cast<DbgDeclareInst>(Declare->use_back());
1355f2937ac4eddb5ced78a1d73206de020c6d9e440fGabor Greif      if (!isa<MDNode>(DDI->getArgOperand(0)) ||
1356f2937ac4eddb5ced78a1d73206de020c6d9e440fGabor Greif          !isa<MDNode>(DDI->getArgOperand(1))) {
1357e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel        while (!Declare->use_empty()) {
1358e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel          CallInst *CI = cast<CallInst>(Declare->use_back());
1359e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel          CI->eraseFromParent();
1360e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel        }
1361e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel        Declare->eraseFromParent();
1362e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel      }
1363e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel    }
1364e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel  }
1365e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel}
1366