[PATCH] D40009: [Lint] Don't warn about passing alloca'd value to tail call if using byval

Mikael Holmén via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 14 23:49:33 PST 2017


This revision was automatically updated to reflect the committed changes.
Closed by commit rL318279: [Lint] Don't warn about passing alloca'd value to tail call if using byval (authored by uabelho).

Changed prior to commit:
  https://reviews.llvm.org/D40009?vs=122968&id=122971#toc

Repository:
  rL LLVM

https://reviews.llvm.org/D40009

Files:
  llvm/trunk/lib/Analysis/Lint.cpp
  llvm/trunk/test/Analysis/Lint/tail-call-byval.ll


Index: llvm/trunk/test/Analysis/Lint/tail-call-byval.ll
===================================================================
--- llvm/trunk/test/Analysis/Lint/tail-call-byval.ll
+++ llvm/trunk/test/Analysis/Lint/tail-call-byval.ll
@@ -0,0 +1,33 @@
+; RUN: opt < %s -lint -disable-output 2>&1 | FileCheck %s
+
+%s = type { i8 }
+
+declare void @f1(%s*)
+
+define void @f2() {
+entry:
+  %c = alloca %s
+  tail call void @f1(%s* %c)
+  ret void
+}
+
+; Lint should complain about the tail call passing the alloca'd value %c to f1.
+; CHECK: Undefined behavior: Call with "tail" keyword references alloca
+; CHECK-NEXT:  tail call void @f1(%s* %c)
+
+declare void @f3(%s* byval)
+
+define void @f4() {
+entry:
+  %c = alloca %s
+  tail call void @f3(%s* byval %c)
+  ret void
+}
+
+; Lint should not complain about passing the alloca'd %c since it's passed
+; byval, effectively copying the data to the stack instead of leaking the
+; pointer itself.
+; CHECK-NOT: Undefined behavior: Call with "tail" keyword references alloca
+; CHECK-NOT:  tail call void @f3(%s* byval %c)
+
+
Index: llvm/trunk/lib/Analysis/Lint.cpp
===================================================================
--- llvm/trunk/lib/Analysis/Lint.cpp
+++ llvm/trunk/lib/Analysis/Lint.cpp
@@ -285,15 +285,24 @@
     }
   }
 
-  if (CS.isCall() && cast<CallInst>(CS.getInstruction())->isTailCall())
-    for (CallSite::arg_iterator AI = CS.arg_begin(), AE = CS.arg_end();
-         AI != AE; ++AI) {
-      Value *Obj = findValue(*AI, /*OffsetOk=*/true);
-      Assert(!isa<AllocaInst>(Obj),
-             "Undefined behavior: Call with \"tail\" keyword references "
-             "alloca",
-             &I);
+  if (CS.isCall()) {
+    const CallInst *CI = cast<CallInst>(CS.getInstruction());
+    if (CI->isTailCall()) {
+      const AttributeList &PAL = CI->getAttributes();
+      unsigned ArgNo = 0;
+      for (Value *Arg : CS.args()) {
+        // Skip ByVal arguments since they will be memcpy'd to the callee's
+        // stack anyway.
+        if (PAL.hasParamAttribute(ArgNo++, Attribute::ByVal))
+          continue;
+        Value *Obj = findValue(Arg, /*OffsetOk=*/true);
+        Assert(!isa<AllocaInst>(Obj),
+               "Undefined behavior: Call with \"tail\" keyword references "
+               "alloca",
+               &I);
+      }
     }
+  }
 
 
   if (IntrinsicInst *II = dyn_cast<IntrinsicInst>(&I))


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D40009.122971.patch
Type: text/x-patch
Size: 2400 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171115/ae547a9b/attachment.bin>


More information about the llvm-commits mailing list