On 13 June 2017 at 17:25, Richard Earnshaw (lists)
<richard.earns...@arm.com> wrote:
> On 12/06/17 15:34, Richard Earnshaw (lists) wrote:
>> On 12/06/17 12:49, Christophe Lyon wrote:
>>> On 10 June 2017 at 01:27, Richard Earnshaw (lists)
>>> <richard.earns...@arm.com> wrote:
>>>> On 09/06/17 23:45, Christophe Lyon wrote:
>>>>> Hi Richard,
>>>>>
>>>>>
>>>>> On 9 June 2017 at 14:53, Richard Earnshaw <richard.earns...@arm.com> 
>>>>> wrote:
>>>>>>
>>>>>> During the ARM BoF at the Cauldron last year I mentioned that I wanted
>>>>>> to rework the way GCC on ARM handles the command line options.  The
>>>>>> problem was that most users, and even many experts, can't remember
>>>>>> which FPU/SIMD unit comes with which CPU and that consequently many
>>>>>> users were inadvertenly generating sub-optimal code for their system.
>>>>>>
>>>>>> This patch series implements the proposed change and provides support
>>>>>> for a generic way of adding optional features to architectures and CPU
>>>>>> names.  The documentation patches at the end of the series explain the
>>>>>> new syntax, so I won't repeat all that here.  Suffice to say here that
>>>>>> the result is that the -mfpu option now defaults to 'auto', which
>>>>>> allows the compiler to infer the floating-point and simd options from
>>>>>> the CPU/architecture options and that these options can normally be
>>>>>> expressed in a context-specific manner like +simd or +fp without
>>>>>> having to know precisely which variant is implemented.  Long term I'd
>>>>>> like to deprecate -mfpu and entirely move over to the new syntax; but
>>>>>> it's too early to start that process now.
>>>>>>
>>>>>> All the patches in the series should build a working basic compiler,
>>>>>> but the multilib selection will not work correctly until the relevant
>>>>>> patches towards the end are applied.  It is not really feasible to
>>>>>> retain that functionality without collapsing too many of the patches
>>>>>> together into one hunk.  It's also possible that some tests in the
>>>>>> testsuite may exhibit transient misbehaviour, but there should be no
>>>>>> regressions by the end of the sequence (some tests no-longer run in
>>>>>> the default configurations because the default CPU does not have
>>>>>> floating-point support).
>>>>>>
>>>>>> Just two patches are to the generic code, but both are fairly trivial.
>>>>>> One permits the sbitmap code to be used in the driver programs and the
>>>>>> other provides a way of escaping the meta-character in some multilib
>>>>>> reuse strings.
>>>>>>
>>>>>> I won't apply any of this series until those two patches have been
>>>>>> approved, and I won't commit anything before the middle of next week
>>>>>> even then.  This is a fairly complex change and it deserves some time
>>>>>> for people to comment before committing.
>>>>>>
>>>>>> R.
>>>>>>
>>>>>> Richard Earnshaw (30):
>>>>>>   [arm] Use strings for -march, -mcpu and -mtune options
>>>>>>   [arm] Rewrite -march and -mcpu options for passing to the assembler
>>>>>>   [arm] Don't pass -mfpu=auto through to the assembler.
>>>>>>   [arm] Allow +opt on arbitrary cpu and architecture specifications
>>>>>>   [arm] Add architectural options
>>>>>>   [arm] Add default FPUs for CPUs.
>>>>>>   [build] Make sbitmap code available to the driver programs
>>>>>>   [arm] Split CPU, architecture and tuning data tables.
>>>>>>   [ARM] Move cpu and architecture option name parsing code to
>>>>>>     arm-common.c
>>>>>>   [arm] Use standard option parsing code for detecting thumb-only
>>>>>>     targets
>>>>>>   [arm] Allow CPU and architecture extensions to be defined as aliases
>>>>>>   [arm] Allow new extended syntax CPU and architecture names during
>>>>>>     configure
>>>>>>   [arm] Force a CPU default in the config args defaults list.
>>>>>>   [arm] Generate a canonical form for -march
>>>>>>   [arm] Make -mfloat-abi=softfp work when there are no FPU instructions
>>>>>>   [arm] Update basic multilib configuration
>>>>>>   [arm] Make 'auto' the default FPU selection option.
>>>>>>   [arm] Rewrite t-aprofile using new selector methodology
>>>>>>   [arm] Explicitly set .fpu in cmse_nonsecure_call.S
>>>>>>   [genmultilib] Allow explicit periods to be escaped in MULTILIB_REUSE
>>>>>>   [arm][testsuite] Use -march=armv7-a+fp when testing hard-float ABI.
>>>>>>   [arm] Rewrite t-rmprofile multilib specification
>>>>>>   [arm][rtems] Update t-rtems for new option framework
>>>>>>   [arm][linux-eabi] Ensure all multilib variables are reset
>>>>>>   [arm][phoenix] reset all multilib variables
>>>>>>   [arm] Rework multlib builds for symbianelf
>>>>>>   [arm][fuchsia] Rework multilib support
>>>>>>   [arm] Add a few missing architecture extension options.
>>>>>>   [arm][doc] Document new -march= syntax.
>>>>>>   [arm][doc] Document changes to -mcpu, -mtune and -mfpu.
>>>>>>
>>>>>>  gcc/Makefile.in                           |    2 +-
>>>>>>  gcc/common/config/arm/arm-common.c        |  651 +++++++-
>>>>>>  gcc/config.gcc                            |   17 +-
>>>>>>  gcc/config/arm/arm-builtins.c             |    4 +-
>>>>>>  gcc/config/arm/arm-cpu-cdata.h            | 2444 
>>>>>> +++++++++++++++++++++++------
>>>>>>  gcc/config/arm/arm-cpu-data.h             | 1410 ++---------------
>>>>>>  gcc/config/arm/arm-cpu.h                  |   38 +
>>>>>>  gcc/config/arm/arm-cpus.in                |  237 ++-
>>>>>>  gcc/config/arm/arm-isa.h                  |   20 +-
>>>>>>  gcc/config/arm/arm-protos.h               |   56 +-
>>>>>>  gcc/config/arm/arm-tables.opt             |   21 +-
>>>>>>  gcc/config/arm/arm.c                      |  337 ++--
>>>>>>  gcc/config/arm/arm.h                      |   75 +-
>>>>>>  gcc/config/arm/arm.opt                    |   15 +-
>>>>>>  gcc/config/arm/bpabi.h                    |    4 -
>>>>>>  gcc/config/arm/elf.h                      |    6 +-
>>>>>>  gcc/config/arm/linux-elf.h                |    3 -
>>>>>>  gcc/config/arm/netbsd-elf.h               |    4 -
>>>>>>  gcc/config/arm/parsecpu.awk               |  295 +++-
>>>>>>  gcc/config/arm/t-aprofile                 |  200 +--
>>>>>>  gcc/config/arm/t-arm-elf                  |  173 +-
>>>>>>  gcc/config/arm/t-fuchsia                  |   33 +
>>>>>>  gcc/config/arm/t-linux-eabi               |    4 +
>>>>>>  gcc/config/arm/t-multilib                 |  126 +-
>>>>>>  gcc/config/arm/t-phoenix                  |   20 +-
>>>>>>  gcc/config/arm/t-rmprofile                |  147 +-
>>>>>>  gcc/config/arm/t-rtems                    |   49 +-
>>>>>>  gcc/config/arm/t-symbian                  |   34 +-
>>>>>>  gcc/config/arm/vxworks.h                  |    2 -
>>>>>>  gcc/doc/fragments.texi                    |   10 +-
>>>>>>  gcc/doc/invoke.texi                       |  371 ++++-
>>>>>>  gcc/genmultilib                           |    4 +-
>>>>>>  gcc/testsuite/gcc.dg/pr59418.c            |    2 +-
>>>>>>  gcc/testsuite/gcc.target/arm/multilib.exp |  685 ++++++++
>>>>>>  gcc/testsuite/gcc.target/arm/pr51915.c    |    2 +-
>>>>>>  gcc/testsuite/gcc.target/arm/pr52006.c    |    2 +-
>>>>>>  gcc/testsuite/gcc.target/arm/pr53187.c    |    2 +-
>>>>>>  libgcc/config/arm/cmse_nonsecure_call.S   |    8 +
>>>>>>  38 files changed, 5073 insertions(+), 2440 deletions(-)
>>>>>>  create mode 100644 gcc/config/arm/t-fuchsia
>>>>>>  create mode 100644 gcc/testsuite/gcc.target/arm/multilib.exp
>>>>>>
>>>>>> ----------------2.7.4--
>>>>>>
>>>>>
>>>>> I wanted to run a validation with the full series applied as one patch
>>>>> over r249050,
>>>>> so I just downloaded all the patches, concatenated them in order, but the 
>>>>> result
>>>>> fails to apply. (conflicts with arm-cpu-cdata.h, arm-cpus.in,
>>>>> t-aprofile, t-rmprofile)
>>>>>
>>>>> Am I missing something?
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Christophe
>>>>>
>>>>
>>>> I really appreciate you trying to do this...
>>>>
>>>> I rebased the patch series sometime on Tuesday/Wednesday just before Jim
>>>> Wilson committed his falkor change; you'll need to back out to just
>>>> before r248944.  I can't think of anything else that might have just
>>>> gone in that might conflict.  For arm-cpu-cdata.h (and the other
>>>> auto-generated files, like arm-cpu-data.h) you can just delete the file
>>>> and it will be rebuilt automatically, the others really do need the
>>>> conflict to be resolved.
>>>>
>>>> Obviously I'll rebase again just before the commit, but propagating such
>>>> changes through the patch series is quite tedious and I don't want to do
>>>> it any more than necessary :-).
>>>>
>>>> It would be easier if the generated files weren't checked in to the
>>>> repository...
>>>>
>>>> R.
>>>
>>> Hi Richard,
>>>
>>> Starting a validation of the whole patch against r248942 did work, thanks.
>>>
>>> The results are here:
>>> http://people.linaro.org/~christophe.lyon/cross-validation/gcc-test-patches/248942-rework-cpu-arch-fpu.patch/report-build-info.html
>>>
>>> Regressions are detected in many configurations, unfortunately.
>>> Some may be caused by the fact that I've upgraded to dejagnu-1.6+ for
>>> my testing,
>>> and thus "multilib flags" are now prepended rather than appended, but
>>> I don't think that's the majority.
>>>
>>> To help you understand/group all the reports:
>>> - all "arm-none-linux-gnueabi" with REGRESSED now have:
>>> FAIL: gcc.target/arm/neon-thumb2-move.c (test for excess errors)
>>
>> See later.
>>
>>> FAIL: gcc.target/arm/no-volatile-in-it.c scan-assembler-not ldrgt
>>> - same for the 2 configs arm-none-eabi --with-cpu=cortex-a9
>>
>> I'm checking a fix for this, I think I understand what's going on here.
>>
>>>
>>> - all "arm-none-linux-gnueabihf" and "armeb-none-linux-gnueabihf" with
>>> REGRESSED now have:
>>> FAIL: gcc.target/arm/no-volatile-in-it.c scan-assembler-not ldrgt
>>>
>>> - arm-none-eabi --with-cpu=cortex-m3 now has:
>>> FAIL:
>>>     gcc.target/arm/no-volatile-in-it.c scan-assembler-not ldrgt
>>>     gcc.target/arm/thumb2-slow-flash-data-2.c (test for excess errors)
>>>     gcc.target/arm/thumb2-slow-flash-data-3.c (test for excess errors)
>>>     gcc.target/arm/thumb2-slow-flash-data-4.c (test for excess errors)
>>>     gcc.target/arm/thumb2-slow-flash-data-5.c (test for excess errors)
>>> UNRESOLVED:
>>>     gcc.target/arm/thumb2-slow-flash-data-4.c scan-assembler-times 
>>> #1\\.0e\\+0 3
>>>     gcc.target/arm/thumb2-slow-flash-data-5.c scan-assembler-not #1\\.0e\\+0
>>>
>>> - The 2 cells with "BIG-REG" mean regressions where detected, but the report
>>> is >100kb so it was attached as a .xz file, click on 'BIG-REG" to download 
>>> it.
>>>
>>> - the cells with "BETTER" can be questionable: it means no new failure
>>> appeared, but PASS -> UNSUPPORTED is considered as "better". Here
>>> we have cases with several thousands (!) of tests becoming unsupported,
>>> which looks a bit suspicious.
>>>
>>> Among other things, I've noticed that when passing -march=armv5t,
>>> arm_neon_ok fails:
>>> xgcc -march=armv5t -fno-diagnostics-show-caret
>>> -fdiagnostics-color=never -mfpu=neon -mfloat-abi=softfp -march=
>>> armv7-a -c -o arm_neon_ok15574.o arm_neon_ok15574.c
>>> arm_neon_ok15574.c:9:4: error: #error Architecture does not support NEON.
>>> compiler exited with status 1
>>>
>>> I'd expect -march=armv7-a to allow to use -mfpu=neon?
>>>
>>
>> It does.  The problem seems to be a generic one in the driver in that
>> the rewrite rules are always passed the first instance of -march and not
>> the last.  Indeed, with the aarch64 compiler, if I write
>>
>> gcc -mcpu=native -mcpu=cortex-a53
>>
>> then the driver will rewrite this as
>>
>> ./cc1 -mcpu=cortex-a53 -mcpu=<expansion of native cpu name>
>>
>> which doesn't seem to be the right thing at all.
>>
>> So we either have a generic problem with all option rewriting, or there
>> are some subtle details of it that we've not figured out yet.
>>
>
> It turns out that there's also a problem with the test framework for
> this particular test.
>
I'm not sure which particular test you are referring to?

