On Wed, Apr 11, 2018 at 10:46 AM, Richard Biener
<richard.guent...@gmail.com> wrote:
> On Tue, Apr 10, 2018 at 6:28 PM, Bin.Cheng <amker.ch...@gmail.com> wrote:
>> On Tue, Apr 10, 2018 at 3:58 PM, Bin.Cheng <amker.ch...@gmail.com> wrote:
>>> On Tue, Apr 10, 2018 at 2:26 PM, Jakub Jelinek <ja...@redhat.com> wrote:
>>>> On Tue, Apr 10, 2018 at 09:55:35AM +0000, Bin Cheng wrote:
>>>>> Hi Rainer, could you please help me double check that this solves the 
>>>>> issue?
>>>>>
>>>>> Thanks,
>>>>> bin
>>>>>
>>>>> gcc/testsuite
>>>>> 2018-04-10  Bin Cheng  <bin.ch...@arm.com>
>>>>>
>>>>>       PR testsuite/85190
>>>>>       * gcc.dg/vect/pr81196.c: Adjust pointer for aligned access.
>>>>
>>>>> diff --git a/gcc/testsuite/gcc.dg/vect/pr81196.c 
>>>>> b/gcc/testsuite/gcc.dg/vect/pr81196.c
>>>>> index 46d7a9e..15320ae 100644
>>>>> --- a/gcc/testsuite/gcc.dg/vect/pr81196.c
>>>>> +++ b/gcc/testsuite/gcc.dg/vect/pr81196.c
>>>>> @@ -4,14 +4,14 @@
>>>>>
>>>>>  void f(short*p){
>>>>>    p=(short*)__builtin_assume_aligned(p,64);
>>>>> -  short*q=p+256;
>>>>> +  short*q=p+255;
>>>>>    for(;p!=q;++p,--q){
>>>>>      short t=*p;*p=*q;*q=t;
>>>>
>>>> This is UB then though, because p will never be equal to q.
>>
>> Hmm, though it's UB in this case, is it OK for niter analysis gives
>> below results?
>>
>> Analyzing # of iterations of loop 1
>>   exit condition [126, + , 18446744073709551615] != 0
>>   bounds on difference of bases: -126 ... -126
>>   result:
>>     # of iterations 126, bounded by 126
>>
>> I don't really follow last piece of code in number_of_iterations_ne:
>>
>>   /* Let nsd (step, size of mode) = d.  If d does not divide c, the loop
>>      is infinite.  Otherwise, the number of iterations is
>>      (inverse(s/d) * (c/d)) mod (size of mode/d).  */
>>   bits = num_ending_zeros (s);
>>   bound = build_low_bits_mask (niter_type,
>>                    (TYPE_PRECISION (niter_type)
>>                 - tree_to_uhwi (bits)));
>>
>>   d = fold_binary_to_constant (LSHIFT_EXPR, niter_type,
>>                    build_int_cst (niter_type, 1), bits);
>>   s = fold_binary_to_constant (RSHIFT_EXPR, niter_type, s, bits);
>>
>>   if (!exit_must_be_taken)
>>     {
>>       /* If we cannot assume that the exit is taken eventually, record the
>>      assumptions for divisibility of c.  */
>>       assumption = fold_build2 (FLOOR_MOD_EXPR, niter_type, c, d);
>>       assumption = fold_build2 (EQ_EXPR, boolean_type_node,
>>                 assumption, build_int_cst (niter_type, 0));
>>       if (!integer_nonzerop (assumption))
>>     niter->assumptions = fold_build2 (TRUTH_AND_EXPR, boolean_type_node,
>>                       niter->assumptions, assumption);
>>     }
>>
>>   c = fold_build2 (EXACT_DIV_EXPR, niter_type, c, d);
>>   tmp = fold_build2 (MULT_EXPR, niter_type, c, inverse (s, bound));
>>   niter->niter = fold_build2 (BIT_AND_EXPR, niter_type, tmp, bound);
>>   return true;
>>
>> Though infinite niters is mentioned, I don't see it's handled?
>
> number_of_iterations_ne_max computes this it seems based on the
> fact that pointer overflow is undefined.  This means that 126 is
> as good as any other number given the testcase is undefined...

Okay, in this case, I simply removed the function with UB in the case.
Is it OK?

Thanks,
bin

gcc/testsuite
2018-04-11  Bin Cheng  <bin.ch...@arm.com>

    PR testsuite/85190
    * gcc.dg/vect/pr81196.c: Remove function with undefined behavior.


>
> Richard.
>
>> Thanks,
>> bin
>>> Sorry I already checked in, will try to correct it in another patch.
>>>
>>> Thanks,
>>> bin
>>>>
>>>>>    }
>>>>>  }
>>>>>  void b(short*p){
>>>>>    p=(short*)__builtin_assume_aligned(p,64);
>>>>> -  short*q=p+256;
>>>>> +  short*q=p+255;
>>>>>    for(;p<q;++p,--q){
>>>>>      short t=*p;*p=*q;*q=t;
>>>>
>>>> This one is fine, sure.
>>>>
>>>>         Jakub
diff --git a/gcc/testsuite/gcc.dg/vect/pr81196.c 
b/gcc/testsuite/gcc.dg/vect/pr81196.c
index 15320ae..97d40a0 100644
--- a/gcc/testsuite/gcc.dg/vect/pr81196.c
+++ b/gcc/testsuite/gcc.dg/vect/pr81196.c
@@ -2,13 +2,6 @@
 /* { dg-require-effective-target vect_int } */
 /* { dg-require-effective-target vect_perm_short } */
 
-void f(short*p){
-  p=(short*)__builtin_assume_aligned(p,64);
-  short*q=p+255;
-  for(;p!=q;++p,--q){
-    short t=*p;*p=*q;*q=t;
-  }
-}
 void b(short*p){
   p=(short*)__builtin_assume_aligned(p,64);
   short*q=p+255;
@@ -16,4 +9,4 @@ void b(short*p){
     short t=*p;*p=*q;*q=t;
   }
 }
-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" } } */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" } } */

Reply via email to