Hi gcc-patches mailing list,
cr1901 via Sourceware Forge <[email protected]> has 
requested that the following forgejo pull request
be published on the mailing list.

Created on: 2026-05-11 00:06:39+00:00
Latest update: 2026-05-11 00:46:02+00:00
Changes: 1 changed files, 0 additions, 2 deletions
Head revision: cr1901/gcc-TEST ref lm32-keep commit 
8b1a1f6565744504ce95735d6700817eb48c2c4f
Base revision: gcc/gcc-TEST ref trunk commit 
f4b5c2bf40d68e1666c83556a236a53cdddc34a2 r17-215-gf4b5c2bf40d68e
Merge base: f4b5c2bf40d68e1666c83556a236a53cdddc34a2
Full diff url: https://forge.sourceware.org/gcc/gcc-TEST/pulls/153.diff
Discussion:  https://forge.sourceware.org/gcc/gcc-TEST/pulls/153
Requested Reviewers:

This PR closes [120077](https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120077) on 
BZ.

I compiled `lm32-none-gcc` with newlib support, and ran the `compile.exp`, 
`execute.exp`, `dg.exp`, and `old-deja.exp` test suites twice; once with LRA 
disabled (baseline), and once with LRA enabled (lra). All 16 multilib 
configurations were tested. Both sets of tests were run against f4b5c2bf40d.

lm32 has a binutils simulator, and while DejaGNU doesn't currently know about 
it in-tree, I was able to define an out-of-tree boards file that worked:

1. export `DEJAGNU=/path/to/site.exp`
2. Fill out `site.exp` with the following:

    ```
    global boards_dir
    lappend boards_dir /path/to/site_exp_dir
    ```

3. Fill out `lm32-sim.exp` _in the same directory as `site.exp`_ with the 
following:

   ```
   # Load the generic configuration for this board. This will define a basic
   # set of routines needed by the tool to communicate with the board.
   load_generic_config "sim"

   # basic-sim.exp is a basic description for the standard Cygnus simulator.
   load_base_board_description "basic-sim"

   # This will look for lm32-elf-run somewhere on your PATH, or in the gcc build
   # dir if binutils was built in-tree.
   setup_sim lm32

   # Makes the slash notation described in "Passing options and running 
multiple testsuites"
   # at https://gcc.gnu.org/install/test.html work. Also "does the right thing" 
for
   # [get_multilibs].
   process_multilib_options ""

   # The compiler used to build for this board. This has *nothing* to do
   # with what compiler is tested if we're testing gcc. Further, this is
   # the default, so this line is optional for most boards.
   # (Does not appear to be optional for lm32-sim. Try removing it and see what 
happens!)
   set_board_info compiler "[find_gcc]"

   # We only support newlib on this target.
   # However, we include libgloss so we can find the linker scripts.
   # For lm32, libnosys is also required and it's not part of the default
   # [libgloss_link_flags].
   set_board_info cflags "[newlib_include_flags] [libgloss_include_flags]"
   set_board_info ldflags "[newlib_link_flags] [libgloss_link_flags] -L 
[get_multilibs]/libgloss/libnosys"

   # No linker script for this board. This is the default explicitly written 
out.
   set_board_info ldscript "-Tsim.ld"

   # set_board_info needs_status_wrapper  1

   set_board_info gcc,stack_size 16384
   set_board_info noargs 1
   set_board_info gdb,nosignals 1

   # 16
   set_board_info gcc,timeout 8
   # set_board_info gdb,timeout 1
   # set_board_info sim,timeout 1
   # set_board_info gdb,noresults 1
   ```

