This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Handle VECTOR_CST in integer_nonzerop()


On Tue, Sep 20, 2016 at 8:20 AM, Marc Glisse <marc.glisse@inria.fr> wrote:
> On Mon, 19 Sep 2016, Patrick Palka wrote:
>
>> On Wed, Sep 14, 2016 at 1:58 AM, Marc Glisse <marc.glisse@inria.fr> wrote:
>>>
>>> On Fri, 19 Aug 2016, Patrick Palka wrote:
>>>
>>>> On Fri, Aug 19, 2016 at 7:30 PM, Patrick Palka <patrick@parcs.ath.cx>
>>>> wrote:
>>>>>
>>>>>
>>>>> integer_nonzerop() currently unconditionally returns false for a
>>>>> VECTOR_CST argument.  This is confusing because one would expect that
>>>>> integer_onep(x) => integer_nonzerop(x) for all x but that is currently
>>>>> not the case.  For a VECTOR_CST of all ones i.e. {1,1,1,1},
>>>>> integer_onep() returns true but integer_nonzerop() returns false.
>>>>>
>>>>> This patch makes integer_nonzerop() handle VECTOR_CSTs in the obvious
>>>>> way and also adds some self tests (the last of which fails without the
>>>>> change).  Does this look OK to commit afetr bootstrap + regtesting on
>>>>> x86_64-pc-linux-gnu?
>>>>
>>>>
>>>>
>>>> Actually I guess there is some ambiguity as to whether
>>>> integer_nonzerop() should return true for a VECTOR_CST only if it has
>>>> at least one non-zero element or only if all of its elements are
>>>> non-zero...
>>>
>>>
>>>
>>> In my opinion, the second one would make a lot more sense. I think most
>>> (all?) current uses are protected by checks that mean it is never called
>>> on
>>> vectors (where did you notice this issue?). But if we wanted to
>>> generalize,
>>
>>
>> Yeah I don't think integer_onep is called anywhere on a VECTOR_CST
>> currently. I ran into this issue because I tried using integer_onep on
>> a VECTOR_CST and found that it didn't work as expected.
>
>
> I thought we were talking about integer_nonzerop? integer_onep is used on
> vectors just fine...

Oh, yeah... Sorry about the confusion.  Your argument to generalize
integer_nonzerop as an AND on vectors makes sense to me.

>
>
>>> looking for instance at fold-const.c (A & C) == D where D & ~C != 0, we
>>> would want that no element of D&~C is 0 to be able to simplify the whole
>>> vector to 0. If we want an OR as in your patch, in most cases we could
>>> use
>>> !integer_zerop, possibly with extra checks that it is indeed a constant.
>>> Maybe we could solve this with more explicit names? integer_each_nonzerop
>>> vs
>>> integer_not_all_zerop?
>>
>>
>> More precise naming would be nice.  Note that integer_all_onesp() and
>> integer_truep() already exist which is another reason I leaned towards
>> making integer_onep behave as an OR for VECTOR_CSTs since the AND
>> behavior is already covered by those aforementioned two predicates.
>> But since there is no consensus and no such user of integer_onep I
>> will just drop this patch.
>
>
> --
> Marc Glisse


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]