LLVM  8.0.0svn
IntrinsicLowering.cpp
Go to the documentation of this file.
1 //===-- IntrinsicLowering.cpp - Intrinsic Lowering default implementation -===//
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 IntrinsicLowering class.
11 //
12 //===----------------------------------------------------------------------===//
13 
15 #include "llvm/ADT/SmallVector.h"
16 #include "llvm/IR/CallSite.h"
17 #include "llvm/IR/Constants.h"
18 #include "llvm/IR/DataLayout.h"
19 #include "llvm/IR/DerivedTypes.h"
20 #include "llvm/IR/IRBuilder.h"
21 #include "llvm/IR/Module.h"
22 #include "llvm/IR/Type.h"
25 using namespace llvm;
26 
27 template <class ArgIt>
28 static void EnsureFunctionExists(Module &M, const char *Name,
29  ArgIt ArgBegin, ArgIt ArgEnd,
30  Type *RetTy) {
31  // Insert a correctly-typed definition now.
32  std::vector<Type *> ParamTys;
33  for (ArgIt I = ArgBegin; I != ArgEnd; ++I)
34  ParamTys.push_back(I->getType());
35  M.getOrInsertFunction(Name, FunctionType::get(RetTy, ParamTys, false));
36 }
37 
39  const char *FName,
40  const char *DName, const char *LDName) {
41  // Insert definitions for all the floating point types.
42  switch((int)Fn.arg_begin()->getType()->getTypeID()) {
43  case Type::FloatTyID:
44  EnsureFunctionExists(M, FName, Fn.arg_begin(), Fn.arg_end(),
46  break;
47  case Type::DoubleTyID:
48  EnsureFunctionExists(M, DName, Fn.arg_begin(), Fn.arg_end(),
50  break;
51  case Type::X86_FP80TyID:
52  case Type::FP128TyID:
54  EnsureFunctionExists(M, LDName, Fn.arg_begin(), Fn.arg_end(),
55  Fn.arg_begin()->getType());
56  break;
57  }
58 }
59 
60 /// This function is used when we want to lower an intrinsic call to a call of
61 /// an external function. This handles hard cases such as when there was already
62 /// a prototype for the external function, but that prototype doesn't match the
63 /// arguments we expect to pass in.
64 template <class ArgIt>
65 static CallInst *ReplaceCallWith(const char *NewFn, CallInst *CI,
66  ArgIt ArgBegin, ArgIt ArgEnd,
67  Type *RetTy) {
68  // If we haven't already looked up this function, check to see if the
69  // program already contains a function with this name.
70  Module *M = CI->getModule();
71  // Get or insert the definition now.
72  std::vector<Type *> ParamTys;
73  for (ArgIt I = ArgBegin; I != ArgEnd; ++I)
74  ParamTys.push_back((*I)->getType());
75  Constant* FCache = M->getOrInsertFunction(NewFn,
76  FunctionType::get(RetTy, ParamTys, false));
77 
78  IRBuilder<> Builder(CI->getParent(), CI->getIterator());
79  SmallVector<Value *, 8> Args(ArgBegin, ArgEnd);
80  CallInst *NewCI = Builder.CreateCall(FCache, Args);
81  NewCI->setName(CI->getName());
82  if (!CI->use_empty())
83  CI->replaceAllUsesWith(NewCI);
84  return NewCI;
85 }
86 
87 // VisualStudio defines setjmp as _setjmp
88 #if defined(_MSC_VER) && defined(setjmp) && \
89  !defined(setjmp_undefined_for_msvc)
90 # pragma push_macro("setjmp")
91 # undef setjmp
92 # define setjmp_undefined_for_msvc
93 #endif
94 
97  for (auto &F : M)
98  if (F.isDeclaration() && !F.use_empty())
99  switch (F.getIntrinsicID()) {
100  default: break;
101  case Intrinsic::setjmp:
102  EnsureFunctionExists(M, "setjmp", F.arg_begin(), F.arg_end(),
103  Type::getInt32Ty(M.getContext()));
104  break;
105  case Intrinsic::longjmp:
106  EnsureFunctionExists(M, "longjmp", F.arg_begin(), F.arg_end(),
107  Type::getVoidTy(M.getContext()));
108  break;
109  case Intrinsic::siglongjmp:
110  EnsureFunctionExists(M, "abort", F.arg_end(), F.arg_end(),
111  Type::getVoidTy(M.getContext()));
112  break;
113  case Intrinsic::memcpy:
114  M.getOrInsertFunction("memcpy",
115  Type::getInt8PtrTy(Context),
116  Type::getInt8PtrTy(Context),
117  Type::getInt8PtrTy(Context),
118  DL.getIntPtrType(Context));
119  break;
120  case Intrinsic::memmove:
121  M.getOrInsertFunction("memmove",
122  Type::getInt8PtrTy(Context),
123  Type::getInt8PtrTy(Context),
124  Type::getInt8PtrTy(Context),
125  DL.getIntPtrType(Context));
126  break;
127  case Intrinsic::memset:
128  M.getOrInsertFunction("memset",
129  Type::getInt8PtrTy(Context),
130  Type::getInt8PtrTy(Context),
131  Type::getInt32Ty(M.getContext()),
132  DL.getIntPtrType(Context));
133  break;
134  case Intrinsic::sqrt:
135  EnsureFPIntrinsicsExist(M, F, "sqrtf", "sqrt", "sqrtl");
136  break;
137  case Intrinsic::sin:
138  EnsureFPIntrinsicsExist(M, F, "sinf", "sin", "sinl");
139  break;
140  case Intrinsic::cos:
141  EnsureFPIntrinsicsExist(M, F, "cosf", "cos", "cosl");
142  break;
143  case Intrinsic::pow:
144  EnsureFPIntrinsicsExist(M, F, "powf", "pow", "powl");
145  break;
146  case Intrinsic::log:
147  EnsureFPIntrinsicsExist(M, F, "logf", "log", "logl");
148  break;
149  case Intrinsic::log2:
150  EnsureFPIntrinsicsExist(M, F, "log2f", "log2", "log2l");
151  break;
152  case Intrinsic::log10:
153  EnsureFPIntrinsicsExist(M, F, "log10f", "log10", "log10l");
154  break;
155  case Intrinsic::exp:
156  EnsureFPIntrinsicsExist(M, F, "expf", "exp", "expl");
157  break;
158  case Intrinsic::exp2:
159  EnsureFPIntrinsicsExist(M, F, "exp2f", "exp2", "exp2l");
160  break;
161  }
162 }
163 
164 /// Emit the code to lower bswap of V before the specified instruction IP.
166  assert(V->getType()->isIntOrIntVectorTy() && "Can't bswap a non-integer type!");
167 
168  unsigned BitSize = V->getType()->getScalarSizeInBits();
169 
170  IRBuilder<> Builder(IP);
171 
172  switch(BitSize) {
173  default: llvm_unreachable("Unhandled type size of value to byteswap!");
174  case 16: {
175  Value *Tmp1 = Builder.CreateShl(V, ConstantInt::get(V->getType(), 8),
176  "bswap.2");
177  Value *Tmp2 = Builder.CreateLShr(V, ConstantInt::get(V->getType(), 8),
178  "bswap.1");
179  V = Builder.CreateOr(Tmp1, Tmp2, "bswap.i16");
180  break;
181  }
182  case 32: {
183  Value *Tmp4 = Builder.CreateShl(V, ConstantInt::get(V->getType(), 24),
184  "bswap.4");
185  Value *Tmp3 = Builder.CreateShl(V, ConstantInt::get(V->getType(), 8),
186  "bswap.3");
187  Value *Tmp2 = Builder.CreateLShr(V, ConstantInt::get(V->getType(), 8),
188  "bswap.2");
189  Value *Tmp1 = Builder.CreateLShr(V,ConstantInt::get(V->getType(), 24),
190  "bswap.1");
191  Tmp3 = Builder.CreateAnd(Tmp3,
192  ConstantInt::get(V->getType(), 0xFF0000),
193  "bswap.and3");
194  Tmp2 = Builder.CreateAnd(Tmp2,
195  ConstantInt::get(V->getType(), 0xFF00),
196  "bswap.and2");
197  Tmp4 = Builder.CreateOr(Tmp4, Tmp3, "bswap.or1");
198  Tmp2 = Builder.CreateOr(Tmp2, Tmp1, "bswap.or2");
199  V = Builder.CreateOr(Tmp4, Tmp2, "bswap.i32");
200  break;
201  }
202  case 64: {
203  Value *Tmp8 = Builder.CreateShl(V, ConstantInt::get(V->getType(), 56),
204  "bswap.8");
205  Value *Tmp7 = Builder.CreateShl(V, ConstantInt::get(V->getType(), 40),
206  "bswap.7");
207  Value *Tmp6 = Builder.CreateShl(V, ConstantInt::get(V->getType(), 24),
208  "bswap.6");
209  Value *Tmp5 = Builder.CreateShl(V, ConstantInt::get(V->getType(), 8),
210  "bswap.5");
211  Value* Tmp4 = Builder.CreateLShr(V, ConstantInt::get(V->getType(), 8),
212  "bswap.4");
213  Value* Tmp3 = Builder.CreateLShr(V,
214  ConstantInt::get(V->getType(), 24),
215  "bswap.3");
216  Value* Tmp2 = Builder.CreateLShr(V,
217  ConstantInt::get(V->getType(), 40),
218  "bswap.2");
219  Value* Tmp1 = Builder.CreateLShr(V,
220  ConstantInt::get(V->getType(), 56),
221  "bswap.1");
222  Tmp7 = Builder.CreateAnd(Tmp7,
224  0xFF000000000000ULL),
225  "bswap.and7");
226  Tmp6 = Builder.CreateAnd(Tmp6,
228  0xFF0000000000ULL),
229  "bswap.and6");
230  Tmp5 = Builder.CreateAnd(Tmp5,
232  0xFF00000000ULL),
233  "bswap.and5");
234  Tmp4 = Builder.CreateAnd(Tmp4,
236  0xFF000000ULL),
237  "bswap.and4");
238  Tmp3 = Builder.CreateAnd(Tmp3,
240  0xFF0000ULL),
241  "bswap.and3");
242  Tmp2 = Builder.CreateAnd(Tmp2,
244  0xFF00ULL),
245  "bswap.and2");
246  Tmp8 = Builder.CreateOr(Tmp8, Tmp7, "bswap.or1");
247  Tmp6 = Builder.CreateOr(Tmp6, Tmp5, "bswap.or2");
248  Tmp4 = Builder.CreateOr(Tmp4, Tmp3, "bswap.or3");
249  Tmp2 = Builder.CreateOr(Tmp2, Tmp1, "bswap.or4");
250  Tmp8 = Builder.CreateOr(Tmp8, Tmp6, "bswap.or5");
251  Tmp4 = Builder.CreateOr(Tmp4, Tmp2, "bswap.or6");
252  V = Builder.CreateOr(Tmp8, Tmp4, "bswap.i64");
253  break;
254  }
255  }
256  return V;
257 }
258 
259 /// Emit the code to lower ctpop of V before the specified instruction IP.
261  assert(V->getType()->isIntegerTy() && "Can't ctpop a non-integer type!");
262 
263  static const uint64_t MaskValues[6] = {
264  0x5555555555555555ULL, 0x3333333333333333ULL,
265  0x0F0F0F0F0F0F0F0FULL, 0x00FF00FF00FF00FFULL,
266  0x0000FFFF0000FFFFULL, 0x00000000FFFFFFFFULL
267  };
268 
269  IRBuilder<> Builder(IP);
270 
271  unsigned BitSize = V->getType()->getPrimitiveSizeInBits();
272  unsigned WordSize = (BitSize + 63) / 64;
273  Value *Count = ConstantInt::get(V->getType(), 0);
274 
275  for (unsigned n = 0; n < WordSize; ++n) {
276  Value *PartValue = V;
277  for (unsigned i = 1, ct = 0; i < (BitSize>64 ? 64 : BitSize);
278  i <<= 1, ++ct) {
279  Value *MaskCst = ConstantInt::get(V->getType(), MaskValues[ct]);
280  Value *LHS = Builder.CreateAnd(PartValue, MaskCst, "cppop.and1");
281  Value *VShift = Builder.CreateLShr(PartValue,
282  ConstantInt::get(V->getType(), i),
283  "ctpop.sh");
284  Value *RHS = Builder.CreateAnd(VShift, MaskCst, "cppop.and2");
285  PartValue = Builder.CreateAdd(LHS, RHS, "ctpop.step");
286  }
287  Count = Builder.CreateAdd(PartValue, Count, "ctpop.part");
288  if (BitSize > 64) {
289  V = Builder.CreateLShr(V, ConstantInt::get(V->getType(), 64),
290  "ctpop.part.sh");
291  BitSize -= 64;
292  }
293  }
294 
295  return Count;
296 }
297 
298 /// Emit the code to lower ctlz of V before the specified instruction IP.
300 
301  IRBuilder<> Builder(IP);
302 
303  unsigned BitSize = V->getType()->getPrimitiveSizeInBits();
304  for (unsigned i = 1; i < BitSize; i <<= 1) {
305  Value *ShVal = ConstantInt::get(V->getType(), i);
306  ShVal = Builder.CreateLShr(V, ShVal, "ctlz.sh");
307  V = Builder.CreateOr(V, ShVal, "ctlz.step");
308  }
309 
310  V = Builder.CreateNot(V);
311  return LowerCTPOP(Context, V, IP);
312 }
313 
314 static void ReplaceFPIntrinsicWithCall(CallInst *CI, const char *Fname,
315  const char *Dname,
316  const char *LDname) {
317  CallSite CS(CI);
318  switch (CI->getArgOperand(0)->getType()->getTypeID()) {
319  default: llvm_unreachable("Invalid type in intrinsic");
320  case Type::FloatTyID:
321  ReplaceCallWith(Fname, CI, CS.arg_begin(), CS.arg_end(),
323  break;
324  case Type::DoubleTyID:
325  ReplaceCallWith(Dname, CI, CS.arg_begin(), CS.arg_end(),
327  break;
328  case Type::X86_FP80TyID:
329  case Type::FP128TyID:
330  case Type::PPC_FP128TyID:
331  ReplaceCallWith(LDname, CI, CS.arg_begin(), CS.arg_end(),
332  CI->getArgOperand(0)->getType());
333  break;
334  }
335 }
336 
338  IRBuilder<> Builder(CI);
339  LLVMContext &Context = CI->getContext();
340 
341  const Function *Callee = CI->getCalledFunction();
342  assert(Callee && "Cannot lower an indirect call!");
343 
344  CallSite CS(CI);
345  switch (Callee->getIntrinsicID()) {
347  report_fatal_error("Cannot lower a call to a non-intrinsic function '"+
348  Callee->getName() + "'!");
349  default:
350  report_fatal_error("Code generator does not support intrinsic function '"+
351  Callee->getName()+"'!");
352 
353  case Intrinsic::expect: {
354  // Just replace __builtin_expect(exp, c) with EXP.
355  Value *V = CI->getArgOperand(0);
356  CI->replaceAllUsesWith(V);
357  break;
358  }
359 
360  // The setjmp/longjmp intrinsics should only exist in the code if it was
361  // never optimized (ie, right out of the CFE), or if it has been hacked on
362  // by the lowerinvoke pass. In both cases, the right thing to do is to
363  // convert the call to an explicit setjmp or longjmp call.
364  case Intrinsic::setjmp: {
365  Value *V = ReplaceCallWith("setjmp", CI, CS.arg_begin(), CS.arg_end(),
366  Type::getInt32Ty(Context));
367  if (!CI->getType()->isVoidTy())
368  CI->replaceAllUsesWith(V);
369  break;
370  }
371  case Intrinsic::sigsetjmp:
372  if (!CI->getType()->isVoidTy())
374  break;
375 
376  case Intrinsic::longjmp: {
377  ReplaceCallWith("longjmp", CI, CS.arg_begin(), CS.arg_end(),
378  Type::getVoidTy(Context));
379  break;
380  }
381 
382  case Intrinsic::siglongjmp: {
383  // Insert the call to abort
384  ReplaceCallWith("abort", CI, CS.arg_end(), CS.arg_end(),
385  Type::getVoidTy(Context));
386  break;
387  }
388  case Intrinsic::ctpop:
389  CI->replaceAllUsesWith(LowerCTPOP(Context, CI->getArgOperand(0), CI));
390  break;
391 
392  case Intrinsic::bswap:
393  CI->replaceAllUsesWith(LowerBSWAP(Context, CI->getArgOperand(0), CI));
394  break;
395 
396  case Intrinsic::ctlz:
397  CI->replaceAllUsesWith(LowerCTLZ(Context, CI->getArgOperand(0), CI));
398  break;
399 
400  case Intrinsic::cttz: {
401  // cttz(x) -> ctpop(~X & (X-1))
402  Value *Src = CI->getArgOperand(0);
403  Value *NotSrc = Builder.CreateNot(Src);
404  NotSrc->setName(Src->getName() + ".not");
405  Value *SrcM1 = ConstantInt::get(Src->getType(), 1);
406  SrcM1 = Builder.CreateSub(Src, SrcM1);
407  Src = LowerCTPOP(Context, Builder.CreateAnd(NotSrc, SrcM1), CI);
408  CI->replaceAllUsesWith(Src);
409  break;
410  }
411 
412  case Intrinsic::stacksave:
413  case Intrinsic::stackrestore: {
414  if (!Warned)
415  errs() << "WARNING: this target does not support the llvm.stack"
416  << (Callee->getIntrinsicID() == Intrinsic::stacksave ?
417  "save" : "restore") << " intrinsic.\n";
418  Warned = true;
419  if (Callee->getIntrinsicID() == Intrinsic::stacksave)
421  break;
422  }
423 
424  case Intrinsic::get_dynamic_area_offset:
425  errs() << "WARNING: this target does not support the custom llvm.get."
426  "dynamic.area.offset. It is being lowered to a constant 0\n";
427  // Just lower it to a constant 0 because for most targets
428  // @llvm.get.dynamic.area.offset is lowered to zero.
430  break;
431  case Intrinsic::returnaddress:
432  case Intrinsic::frameaddress:
433  errs() << "WARNING: this target does not support the llvm."
434  << (Callee->getIntrinsicID() == Intrinsic::returnaddress ?
435  "return" : "frame") << "address intrinsic.\n";
436  CI->replaceAllUsesWith(
437  ConstantPointerNull::get(cast<PointerType>(CI->getType())));
438  break;
439  case Intrinsic::addressofreturnaddress:
440  errs() << "WARNING: this target does not support the "
441  "llvm.addressofreturnaddress intrinsic.\n";
442  CI->replaceAllUsesWith(
443  ConstantPointerNull::get(cast<PointerType>(CI->getType())));
444  break;
445 
446  case Intrinsic::prefetch:
447  break; // Simply strip out prefetches on unsupported architectures
448 
449  case Intrinsic::pcmarker:
450  break; // Simply strip out pcmarker on unsupported architectures
451  case Intrinsic::readcyclecounter: {
452  errs() << "WARNING: this target does not support the llvm.readcyclecoun"
453  << "ter intrinsic. It is being lowered to a constant 0\n";
455  break;
456  }
457 
458  case Intrinsic::dbg_declare:
459  case Intrinsic::dbg_label:
460  break; // Simply strip out debugging intrinsics
461 
462  case Intrinsic::eh_typeid_for:
463  // Return something different to eh_selector.
465  break;
466 
467  case Intrinsic::annotation:
468  case Intrinsic::ptr_annotation:
469  // Just drop the annotation, but forward the value
470  CI->replaceAllUsesWith(CI->getOperand(0));
471  break;
472 
473  case Intrinsic::assume:
474  case Intrinsic::var_annotation:
475  break; // Strip out these intrinsics
476 
477  case Intrinsic::memcpy: {
478  Type *IntPtr = DL.getIntPtrType(Context);
479  Value *Size = Builder.CreateIntCast(CI->getArgOperand(2), IntPtr,
480  /* isSigned */ false);
481  Value *Ops[3];
482  Ops[0] = CI->getArgOperand(0);
483  Ops[1] = CI->getArgOperand(1);
484  Ops[2] = Size;
485  ReplaceCallWith("memcpy", CI, Ops, Ops+3, CI->getArgOperand(0)->getType());
486  break;
487  }
488  case Intrinsic::memmove: {
489  Type *IntPtr = DL.getIntPtrType(Context);
490  Value *Size = Builder.CreateIntCast(CI->getArgOperand(2), IntPtr,
491  /* isSigned */ false);
492  Value *Ops[3];
493  Ops[0] = CI->getArgOperand(0);
494  Ops[1] = CI->getArgOperand(1);
495  Ops[2] = Size;
496  ReplaceCallWith("memmove", CI, Ops, Ops+3, CI->getArgOperand(0)->getType());
497  break;
498  }
499  case Intrinsic::memset: {
500  Value *Op0 = CI->getArgOperand(0);
501  Type *IntPtr = DL.getIntPtrType(Op0->getType());
502  Value *Size = Builder.CreateIntCast(CI->getArgOperand(2), IntPtr,
503  /* isSigned */ false);
504  Value *Ops[3];
505  Ops[0] = Op0;
506  // Extend the amount to i32.
507  Ops[1] = Builder.CreateIntCast(CI->getArgOperand(1),
508  Type::getInt32Ty(Context),
509  /* isSigned */ false);
510  Ops[2] = Size;
511  ReplaceCallWith("memset", CI, Ops, Ops+3, CI->getArgOperand(0)->getType());
512  break;
513  }
514  case Intrinsic::sqrt: {
515  ReplaceFPIntrinsicWithCall(CI, "sqrtf", "sqrt", "sqrtl");
516  break;
517  }
518  case Intrinsic::log: {
519  ReplaceFPIntrinsicWithCall(CI, "logf", "log", "logl");
520  break;
521  }
522  case Intrinsic::log2: {
523  ReplaceFPIntrinsicWithCall(CI, "log2f", "log2", "log2l");
524  break;
525  }
526  case Intrinsic::log10: {
527  ReplaceFPIntrinsicWithCall(CI, "log10f", "log10", "log10l");
528  break;
529  }
530  case Intrinsic::exp: {
531  ReplaceFPIntrinsicWithCall(CI, "expf", "exp", "expl");
532  break;
533  }
534  case Intrinsic::exp2: {
535  ReplaceFPIntrinsicWithCall(CI, "exp2f", "exp2", "exp2l");
536  break;
537  }
538  case Intrinsic::pow: {
539  ReplaceFPIntrinsicWithCall(CI, "powf", "pow", "powl");
540  break;
541  }
542  case Intrinsic::sin: {
543  ReplaceFPIntrinsicWithCall(CI, "sinf", "sin", "sinl");
544  break;
545  }
546  case Intrinsic::cos: {
547  ReplaceFPIntrinsicWithCall(CI, "cosf", "cos", "cosl");
548  break;
549  }
550  case Intrinsic::floor: {
551  ReplaceFPIntrinsicWithCall(CI, "floorf", "floor", "floorl");
552  break;
553  }
554  case Intrinsic::ceil: {
555  ReplaceFPIntrinsicWithCall(CI, "ceilf", "ceil", "ceill");
556  break;
557  }
558  case Intrinsic::trunc: {
559  ReplaceFPIntrinsicWithCall(CI, "truncf", "trunc", "truncl");
560  break;
561  }
562  case Intrinsic::round: {
563  ReplaceFPIntrinsicWithCall(CI, "roundf", "round", "roundl");
564  break;
565  }
566  case Intrinsic::copysign: {
567  ReplaceFPIntrinsicWithCall(CI, "copysignf", "copysign", "copysignl");
568  break;
569  }
570  case Intrinsic::flt_rounds:
571  // Lower to "round to the nearest"
572  if (!CI->getType()->isVoidTy())
574  break;
575  case Intrinsic::invariant_start:
576  case Intrinsic::lifetime_start:
577  // Discard region information.
579  break;
580  case Intrinsic::invariant_end:
581  case Intrinsic::lifetime_end:
582  // Discard region information.
583  break;
584  }
585 
586  assert(CI->use_empty() &&
587  "Lowering should have eliminated any uses of the intrinsic call!");
588  CI->eraseFromParent();
589 }
590 
592  // Verify this is a simple bswap.
593  if (CI->getNumArgOperands() != 1 ||
594  CI->getType() != CI->getArgOperand(0)->getType() ||
595  !CI->getType()->isIntegerTy())
596  return false;
597 
598  IntegerType *Ty = dyn_cast<IntegerType>(CI->getType());
599  if (!Ty)
600  return false;
601 
602  // Okay, we can do this xform, do so now.
603  Module *M = CI->getModule();
604  Constant *Int = Intrinsic::getDeclaration(M, Intrinsic::bswap, Ty);
605 
606  Value *Op = CI->getArgOperand(0);
607  Op = CallInst::Create(Int, Op, CI->getName(), CI);
608 
609  CI->replaceAllUsesWith(Op);
610  CI->eraseFromParent();
611  return true;
612 }
SymbolTableList< Instruction >::iterator eraseFromParent()
This method unlinks &#39;this&#39; from the containing basic block and deletes it.
Definition: Instruction.cpp:68
Function * getCalledFunction() const
Return the function called, or null if this is an indirect function invocation.
static Type * getDoubleTy(LLVMContext &C)
Definition: Type.cpp:165
raw_ostream & errs()
This returns a reference to a raw_ostream for standard error.
LLVMContext & Context
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
Definition: Error.cpp:139
Compute iterated dominance frontiers using a linear time algorithm.
Definition: AllocatorList.h:24
Constant * getOrInsertFunction(StringRef Name, FunctionType *T, AttributeList AttributeList)
Look up the specified function in the module symbol table.
Definition: Module.cpp:143
A Module instance is used to store all the information related to an LLVM module. ...
Definition: Module.h:64
static CallInst * ReplaceCallWith(const char *NewFn, CallInst *CI, ArgIt ArgBegin, ArgIt ArgEnd, Type *RetTy)
This function is used when we want to lower an intrinsic call to a call of an external function...
2: 32-bit floating point type
Definition: Type.h:59
This class represents a function call, abstracting a target machine&#39;s calling convention.
static uint64_t round(uint64_t Acc, uint64_t Input)
Definition: xxhash.cpp:57
LLVMContext & getContext() const
All values hold a context through their type.
Definition: Value.cpp:714
arg_iterator arg_end()
Definition: Function.h:680
F(f)
4: 80-bit floating point type (X87)
Definition: Type.h:61
static CallInst * Create(Value *Func, ArrayRef< Value *> Args, ArrayRef< OperandBundleDef > Bundles=None, const Twine &NameStr="", Instruction *InsertBefore=nullptr)
static IntegerType * getInt64Ty(LLVMContext &C)
Definition: Type.cpp:177
loop data prefetch
static Constant * getNullValue(Type *Ty)
Constructor to create a &#39;0&#39; constant of arbitrary type.
Definition: Constants.cpp:268
Value * CreateNot(Value *V, const Twine &Name="")
Definition: IRBuilder.h:1294
amdgpu Simplify well known AMD library false Value Value const Twine & Name
static Type * getFloatTy(LLVMContext &C)
Definition: Type.cpp:164
TypeID getTypeID() const
Return the type id for the type.
Definition: Type.h:138
LLVMContext & getContext() const
Get the global data context.
Definition: Module.h:243
IterTy arg_end() const
Definition: CallSite.h:575
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition: Type.h:197
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition: IRBuilder.h:743
static void EnsureFunctionExists(Module &M, const char *Name, ArgIt ArgBegin, ArgIt ArgEnd, Type *RetTy)
static void ReplaceFPIntrinsicWithCall(CallInst *CI, const char *Fname, const char *Dname, const char *LDname)
Value * CreateAdd(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition: IRBuilder.h:974
void setName(const Twine &Name)
Change the name of the value.
Definition: Value.cpp:295
Type * getType() const
All values are typed, get the type of this value.
Definition: Value.h:245
Value * CreateSub(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition: IRBuilder.h:991
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
Definition: Type.h:203
void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition: Value.cpp:439
amdgpu Simplify well known AMD library false Value * Callee
Function * getDeclaration(Module *M, ID id, ArrayRef< Type *> Tys=None)
Create or insert an LLVM Function declaration for an intrinsic, and return it.
Definition: Function.cpp:1021
Value * CreateOr(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:1142
Value * getOperand(unsigned i_nocapture) const
bool isVoidTy() const
Return true if this is &#39;void&#39;.
Definition: Type.h:141
IntegerType * getIntPtrType(LLVMContext &C, unsigned AddressSpace=0) const
Returns an integer type with size at least as big as that of a pointer in the given address space...
Definition: DataLayout.cpp:742
static ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
Definition: Constants.cpp:1378
The instances of the Type class are immutable: once they are created, they are never changed...
Definition: Type.h:46
This is an important class for using LLVM in a threaded context.
Definition: LLVMContext.h:69
static Value * LowerBSWAP(LLVMContext &Context, Value *V, Instruction *IP)
Emit the code to lower bswap of V before the specified instruction IP.
This is an important base class in LLVM.
Definition: Constant.h:42
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static Type * getVoidTy(LLVMContext &C)
Definition: Type.cpp:161
static void EnsureFPIntrinsicsExist(Module &M, Function &Fn, const char *FName, const char *DName, const char *LDName)
6: 128-bit floating point type (two 64-bits, PowerPC)
Definition: Type.h:63
static FunctionType * get(Type *Result, ArrayRef< Type *> Params, bool isVarArg)
This static method is the primary way of constructing a FunctionType.
Definition: Type.cpp:297
arg_iterator arg_begin()
Definition: Function.h:671
self_iterator getIterator()
Definition: ilist_node.h:82
Class to represent integer types.
Definition: DerivedTypes.h:40
static double log2(double V)
static UndefValue * get(Type *T)
Static factory methods - Return an &#39;undef&#39; object of the specified type.
Definition: Constants.cpp:1392
static PointerType * getInt8PtrTy(LLVMContext &C, unsigned AS=0)
Definition: Type.cpp:220
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
static Value * LowerCTPOP(LLVMContext &Context, Value *V, Instruction *IP)
Emit the code to lower ctpop of V before the specified instruction IP.
unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type...
Definition: Type.cpp:130
IterTy arg_begin() const
Definition: CallSite.h:571
Value * CreateIntCast(Value *V, Type *DestTy, bool isSigned, const Twine &Name="")
Definition: IRBuilder.h:1710
Module.h This file contains the declarations for the Module class.
void AddPrototypes(Module &M)
Add all of the prototypes that might be needed by an intrinsic lowering implementation to be inserted...
static Value * LowerCTLZ(LLVMContext &Context, Value *V, Instruction *IP)
Emit the code to lower ctlz of V before the specified instruction IP.
static Constant * get(Type *Ty, uint64_t V, bool isSigned=false)
If Ty is a vector type, return a Constant with a splat of the given value.
Definition: Constants.cpp:621
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
Definition: Function.h:194
const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
Definition: Instruction.cpp:56
Value * CreateShl(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Definition: IRBuilder.h:1063
static bool LowerToByteSwap(CallInst *CI)
Try to replace a call instruction with a call to a bswap intrinsic.
static IntegerType * getInt32Ty(LLVMContext &C)
Definition: Type.cpp:176
void LowerIntrinsicCall(CallInst *CI)
Replace a call to the specified intrinsic function.
unsigned getNumArgOperands() const
Return the number of call arguments.
StringRef getName() const
Return a constant reference to the value&#39;s name.
Definition: Value.cpp:224
#define I(x, y, z)
Definition: MD5.cpp:58
LLVM_NODISCARD std::enable_if<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)
Definition: Casting.h:323
uint32_t Size
Definition: Profile.cpp:47
Value * CreateAnd(Value *LHS, Value *RHS, const Twine &Name="")
Definition: IRBuilder.h:1124
3: 64-bit floating point type
Definition: Type.h:60
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
Value * getArgOperand(unsigned i) const
getArgOperand/setArgOperand - Return/set the i-th call argument.
unsigned getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
Definition: Type.cpp:115
LLVM Value Representation.
Definition: Value.h:73
Value * CreateLShr(Value *LHS, Value *RHS, const Twine &Name="", bool isExact=false)
Definition: IRBuilder.h:1084
bool use_empty() const
Definition: Value.h:323
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
const BasicBlock * getParent() const
Definition: Instruction.h:67
5: 128-bit floating point type (112-bit mantissa)
Definition: Type.h:62