https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90656

            Bug ID: 90656
           Summary: Illegal operand from Fortran program WRF with
                    mcpu=niagara3
           Product: gcc
           Version: 9.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mailboxnotfound at yahoo dot com
  Target Milestone: ---

Created attachment 46426
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=46426&action=edit
tarball, md5sum is 3cba3d5be4b05751298c6dbcb824f06d

Introduction

   Compiling 521.wrf_r from SPEC CPU 2017 with gcc 9.1 on SPARC Linux fails
with message

     module_cu_nsas.fppized.s: Assembler messages:
     module_cu_nsas.fppized.s:8432: Error: Illegal operands

   and indeed the operand is illegal -  %f25 is only a single precision
register:

     $ head -8432 module_cu_nsas.fppized.s | tail -1
           std     %f25, [%fp+1799]
     $

Also fails with WRF

    You do not need SPEC CPU 2017 to reproduce this problem.  The reproducer
script
    for this bug starts from  
    https://raw.githubusercontent.com/NCAR/WRFV3/master/phys/module_cu_nsas.F

New with 9.1

   The error does not occur with gcc 8.3.  I built my copy of GCC 9.1 on a
SPARC T8
   running Oracle Linux 6.9 with these add-ins to the source directory:

       binutils-2.32 gmp-6.1.2 isl-0.19 mpc-1.1.0 mpfr-3.1.6

   and this configure command:

       /export/GCC/build/gcc-9.1.0/configure --enable-languages=c,c++,fortran
--enable-lto 
       --enable-bootstrap --with-cpu=ultrasparc 
--with-pkgversion=johnh-16-May-2019 
       --prefix=/export/GCC/gcc-9.1.0 --with-local-prefix=/export/GCC

Optimization 

   Original:
      -Ofast -mcpu=niagara4

   In the reproducer, I got it down to:
      -O3 -fstack-arrays -ffinite-math-only -mcpu=niagara3 

   Furthermore, it still fails even if many of the components of O3 are turned
off:

      -fno-inline-functions -fno-predictive-commoning -fno-gcse-after-reload 
      -fno-tree-loop-distribution -fno-tree-loop-distribute-patterns 
      -fno-loop-interchange -fno-loop-unroll-and-jam -fno-split-paths 
      -fno-tree-slp-vectorize -fno-vect-cost-model -fno-tree-partial-pre 
      -fno-peel-loops -fno-ipa-cp-clone -fno-split-loops

   The reproducer adds all the above to the command and still generates the
failure.

The problem is rare

   No other SPEC CPU 2017 benchmarks failed for me on SPARC Linux with GCC 9.1.

   Within the failing benchmark, 479 modules were built, and they had 
   29,623 std instructions:

      $ ls *.s | wc -l
      479
      $ cat *s | expand |grep -c "        std"
      29623
      $ 

   and only one with a bad floating point double register:

      $ cat *s | expand |grep  "        std" | tr -s ' ' | cut -f1 -d, | sort |
uniq
       std %f0
       std %f10
       std %f12
       std %f14
       std %f16
       std %f18
       std %f2
       std %f20
       std %f22
       std %f24
       std %f25   <-----
       std %f26
       std %f28
       std %f30
       std %f32
       std %f34
       std %f36
       std %f38
       std %f4
       std %f40
       std %f42
       std %f44
       std %f46
       std %f48
       std %f50
       std %f52
       std %f54
       std %f56
       std %f58
       std %f6
       std %f60
       std %f62
       std %f8
      $
      $ grep std *s | grep f25
      module_cu_nsas.fppized.s:       std     %f25, [%fp+1799]
      $ 


To reproduce:

$ ls
illegal_operand.tar.xz 
$ xz -dc illegal_operand.tar.xz | tar -xvf -
illegal_operand/
illegal_operand/readme.txt
illegal_operand/module_cu_nsas.F
illegal_operand/doit.sh
$ cd illegal_operand
$ 

Edit 'doit.sh' for your paths, and then:

$ ./doit.sh 

This command using -O3 is expected to fail with gcc 9.1:
   /export/GCC/gcc-9.1.0/bin/gfortran -ffree-form -nocpp -O3 -m64 -c -o
module_cu_nsas.o -v -save-temps  -g -fstack-arrays -ffinite-math-only
-mcpu=niagara3 module_cu_nsas.F

press enter to continue
GNU assembler version 2.32 (sparc64-unknown-linux-gnu) using BFD version
(johnh-16-May-2019) 2.32
module_cu_nsas.s: Assembler messages:
module_cu_nsas.s:9061: Error: Illegal operands

press enter to continue

This command still uses -O3, but turns off many of its components. It is
expected to still fail with gcc 9.1
   /export/GCC/gcc-9.1.0/bin/gfortran -ffree-form -fno-inline-functions
-fno-predictive-commoning -fno-gcse-after-reload 
-fno-tree-loop-distribution -fno-tree-loop-distribute-patterns
-fno-loop-interchange -fno-loop-unroll-and-jam
-fno-split-paths -fno-tree-slp-vectorize -fno-vect-cost-model
-fno-tree-partial-pre -fno-peel-loops -fno-ipa-cp-clone
-fno-split-loops -nocpp -O3 -m64 -c -o module_cu_nsas.o -v -save-temps  -g
-fstack-arrays -ffinite-math-only -mcpu=niagara3 module_cu_nsas.F

press enter to continue
GNU assembler version 2.32 (sparc64-unknown-linux-gnu) using BFD version
(johnh-16-May-2019) 2.32
module_cu_nsas.s: Assembler messages:
module_cu_nsas.s:9087: Error: Illegal operands
$

Reply via email to