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