[PATCH] Remove conflicting attributes before adding deduced readonly/readnone

Nick Lewycky nicholas at mxc.ca
Mon May 25 12:27:20 PDT 2015


Björn Steinbrink wrote:
> Hi nlewycky,
>
> In case of functions that have a pointer argument and only pass it to
> each other, the function attributes pass deduces that the pointer should
> get the readnone attribute, but fails to remove a readonly attribute
> that may already have been present.

I suspect something else is wrong then; readnone implies readonly, so it 
should be impossible to have readnone *without* readonly. This is how it 
works on the function attributes, I suspect the pointer attributes may 
be missing similar logic to suppress printing of readonly and setting of 
readonly when readnone is set?

>
> http://reviews.llvm.org/D9995
>
> Files:
>    lib/Transforms/IPO/FunctionAttrs.cpp
>    test/Transforms/FunctionAttrs/readnone.ll
>
> Index: lib/Transforms/IPO/FunctionAttrs.cpp
> ===================================================================
> --- lib/Transforms/IPO/FunctionAttrs.cpp
> +++ lib/Transforms/IPO/FunctionAttrs.cpp
> @@ -703,10 +703,14 @@
>       }
>
>       if (ReadAttr != Attribute::None) {
> -      AttrBuilder B;
> +      AttrBuilder B, R;
>         B.addAttribute(ReadAttr);
> +      R.addAttribute(Attribute::ReadOnly)
> +        .addAttribute(Attribute::ReadNone);
>         for (unsigned i = 0, e = ArgumentSCC.size(); i != e; ++i) {
>           Argument *A = ArgumentSCC[i]->Definition;
> +        // Clear out any existing attributes.
> +        A->removeAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, R));
>           A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B));
>           ReadAttr == Attribute::ReadOnly ? ++NumReadOnlyArg : ++NumReadNoneArg;
>           Changed = true;
> Index: test/Transforms/FunctionAttrs/readnone.ll
> ===================================================================
> --- /dev/null
> +++ test/Transforms/FunctionAttrs/readnone.ll
> @@ -0,0 +1,13 @@
> +; RUN: opt<  %s -functionattrs -S | FileCheck %s
> +
> +; CHECK: define void @bar(i8* nocapture readnone)
> +define void @bar(i8* readonly) {
> +  call void @foo(i8* %0)
> +    ret void
> +}
> +
> +; CHECK: define void @foo(i8* nocapture readnone)
> +define void @foo(i8* readonly) {
> +  call void @bar(i8* %0)
> +  ret void
> +}
>
> EMAIL PREFERENCES
>    http://reviews.llvm.org/settings/panel/emailpreferences/
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits





More information about the llvm-commits mailing list