> The test has:
>
> /* { dg-require-effective-target arm_neon_ok } */
> /* { dg-require-effective-target arm_thumb2_ok } */
> /* { dg-options "-O2 -mthumb -march=armv7-a" } */
> /* { dg-add-options arm_neon } */
>
> This combination of flags goes through the following process:
>
> firstly it checks that Neon is ok.  That's fine
> Then it checks for thumb2.  That's also fine
> Then it adds the extra options.
> Finally it adds any final options needed to enable Neon.
>
> Unfortunately, the last step uses a cache.  The cache is based on trying
> a number of options from the default option set, which inherits from the
> options built into the compiler, which in this case is -mcpu=cortex-a9.
>
> Now since -mcpu=cortex-a9 now implies neon, the generic framework
> deduces (correctly) that -mfloat-abi=softfp is sufficient to enable neon.
>
> Unfortunately, this is the point at which the dg-options statement
> messes things up - the -march=armv7-a overrides the internally selected
> default CPU (cortex-a9) and thus removes Neon (simd) from the
> instruction set, since we haven't specified an architecture that
> supports SIMD.
>
> I think the correct (second) fix for this test is to remove the -march
> option entirely from the dg-options list and then rely on dg-add-options
> arm_neon adding the correct flags for this target configuration.
>

Indeed, I think in general there should be no such -march=XXX option
in dg-options and that should be handled by the
dg-require-effective-target/dg-add-options pair.
Why was -march=armv7-a added to this test in the first place?

> R.
>

Reply via email to