[llvm] r281221 - [FunctionAttrs] Don't try to infer returned if it is already on an argument
David Majnemer via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 12 09:04:59 PDT 2016
Author: majnemer
Date: Mon Sep 12 11:04:59 2016
New Revision: 281221
URL: http://llvm.org/viewvc/llvm-project?rev=281221&view=rev
Log:
[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.
Modified:
llvm/trunk/lib/Transforms/IPO/FunctionAttrs.cpp
llvm/trunk/test/Transforms/FunctionAttrs/returned.ll
Modified: llvm/trunk/lib/Transforms/IPO/FunctionAttrs.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/FunctionAttrs.cpp?rev=281221&r1=281220&r2=281221&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/IPO/FunctionAttrs.cpp (original)
+++ llvm/trunk/lib/Transforms/IPO/FunctionAttrs.cpp Mon Sep 12 11:04:59 2016
@@ -496,6 +496,11 @@ static bool addArgumentReturnedAttrs(con
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)
Modified: llvm/trunk/test/Transforms/FunctionAttrs/returned.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/FunctionAttrs/returned.ll?rev=281221&r1=281220&r2=281221&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/FunctionAttrs/returned.ll (original)
+++ llvm/trunk/test/Transforms/FunctionAttrs/returned.ll Mon Sep 12 11:04:59 2016
@@ -16,3 +16,15 @@ lor.lhs.false:
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
+}
More information about the llvm-commits
mailing list