From 5db0b906e8e74676badd156a8f9607d51851dd11 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Mon, 12 Sep 2016 16:04:59 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281221 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/IPO/FunctionAttrs.cpp | 5 +++++ test/Transforms/FunctionAttrs/returned.ll | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/lib/Transforms/IPO/FunctionAttrs.cpp b/lib/Transforms/IPO/FunctionAttrs.cpp index 96dcf9de7d5..0fde10752b5 100644 --- a/lib/Transforms/IPO/FunctionAttrs.cpp +++ b/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/test/Transforms/FunctionAttrs/returned.ll b/test/Transforms/FunctionAttrs/returned.ll index 4e419693d9f..ede9481e433 100644 --- a/test/Transforms/FunctionAttrs/returned.ll +++ b/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 +} -- 2.11.0