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

Nick Lewycky nicholas at mxc.ca
Mon May 25 12:40:14 PDT 2015


Björn Steinbrink wrote:
> 2015-05-25 21:27 GMT+02:00 Nick Lewycky<nicholas at mxc.ca>:
>>
>> 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?
>
> The verifier checks that only one of readonly and readnone is set, and
> I actually copied the attribute removal from the code that handles the
> function attributes. In fact, the verifier also complains about this:
>
>      define void @foo() readonly readnone {
>          ret void
>      }
>
> I found this to be confusing as well, but assumed that since the
> function attributes are handled the same way, the right fix is to
> remove the conflicting attribute.

Oh. As long as testing for readonly returns true when readnone is set, 
that works.

>>> 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.

This only clears out readnone/readonly attributes, not all attributes.

LGTM, with a change to the comment.

Nick

>>> +        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