On Sat, 10 Nov 2018 09:11:20 -0800
Julian Brown <jul...@codesourcery.com> wrote:

Two nits.

> diff --git a/gcc/fortran/openmp.c b/gcc/fortran/openmp.c
> index 6430e61..ebba7ca 100644
> --- a/gcc/fortran/openmp.c
> +++ b/gcc/fortran/openmp.c

> @@ -3781,9 +3805,6 @@ check_array_not_assumed (gfc_symbol *sym, locus loc, 
> const char *name)
>  static void
>  resolve_oacc_data_clauses (gfc_symbol *sym, locus loc, const char *name)
>  {
> -  if (sym->ts.type == BT_DERIVED && sym->attr.allocatable)
> -    gfc_error ("ALLOCATABLE object %qs of derived type in %s clause at %L",
> -            sym->name, name, &loc);
>    if ((sym->ts.type == BT_ASSUMED && sym->attr.allocatable)
>        || (sym->ts.type == BT_CLASS && CLASS_DATA (sym)
>         && CLASS_DATA (sym)->attr.allocatable))
> @@ -4153,11 +4174,23 @@ resolve_omp_clauses (gfc_code *code, gfc_omp_clauses 
> *omp_clauses,
>       && (list != OMP_LIST_REDUCTION || !openacc))
>        for (n = omp_clauses->lists[list]; n; n = n->next)
>       {
> -       if (n->sym->mark)
> -         gfc_error ("Symbol %qs present on multiple clauses at %L",
> -                    n->sym->name, &n->where);
> -       else
> -         n->sym->mark = 1;
> +       bool array_only_p = true;
> +       /* Disallow duplicate bare variable references and multiple
> +          subarrays of the same array here, but allow multiple components of
> +          the same (e.g. derived-type) variable.  For the latter, duplicate
> +          components are detected elsewhere.  */
> +       if (openacc && n->expr && n->expr->expr_type == EXPR_VARIABLE)
> +         for (gfc_ref *ref = n->expr->ref; ref; ref = ref->next)
> +           if (ref->type != REF_ARRAY)
> +             array_only_p = false;

you could break here.
It seems we do not perform this optimization ourself even when we
could (or should) prove that the dataflow does not force the loop to run
to completion?!

Consider:

int foo(char *str) {                                                            
        _Bool cond = 0;                                                         
        for (char *chp = str; *chp != 0; chp++)                                 
                if (*chp == 42) {                                               
                        cond = 1;                                               
#ifdef BREAK                                                                    
                        break;                                                  
#endif                                                                          
                }                                                               
        return 0x0815 + cond;                                                   
}

$ for i in 0 1 2 3 s;do gcc -UBREAK -O$i -c -o $i.o /tmp/1/foo.c  
-fomit-frame-pointer -m32 -mtune=i386;done;size ?.o
   text    data     bss     dec     hex filename
    109       0       0     109      6d 0.o
     97       0       0      97      61 1.o
    107       0       0     107      6b 2.o
    107       0       0     107      6b 3.o
     86       0       0      86      56 s.o
$ for i in 0 1 2 3 s;do gcc -DBREAK -O$i -c -o $i.o /tmp/1/foo.c  
-fomit-frame-pointer -m32 -mtune=i386;done;size ?.o
   text    data     bss     dec     hex filename
    111       0       0     111      6f 0.o
     82       0       0      82      52 1.o
     82       0       0      82      52 2.o
     82       0       0      82      52 3.o
     77       0       0      77      4d s.o

respectively

$ for i in 0 1 2 3 s;do gcc -UBREAK -O$i -c -o $i.o /tmp/1/foo.c  
-fomit-frame-pointer -m32 -mtune=i386 -falign-functions=1 -falign-jumps=1 
-falign-labels=1 -falign-loops=1 -fno-unwind-tables 
-fno-asynchronous-unwind-tables -fno-guess-branch-probability;done;size ?.o
   text    data     bss     dec     hex filename
     61       0       0      61      3d 0.o
     38       0       0      38      26 1.o
     43       0       0      43      2b 2.o
     43       0       0      43      2b 3.o
     34       0       0      34      22 s.o
$ for i in 0 1 2 3 s;do gcc -DBREAK -O$i -c -o $i.o /tmp/1/foo.c  
-fomit-frame-pointer -m32 -mtune=i386 -falign-functions=1 -falign-jumps=1 
-falign-labels=1 -falign-loops=1 -fno-unwind-tables 
-fno-asynchronous-unwind-tables -fno-guess-branch-probability;done;size ?.o
   text    data     bss     dec     hex filename
     63       0       0      63      3f 0.o
     39       0       0      39      27 1.o
     39       0       0      39      27 2.o
     39       0       0      39      27 3.o
     33       0       0      33      21 s.o

that's really a pity.


> +       if (array_only_p)
> +         {
> +           if (n->sym->mark)
> +             gfc_error ("Symbol %qs present on multiple clauses at %L",
> +                        n->sym->name, &n->where);
> +           else
> +             n->sym->mark = 1;
> +         }
>       }

> diff --git a/gcc/gimplify.c b/gcc/gimplify.c
> index 274edc0..aa7723d 100644
> --- a/gcc/gimplify.c
> +++ b/gcc/gimplify.c

> +                   /* Turning a GOMP_MAP_ALWAYS_POINTER clause into a
> +                      GOMP_MAP_ATTACH clause after we have detected a case
> +                      that needs a GOMP_MAP_STRUCT mapping adding.  */

s/adding/added/ i think.

thanks,

Reply via email to