diff options
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/IR/AutoUpgrade.cpp | 23 | ||||
-rw-r--r-- | llvm/test/Bitcode/upgrade-arc-runtime-calls-bitcast.bc | bin | 0 -> 1536 bytes | |||
-rw-r--r-- | llvm/test/Bitcode/upgrade-arc-runtime-calls-bitcast.ll | 21 |
3 files changed, 43 insertions, 1 deletions
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp index 79f580d0e14..d2dd2a69bea 100644 --- a/llvm/lib/IR/AutoUpgrade.cpp +++ b/llvm/lib/IR/AutoUpgrade.cpp @@ -3877,15 +3877,36 @@ void llvm::UpgradeARCRuntime(Module &M) { FunctionType *NewFuncTy = NewFn->getFunctionType(); SmallVector<Value *, 2> Args; + // Don't upgrade the intrinsic if it's not valid to bitcast the return + // value to the return type of the old function. + if (NewFuncTy->getReturnType() != CI->getType() && + !CastInst::castIsValid(Instruction::BitCast, CI, + NewFuncTy->getReturnType())) + continue; + + bool InvalidCast = false; + for (unsigned I = 0, E = CI->getNumArgOperands(); I != E; ++I) { Value *Arg = CI->getArgOperand(I); + // Bitcast argument to the parameter type of the new function if it's // not a variadic argument. - if (I < NewFuncTy->getNumParams()) + if (I < NewFuncTy->getNumParams()) { + // Don't upgrade the intrinsic if it's not valid to bitcast the argument + // to the parameter type of the new function. + if (!CastInst::castIsValid(Instruction::BitCast, Arg, + NewFuncTy->getParamType(I))) { + InvalidCast = true; + break; + } Arg = Builder.CreateBitCast(Arg, NewFuncTy->getParamType(I)); + } Args.push_back(Arg); } + if (InvalidCast) + continue; + // Create a call instruction that calls the new function. CallInst *NewCall = Builder.CreateCall(NewFuncTy, NewFn, Args); NewCall->setTailCallKind(cast<CallInst>(CI)->getTailCallKind()); diff --git a/llvm/test/Bitcode/upgrade-arc-runtime-calls-bitcast.bc b/llvm/test/Bitcode/upgrade-arc-runtime-calls-bitcast.bc Binary files differnew file mode 100644 index 00000000000..f2af475b26c --- /dev/null +++ b/llvm/test/Bitcode/upgrade-arc-runtime-calls-bitcast.bc diff --git a/llvm/test/Bitcode/upgrade-arc-runtime-calls-bitcast.ll b/llvm/test/Bitcode/upgrade-arc-runtime-calls-bitcast.ll new file mode 100644 index 00000000000..deac12d36df --- /dev/null +++ b/llvm/test/Bitcode/upgrade-arc-runtime-calls-bitcast.ll @@ -0,0 +1,21 @@ +target triple = "arm64-apple-ios7.0" + +; RUN: llvm-dis < %S/upgrade-arc-runtime-calls-bitcast.bc | FileCheck %s + +; CHECK: tail call i8* @objc_retain(i32 1) +; CHECK: tail call i8* @objc_storeStrong( + +define void @testRuntimeCalls(i8* %a, i8** %b) { + %v6 = tail call i8* @objc_retain(i32 1) + %1 = tail call i8* @objc_storeStrong(i8** %b, i8* %a) + ret void +} + +declare i8* @objc_retain(i32) +declare i8* @objc_storeStrong(i8**, i8*) + +attributes #0 = { nounwind } + +!llvm.module.flags = !{!0} + +!0 = !{i32 1, !"clang.arc.retainAutoreleasedReturnValueMarker", !"mov\09fp, fp\09\09; marker for objc_retainAutoreleaseReturnValue"} |