erratum:

-       extern unsigned int value;
+       extern unsigned short value;

On 2022/06/17 22:47, Takayuki 'January June' Suwa via Gcc-patches wrote:
> 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 int 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.

Reply via email to