1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 02:52:53 +02:00

[FunctionAttrs] Don't try to infer returned if it is already on an argument

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.

llvm-svn: 281221
This commit is contained in:
David Majnemer 2016-09-12 16:04:59 +00:00
parent 3ae7d766da
commit 9f8ea93cf2
2 changed files with 17 additions and 0 deletions

View File

@ -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)

View File

@ -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
}