Skip to content

Commit

Permalink
[FunctionAttrs] Don't try to infer returned if it is already on an ar…
Browse files Browse the repository at this point in the history
…gument

Trying to infer the 'returned' attribute if an argument is already
'returned' can lead to verification failure: inference might determine
that a different argument is passed through which would result in two
different arguments marked as 'returned'.

This fixes PR30350.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281221 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
majnemer committed Sep 12, 2016
1 parent 7e05343 commit 5db0b90
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 0 deletions.
5 changes: 5 additions & 0 deletions lib/Transforms/IPO/FunctionAttrs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
12 changes: 12 additions & 0 deletions test/Transforms/FunctionAttrs/returned.ll
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

0 comments on commit 5db0b90

Please sign in to comment.