• Home
  • Raw
  • Download

Lines Matching +full:get +full:- +full:intrinsic

1 //===-- IntrinsicLowering.cpp - Intrinsic Lowering default implementation -===//
8 //===----------------------------------------------------------------------===//
12 //===----------------------------------------------------------------------===//
31 // Insert a correctly-typed definition now. in EnsureFunctionExists()
34 ParamTys.push_back(I->getType()); in EnsureFunctionExists()
35 M.getOrInsertFunction(Name, FunctionType::get(RetTy, ParamTys, false)); in EnsureFunctionExists()
42 switch((int)Fn.arg_begin()->getType()->getTypeID()) { in EnsureFPIntrinsicsExist()
55 Fn.arg_begin()->getType()); in EnsureFPIntrinsicsExist()
60 /// ReplaceCallWith - This function is used when we want to lower an intrinsic
70 Module *M = CI->getModule(); in ReplaceCallWith()
71 // Get or insert the definition now. in ReplaceCallWith()
74 ParamTys.push_back((*I)->getType()); in ReplaceCallWith()
75 Constant* FCache = M->getOrInsertFunction(NewFn, in ReplaceCallWith()
76 FunctionType::get(RetTy, ParamTys, false)); in ReplaceCallWith()
78 IRBuilder<> Builder(CI->getParent(), CI->getIterator()); in ReplaceCallWith()
81 NewCI->setName(CI->getName()); in ReplaceCallWith()
82 if (!CI->use_empty()) in ReplaceCallWith()
83 CI->replaceAllUsesWith(NewCI); in ReplaceCallWith()
101 case Intrinsic::setjmp: in AddPrototypes()
105 case Intrinsic::longjmp: in AddPrototypes()
109 case Intrinsic::siglongjmp: in AddPrototypes()
113 case Intrinsic::memcpy: in AddPrototypes()
120 case Intrinsic::memmove: in AddPrototypes()
127 case Intrinsic::memset: in AddPrototypes()
134 case Intrinsic::sqrt: in AddPrototypes()
137 case Intrinsic::sin: in AddPrototypes()
140 case Intrinsic::cos: in AddPrototypes()
143 case Intrinsic::pow: in AddPrototypes()
146 case Intrinsic::log: in AddPrototypes()
149 case Intrinsic::log2: in AddPrototypes()
152 case Intrinsic::log10: in AddPrototypes()
155 case Intrinsic::exp: in AddPrototypes()
158 case Intrinsic::exp2: in AddPrototypes()
164 /// LowerBSWAP - Emit the code to lower bswap of V before the specified
167 assert(V->getType()->isIntegerTy() && "Can't bswap a non-integer type!"); in LowerBSWAP()
169 unsigned BitSize = V->getType()->getPrimitiveSizeInBits(); in LowerBSWAP()
176 Value *Tmp1 = Builder.CreateShl(V, ConstantInt::get(V->getType(), 8), in LowerBSWAP()
178 Value *Tmp2 = Builder.CreateLShr(V, ConstantInt::get(V->getType(), 8), in LowerBSWAP()
184 Value *Tmp4 = Builder.CreateShl(V, ConstantInt::get(V->getType(), 24), in LowerBSWAP()
186 Value *Tmp3 = Builder.CreateShl(V, ConstantInt::get(V->getType(), 8), in LowerBSWAP()
188 Value *Tmp2 = Builder.CreateLShr(V, ConstantInt::get(V->getType(), 8), in LowerBSWAP()
190 Value *Tmp1 = Builder.CreateLShr(V,ConstantInt::get(V->getType(), 24), in LowerBSWAP()
193 ConstantInt::get(Type::getInt32Ty(Context), 0xFF0000), in LowerBSWAP()
196 ConstantInt::get(Type::getInt32Ty(Context), 0xFF00), in LowerBSWAP()
204 Value *Tmp8 = Builder.CreateShl(V, ConstantInt::get(V->getType(), 56), in LowerBSWAP()
206 Value *Tmp7 = Builder.CreateShl(V, ConstantInt::get(V->getType(), 40), in LowerBSWAP()
208 Value *Tmp6 = Builder.CreateShl(V, ConstantInt::get(V->getType(), 24), in LowerBSWAP()
210 Value *Tmp5 = Builder.CreateShl(V, ConstantInt::get(V->getType(), 8), in LowerBSWAP()
212 Value* Tmp4 = Builder.CreateLShr(V, ConstantInt::get(V->getType(), 8), in LowerBSWAP()
215 ConstantInt::get(V->getType(), 24), in LowerBSWAP()
218 ConstantInt::get(V->getType(), 40), in LowerBSWAP()
221 ConstantInt::get(V->getType(), 56), in LowerBSWAP()
224 ConstantInt::get(Type::getInt64Ty(Context), in LowerBSWAP()
228 ConstantInt::get(Type::getInt64Ty(Context), in LowerBSWAP()
232 ConstantInt::get(Type::getInt64Ty(Context), in LowerBSWAP()
236 ConstantInt::get(Type::getInt64Ty(Context), in LowerBSWAP()
240 ConstantInt::get(Type::getInt64Ty(Context), in LowerBSWAP()
244 ConstantInt::get(Type::getInt64Ty(Context), in LowerBSWAP()
260 /// LowerCTPOP - Emit the code to lower ctpop of V before the specified
263 assert(V->getType()->isIntegerTy() && "Can't ctpop a non-integer type!"); in LowerCTPOP()
273 unsigned BitSize = V->getType()->getPrimitiveSizeInBits(); in LowerCTPOP()
275 Value *Count = ConstantInt::get(V->getType(), 0); in LowerCTPOP()
281 Value *MaskCst = ConstantInt::get(V->getType(), MaskValues[ct]); in LowerCTPOP()
284 ConstantInt::get(V->getType(), i), in LowerCTPOP()
291 V = Builder.CreateLShr(V, ConstantInt::get(V->getType(), 64), in LowerCTPOP()
293 BitSize -= 64; in LowerCTPOP()
300 /// LowerCTLZ - Emit the code to lower ctlz of V before the specified
306 unsigned BitSize = V->getType()->getPrimitiveSizeInBits(); in LowerCTLZ()
308 Value *ShVal = ConstantInt::get(V->getType(), i); in LowerCTLZ()
321 switch (CI->getArgOperand(0)->getType()->getTypeID()) { in ReplaceFPIntrinsicWithCall()
322 default: llvm_unreachable("Invalid type in intrinsic"); in ReplaceFPIntrinsicWithCall()
325 Type::getFloatTy(CI->getContext())); in ReplaceFPIntrinsicWithCall()
329 Type::getDoubleTy(CI->getContext())); in ReplaceFPIntrinsicWithCall()
335 CI->getArgOperand(0)->getType()); in ReplaceFPIntrinsicWithCall()
342 LLVMContext &Context = CI->getContext(); in LowerIntrinsicCall()
344 const Function *Callee = CI->getCalledFunction(); in LowerIntrinsicCall()
348 switch (Callee->getIntrinsicID()) { in LowerIntrinsicCall()
349 case Intrinsic::not_intrinsic: in LowerIntrinsicCall()
350 report_fatal_error("Cannot lower a call to a non-intrinsic function '"+ in LowerIntrinsicCall()
351 Callee->getName() + "'!"); in LowerIntrinsicCall()
353 report_fatal_error("Code generator does not support intrinsic function '"+ in LowerIntrinsicCall()
354 Callee->getName()+"'!"); in LowerIntrinsicCall()
356 case Intrinsic::expect: { in LowerIntrinsicCall()
358 Value *V = CI->getArgOperand(0); in LowerIntrinsicCall()
359 CI->replaceAllUsesWith(V); in LowerIntrinsicCall()
367 case Intrinsic::setjmp: { in LowerIntrinsicCall()
370 if (!CI->getType()->isVoidTy()) in LowerIntrinsicCall()
371 CI->replaceAllUsesWith(V); in LowerIntrinsicCall()
374 case Intrinsic::sigsetjmp: in LowerIntrinsicCall()
375 if (!CI->getType()->isVoidTy()) in LowerIntrinsicCall()
376 CI->replaceAllUsesWith(Constant::getNullValue(CI->getType())); in LowerIntrinsicCall()
379 case Intrinsic::longjmp: { in LowerIntrinsicCall()
385 case Intrinsic::siglongjmp: { in LowerIntrinsicCall()
391 case Intrinsic::ctpop: in LowerIntrinsicCall()
392 CI->replaceAllUsesWith(LowerCTPOP(Context, CI->getArgOperand(0), CI)); in LowerIntrinsicCall()
395 case Intrinsic::bswap: in LowerIntrinsicCall()
396 CI->replaceAllUsesWith(LowerBSWAP(Context, CI->getArgOperand(0), CI)); in LowerIntrinsicCall()
399 case Intrinsic::ctlz: in LowerIntrinsicCall()
400 CI->replaceAllUsesWith(LowerCTLZ(Context, CI->getArgOperand(0), CI)); in LowerIntrinsicCall()
403 case Intrinsic::cttz: { in LowerIntrinsicCall()
404 // cttz(x) -> ctpop(~X & (X-1)) in LowerIntrinsicCall()
405 Value *Src = CI->getArgOperand(0); in LowerIntrinsicCall()
407 NotSrc->setName(Src->getName() + ".not"); in LowerIntrinsicCall()
408 Value *SrcM1 = ConstantInt::get(Src->getType(), 1); in LowerIntrinsicCall()
411 CI->replaceAllUsesWith(Src); in LowerIntrinsicCall()
415 case Intrinsic::stacksave: in LowerIntrinsicCall()
416 case Intrinsic::stackrestore: { in LowerIntrinsicCall()
419 << (Callee->getIntrinsicID() == Intrinsic::stacksave ? in LowerIntrinsicCall()
420 "save" : "restore") << " intrinsic.\n"; in LowerIntrinsicCall()
422 if (Callee->getIntrinsicID() == Intrinsic::stacksave) in LowerIntrinsicCall()
423 CI->replaceAllUsesWith(Constant::getNullValue(CI->getType())); in LowerIntrinsicCall()
427 case Intrinsic::get_dynamic_area_offset: in LowerIntrinsicCall()
428 errs() << "WARNING: this target does not support the custom llvm.get." in LowerIntrinsicCall()
431 // @llvm.get.dynamic.area.offset is lowered to zero. in LowerIntrinsicCall()
432 CI->replaceAllUsesWith(ConstantInt::get(CI->getType(), 0)); in LowerIntrinsicCall()
434 case Intrinsic::returnaddress: in LowerIntrinsicCall()
435 case Intrinsic::frameaddress: in LowerIntrinsicCall()
437 << (Callee->getIntrinsicID() == Intrinsic::returnaddress ? in LowerIntrinsicCall()
438 "return" : "frame") << "address intrinsic.\n"; in LowerIntrinsicCall()
439 CI->replaceAllUsesWith(ConstantPointerNull::get( in LowerIntrinsicCall()
440 cast<PointerType>(CI->getType()))); in LowerIntrinsicCall()
443 case Intrinsic::prefetch: in LowerIntrinsicCall()
446 case Intrinsic::pcmarker: in LowerIntrinsicCall()
448 case Intrinsic::readcyclecounter: { in LowerIntrinsicCall()
450 << "ter intrinsic. It is being lowered to a constant 0\n"; in LowerIntrinsicCall()
451 CI->replaceAllUsesWith(ConstantInt::get(Type::getInt64Ty(Context), 0)); in LowerIntrinsicCall()
455 case Intrinsic::dbg_declare: in LowerIntrinsicCall()
458 case Intrinsic::eh_typeid_for: in LowerIntrinsicCall()
460 CI->replaceAllUsesWith(ConstantInt::get(CI->getType(), 1)); in LowerIntrinsicCall()
463 case Intrinsic::annotation: in LowerIntrinsicCall()
464 case Intrinsic::ptr_annotation: in LowerIntrinsicCall()
466 CI->replaceAllUsesWith(CI->getOperand(0)); in LowerIntrinsicCall()
469 case Intrinsic::assume: in LowerIntrinsicCall()
470 case Intrinsic::var_annotation: in LowerIntrinsicCall()
473 case Intrinsic::memcpy: { in LowerIntrinsicCall()
475 Value *Size = Builder.CreateIntCast(CI->getArgOperand(2), IntPtr, in LowerIntrinsicCall()
478 Ops[0] = CI->getArgOperand(0); in LowerIntrinsicCall()
479 Ops[1] = CI->getArgOperand(1); in LowerIntrinsicCall()
481 ReplaceCallWith("memcpy", CI, Ops, Ops+3, CI->getArgOperand(0)->getType()); in LowerIntrinsicCall()
484 case Intrinsic::memmove: { in LowerIntrinsicCall()
486 Value *Size = Builder.CreateIntCast(CI->getArgOperand(2), IntPtr, in LowerIntrinsicCall()
489 Ops[0] = CI->getArgOperand(0); in LowerIntrinsicCall()
490 Ops[1] = CI->getArgOperand(1); in LowerIntrinsicCall()
492 ReplaceCallWith("memmove", CI, Ops, Ops+3, CI->getArgOperand(0)->getType()); in LowerIntrinsicCall()
495 case Intrinsic::memset: { in LowerIntrinsicCall()
496 Value *Op0 = CI->getArgOperand(0); in LowerIntrinsicCall()
497 Type *IntPtr = DL.getIntPtrType(Op0->getType()); in LowerIntrinsicCall()
498 Value *Size = Builder.CreateIntCast(CI->getArgOperand(2), IntPtr, in LowerIntrinsicCall()
503 Ops[1] = Builder.CreateIntCast(CI->getArgOperand(1), in LowerIntrinsicCall()
507 ReplaceCallWith("memset", CI, Ops, Ops+3, CI->getArgOperand(0)->getType()); in LowerIntrinsicCall()
510 case Intrinsic::sqrt: { in LowerIntrinsicCall()
514 case Intrinsic::log: { in LowerIntrinsicCall()
518 case Intrinsic::log2: { in LowerIntrinsicCall()
522 case Intrinsic::log10: { in LowerIntrinsicCall()
526 case Intrinsic::exp: { in LowerIntrinsicCall()
530 case Intrinsic::exp2: { in LowerIntrinsicCall()
534 case Intrinsic::pow: { in LowerIntrinsicCall()
538 case Intrinsic::sin: { in LowerIntrinsicCall()
542 case Intrinsic::cos: { in LowerIntrinsicCall()
546 case Intrinsic::floor: { in LowerIntrinsicCall()
550 case Intrinsic::ceil: { in LowerIntrinsicCall()
554 case Intrinsic::trunc: { in LowerIntrinsicCall()
558 case Intrinsic::round: { in LowerIntrinsicCall()
562 case Intrinsic::copysign: { in LowerIntrinsicCall()
566 case Intrinsic::flt_rounds: in LowerIntrinsicCall()
568 if (!CI->getType()->isVoidTy()) in LowerIntrinsicCall()
569 CI->replaceAllUsesWith(ConstantInt::get(CI->getType(), 1)); in LowerIntrinsicCall()
571 case Intrinsic::invariant_start: in LowerIntrinsicCall()
572 case Intrinsic::lifetime_start: in LowerIntrinsicCall()
574 CI->replaceAllUsesWith(UndefValue::get(CI->getType())); in LowerIntrinsicCall()
576 case Intrinsic::invariant_end: in LowerIntrinsicCall()
577 case Intrinsic::lifetime_end: in LowerIntrinsicCall()
582 assert(CI->use_empty() && in LowerIntrinsicCall()
583 "Lowering should have eliminated any uses of the intrinsic call!"); in LowerIntrinsicCall()
584 CI->eraseFromParent(); in LowerIntrinsicCall()
589 if (CI->getNumArgOperands() != 1 || in LowerToByteSwap()
590 CI->getType() != CI->getArgOperand(0)->getType() || in LowerToByteSwap()
591 !CI->getType()->isIntegerTy()) in LowerToByteSwap()
594 IntegerType *Ty = dyn_cast<IntegerType>(CI->getType()); in LowerToByteSwap()
599 Module *M = CI->getModule(); in LowerToByteSwap()
600 Constant *Int = Intrinsic::getDeclaration(M, Intrinsic::bswap, Ty); in LowerToByteSwap()
602 Value *Op = CI->getArgOperand(0); in LowerToByteSwap()
603 Op = CallInst::Create(Int, Op, CI->getName(), CI); in LowerToByteSwap()
605 CI->replaceAllUsesWith(Op); in LowerToByteSwap()
606 CI->eraseFromParent(); in LowerToByteSwap()