4. `make check-gcc` and `make check-g++` should "just work" and pick up the new 
board file. The full command-lines I used were:
   ```
   make -j5 
check-gcc//lm32-sim/{,-mbarrel-shift-enabled,-mmultiply-enabled,-mdivide-enabled,-msign-extend-enabled,'-mdivide-enabled/-msign-extend-enabled','-mmultiply-enabled/-mdivide-enabled','-mmultiply-enabled/-msign-extend-enabled','-mmultiply-enabled/-mdivide-enabled/-msign-extend-enabled','-mbarrel-shift-enabled/-mmultiply-enabled','-mbarrel-shift-enabled/-mdivide-enabled','-mbarrel-shift-enabled/-msign-extend-enabled','-mbarrel-shift-enabled/-mdivide-enabled/-msign-extend-enabled','-mbarrel-shift-enabled/-mmultiply-enabled/-mdivide-enabled','-mbarrel-shift-enabled/-mmultiply-enabled/-msign-extend-enabled','-mbarrel-shift-enabled/-mmultiply-enabled/-mdivide-enabled/-msign-extend-enabled'}
 RUNTESTFLAGS="compile.exp execute.exp dg.exp old-deja.exp "
   make -j5 
check-g++//lm32-sim/{,-mbarrel-shift-enabled,-mmultiply-enabled,-mdivide-enabled,-msign-extend-enabled,'-mdivide-enabled/-msign-extend-enabled','-mmultiply-enabled/-mdivide-enabled','-mmultiply-enabled/-msign-extend-enabled','-mmultiply-enabled/-mdivide-enabled/-msign-extend-enabled','-mbarrel-shift-enabled/-mmultiply-enabled','-mbarrel-shift-enabled/-mdivide-enabled','-mbarrel-shift-enabled/-msign-extend-enabled','-mbarrel-shift-enabled/-mdivide-enabled/-msign-extend-enabled','-mbarrel-shift-enabled/-mmultiply-enabled/-mdivide-enabled','-mbarrel-shift-enabled/-mmultiply-enabled/-msign-extend-enabled','-mbarrel-shift-enabled/-mmultiply-enabled/-mdivide-enabled/-msign-extend-enabled'}
 RUNTESTFLAGS="compile.exp execute.exp dg.exp old-deja.exp "
   ```

   I encountered issues with log files being truncated when interleaving 
`check-gcc` and `check-g++`, so I ran them separately.

