diff options
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/Transforms/IPO/FunctionAttrs.cpp | 5 | ||||
-rw-r--r-- | llvm/test/Transforms/FunctionAttrs/returned.ll | 12 |
2 files changed, 17 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/IPO/FunctionAttrs.cpp b/llvm/lib/Transforms/IPO/FunctionAttrs.cpp index 96dcf9de7d5..0fde10752b5 100644 --- a/llvm/lib/Transforms/IPO/FunctionAttrs.cpp +++ b/llvm/lib/Transforms/IPO/FunctionAttrs.cpp @@ -496,6 +496,11 @@ static bool addArgumentReturnedAttrs(const SCCNodeSet &SCCNodes) { if (F->getReturnType()->isVoidTy()) continue; + // There is nothing to do if an argument is already marked as 'returned'. + if (any_of(F->args(), + [](const Argument &Arg) { return Arg.hasReturnedAttr(); })) + continue; + auto FindRetArg = [&]() -> Value * { Value *RetArg = nullptr; for (BasicBlock &BB : *F) diff --git a/llvm/test/Transforms/FunctionAttrs/returned.ll b/llvm/test/Transforms/FunctionAttrs/returned.ll index 4e419693d9f..ede9481e433 100644 --- a/llvm/test/Transforms/FunctionAttrs/returned.ll +++ b/llvm/test/Transforms/FunctionAttrs/returned.ll @@ -16,3 +16,15 @@ lor.lhs.false: ; preds = %entry cond.end: ; preds = %entry ret i32 %p } + +; CHECK: define i32 @test2(i32 %p1, i32 returned %p2) +define i32 @test2(i32 %p1, i32 returned %p2) { + %_tmp4 = icmp eq i32 %p1, %p2 + br i1 %_tmp4, label %bb2, label %bb1 + +bb2: ; preds = %0 + ret i32 %p1 + +bb1: ; preds = %bb1, %0 + br label %bb1 +} |