Adds a JIT based exception handling example to the examples directory.
[oota-llvm.git] / lib / VMCore / AutoUpgrade.cpp
1 //===-- AutoUpgrade.cpp - Implement auto-upgrade helper functions ---------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the auto-upgrade helper functions 
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "llvm/AutoUpgrade.h"
15 #include "llvm/Constants.h"
16 #include "llvm/Function.h"
17 #include "llvm/LLVMContext.h"
18 #include "llvm/Module.h"
19 #include "llvm/IntrinsicInst.h"
20 #include "llvm/ADT/SmallVector.h"
21 #include "llvm/Support/ErrorHandling.h"
22 #include <cstring>
23 using namespace llvm;
24
25
26 static bool UpgradeIntrinsicFunction1(Function *F, Function *&NewFn) {
27   assert(F && "Illegal to upgrade a non-existent Function.");
28
29   // Get the Function's name.
30   const std::string& Name = F->getName();
31
32   // Convenience
33   const FunctionType *FTy = F->getFunctionType();
34
35   // Quickly eliminate it, if it's not a candidate.
36   if (Name.length() <= 8 || Name[0] != 'l' || Name[1] != 'l' || 
37       Name[2] != 'v' || Name[3] != 'm' || Name[4] != '.')
38     return false;
39
40   Module *M = F->getParent();
41   switch (Name[5]) {
42   default: break;
43   case 'a':
44     // This upgrades the llvm.atomic.lcs, llvm.atomic.las, llvm.atomic.lss,
45     // and atomics with default address spaces to their new names to their new
46     // function name (e.g. llvm.atomic.add.i32 => llvm.atomic.add.i32.p0i32)
47     if (Name.compare(5,7,"atomic.",7) == 0) {
48       if (Name.compare(12,3,"lcs",3) == 0) {
49         std::string::size_type delim = Name.find('.',12);
50         F->setName("llvm.atomic.cmp.swap" + Name.substr(delim) +
51                    ".p0" + Name.substr(delim+1));
52         NewFn = F;
53         return true;
54       }
55       else if (Name.compare(12,3,"las",3) == 0) {
56         std::string::size_type delim = Name.find('.',12);
57         F->setName("llvm.atomic.load.add"+Name.substr(delim)
58                    + ".p0" + Name.substr(delim+1));
59         NewFn = F;
60         return true;
61       }
62       else if (Name.compare(12,3,"lss",3) == 0) {
63         std::string::size_type delim = Name.find('.',12);
64         F->setName("llvm.atomic.load.sub"+Name.substr(delim)
65                    + ".p0" + Name.substr(delim+1));
66         NewFn = F;
67         return true;
68       }
69       else if (Name.rfind(".p") == std::string::npos) {
70         // We don't have an address space qualifier so this has be upgraded
71         // to the new name.  Copy the type name at the end of the intrinsic
72         // and add to it
73         std::string::size_type delim = Name.find_last_of('.');
74         assert(delim != std::string::npos && "can not find type");
75         F->setName(Name + ".p0" + Name.substr(delim+1));
76         NewFn = F;
77         return true;
78       }
79     }
80     break;
81   case 'b':
82     //  This upgrades the name of the llvm.bswap intrinsic function to only use 
83     //  a single type name for overloading. We only care about the old format
84     //  'llvm.bswap.i*.i*', so check for 'bswap.' and then for there being 
85     //  a '.' after 'bswap.'
86     if (Name.compare(5,6,"bswap.",6) == 0) {
87       std::string::size_type delim = Name.find('.',11);
88       
89       if (delim != std::string::npos) {
90         //  Construct the new name as 'llvm.bswap' + '.i*'
91         F->setName(Name.substr(0,10)+Name.substr(delim));
92         NewFn = F;
93         return true;
94       }
95     }
96     break;
97
98   case 'c':
99     //  We only want to fix the 'llvm.ct*' intrinsics which do not have the 
100     //  correct return type, so we check for the name, and then check if the 
101     //  return type does not match the parameter type.
102     if ( (Name.compare(5,5,"ctpop",5) == 0 ||
103           Name.compare(5,4,"ctlz",4) == 0 ||
104           Name.compare(5,4,"cttz",4) == 0) &&
105         FTy->getReturnType() != FTy->getParamType(0)) {
106       //  We first need to change the name of the old (bad) intrinsic, because 
107       //  its type is incorrect, but we cannot overload that name. We 
108       //  arbitrarily unique it here allowing us to construct a correctly named 
109       //  and typed function below.
110       F->setName("");
111
112       //  Now construct the new intrinsic with the correct name and type. We 
113       //  leave the old function around in order to query its type, whatever it 
114       //  may be, and correctly convert up to the new type.
115       NewFn = cast<Function>(M->getOrInsertFunction(Name, 
116                                                     FTy->getParamType(0),
117                                                     FTy->getParamType(0),
118                                                     (Type *)0));
119       return true;
120     }
121     break;
122
123   case 'e':
124     //  The old llvm.eh.selector.i32 is equivalent to the new llvm.eh.selector.
125     if (Name.compare("llvm.eh.selector.i32") == 0) {
126       F->setName("llvm.eh.selector");
127       NewFn = F;
128       return true;
129     }
130     //  The old llvm.eh.typeid.for.i32 is equivalent to llvm.eh.typeid.for.
131     if (Name.compare("llvm.eh.typeid.for.i32") == 0) {
132       F->setName("llvm.eh.typeid.for");
133       NewFn = F;
134       return true;
135     }
136     //  Convert the old llvm.eh.selector.i64 to a call to llvm.eh.selector.
137     if (Name.compare("llvm.eh.selector.i64") == 0) {
138       NewFn = Intrinsic::getDeclaration(M, Intrinsic::eh_selector);
139       return true;
140     }
141     //  Convert the old llvm.eh.typeid.for.i64 to a call to llvm.eh.typeid.for.
142     if (Name.compare("llvm.eh.typeid.for.i64") == 0) {
143       NewFn = Intrinsic::getDeclaration(M, Intrinsic::eh_typeid_for);
144       return true;
145     }
146     break;
147
148   case 'p':
149     //  This upgrades the llvm.part.select overloaded intrinsic names to only 
150     //  use one type specifier in the name. We only care about the old format
151     //  'llvm.part.select.i*.i*', and solve as above with bswap.
152     if (Name.compare(5,12,"part.select.",12) == 0) {
153       std::string::size_type delim = Name.find('.',17);
154       
155       if (delim != std::string::npos) {
156         //  Construct a new name as 'llvm.part.select' + '.i*'
157         F->setName(Name.substr(0,16)+Name.substr(delim));
158         NewFn = F;
159         return true;
160       }
161       break;
162     }
163
164     //  This upgrades the llvm.part.set intrinsics similarly as above, however 
165     //  we care about 'llvm.part.set.i*.i*.i*', but only the first two types 
166     //  must match. There is an additional type specifier after these two 
167     //  matching types that we must retain when upgrading.  Thus, we require 
168     //  finding 2 periods, not just one, after the intrinsic name.
169     if (Name.compare(5,9,"part.set.",9) == 0) {
170       std::string::size_type delim = Name.find('.',14);
171
172       if (delim != std::string::npos &&
173           Name.find('.',delim+1) != std::string::npos) {
174         //  Construct a new name as 'llvm.part.select' + '.i*.i*'
175         F->setName(Name.substr(0,13)+Name.substr(delim));
176         NewFn = F;
177         return true;
178       }
179       break;
180     }
181
182     break;
183   case 'x': 
184     // This fixes all MMX shift intrinsic instructions to take a
185     // v1i64 instead of a v2i32 as the second parameter.
186     if (Name.compare(5,10,"x86.mmx.ps",10) == 0 &&
187         (Name.compare(13,4,"psll", 4) == 0 ||
188          Name.compare(13,4,"psra", 4) == 0 ||
189          Name.compare(13,4,"psrl", 4) == 0) && Name[17] != 'i') {
190       
191       const llvm::Type *VT =
192                     VectorType::get(IntegerType::get(FTy->getContext(), 64), 1);
193       
194       // We don't have to do anything if the parameter already has
195       // the correct type.
196       if (FTy->getParamType(1) == VT)
197         break;
198       
199       //  We first need to change the name of the old (bad) intrinsic, because 
200       //  its type is incorrect, but we cannot overload that name. We 
201       //  arbitrarily unique it here allowing us to construct a correctly named 
202       //  and typed function below.
203       F->setName("");
204
205       assert(FTy->getNumParams() == 2 && "MMX shift intrinsics take 2 args!");
206       
207       //  Now construct the new intrinsic with the correct name and type. We 
208       //  leave the old function around in order to query its type, whatever it 
209       //  may be, and correctly convert up to the new type.
210       NewFn = cast<Function>(M->getOrInsertFunction(Name, 
211                                                     FTy->getReturnType(),
212                                                     FTy->getParamType(0),
213                                                     VT,
214                                                     (Type *)0));
215       return true;
216     } else if (Name.compare(5,17,"x86.sse2.loadh.pd",17) == 0 ||
217                Name.compare(5,17,"x86.sse2.loadl.pd",17) == 0 ||
218                Name.compare(5,16,"x86.sse2.movl.dq",16) == 0 ||
219                Name.compare(5,15,"x86.sse2.movs.d",15) == 0 ||
220                Name.compare(5,16,"x86.sse2.shuf.pd",16) == 0 ||
221                Name.compare(5,18,"x86.sse2.unpckh.pd",18) == 0 ||
222                Name.compare(5,18,"x86.sse2.unpckl.pd",18) == 0 ||
223                Name.compare(5,20,"x86.sse2.punpckh.qdq",20) == 0 ||
224                Name.compare(5,20,"x86.sse2.punpckl.qdq",20) == 0) {
225       // Calls to these intrinsics are transformed into ShuffleVector's.
226       NewFn = 0;
227       return true;
228     }
229
230     break;
231   }
232
233   //  This may not belong here. This function is effectively being overloaded 
234   //  to both detect an intrinsic which needs upgrading, and to provide the 
235   //  upgraded form of the intrinsic. We should perhaps have two separate 
236   //  functions for this.
237   return false;
238 }
239
240 bool llvm::UpgradeIntrinsicFunction(Function *F, Function *&NewFn) {
241   NewFn = 0;
242   bool Upgraded = UpgradeIntrinsicFunction1(F, NewFn);
243
244   // Upgrade intrinsic attributes.  This does not change the function.
245   if (NewFn)
246     F = NewFn;
247   if (unsigned id = F->getIntrinsicID())
248     F->setAttributes(Intrinsic::getAttributes((Intrinsic::ID)id));
249   return Upgraded;
250 }
251
252 // UpgradeIntrinsicCall - Upgrade a call to an old intrinsic to be a call the 
253 // upgraded intrinsic. All argument and return casting must be provided in 
254 // order to seamlessly integrate with existing context.
255 void llvm::UpgradeIntrinsicCall(CallInst *CI, Function *NewFn) {
256   Function *F = CI->getCalledFunction();
257   LLVMContext &C = CI->getContext();
258   
259   assert(F && "CallInst has no function associated with it.");
260
261   if (!NewFn) {
262     bool isLoadH = false, isLoadL = false, isMovL = false;
263     bool isMovSD = false, isShufPD = false;
264     bool isUnpckhPD = false, isUnpcklPD = false;
265     bool isPunpckhQPD = false, isPunpcklQPD = false;
266     if (F->getName() == "llvm.x86.sse2.loadh.pd")
267       isLoadH = true;
268     else if (F->getName() == "llvm.x86.sse2.loadl.pd")
269       isLoadL = true;
270     else if (F->getName() == "llvm.x86.sse2.movl.dq")
271       isMovL = true;
272     else if (F->getName() == "llvm.x86.sse2.movs.d")
273       isMovSD = true;
274     else if (F->getName() == "llvm.x86.sse2.shuf.pd")
275       isShufPD = true;
276     else if (F->getName() == "llvm.x86.sse2.unpckh.pd")
277       isUnpckhPD = true;
278     else if (F->getName() == "llvm.x86.sse2.unpckl.pd")
279       isUnpcklPD = true;
280     else if (F->getName() ==  "llvm.x86.sse2.punpckh.qdq")
281       isPunpckhQPD = true;
282     else if (F->getName() ==  "llvm.x86.sse2.punpckl.qdq")
283       isPunpcklQPD = true;
284
285     if (isLoadH || isLoadL || isMovL || isMovSD || isShufPD ||
286         isUnpckhPD || isUnpcklPD || isPunpckhQPD || isPunpcklQPD) {
287       std::vector<Constant*> Idxs;
288       Value *Op0 = CI->getOperand(1);
289       ShuffleVectorInst *SI = NULL;
290       if (isLoadH || isLoadL) {
291         Value *Op1 = UndefValue::get(Op0->getType());
292         Value *Addr = new BitCastInst(CI->getOperand(2), 
293                                   Type::getDoublePtrTy(C),
294                                       "upgraded.", CI);
295         Value *Load = new LoadInst(Addr, "upgraded.", false, 8, CI);
296         Value *Idx = ConstantInt::get(Type::getInt32Ty(C), 0);
297         Op1 = InsertElementInst::Create(Op1, Load, Idx, "upgraded.", CI);
298
299         if (isLoadH) {
300           Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 0));
301           Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 2));
302         } else {
303           Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 2));
304           Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 1));
305         }
306         Value *Mask = ConstantVector::get(Idxs);
307         SI = new ShuffleVectorInst(Op0, Op1, Mask, "upgraded.", CI);
308       } else if (isMovL) {
309         Constant *Zero = ConstantInt::get(Type::getInt32Ty(C), 0);
310         Idxs.push_back(Zero);
311         Idxs.push_back(Zero);
312         Idxs.push_back(Zero);
313         Idxs.push_back(Zero);
314         Value *ZeroV = ConstantVector::get(Idxs);
315
316         Idxs.clear(); 
317         Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 4));
318         Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 5));
319         Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 2));
320         Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 3));
321         Value *Mask = ConstantVector::get(Idxs);
322         SI = new ShuffleVectorInst(ZeroV, Op0, Mask, "upgraded.", CI);
323       } else if (isMovSD ||
324                  isUnpckhPD || isUnpcklPD || isPunpckhQPD || isPunpcklQPD) {
325         Value *Op1 = CI->getOperand(2);
326         if (isMovSD) {
327           Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 2));
328           Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 1));
329         } else if (isUnpckhPD || isPunpckhQPD) {
330           Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 1));
331           Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 3));
332         } else {
333           Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 0));
334           Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), 2));
335         }
336         Value *Mask = ConstantVector::get(Idxs);
337         SI = new ShuffleVectorInst(Op0, Op1, Mask, "upgraded.", CI);
338       } else if (isShufPD) {
339         Value *Op1 = CI->getOperand(2);
340         unsigned MaskVal = cast<ConstantInt>(CI->getOperand(3))->getZExtValue();
341         Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C), MaskVal & 1));
342         Idxs.push_back(ConstantInt::get(Type::getInt32Ty(C),
343                                                ((MaskVal >> 1) & 1)+2));
344         Value *Mask = ConstantVector::get(Idxs);
345         SI = new ShuffleVectorInst(Op0, Op1, Mask, "upgraded.", CI);
346       }
347
348       assert(SI && "Unexpected!");
349
350       // Handle any uses of the old CallInst.
351       if (!CI->use_empty())
352         //  Replace all uses of the old call with the new cast which has the 
353         //  correct type.
354         CI->replaceAllUsesWith(SI);
355       
356       //  Clean up the old call now that it has been completely upgraded.
357       CI->eraseFromParent();
358     } else {
359       llvm_unreachable("Unknown function for CallInst upgrade.");
360     }
361     return;
362   }
363
364   switch (NewFn->getIntrinsicID()) {
365   default:  llvm_unreachable("Unknown function for CallInst upgrade.");
366   case Intrinsic::x86_mmx_psll_d:
367   case Intrinsic::x86_mmx_psll_q:
368   case Intrinsic::x86_mmx_psll_w:
369   case Intrinsic::x86_mmx_psra_d:
370   case Intrinsic::x86_mmx_psra_w:
371   case Intrinsic::x86_mmx_psrl_d:
372   case Intrinsic::x86_mmx_psrl_q:
373   case Intrinsic::x86_mmx_psrl_w: {
374     Value *Operands[2];
375     
376     Operands[0] = CI->getOperand(1);
377     
378     // Cast the second parameter to the correct type.
379     BitCastInst *BC = new BitCastInst(CI->getOperand(2), 
380                                       NewFn->getFunctionType()->getParamType(1),
381                                       "upgraded.", CI);
382     Operands[1] = BC;
383     
384     //  Construct a new CallInst
385     CallInst *NewCI = CallInst::Create(NewFn, Operands, Operands+2, 
386                                        "upgraded."+CI->getName(), CI);
387     NewCI->setTailCall(CI->isTailCall());
388     NewCI->setCallingConv(CI->getCallingConv());
389     
390     //  Handle any uses of the old CallInst.
391     if (!CI->use_empty())
392       //  Replace all uses of the old call with the new cast which has the 
393       //  correct type.
394       CI->replaceAllUsesWith(NewCI);
395     
396     //  Clean up the old call now that it has been completely upgraded.
397     CI->eraseFromParent();
398     break;
399   }        
400   case Intrinsic::ctlz:
401   case Intrinsic::ctpop:
402   case Intrinsic::cttz: {
403     //  Build a small vector of the 1..(N-1) operands, which are the 
404     //  parameters.
405     SmallVector<Value*, 8> Operands(CI->op_begin()+1, CI->op_end());
406
407     //  Construct a new CallInst
408     CallInst *NewCI = CallInst::Create(NewFn, Operands.begin(), Operands.end(),
409                                        "upgraded."+CI->getName(), CI);
410     NewCI->setTailCall(CI->isTailCall());
411     NewCI->setCallingConv(CI->getCallingConv());
412
413     //  Handle any uses of the old CallInst.
414     if (!CI->use_empty()) {
415       //  Check for sign extend parameter attributes on the return values.
416       bool SrcSExt = NewFn->getAttributes().paramHasAttr(0, Attribute::SExt);
417       bool DestSExt = F->getAttributes().paramHasAttr(0, Attribute::SExt);
418       
419       //  Construct an appropriate cast from the new return type to the old.
420       CastInst *RetCast = CastInst::Create(
421                             CastInst::getCastOpcode(NewCI, SrcSExt,
422                                                     F->getReturnType(),
423                                                     DestSExt),
424                             NewCI, F->getReturnType(),
425                             NewCI->getName(), CI);
426       NewCI->moveBefore(RetCast);
427
428       //  Replace all uses of the old call with the new cast which has the 
429       //  correct type.
430       CI->replaceAllUsesWith(RetCast);
431     }
432
433     //  Clean up the old call now that it has been completely upgraded.
434     CI->eraseFromParent();
435   }
436   break;
437   case Intrinsic::eh_selector:
438   case Intrinsic::eh_typeid_for: {
439     // Only the return type changed.
440     SmallVector<Value*, 8> Operands(CI->op_begin() + 1, CI->op_end());
441     CallInst *NewCI = CallInst::Create(NewFn, Operands.begin(), Operands.end(),
442                                        "upgraded." + CI->getName(), CI);
443     NewCI->setTailCall(CI->isTailCall());
444     NewCI->setCallingConv(CI->getCallingConv());
445
446     //  Handle any uses of the old CallInst.
447     if (!CI->use_empty()) {
448       //  Construct an appropriate cast from the new return type to the old.
449       CastInst *RetCast =
450         CastInst::Create(CastInst::getCastOpcode(NewCI, true,
451                                                  F->getReturnType(), true),
452                          NewCI, F->getReturnType(), NewCI->getName(), CI);
453       CI->replaceAllUsesWith(RetCast);
454     }
455     CI->eraseFromParent();
456   }
457   break;
458   }
459 }
460
461 // This tests each Function to determine if it needs upgrading. When we find 
462 // one we are interested in, we then upgrade all calls to reflect the new 
463 // function.
464 void llvm::UpgradeCallsToIntrinsic(Function* F) {
465   assert(F && "Illegal attempt to upgrade a non-existent intrinsic.");
466
467   // Upgrade the function and check if it is a totaly new function.
468   Function* NewFn;
469   if (UpgradeIntrinsicFunction(F, NewFn)) {
470     if (NewFn != F) {
471       // Replace all uses to the old function with the new one if necessary.
472       for (Value::use_iterator UI = F->use_begin(), UE = F->use_end();
473            UI != UE; ) {
474         if (CallInst* CI = dyn_cast<CallInst>(*UI++))
475           UpgradeIntrinsicCall(CI, NewFn);
476       }
477       // Remove old function, no longer used, from the module.
478       F->eraseFromParent();
479     }
480   }
481 }
482
483 /// This function strips all debug info intrinsics, except for llvm.dbg.declare.
484 /// If an llvm.dbg.declare intrinsic is invalid, then this function simply
485 /// strips that use.
486 void llvm::CheckDebugInfoIntrinsics(Module *M) {
487
488
489   if (Function *FuncStart = M->getFunction("llvm.dbg.func.start")) {
490     while (!FuncStart->use_empty()) {
491       CallInst *CI = cast<CallInst>(FuncStart->use_back());
492       CI->eraseFromParent();
493     }
494     FuncStart->eraseFromParent();
495   }
496   
497   if (Function *StopPoint = M->getFunction("llvm.dbg.stoppoint")) {
498     while (!StopPoint->use_empty()) {
499       CallInst *CI = cast<CallInst>(StopPoint->use_back());
500       CI->eraseFromParent();
501     }
502     StopPoint->eraseFromParent();
503   }
504
505   if (Function *RegionStart = M->getFunction("llvm.dbg.region.start")) {
506     while (!RegionStart->use_empty()) {
507       CallInst *CI = cast<CallInst>(RegionStart->use_back());
508       CI->eraseFromParent();
509     }
510     RegionStart->eraseFromParent();
511   }
512
513   if (Function *RegionEnd = M->getFunction("llvm.dbg.region.end")) {
514     while (!RegionEnd->use_empty()) {
515       CallInst *CI = cast<CallInst>(RegionEnd->use_back());
516       CI->eraseFromParent();
517     }
518     RegionEnd->eraseFromParent();
519   }
520   
521   if (Function *Declare = M->getFunction("llvm.dbg.declare")) {
522     if (!Declare->use_empty()) {
523       DbgDeclareInst *DDI = cast<DbgDeclareInst>(Declare->use_back());
524       if (!isa<MDNode>(DDI->getOperand(1)) ||!isa<MDNode>(DDI->getOperand(2))) {
525         while (!Declare->use_empty()) {
526           CallInst *CI = cast<CallInst>(Declare->use_back());
527           CI->eraseFromParent();
528         }
529         Declare->eraseFromParent();
530       }
531     }
532   }
533 }