Once I ran the testsuites with LRA disabled and enabled, I uploaded them into a 
git repo using [Bunsen](https://sourceware.org/bunsen/). The repo of testruns 
is available on [Codeberg](https://codeberg.org/cr1901/gcc-testruns), for those 
curious. You will want the `lm32-baseline-2026-04-30T07.50.19` and 
`lm32-lra-2026-04-30T14.05.53` tags. I then used Bunsen's `r-diff-testruns` 
command output to analyze the differences at a file level (i.e. I'm summarizing 
the various optimization level and multilib configs):

|Test file                                  |Without LRA                   
|With LRA                      |
|:------------------------------------------|:-----------------------------|:-----------------------------|
| c-c++-common/missing-close-symbol.c       | all PASS                     | 
transient error              |
| c-c++-common/Wbidi-chars-ranges.c         | all PASS                     | 
transient error              |
| gcc.c-torture/compile/asmgoto-2.c         | all UNSUPPORTED              | 
all PASS                     |
| gcc.c-torture/compile/asmgoto-5.c         | all UNSUPPORTED              | 
all PASS                     |
| gcc.c-torture/compile/asmgoto-6.c         | all UNSUPPORTED              | 
all PASS                     |
| gcc.c-torture/compile/limits-externdecl.c | all FAIL                     | 
all PASS                     |
| gcc.c-torture/compile/pr98096.c           | all UNSUPPORTED              | 
all PASS                     |
| gcc.c-torture/execute/built-in-setjmp.c   | all FAIL                     | 
all PASS                     |
| gcc.dg/asm-hard-reg-error-4.c             | all UNSUPPORTED              | 
all PASS                     |
| gcc.dg/asm-hard-reg-error-5.c             | all UNSUPPORTED              | 
all PASS                     |
| gcc.dg/asm-hard-reg-error-6.c             | all UNSUPPORTED              | 
all PASS                     |
| gcc.dg/c11-atomic-2.c                     | all FAIL                     | 
all PASS                     |
| gcc.dg/missing-symbol-3.c                 | all PASS                     | 
transient error              |
| gcc.dg/pr100590.c                         | all UNSUPPORTED              | 
all PASS                     |
| gcc.dg/pr107385.c                         | all UNSUPPORTED              | 
all PASS                     |
| gcc.dg/pr108095.c                         | all UNSUPPORTED              | 
all PASS                     |
| gcc.dg/pr110079.c                         | all UNSUPPORTED              | 
all PASS                     |
| gcc.dg/pr43058.c                          | all FAIL                     | 
all PASS                     |
| gcc.dg/pr48141.c                          | all FAIL                     | 
all PASS                     |
| gcc.dg/pr70281.c                          | all PASS                     | 
transient error              |
| gcc.dg/pr97459-2.c                        | all FAIL                     | 
all PASS                     |
| gcc.dg/pr97459-4.c                        | all FAIL                     | 
all PASS                     |
| gcc.dg/pr97459-5.c                        | all FAIL                     | 
all PASS                     |
| gcc.dg/pr97459-6.c                        | all FAIL                     | 
all PASS                     |
| gcc.dg/pr97954.c                          | all UNSUPPORTED              | 
all PASS                     |
| gcc.dg/struct-by-value-1.c                | UNSUPPORTED/FAIL mix         | 
all PASS                     |
| g++.dg/eh/ctor2.C                         | PASS/FAIL mix                | 
disjoint PASS/FAIL mix       |
| g++.dg/inherit/covariant4.C               | PASS/FAIL mix                | 
PASS/FAIL mix                |
| g++.dg/ipa/pr71207.C                      | PASS/FAIL mix                | 
PASS/FAIL mix                |
| g++.dg/tree-ssa/pr96979.C                 | all FAIL                     | 
all PASS                     |
| g++.dg/warn/uninit-pr105562.C             | all FAIL                     | 
all PASS                     |
| g++.dg/warn/Warray-bounds-pr122824.C      | all FAIL                     | 
all PASS                     |
| g++.old-deja/g++.eh/catch5p.C             | PASS/FAIL mix                | 
disjoint PASS/FAIL mix       |
| g++.old-deja/g++.eh/catch6.C              | PASS/FAIL mix                | 
disjoint PASS/FAIL mix       |
| g++.old-deja/g++.eh/catch6p.C             | PASS/FAIL mix                | 
disjoint PASS/FAIL mix       |
| g++.old-deja/g++.mike/align1.C            | PASS/FAIL mix                | 
disjoint PASS/FAIL mix       |
| g++.old-deja/g++.mike/dyncast1.C          | PASS/FAIL mix                | 
disjoint PASS/FAIL mix       |
| g++.old-deja/g++.mike/p658.C              | all UNSUPPORTED              | 
all UNRESOLVED/FAIL mix      |
| g++.old-deja/g++.other/dyncast4.C         | PASS/FAIL mix                | 
disjoint PASS/FAIL mix       |
| g++.old-deja/g++.robertl/eh990323-2.C     | PASS/FAIL mix                | 
disjoint PASS/FAIL mix       |

Notes:

* "Transient errors" mean "the test failed , but I could not duplicate." Race 
condition in dejagnu? Bit flip? Who knows :)! All of the
   failures seem to be excess-error related, like some columns of the error 
output got stripped:

   ```
   FAIL: c-c++-common/Wbidi-chars-ranges.c  -Wc++-compat  (test for excess 
errors)
   Excess errors:
    <U+2066>if (isAdmin)<U+2069> <U+2066> begin admins only */
                                 ~~~~~~~~                    ^
                                 |                           |
                                 |                           end of 
bidirectional context
                                 U+2066 (LEFT-TO-RIGHT ISOLATE)
   ```

* For `g++.dg/inherit/covariant4.C` are `g++.dg/ipa/pr71207.C`, the test 
results don't change, but the failure reason varies between `core: 4 byte 
misaligned read to address` and "the test timed out". I wasn't sure if this is 
noteworthy with the 8 second timeout in my board file, so I included them just 
in case.

Based on these results, I don't believe that the lm32 backend really depends on 
differences between reload and LRA. Specifically:

* Many tests that fail with LRA disabled, pass with LRA enabled.
* Disregarding transient errors, _there is no test which was previously passing 
in all multilib configurations that started failing when LRA is enabled._
* Tests that started failing when LRA is enabled seem to all be part of tests 
which were already flaky before LRA was enabled (most of `g++.old-deja`, 
`g++.dg/inherit/covariant4.C`, and `g++.dg/ipa/pr71207.C`?).

For these reasons, I'm offering this PR and test results as reason to just 
"flip the LRA switch on" for lm32. I don't use the backend myself as much as I 
did 10 years ago; everybody loves RISC-V nowadays. but the target is 
unchanging, and the backend is simple enough for a single person to study that 
I think it's worth keeping around as gcc's version of 
[Cpu0](https://jonathan2251.github.io/lbd/llvmstructure.html).


Changed files:
- M: gcc/config/lm32/lm32.cc


William D. Jones (1):
  lm32: enable LRA after testing showed minimal regressions.

 gcc/config/lm32/lm32.cc | 2 --
 1 file changed, 2 deletions(-)

-- 
2.54.0

Reply via email to