]> git.ipfire.org Git - thirdparty/gcc.git/commit
xtensa: Defer storing integer constants into litpool until reload
authorTakayuki 'January June' Suwa <jjsuwa_sys3175@yahoo.co.jp>
Fri, 17 Jun 2022 13:47:49 +0000 (22:47 +0900)
committerMax Filippov <jcmvbkbc@gmail.com>
Sat, 18 Jun 2022 06:28:14 +0000 (23:28 -0700)
commit479b6f449ee999501ad6eff0b7db8d0cd5b2d28d
tree792545e37b0995be2b60a94b691461ac417038ce
parent5a66d7dd2bf4c99b743de65a5b0bcfab44c77305
xtensa: Defer storing integer constants into litpool until reload

Storing integer constants into litpool in the early stage of compilation
hinders some integer optimizations.  In fact, such integer constants are
not subject to the constant folding process.

For example:

    extern unsigned short value;
    extern void foo(void);
    void test(void) {
      if (value == 30001)
        foo();
    }

.literal_position
.literal .LC0, value
.literal .LC1, 30001
    test:
l32r a3, .LC0
l32r a2, .LC1
l16ui a3, a3, 0
extui a2, a2, 0, 16  // runtime zero-extension despite constant
bne a3, a2, .L1
j.l foo, a9
    .L1:
ret.n

This patch defers the placement of integer constants into litpool until
the start of reload:

.literal_position
.literal .LC0, value
.literal .LC1, 30001
    test:
l32r a3, .LC0
l32r a2, .LC1
l16ui a3, a3, 0
bne a3, a2, .L1
j.l foo, a9
    .L1:
ret.n

gcc/ChangeLog:

* config/xtensa/constraints.md (Y):
Change to include integer constants until reload begins.
* config/xtensa/predicates.md (move_operand): Ditto.
* config/xtensa/xtensa.cc (xtensa_emit_move_sequence):
Change to allow storing integer constants into litpool only after
reload begins.
gcc/config/xtensa/constraints.md
gcc/config/xtensa/predicates.md
gcc/config/xtensa/xtensa.cc