1 //===-- IntrinsicLowering.cpp - Intrinsic Lowering default implementation -===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the IntrinsicLowering class.
12 //===----------------------------------------------------------------------===//
14 #include "llvm/CodeGen/IntrinsicLowering.h"
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"
23 #include "llvm/Support/ErrorHandling.h"
24 #include "llvm/Support/raw_ostream.h"
27 template <class ArgIt
>
28 static void EnsureFunctionExists(Module
&M
, const char *Name
,
29 ArgIt ArgBegin
, ArgIt ArgEnd
,
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));
38 static void EnsureFPIntrinsicsExist(Module
&M
, Function
&Fn
,
40 const char *DName
, const char *LDName
) {
41 // Insert definitions for all the floating point types.
42 switch((int)Fn
.arg_begin()->getType()->getTypeID()) {
44 EnsureFunctionExists(M
, FName
, Fn
.arg_begin(), Fn
.arg_end(),
45 Type::getFloatTy(M
.getContext()));
47 case Type::DoubleTyID
:
48 EnsureFunctionExists(M
, DName
, Fn
.arg_begin(), Fn
.arg_end(),
49 Type::getDoubleTy(M
.getContext()));
51 case Type::X86_FP80TyID
:
53 case Type::PPC_FP128TyID
:
54 EnsureFunctionExists(M
, LDName
, Fn
.arg_begin(), Fn
.arg_end(),
55 Fn
.arg_begin()->getType());
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
,
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));
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());
83 CI
->replaceAllUsesWith(NewCI
);
87 // VisualStudio defines setjmp as _setjmp
88 #if defined(_MSC_VER) && defined(setjmp) && \
89 !defined(setjmp_undefined_for_msvc)
90 # pragma push_macro("setjmp")
92 # define setjmp_undefined_for_msvc
95 void IntrinsicLowering::AddPrototypes(Module
&M
) {
96 LLVMContext
&Context
= M
.getContext();
98 if (F
.isDeclaration() && !F
.use_empty())
99 switch (F
.getIntrinsicID()) {
101 case Intrinsic::setjmp
:
102 EnsureFunctionExists(M
, "setjmp", F
.arg_begin(), F
.arg_end(),
103 Type::getInt32Ty(M
.getContext()));
105 case Intrinsic::longjmp
:
106 EnsureFunctionExists(M
, "longjmp", F
.arg_begin(), F
.arg_end(),
107 Type::getVoidTy(M
.getContext()));
109 case Intrinsic::siglongjmp
:
110 EnsureFunctionExists(M
, "abort", F
.arg_end(), F
.arg_end(),
111 Type::getVoidTy(M
.getContext()));
113 case Intrinsic::memcpy
:
114 M
.getOrInsertFunction("memcpy",
115 Type::getInt8PtrTy(Context
),
116 Type::getInt8PtrTy(Context
),
117 Type::getInt8PtrTy(Context
),
118 DL
.getIntPtrType(Context
));
120 case Intrinsic::memmove
:
121 M
.getOrInsertFunction("memmove",
122 Type::getInt8PtrTy(Context
),
123 Type::getInt8PtrTy(Context
),
124 Type::getInt8PtrTy(Context
),
125 DL
.getIntPtrType(Context
));
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
));
134 case Intrinsic::sqrt
:
135 EnsureFPIntrinsicsExist(M
, F
, "sqrtf", "sqrt", "sqrtl");
138 EnsureFPIntrinsicsExist(M
, F
, "sinf", "sin", "sinl");
141 EnsureFPIntrinsicsExist(M
, F
, "cosf", "cos", "cosl");
144 EnsureFPIntrinsicsExist(M
, F
, "powf", "pow", "powl");
147 EnsureFPIntrinsicsExist(M
, F
, "logf", "log", "logl");
149 case Intrinsic::log2
:
150 EnsureFPIntrinsicsExist(M
, F
, "log2f", "log2", "log2l");
152 case Intrinsic::log10
:
153 EnsureFPIntrinsicsExist(M
, F
, "log10f", "log10", "log10l");
156 EnsureFPIntrinsicsExist(M
, F
, "expf", "exp", "expl");
158 case Intrinsic::exp2
:
159 EnsureFPIntrinsicsExist(M
, F
, "exp2f", "exp2", "exp2l");
164 /// Emit the code to lower bswap of V before the specified instruction IP.
165 static Value
*LowerBSWAP(LLVMContext
&Context
, Value
*V
, Instruction
*IP
) {
166 assert(V
->getType()->isIntOrIntVectorTy() && "Can't bswap a non-integer type!");
168 unsigned BitSize
= V
->getType()->getScalarSizeInBits();
170 IRBuilder
<> Builder(IP
);
173 default: llvm_unreachable("Unhandled type size of value to byteswap!");
175 Value
*Tmp1
= Builder
.CreateShl(V
, ConstantInt::get(V
->getType(), 8),
177 Value
*Tmp2
= Builder
.CreateLShr(V
, ConstantInt::get(V
->getType(), 8),
179 V
= Builder
.CreateOr(Tmp1
, Tmp2
, "bswap.i16");
183 Value
*Tmp4
= Builder
.CreateShl(V
, ConstantInt::get(V
->getType(), 24),
185 Value
*Tmp3
= Builder
.CreateShl(V
, ConstantInt::get(V
->getType(), 8),
187 Value
*Tmp2
= Builder
.CreateLShr(V
, ConstantInt::get(V
->getType(), 8),
189 Value
*Tmp1
= Builder
.CreateLShr(V
,ConstantInt::get(V
->getType(), 24),
191 Tmp3
= Builder
.CreateAnd(Tmp3
,
192 ConstantInt::get(V
->getType(), 0xFF0000),
194 Tmp2
= Builder
.CreateAnd(Tmp2
,
195 ConstantInt::get(V
->getType(), 0xFF00),
197 Tmp4
= Builder
.CreateOr(Tmp4
, Tmp3
, "bswap.or1");
198 Tmp2
= Builder
.CreateOr(Tmp2
, Tmp1
, "bswap.or2");
199 V
= Builder
.CreateOr(Tmp4
, Tmp2
, "bswap.i32");
203 Value
*Tmp8
= Builder
.CreateShl(V
, ConstantInt::get(V
->getType(), 56),
205 Value
*Tmp7
= Builder
.CreateShl(V
, ConstantInt::get(V
->getType(), 40),
207 Value
*Tmp6
= Builder
.CreateShl(V
, ConstantInt::get(V
->getType(), 24),
209 Value
*Tmp5
= Builder
.CreateShl(V
, ConstantInt::get(V
->getType(), 8),
211 Value
* Tmp4
= Builder
.CreateLShr(V
, ConstantInt::get(V
->getType(), 8),
213 Value
* Tmp3
= Builder
.CreateLShr(V
,
214 ConstantInt::get(V
->getType(), 24),
216 Value
* Tmp2
= Builder
.CreateLShr(V
,
217 ConstantInt::get(V
->getType(), 40),
219 Value
* Tmp1
= Builder
.CreateLShr(V
,
220 ConstantInt::get(V
->getType(), 56),
222 Tmp7
= Builder
.CreateAnd(Tmp7
,
223 ConstantInt::get(V
->getType(),
224 0xFF000000000000ULL
),
226 Tmp6
= Builder
.CreateAnd(Tmp6
,
227 ConstantInt::get(V
->getType(),
230 Tmp5
= Builder
.CreateAnd(Tmp5
,
231 ConstantInt::get(V
->getType(),
234 Tmp4
= Builder
.CreateAnd(Tmp4
,
235 ConstantInt::get(V
->getType(),
238 Tmp3
= Builder
.CreateAnd(Tmp3
,
239 ConstantInt::get(V
->getType(),
242 Tmp2
= Builder
.CreateAnd(Tmp2
,
243 ConstantInt::get(V
->getType(),
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");
259 /// Emit the code to lower ctpop of V before the specified instruction IP.
260 static Value
*LowerCTPOP(LLVMContext
&Context
, Value
*V
, Instruction
*IP
) {
261 assert(V
->getType()->isIntegerTy() && "Can't ctpop a non-integer type!");
263 static const uint64_t MaskValues
[6] = {
264 0x5555555555555555ULL
, 0x3333333333333333ULL
,
265 0x0F0F0F0F0F0F0F0FULL
, 0x00FF00FF00FF00FFULL
,
266 0x0000FFFF0000FFFFULL
, 0x00000000FFFFFFFFULL
269 IRBuilder
<> Builder(IP
);
271 unsigned BitSize
= V
->getType()->getPrimitiveSizeInBits();
272 unsigned WordSize
= (BitSize
+ 63) / 64;
273 Value
*Count
= ConstantInt::get(V
->getType(), 0);
275 for (unsigned n
= 0; n
< WordSize
; ++n
) {
276 Value
*PartValue
= V
;
277 for (unsigned i
= 1, ct
= 0; i
< (BitSize
>64 ? 64 : BitSize
);
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
),
284 Value
*RHS
= Builder
.CreateAnd(VShift
, MaskCst
, "cppop.and2");
285 PartValue
= Builder
.CreateAdd(LHS
, RHS
, "ctpop.step");
287 Count
= Builder
.CreateAdd(PartValue
, Count
, "ctpop.part");
289 V
= Builder
.CreateLShr(V
, ConstantInt::get(V
->getType(), 64),
298 /// Emit the code to lower ctlz of V before the specified instruction IP.
299 static Value
*LowerCTLZ(LLVMContext
&Context
, Value
*V
, Instruction
*IP
) {
301 IRBuilder
<> Builder(IP
);
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");
310 V
= Builder
.CreateNot(V
);
311 return LowerCTPOP(Context
, V
, IP
);
314 static void ReplaceFPIntrinsicWithCall(CallInst
*CI
, const char *Fname
,
316 const char *LDname
) {
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(),
322 Type::getFloatTy(CI
->getContext()));
324 case Type::DoubleTyID
:
325 ReplaceCallWith(Dname
, CI
, CS
.arg_begin(), CS
.arg_end(),
326 Type::getDoubleTy(CI
->getContext()));
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());
337 void IntrinsicLowering::LowerIntrinsicCall(CallInst
*CI
) {
338 IRBuilder
<> Builder(CI
);
339 LLVMContext
&Context
= CI
->getContext();
341 const Function
*Callee
= CI
->getCalledFunction();
342 assert(Callee
&& "Cannot lower an indirect call!");
345 switch (Callee
->getIntrinsicID()) {
346 case Intrinsic::not_intrinsic
:
347 report_fatal_error("Cannot lower a call to a non-intrinsic function '"+
348 Callee
->getName() + "'!");
350 report_fatal_error("Code generator does not support intrinsic function '"+
351 Callee
->getName()+"'!");
353 case Intrinsic::expect
: {
354 // Just replace __builtin_expect(exp, c) with EXP.
355 Value
*V
= CI
->getArgOperand(0);
356 CI
->replaceAllUsesWith(V
);
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
);
371 case Intrinsic::sigsetjmp
:
372 if (!CI
->getType()->isVoidTy())
373 CI
->replaceAllUsesWith(Constant::getNullValue(CI
->getType()));
376 case Intrinsic::longjmp
: {
377 ReplaceCallWith("longjmp", CI
, CS
.arg_begin(), CS
.arg_end(),
378 Type::getVoidTy(Context
));
382 case Intrinsic::siglongjmp
: {
383 // Insert the call to abort
384 ReplaceCallWith("abort", CI
, CS
.arg_end(), CS
.arg_end(),
385 Type::getVoidTy(Context
));
388 case Intrinsic::ctpop
:
389 CI
->replaceAllUsesWith(LowerCTPOP(Context
, CI
->getArgOperand(0), CI
));
392 case Intrinsic::bswap
:
393 CI
->replaceAllUsesWith(LowerBSWAP(Context
, CI
->getArgOperand(0), CI
));
396 case Intrinsic::ctlz
:
397 CI
->replaceAllUsesWith(LowerCTLZ(Context
, CI
->getArgOperand(0), CI
));
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
);
412 case Intrinsic::stacksave
:
413 case Intrinsic::stackrestore
: {
415 errs() << "WARNING: this target does not support the llvm.stack"
416 << (Callee
->getIntrinsicID() == Intrinsic::stacksave
?
417 "save" : "restore") << " intrinsic.\n";
419 if (Callee
->getIntrinsicID() == Intrinsic::stacksave
)
420 CI
->replaceAllUsesWith(Constant::getNullValue(CI
->getType()));
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.
429 CI
->replaceAllUsesWith(ConstantInt::get(CI
->getType(), 0));
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())));
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())));
446 case Intrinsic::prefetch
:
447 break; // Simply strip out prefetches on unsupported architectures
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";
454 CI
->replaceAllUsesWith(ConstantInt::get(Type::getInt64Ty(Context
), 0));
458 case Intrinsic::dbg_declare
:
459 case Intrinsic::dbg_label
:
460 break; // Simply strip out debugging intrinsics
462 case Intrinsic::eh_typeid_for
:
463 // Return something different to eh_selector.
464 CI
->replaceAllUsesWith(ConstantInt::get(CI
->getType(), 1));
467 case Intrinsic::annotation
:
468 case Intrinsic::ptr_annotation
:
469 // Just drop the annotation, but forward the value
470 CI
->replaceAllUsesWith(CI
->getOperand(0));
473 case Intrinsic::assume
:
474 case Intrinsic::var_annotation
:
475 break; // Strip out these intrinsics
477 case Intrinsic::memcpy
: {
478 Type
*IntPtr
= DL
.getIntPtrType(Context
);
479 Value
*Size
= Builder
.CreateIntCast(CI
->getArgOperand(2), IntPtr
,
480 /* isSigned */ false);
482 Ops
[0] = CI
->getArgOperand(0);
483 Ops
[1] = CI
->getArgOperand(1);
485 ReplaceCallWith("memcpy", CI
, Ops
, Ops
+3, CI
->getArgOperand(0)->getType());
488 case Intrinsic::memmove
: {
489 Type
*IntPtr
= DL
.getIntPtrType(Context
);
490 Value
*Size
= Builder
.CreateIntCast(CI
->getArgOperand(2), IntPtr
,
491 /* isSigned */ false);
493 Ops
[0] = CI
->getArgOperand(0);
494 Ops
[1] = CI
->getArgOperand(1);
496 ReplaceCallWith("memmove", CI
, Ops
, Ops
+3, CI
->getArgOperand(0)->getType());
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);
506 // Extend the amount to i32.
507 Ops
[1] = Builder
.CreateIntCast(CI
->getArgOperand(1),
508 Type::getInt32Ty(Context
),
509 /* isSigned */ false);
511 ReplaceCallWith("memset", CI
, Ops
, Ops
+3, CI
->getArgOperand(0)->getType());
514 case Intrinsic::sqrt
: {
515 ReplaceFPIntrinsicWithCall(CI
, "sqrtf", "sqrt", "sqrtl");
518 case Intrinsic::log
: {
519 ReplaceFPIntrinsicWithCall(CI
, "logf", "log", "logl");
522 case Intrinsic::log2
: {
523 ReplaceFPIntrinsicWithCall(CI
, "log2f", "log2", "log2l");
526 case Intrinsic::log10
: {
527 ReplaceFPIntrinsicWithCall(CI
, "log10f", "log10", "log10l");
530 case Intrinsic::exp
: {
531 ReplaceFPIntrinsicWithCall(CI
, "expf", "exp", "expl");
534 case Intrinsic::exp2
: {
535 ReplaceFPIntrinsicWithCall(CI
, "exp2f", "exp2", "exp2l");
538 case Intrinsic::pow
: {
539 ReplaceFPIntrinsicWithCall(CI
, "powf", "pow", "powl");
542 case Intrinsic::sin
: {
543 ReplaceFPIntrinsicWithCall(CI
, "sinf", "sin", "sinl");
546 case Intrinsic::cos
: {
547 ReplaceFPIntrinsicWithCall(CI
, "cosf", "cos", "cosl");
550 case Intrinsic::floor
: {
551 ReplaceFPIntrinsicWithCall(CI
, "floorf", "floor", "floorl");
554 case Intrinsic::ceil
: {
555 ReplaceFPIntrinsicWithCall(CI
, "ceilf", "ceil", "ceill");
558 case Intrinsic::trunc
: {
559 ReplaceFPIntrinsicWithCall(CI
, "truncf", "trunc", "truncl");
562 case Intrinsic::round
: {
563 ReplaceFPIntrinsicWithCall(CI
, "roundf", "round", "roundl");
566 case Intrinsic::copysign
: {
567 ReplaceFPIntrinsicWithCall(CI
, "copysignf", "copysign", "copysignl");
570 case Intrinsic::flt_rounds
:
571 // Lower to "round to the nearest"
572 if (!CI
->getType()->isVoidTy())
573 CI
->replaceAllUsesWith(ConstantInt::get(CI
->getType(), 1));
575 case Intrinsic::invariant_start
:
576 case Intrinsic::lifetime_start
:
577 // Discard region information.
578 CI
->replaceAllUsesWith(UndefValue::get(CI
->getType()));
580 case Intrinsic::invariant_end
:
581 case Intrinsic::lifetime_end
:
582 // Discard region information.
586 assert(CI
->use_empty() &&
587 "Lowering should have eliminated any uses of the intrinsic call!");
588 CI
->eraseFromParent();
591 bool IntrinsicLowering::LowerToByteSwap(CallInst
*CI
) {
592 // Verify this is a simple bswap.
593 if (CI
->getNumArgOperands() != 1 ||
594 CI
->getType() != CI
->getArgOperand(0)->getType() ||
595 !CI
->getType()->isIntegerTy())
598 IntegerType
*Ty
= dyn_cast
<IntegerType
>(CI
->getType());
602 // Okay, we can do this xform, do so now.
603 Module
*M
= CI
->getModule();
604 Constant
*Int
= Intrinsic::getDeclaration(M
, Intrinsic::bswap
, Ty
);
606 Value
*Op
= CI
->getArgOperand(0);
607 Op
= CallInst::Create(Int
, Op
, CI
->getName(), CI
);
609 CI
->replaceAllUsesWith(Op
);
610 CI
->eraseFromParent();