AutoUpgrade.cpp revision b85e4eba85a38698f3b3332f82554bf8442547e2
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; 456994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth case 'p': 469a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes // This upgrades the llvm.prefetch intrinsic to accept one more parameter, 479a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes // which is a instruction / data cache identifier. The old version only 489a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes // implicitly accepted the data version. 499a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes if (Name.compare(5,8,"prefetch",8) == 0) { 509a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes // Don't do anything if it has the correct number of arguments already 519a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes if (FTy->getNumParams() == 4) 529a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes break; 539a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes 549a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes assert(FTy->getNumParams() == 3 && "old prefetch takes 3 args!"); 559a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes // We first need to change the name of the old (bad) intrinsic, because 569a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes // its type is incorrect, but we cannot overload that name. We 579a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes // arbitrarily unique it here allowing us to construct a correctly named 589a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes // and typed function below. 599a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes F->setName(""); 609a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes NewFn = cast<Function>(M->getOrInsertFunction(Name, 619a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes FTy->getReturnType(), 629a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes FTy->getParamType(0), 639a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes FTy->getParamType(1), 649a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes FTy->getParamType(2), 659a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes FTy->getParamType(2), 669a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes (Type*)0)); 679a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes return true; 689a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes } 699a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes 706994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth break; 7162660310d9e5f9ecf329fd3cacb67c344a12ddbcChad Rosier case 'x': 7262660310d9e5f9ecf329fd3cacb67c344a12ddbcChad Rosier // This fixes the poorly named crc32 intrinsics 7362660310d9e5f9ecf329fd3cacb67c344a12ddbcChad Rosier if (Name.compare(5, 13, "x86.sse42.crc", 13) == 0) { 7462660310d9e5f9ecf329fd3cacb67c344a12ddbcChad Rosier const char* NewFnName = NULL; 7562660310d9e5f9ecf329fd3cacb67c344a12ddbcChad Rosier if (Name.compare(18, 2, "32", 2) == 0) { 764591193b8d0f19547b73452366a08c43785678ccChad Rosier if (Name.compare(20, 2, ".8") == 0 && Name.length() == 22) { 7762660310d9e5f9ecf329fd3cacb67c344a12ddbcChad Rosier NewFnName = "llvm.x86.sse42.crc32.32.8"; 784591193b8d0f19547b73452366a08c43785678ccChad Rosier } else if (Name.compare(20, 3, ".16") == 0 && Name.length() == 23) { 7962660310d9e5f9ecf329fd3cacb67c344a12ddbcChad Rosier NewFnName = "llvm.x86.sse42.crc32.32.16"; 804591193b8d0f19547b73452366a08c43785678ccChad Rosier } else if (Name.compare(20, 3, ".32") == 0 && Name.length() == 23) { 8162660310d9e5f9ecf329fd3cacb67c344a12ddbcChad Rosier NewFnName = "llvm.x86.sse42.crc32.32.32"; 8262660310d9e5f9ecf329fd3cacb67c344a12ddbcChad Rosier } 8362660310d9e5f9ecf329fd3cacb67c344a12ddbcChad Rosier } 8462660310d9e5f9ecf329fd3cacb67c344a12ddbcChad Rosier else if (Name.compare(18, 2, "64", 2) == 0) { 854591193b8d0f19547b73452366a08c43785678ccChad Rosier if (Name.compare(20, 2, ".8") == 0 && Name.length() == 22) { 8662660310d9e5f9ecf329fd3cacb67c344a12ddbcChad Rosier NewFnName = "llvm.x86.sse42.crc32.64.8"; 874591193b8d0f19547b73452366a08c43785678ccChad Rosier } else if (Name.compare(20, 3, ".64") == 0 && Name.length() == 23) { 8862660310d9e5f9ecf329fd3cacb67c344a12ddbcChad Rosier NewFnName = "llvm.x86.sse42.crc32.64.64"; 8962660310d9e5f9ecf329fd3cacb67c344a12ddbcChad Rosier } 9062660310d9e5f9ecf329fd3cacb67c344a12ddbcChad Rosier } 9162660310d9e5f9ecf329fd3cacb67c344a12ddbcChad Rosier if (NewFnName) { 9262660310d9e5f9ecf329fd3cacb67c344a12ddbcChad Rosier F->setName(NewFnName); 9362660310d9e5f9ecf329fd3cacb67c344a12ddbcChad Rosier NewFn = F; 9462660310d9e5f9ecf329fd3cacb67c344a12ddbcChad Rosier return true; 9562660310d9e5f9ecf329fd3cacb67c344a12ddbcChad Rosier } 9662660310d9e5f9ecf329fd3cacb67c344a12ddbcChad Rosier } 9762660310d9e5f9ecf329fd3cacb67c344a12ddbcChad Rosier 98b85e4eba85a38698f3b3332f82554bf8442547e2Chris Lattner if (Name.compare(5, 16, "x86.sse.loadu.ps", 16) == 0 || 99b85e4eba85a38698f3b3332f82554bf8442547e2Chris Lattner Name.compare(5, 17, "x86.sse2.loadu.dq", 17) == 0 || 100b85e4eba85a38698f3b3332f82554bf8442547e2Chris Lattner Name.compare(5, 17, "x86.sse2.loadu.pd", 17) == 0) { 101f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling // Calls to these instructions are transformed into unaligned loads. 102f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling NewFn = 0; 103f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling return true; 104b85e4eba85a38698f3b3332f82554bf8442547e2Chris Lattner } 105b85e4eba85a38698f3b3332f82554bf8442547e2Chris Lattner 106b85e4eba85a38698f3b3332f82554bf8442547e2Chris Lattner if (Name.compare(5, 16, "x86.sse.movnt.ps", 16) == 0 || 107b85e4eba85a38698f3b3332f82554bf8442547e2Chris Lattner Name.compare(5, 17, "x86.sse2.movnt.dq", 17) == 0 || 108b85e4eba85a38698f3b3332f82554bf8442547e2Chris Lattner Name.compare(5, 17, "x86.sse2.movnt.pd", 17) == 0 || 109b85e4eba85a38698f3b3332f82554bf8442547e2Chris Lattner Name.compare(5, 17, "x86.sse2.movnt.i", 16) == 0) { 1109493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling // Calls to these instructions are transformed into nontemporal stores. 1119493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling NewFn = 0; 1129493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling return true; 113d04764a8acabe0b3f0452b3099bc5964ba783884Anders Carlsson } 114f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng 115d04764a8acabe0b3f0452b3099bc5964ba783884Anders Carlsson break; 1166994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth } 1176994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth 1186994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth // This may not belong here. This function is effectively being overloaded 1196994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth // to both detect an intrinsic which needs upgrading, and to provide the 1206994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth // upgraded form of the intrinsic. We should perhaps have two separate 1216994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth // functions for this. 122f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng return false; 1236994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth} 1246994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth 125f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Chengbool llvm::UpgradeIntrinsicFunction(Function *F, Function *&NewFn) { 126f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng NewFn = 0; 127f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng bool Upgraded = UpgradeIntrinsicFunction1(F, NewFn); 128a3355ffb3d30d19d226bbb75707991c60f236e37Duncan Sands 129a3355ffb3d30d19d226bbb75707991c60f236e37Duncan Sands // Upgrade intrinsic attributes. This does not change the function. 130f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng if (NewFn) 131f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng F = NewFn; 13249de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen if (unsigned id = F->getIntrinsicID()) 1330598866c052147c31b808391f58434ce3dbfb838Devang Patel F->setAttributes(Intrinsic::getAttributes((Intrinsic::ID)id)); 134a3355ffb3d30d19d226bbb75707991c60f236e37Duncan Sands return Upgraded; 135a3355ffb3d30d19d226bbb75707991c60f236e37Duncan Sands} 136a3355ffb3d30d19d226bbb75707991c60f236e37Duncan Sands 137de49f360ec4780acb382a3ae923d1716fdb0dc03Bill Wendlingbool llvm::UpgradeGlobalVariable(GlobalVariable *GV) { 138b85e4eba85a38698f3b3332f82554bf8442547e2Chris Lattner // Nothing to do yet. 139de49f360ec4780acb382a3ae923d1716fdb0dc03Bill Wendling return false; 140de49f360ec4780acb382a3ae923d1716fdb0dc03Bill Wendling} 141de49f360ec4780acb382a3ae923d1716fdb0dc03Bill Wendling 1426994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth// UpgradeIntrinsicCall - Upgrade a call to an old intrinsic to be a call the 1436994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth// upgraded intrinsic. All argument and return casting must be provided in 1446994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth// order to seamlessly integrate with existing context. 1456994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruthvoid llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) { 1466994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth Function *F = CI->getCalledFunction(); 1471d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson LLVMContext &C = CI->getContext(); 148bb6eabf4f5b518a333ab4cedce910962ff935e3aGabor Greif ImmutableCallSite CS(CI); 149bb6eabf4f5b518a333ab4cedce910962ff935e3aGabor Greif 1506994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth assert(F && "CallInst has no function associated with it."); 151f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng 152f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng if (!NewFn) { 153b85e4eba85a38698f3b3332f82554bf8442547e2Chris Lattner if (F->getName() == "llvm.x86.sse.loadu.ps" || 154b85e4eba85a38698f3b3332f82554bf8442547e2Chris Lattner F->getName() == "llvm.x86.sse2.loadu.dq" || 155b85e4eba85a38698f3b3332f82554bf8442547e2Chris Lattner F->getName() == "llvm.x86.sse2.loadu.pd") { 156f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling // Convert to a native, unaligned load. 157f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling const Type *VecTy = CI->getType(); 158f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling const Type *IntTy = IntegerType::get(C, 128); 159f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling IRBuilder<> Builder(C); 160f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling Builder.SetInsertPoint(CI->getParent(), CI); 161f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling 162f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling Value *BC = Builder.CreateBitCast(CI->getArgOperand(0), 163f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling PointerType::getUnqual(IntTy), 164f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling "cast"); 165f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling LoadInst *LI = Builder.CreateLoad(BC, CI->getName()); 166f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling LI->setAlignment(1); // Unaligned load. 167f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling BC = Builder.CreateBitCast(LI, VecTy, "new.cast"); 168f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling 169f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling // Fix up all the uses with our new load. 170f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling if (!CI->use_empty()) 171f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling CI->replaceAllUsesWith(BC); 172f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling 173f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling // Remove intrinsic. 174f93f7b2446bec3febc30b7136e18704664bd98ccBill Wendling CI->eraseFromParent(); 1759493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling } else if (F->getName() == "llvm.x86.sse.movnt.ps" || 1769493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling F->getName() == "llvm.x86.sse2.movnt.dq" || 1779493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling F->getName() == "llvm.x86.sse2.movnt.pd" || 1789493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling F->getName() == "llvm.x86.sse2.movnt.i") { 1799493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling IRBuilder<> Builder(C); 1809493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling Builder.SetInsertPoint(CI->getParent(), CI); 1819493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling 1829493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling Module *M = F->getParent(); 1839493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling SmallVector<Value *, 1> Elts; 1849493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling Elts.push_back(ConstantInt::get(Type::getInt32Ty(C), 1)); 1859493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling MDNode *Node = MDNode::get(C, Elts); 1869493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling 1879493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling Value *Arg0 = CI->getArgOperand(0); 1889493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling Value *Arg1 = CI->getArgOperand(1); 1899493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling 1909493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling // Convert the type of the pointer to a pointer to the stored type. 1919493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling Value *BC = Builder.CreateBitCast(Arg0, 1929493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling PointerType::getUnqual(Arg1->getType()), 1939493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling "cast"); 1949493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling StoreInst *SI = Builder.CreateStore(Arg1, BC); 1959493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling SI->setMetadata(M->getMDKindID("nontemporal"), Node); 1969493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling SI->setAlignment(16); 1979493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling 1989493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling // Remove intrinsic. 1999493a285d13fd34ff3a507ea57039fdc19dd1ce7Bill Wendling CI->eraseFromParent(); 200a5cecd0a130f7ebc4787f8f5b3e8959e41786673Evan Cheng } else { 201c23197a26f34f559ea9797de51e187087c039c42Torok Edwin llvm_unreachable("Unknown function for CallInst upgrade."); 202f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng } 203f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng return; 204f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng } 205f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng 206051a950000e21935165db56695e35bade668193bGabor Greif switch (NewFn->getIntrinsicID()) { 2079a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes case Intrinsic::prefetch: { 2089a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes IRBuilder<> Builder(C); 2099a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes Builder.SetInsertPoint(CI->getParent(), CI); 2109a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes const llvm::Type *I32Ty = llvm::Type::getInt32Ty(CI->getContext()); 2119a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes 2129a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes // Add the extra "data cache" argument 2139a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes Value *Operands[4] = { CI->getArgOperand(0), CI->getArgOperand(1), 2149a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes CI->getArgOperand(2), 2159a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes llvm::ConstantInt::get(I32Ty, 1) }; 2169a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes CallInst *NewCI = CallInst::Create(NewFn, Operands, Operands+4, 2179a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes CI->getName(), CI); 2189a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes NewCI->setTailCall(CI->isTailCall()); 2199a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes NewCI->setCallingConv(CI->getCallingConv()); 2209a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes // Handle any uses of the old CallInst. 2219a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes if (!CI->use_empty()) 2229a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes // Replace all uses of the old call with the new cast which has the 2239a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes // correct type. 2249a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes CI->replaceAllUsesWith(NewCI); 2259a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes 2269a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes // Clean up the old call now that it has been completely upgraded. 2279a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes CI->eraseFromParent(); 2289a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes break; 2299a767330f555f21d6ef311d3a348d3a44f306d35Bruno Cardoso Lopes } 2306994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth } 2316994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth} 2326994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth 2336994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth// This tests each Function to determine if it needs upgrading. When we find 2346994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth// one we are interested in, we then upgrade all calls to reflect the new 2356994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth// function. 2366994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruthvoid llvm::UpgradeCallsToIntrinsic(Function* F) { 2376994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth assert(F && "Illegal attempt to upgrade a non-existent intrinsic."); 2386994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth 2396994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth // Upgrade the function and check if it is a totaly new function. 240b85e4eba85a38698f3b3332f82554bf8442547e2Chris Lattner Function *NewFn; 241f9b83fcf95e8a280d7b117af8858596fe5b10d94Evan Cheng if (UpgradeIntrinsicFunction(F, NewFn)) { 2426994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth if (NewFn != F) { 2436994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth // Replace all uses to the old function with the new one if necessary. 2446994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth for (Value::use_iterator UI = F->use_begin(), UE = F->use_end(); 2456994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth UI != UE; ) { 246b85e4eba85a38698f3b3332f82554bf8442547e2Chris Lattner if (CallInst *CI = dyn_cast<CallInst>(*UI++)) 2476994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth UpgradeIntrinsicCall(CI, NewFn); 2486994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth } 2496994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth // Remove old function, no longer used, from the module. 2506994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth F->eraseFromParent(); 2516994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth } 2526994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth } 2536994040a952e5fb27605eb3cf29ed86c4e59cf62Chandler Carruth} 254e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel 255771150accba7ab3480746a451710ac81f950fac2Victor Hernandez/// This function strips all debug info intrinsics, except for llvm.dbg.declare. 256771150accba7ab3480746a451710ac81f950fac2Victor Hernandez/// If an llvm.dbg.declare intrinsic is invalid, then this function simply 257771150accba7ab3480746a451710ac81f950fac2Victor Hernandez/// strips that use. 258e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patelvoid llvm::CheckDebugInfoIntrinsics(Module *M) { 259e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel if (Function *FuncStart = M->getFunction("llvm.dbg.func.start")) { 260b85e4eba85a38698f3b3332f82554bf8442547e2Chris Lattner while (!FuncStart->use_empty()) 261b85e4eba85a38698f3b3332f82554bf8442547e2Chris Lattner cast<CallInst>(FuncStart->use_back())->eraseFromParent(); 26244a29e066a24e88bdf127e88be4380a5f259c4b4Devang Patel FuncStart->eraseFromParent(); 263e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel } 26444a29e066a24e88bdf127e88be4380a5f259c4b4Devang Patel 265e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel if (Function *StopPoint = M->getFunction("llvm.dbg.stoppoint")) { 266b85e4eba85a38698f3b3332f82554bf8442547e2Chris Lattner while (!StopPoint->use_empty()) 267b85e4eba85a38698f3b3332f82554bf8442547e2Chris Lattner cast<CallInst>(StopPoint->use_back())->eraseFromParent(); 26844a29e066a24e88bdf127e88be4380a5f259c4b4Devang Patel StopPoint->eraseFromParent(); 269e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel } 270e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel 271e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel if (Function *RegionStart = M->getFunction("llvm.dbg.region.start")) { 272b85e4eba85a38698f3b3332f82554bf8442547e2Chris Lattner while (!RegionStart->use_empty()) 273b85e4eba85a38698f3b3332f82554bf8442547e2Chris Lattner cast<CallInst>(RegionStart->use_back())->eraseFromParent(); 27444a29e066a24e88bdf127e88be4380a5f259c4b4Devang Patel RegionStart->eraseFromParent(); 275e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel } 276e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel 277e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel if (Function *RegionEnd = M->getFunction("llvm.dbg.region.end")) { 278b85e4eba85a38698f3b3332f82554bf8442547e2Chris Lattner while (!RegionEnd->use_empty()) 279b85e4eba85a38698f3b3332f82554bf8442547e2Chris Lattner cast<CallInst>(RegionEnd->use_back())->eraseFromParent(); 28044a29e066a24e88bdf127e88be4380a5f259c4b4Devang Patel RegionEnd->eraseFromParent(); 281e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel } 282e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel 283e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel if (Function *Declare = M->getFunction("llvm.dbg.declare")) { 284e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel if (!Declare->use_empty()) { 285e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel DbgDeclareInst *DDI = cast<DbgDeclareInst>(Declare->use_back()); 286f2937ac4eddb5ced78a1d73206de020c6d9e440fGabor Greif if (!isa<MDNode>(DDI->getArgOperand(0)) || 287f2937ac4eddb5ced78a1d73206de020c6d9e440fGabor Greif !isa<MDNode>(DDI->getArgOperand(1))) { 288e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel while (!Declare->use_empty()) { 289e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel CallInst *CI = cast<CallInst>(Declare->use_back()); 290e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel CI->eraseFromParent(); 291e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel } 292e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel Declare->eraseFromParent(); 293e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel } 294e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel } 295e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel } 296e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel} 297