[PATCH] Use dereferencable attribute in Clang for C++ references

hfinkel at anl.gov hfinkel at anl.gov
Wed Jul 9 20:25:58 PDT 2014


Hi rsmith, chandlerc, nlewycky,

This is the Clang companion patch to http://reviews.llvm.org/D4449 which adds a dereferencable function parameter attribute (like the nonnull attribute, but specifying that the pointer is dereferencable like the value of an alloca is dereferencable). This patch causes the dereferencable attribute to appear on reference parameters (and return values) just like nonnull does currently.

As mentioned in the llvm patch summary, my motivating use case is C++ references that are passes as function parameters and used in loops. For example,

void foo(int * __restrict__ a, int * __restrict__ b, int &c, int n) {
  for (int i = 0; i < n; ++i)
    if (a[i] > 0)
      a[i] = c*b[i];
}

Currently, we generate a load of 'c' in every loop iteration because we can't prove that there is no control dependence on the dereferencability of 'c' from the if condition. But because 'c' is a reference, we know it must point to something, and since nothing else in the loop can alias it, it is safe to load it in the preheader.

http://reviews.llvm.org/D4450

Files:
  lib/CodeGen/CGCall.cpp

Index: lib/CodeGen/CGCall.cpp
===================================================================
--- lib/CodeGen/CGCall.cpp
+++ lib/CodeGen/CGCall.cpp
@@ -1200,8 +1200,10 @@
     llvm_unreachable("Invalid ABI kind for return argument");
   }
 
-  if (RetTy->isReferenceType())
+  if (RetTy->isReferenceType()) {
+    RetAttrs.addAttribute(llvm::Attribute::Dereferencable);
     RetAttrs.addAttribute(llvm::Attribute::NonNull);
+  }
 
   if (RetAttrs.hasAttributes())
     PAL.push_back(llvm::
@@ -1291,8 +1293,10 @@
     }
     }
 
-    if (ParamType->isReferenceType())
+    if (ParamType->isReferenceType()) {
+      Attrs.addAttribute(llvm::Attribute::Dereferencable);
       Attrs.addAttribute(llvm::Attribute::NonNull);
+    }
 
     if (Attrs.hasAttributes())
       PAL.push_back(llvm::AttributeSet::get(getLLVMContext(), Index, Attrs));
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D4450.11239.patch
Type: text/x-patch
Size: 846 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140710/232c3d80/attachment.bin>


More information about the cfe-commits mailing list