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